Commit d0cbc93a authored by Philipp Zabel's avatar Philipp Zabel

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: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Acked-by: default avatarSteve Longerbeam <slongerbeam@gmail.com>
Tested-by: default avatarSteve Longerbeam <slongerbeam@gmail.com>
parent dec408fd
...@@ -442,24 +442,27 @@ int ipu_ic_task_graphics_init(struct ipu_ic *ic, ...@@ -442,24 +442,27 @@ int ipu_ic_task_graphics_init(struct ipu_ic *ic,
} }
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;
if (!rsc) {
/* Setup vertical resizing */ /* Setup vertical resizing */
ret = calc_resize_coeffs(ic, in_height, out_height, ret = calc_resize_coeffs(ic, in_height, out_height,
&resize_coeff, &downsize_coeff); &resize_coeff, &downsize_coeff);
if (ret) if (ret)
return ret; return ret;
reg = (downsize_coeff << 30) | (resize_coeff << 16); rsc = (downsize_coeff << 30) | (resize_coeff << 16);
/* Setup horizontal resizing */ /* Setup horizontal resizing */
ret = calc_resize_coeffs(ic, in_width, out_width, ret = calc_resize_coeffs(ic, in_width, out_width,
...@@ -467,11 +470,12 @@ int ipu_ic_task_init(struct ipu_ic *ic, ...@@ -467,11 +470,12 @@ int ipu_ic_task_init(struct ipu_ic *ic,
if (ret) if (ret)
return ret; return ret;
reg |= (downsize_coeff << 14) | resize_coeff; 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 @@ int ipu_ic_task_init(struct ipu_ic *ic, ...@@ -487,6 +491,16 @@ int ipu_ic_task_init(struct ipu_ic *ic,
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, ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment