Commit d0cbc93a authored by Philipp Zabel's avatar Philipp Zabel
Browse files

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
Loading
Loading
Loading
Loading
+33 −19
Original line number Diff line number Diff line
@@ -442,24 +442,27 @@ unlock:
}
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 out_width, int out_height,
			 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;
	u32 reg, downsize_coeff, resize_coeff;
	u32 downsize_coeff, resize_coeff;
	unsigned long flags;
	int ret = 0;

	if (!rsc) {
		/* Setup vertical resizing */

		ret = calc_resize_coeffs(ic, in_height, out_height,
					 &resize_coeff, &downsize_coeff);
		if (ret)
			return ret;

	reg = (downsize_coeff << 30) | (resize_coeff << 16);
		rsc = (downsize_coeff << 30) | (resize_coeff << 16);

		/* Setup horizontal resizing */
		ret = calc_resize_coeffs(ic, in_width, out_width,
@@ -467,11 +470,12 @@ int ipu_ic_task_init(struct ipu_ic *ic,
		if (ret)
			return ret;

	reg |= (downsize_coeff << 14) | resize_coeff;
		rsc |= (downsize_coeff << 14) | resize_coeff;
	}

	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 */
	ic->in_cs = in_cs;
@@ -487,6 +491,16 @@ unlock:
	spin_unlock_irqrestore(&priv->lock, flags);
	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);

int ipu_ic_task_idma_init(struct ipu_ic *ic, struct ipuv3_channel *channel,
+6 −0
Original line number Diff line number Diff line
@@ -390,6 +390,12 @@ int ipu_ic_task_init(struct ipu_ic *ic,
		     int out_width, int out_height,
		     enum ipu_color_space in_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,
			      enum ipu_color_space in_g_cs,
			      bool galpha_en, u32 galpha,