gpu: ipu-v3: ipu-ic: allow to manually set resize coefficients
For tiled scaling, we want to compute the scaling coefficients externally in such a way that the interpolation overshoots tile boundaries and samples up to the first pixel of the next tile. Prepare to override the resizing coefficients from the image conversion code. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Acked-by: Steve Longerbeam <slongerbeam@gmail.com> Tested-by: Steve Longerbeam <slongerbeam@gmail.com>
This commit is contained in:
parent
dec408fd23
commit
d0cbc93a01
|
@ -442,36 +442,40 @@ unlock:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ipu_ic_task_graphics_init);
|
EXPORT_SYMBOL_GPL(ipu_ic_task_graphics_init);
|
||||||
|
|
||||||
int ipu_ic_task_init(struct ipu_ic *ic,
|
int ipu_ic_task_init_rsc(struct ipu_ic *ic,
|
||||||
int in_width, int in_height,
|
int in_width, int in_height,
|
||||||
int out_width, int out_height,
|
int out_width, int out_height,
|
||||||
enum ipu_color_space in_cs,
|
enum ipu_color_space in_cs,
|
||||||
enum ipu_color_space out_cs)
|
enum ipu_color_space out_cs,
|
||||||
|
u32 rsc)
|
||||||
{
|
{
|
||||||
struct ipu_ic_priv *priv = ic->priv;
|
struct ipu_ic_priv *priv = ic->priv;
|
||||||
u32 reg, downsize_coeff, resize_coeff;
|
u32 downsize_coeff, resize_coeff;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* Setup vertical resizing */
|
if (!rsc) {
|
||||||
ret = calc_resize_coeffs(ic, in_height, out_height,
|
/* Setup vertical resizing */
|
||||||
&resize_coeff, &downsize_coeff);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
reg = (downsize_coeff << 30) | (resize_coeff << 16);
|
ret = calc_resize_coeffs(ic, in_height, out_height,
|
||||||
|
&resize_coeff, &downsize_coeff);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
/* Setup horizontal resizing */
|
rsc = (downsize_coeff << 30) | (resize_coeff << 16);
|
||||||
ret = calc_resize_coeffs(ic, in_width, out_width,
|
|
||||||
&resize_coeff, &downsize_coeff);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
reg |= (downsize_coeff << 14) | resize_coeff;
|
/* Setup horizontal resizing */
|
||||||
|
ret = calc_resize_coeffs(ic, in_width, out_width,
|
||||||
|
&resize_coeff, &downsize_coeff);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
rsc |= (downsize_coeff << 14) | resize_coeff;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
|
||||||
ipu_ic_write(ic, reg, ic->reg->rsc);
|
ipu_ic_write(ic, rsc, ic->reg->rsc);
|
||||||
|
|
||||||
/* Setup color space conversion */
|
/* Setup color space conversion */
|
||||||
ic->in_cs = in_cs;
|
ic->in_cs = in_cs;
|
||||||
|
@ -487,6 +491,16 @@ unlock:
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ipu_ic_task_init(struct ipu_ic *ic,
|
||||||
|
int in_width, int in_height,
|
||||||
|
int out_width, int out_height,
|
||||||
|
enum ipu_color_space in_cs,
|
||||||
|
enum ipu_color_space out_cs)
|
||||||
|
{
|
||||||
|
return ipu_ic_task_init_rsc(ic, in_width, in_height, out_width,
|
||||||
|
out_height, in_cs, out_cs, 0);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(ipu_ic_task_init);
|
EXPORT_SYMBOL_GPL(ipu_ic_task_init);
|
||||||
|
|
||||||
int ipu_ic_task_idma_init(struct ipu_ic *ic, struct ipuv3_channel *channel,
|
int ipu_ic_task_idma_init(struct ipu_ic *ic, struct ipuv3_channel *channel,
|
||||||
|
|
|
@ -390,6 +390,12 @@ int ipu_ic_task_init(struct ipu_ic *ic,
|
||||||
int out_width, int out_height,
|
int out_width, int out_height,
|
||||||
enum ipu_color_space in_cs,
|
enum ipu_color_space in_cs,
|
||||||
enum ipu_color_space out_cs);
|
enum ipu_color_space out_cs);
|
||||||
|
int ipu_ic_task_init_rsc(struct ipu_ic *ic,
|
||||||
|
int in_width, int in_height,
|
||||||
|
int out_width, int out_height,
|
||||||
|
enum ipu_color_space in_cs,
|
||||||
|
enum ipu_color_space out_cs,
|
||||||
|
u32 rsc);
|
||||||
int ipu_ic_task_graphics_init(struct ipu_ic *ic,
|
int ipu_ic_task_graphics_init(struct ipu_ic *ic,
|
||||||
enum ipu_color_space in_g_cs,
|
enum ipu_color_space in_g_cs,
|
||||||
bool galpha_en, u32 galpha,
|
bool galpha_en, u32 galpha,
|
||||||
|
|
Loading…
Reference in New Issue