All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] drm/vc4: Support for 30 bits YUV formats
@ 2021-11-17 14:08 Maxime Ripard
  2021-11-17 14:08 ` [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format Maxime Ripard
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Maxime Ripard @ 2021-11-17 14:08 UTC (permalink / raw)
  To: Daniel Vetter, David Airlie, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard
  Cc: dri-devel, Dom Cobley, Phil Elwell, Tim Gover, Dave Stevenson

Hi,

Here are a few patches adding support for the P030 and the BT709 and BT2020
colorspaces.

Let me know what you think,
Maxime

Dave Stevenson (3):
  drm/fourcc: Add packed 10bit YUV 4:2:0 format
  drm/vc4: plane: Add support for DRM_FORMAT_P030
  drm/vc4: plane: Add support for YUV color encodings and ranges

 drivers/gpu/drm/drm_fourcc.c    |   3 +
 drivers/gpu/drm/vc4/vc4_plane.c | 169 ++++++++++++++++++++++++++------
 drivers/gpu/drm/vc4/vc4_regs.h  |  19 +++-
 include/uapi/drm/drm_fourcc.h   |  11 +++
 4 files changed, 167 insertions(+), 35 deletions(-)

-- 
2.33.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format
  2021-11-17 14:08 [PATCH 0/3] drm/vc4: Support for 30 bits YUV formats Maxime Ripard
@ 2021-11-17 14:08 ` Maxime Ripard
  2021-11-19 14:31   ` Pekka Paalanen
  2021-11-17 14:08 ` [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030 Maxime Ripard
  2021-11-17 14:09 ` [PATCH 3/3] drm/vc4: plane: Add support for YUV color encodings and ranges Maxime Ripard
  2 siblings, 1 reply; 9+ messages in thread
From: Maxime Ripard @ 2021-11-17 14:08 UTC (permalink / raw)
  To: Daniel Vetter, David Airlie, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard
  Cc: dri-devel, Dom Cobley, Phil Elwell, Tim Gover, Dave Stevenson

From: Dave Stevenson <dave.stevenson@raspberrypi.com>

Adds a format that is 3 10bit YUV 4:2:0 samples packed into
a 32bit work (with 2 spare bits).

Supported on Broadcom BCM2711 chips.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 drivers/gpu/drm/drm_fourcc.c  |  3 +++
 include/uapi/drm/drm_fourcc.h | 11 +++++++++++
 2 files changed, 14 insertions(+)

diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
index 25837b1d6639..07741b678798 100644
--- a/drivers/gpu/drm/drm_fourcc.c
+++ b/drivers/gpu/drm/drm_fourcc.c
@@ -269,6 +269,9 @@ const struct drm_format_info *__drm_format_info(u32 format)
 		  .num_planes = 3, .char_per_block = { 2, 2, 2 },
 		  .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 0,
 		  .vsub = 0, .is_yuv = true },
+		{ .format = DRM_FORMAT_P030,            .depth = 0,  .num_planes = 2,
+		  .char_per_block = { 4, 8, 0 }, .block_w = { 3, 3, 0 }, .block_h = { 1, 1, 0 },
+		  .hsub = 2, .vsub = 2, .is_yuv = true},
 	};
 
 	unsigned int i;
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
index 7f652c96845b..2e6d2ecae45f 100644
--- a/include/uapi/drm/drm_fourcc.h
+++ b/include/uapi/drm/drm_fourcc.h
@@ -330,6 +330,13 @@ extern "C" {
  */
 #define DRM_FORMAT_Q401		fourcc_code('Q', '4', '0', '1')
 
+/*
+ * 2 plane YCbCr MSB aligned, 3 pixels packed into 4 bytes.
+ * index 0 = Y plane, [31:0] x:Y2:Y1:Y0 2:10:10:10 little endian
+ * index 1 = Cr:Cb plane, [63:0] x:Cr2:Cb2:Cr1:x:Cb1:Cr0:Cb0 [2:10:10:10:2:10:10:10] little endian
+ */
+#define DRM_FORMAT_P030		fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */
+
 /*
  * 3 plane YCbCr
  * index 0: Y plane, [7:0] Y
@@ -854,6 +861,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
  * and UV.  Some SAND-using hardware stores UV in a separate tiled
  * image from Y to reduce the column height, which is not supported
  * with these modifiers.
+ *
+ * The DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT modifier is also
+ * supported for DRM_FORMAT_P030 where the columns remain as 128 bytes
+ * wide, but as this is a 10 bpp format that translates to 96 pixels.
  */
 
 #define DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(v) \
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030
  2021-11-17 14:08 [PATCH 0/3] drm/vc4: Support for 30 bits YUV formats Maxime Ripard
  2021-11-17 14:08 ` [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format Maxime Ripard
@ 2021-11-17 14:08 ` Maxime Ripard
  2021-11-26  2:18     ` kernel test robot
  2021-11-17 14:09 ` [PATCH 3/3] drm/vc4: plane: Add support for YUV color encodings and ranges Maxime Ripard
  2 siblings, 1 reply; 9+ messages in thread
From: Maxime Ripard @ 2021-11-17 14:08 UTC (permalink / raw)
  To: Daniel Vetter, David Airlie, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard
  Cc: dri-devel, Dom Cobley, Phil Elwell, Tim Gover, Dave Stevenson

From: Dave Stevenson <dave.stevenson@raspberrypi.com>

The P030 format, used with the DRM_FORMAT_MOD_BROADCOM_SAND128 modifier,
is a format output by the video decoder on the BCM2711.

Add native support to the KMS planes for that format.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 drivers/gpu/drm/vc4/vc4_plane.c | 98 ++++++++++++++++++++++++---------
 1 file changed, 71 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index ac761c683663..41823248a024 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -33,6 +33,7 @@ static const struct hvs_format {
 	u32 hvs; /* HVS_FORMAT_* */
 	u32 pixel_order;
 	u32 pixel_order_hvs5;
+	bool hvs5_only;
 } hvs_formats[] = {
 	{
 		.drm = DRM_FORMAT_XRGB8888,
@@ -128,6 +129,12 @@ static const struct hvs_format {
 		.hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE,
 		.pixel_order = HVS_PIXEL_ORDER_XYCRCB,
 	},
+	{
+		.drm = DRM_FORMAT_P030,
+		.hvs = HVS_PIXEL_FORMAT_YCBCR_10BIT,
+		.pixel_order = HVS_PIXEL_ORDER_XYCBCR,
+		.hvs5_only = true,
+	},
 };
 
 static const struct hvs_format *vc4_get_hvs_format(u32 drm_format)
@@ -764,45 +771,67 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
 		uint32_t param = fourcc_mod_broadcom_param(fb->modifier);
 		u32 tile_w, tile, x_off, pix_per_tile;
 
-		hvs_format = HVS_PIXEL_FORMAT_H264;
+		if (fb->format->format == DRM_FORMAT_P030) {
+			/*
+			 * Spec says: bits [31:4] of the given address should point to
+			 * the 128-bit word containing the desired starting pixel,
+			 * and bits[3:0] should be between 0 and 11, indicating which
+			 * of the 12-pixels in that 128-bit word is the first pixel to be used
+			 */
+	                u32 remaining_pixels = vc4_state->src_x % 96;
+			u32 aligned = remaining_pixels / 12;
+			u32 last_bits = remaining_pixels % 12;
 
-		switch (base_format_mod) {
-		case DRM_FORMAT_MOD_BROADCOM_SAND64:
-			tiling = SCALER_CTL0_TILING_64B;
-			tile_w = 64;
-			break;
-		case DRM_FORMAT_MOD_BROADCOM_SAND128:
+			x_off = aligned * 16 + last_bits;
+			hvs_format = HVS_PIXEL_FORMAT_YCBCR_10BIT;
 			tiling = SCALER_CTL0_TILING_128B;
 			tile_w = 128;
-			break;
-		case DRM_FORMAT_MOD_BROADCOM_SAND256:
-			tiling = SCALER_CTL0_TILING_256B_OR_T;
-			tile_w = 256;
-			break;
-		default:
-			break;
-		}
+			pix_per_tile = 96;
+		} else {
+			hvs_format = HVS_PIXEL_FORMAT_H264;
 
+			switch (base_format_mod) {
+			case DRM_FORMAT_MOD_BROADCOM_SAND64:
+				tiling = SCALER_CTL0_TILING_64B;
+				tile_w = 64;
+				break;
+			case DRM_FORMAT_MOD_BROADCOM_SAND128:
+				tiling = SCALER_CTL0_TILING_128B;
+				tile_w = 128;
+				break;
+			case DRM_FORMAT_MOD_BROADCOM_SAND256:
+				tiling = SCALER_CTL0_TILING_256B_OR_T;
+				tile_w = 256;
+				break;
+			default:
+				break;
+			}
+			pix_per_tile = tile_w / fb->format->cpp[0];
+			x_off = (vc4_state->src_x % pix_per_tile) /
+				(i ? h_subsample : 1) * fb->format->cpp[i];
+		}
 		if (param > SCALER_TILE_HEIGHT_MASK) {
-			DRM_DEBUG_KMS("SAND height too large (%d)\n", param);
+			DRM_DEBUG_KMS("SAND height too large (%d)\n",
+				      param);
 			return -EINVAL;
 		}
-
-		pix_per_tile = tile_w / fb->format->cpp[0];
 		tile = vc4_state->src_x / pix_per_tile;
-		x_off = vc4_state->src_x % pix_per_tile;
-
 		/* Adjust the base pointer to the first pixel to be scanned
 		 * out.
+		 *
+		 * For P030, y_ptr [31:4] is the 128bit word for the start pixel
+		 * y_ptr [3:0] is the pixel (0-11) contained within that 128bit
+		 * word that should be taken as the first pixel.
+		 * Ditto uv_ptr [31:4] vs [3:0], however [3:0] contains the
+		 * element within the 128bit word, eg for pixel 3 the value
+		 * should be 6.
 		 */
 		for (i = 0; i < num_planes; i++) {
 			vc4_state->offsets[i] += param * tile_w * tile;
 			vc4_state->offsets[i] += src_y /
 						 (i ? v_subsample : 1) *
 						 tile_w;
-			vc4_state->offsets[i] += x_off /
-						 (i ? h_subsample : 1) *
-						 fb->format->cpp[i];
+			vc4_state->offsets[i] += x_off & ~(i ? 1 : 0);
 		}
 
 		pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT);
@@ -955,7 +984,8 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
 
 	/* Pitch word 1/2 */
 	for (i = 1; i < num_planes; i++) {
-		if (hvs_format != HVS_PIXEL_FORMAT_H264) {
+		if (hvs_format != HVS_PIXEL_FORMAT_H264 &&
+		    hvs_format != HVS_PIXEL_FORMAT_YCBCR_10BIT) {
 			vc4_dlist_write(vc4_state,
 					VC4_SET_FIELD(fb->pitches[i],
 						      SCALER_SRC_PITCH));
@@ -1315,6 +1345,13 @@ static bool vc4_format_mod_supported(struct drm_plane *plane,
 		default:
 			return false;
 		}
+	case DRM_FORMAT_P030:
+		switch (fourcc_mod_broadcom_mod(modifier)) {
+		case DRM_FORMAT_MOD_BROADCOM_SAND128:
+			return true;
+		default:
+			return false;
+		}
 	case DRM_FORMAT_RGBX1010102:
 	case DRM_FORMAT_BGRX1010102:
 	case DRM_FORMAT_RGBA1010102:
@@ -1347,8 +1384,11 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
 	struct drm_plane *plane = NULL;
 	struct vc4_plane *vc4_plane;
 	u32 formats[ARRAY_SIZE(hvs_formats)];
+	int num_formats = 0;
 	int ret = 0;
 	unsigned i;
+	bool hvs5 = of_device_is_compatible(dev->dev->of_node,
+					    "brcm,bcm2711-vc5");
 	static const uint64_t modifiers[] = {
 		DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
 		DRM_FORMAT_MOD_BROADCOM_SAND128,
@@ -1363,13 +1403,17 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
 	if (!vc4_plane)
 		return ERR_PTR(-ENOMEM);
 
-	for (i = 0; i < ARRAY_SIZE(hvs_formats); i++)
-		formats[i] = hvs_formats[i].drm;
+	for (i = 0; i < ARRAY_SIZE(hvs_formats); i++) {
+		if (!hvs_formats[i].hvs5_only || hvs5) {
+			formats[num_formats] = hvs_formats[i].drm;
+			num_formats++;
+		}
+	}
 
 	plane = &vc4_plane->base;
 	ret = drm_universal_plane_init(dev, plane, 0,
 				       &vc4_plane_funcs,
-				       formats, ARRAY_SIZE(formats),
+				       formats, num_formats,
 				       modifiers, type, NULL);
 	if (ret)
 		return ERR_PTR(ret);
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] drm/vc4: plane: Add support for YUV color encodings and ranges
  2021-11-17 14:08 [PATCH 0/3] drm/vc4: Support for 30 bits YUV formats Maxime Ripard
  2021-11-17 14:08 ` [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format Maxime Ripard
  2021-11-17 14:08 ` [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030 Maxime Ripard
@ 2021-11-17 14:09 ` Maxime Ripard
  2 siblings, 0 replies; 9+ messages in thread
From: Maxime Ripard @ 2021-11-17 14:09 UTC (permalink / raw)
  To: Daniel Vetter, David Airlie, Maarten Lankhorst, Thomas Zimmermann,
	Maxime Ripard
  Cc: Dom Cobley, Tim Gover, Dave Stevenson, dri-devel, Dave Stevenson,
	Phil Elwell

From: Dave Stevenson <dave.stevenson@raspberrypi.org>

The BT601/BT709 color encoding and limited vs full
range properties were not being exposed, defaulting
always to BT601 limited range.

Expose the parameters and set the registers appropriately.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 drivers/gpu/drm/vc4/vc4_plane.c | 71 +++++++++++++++++++++++++++++++--
 drivers/gpu/drm/vc4/vc4_regs.h  | 19 ++++++---
 2 files changed, 82 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index 41823248a024..4fac03b36fea 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -623,6 +623,51 @@ static int vc4_plane_allocate_lbm(struct drm_plane_state *state)
 	return 0;
 }
 
+/*
+ * The colorspace conversion matrices are held in 3 entries in the dlist.
+ * Create an array of them, with entries for each full and limited mode, and
+ * each supported colorspace.
+ */
+static const u32 colorspace_coeffs[2][DRM_COLOR_ENCODING_MAX][3] = {
+	{
+		/* Limited range */
+		{
+			/* BT601 */
+			SCALER_CSC0_ITR_R_601_5,
+			SCALER_CSC1_ITR_R_601_5,
+			SCALER_CSC2_ITR_R_601_5,
+		}, {
+			/* BT709 */
+			SCALER_CSC0_ITR_R_709_3,
+			SCALER_CSC1_ITR_R_709_3,
+			SCALER_CSC2_ITR_R_709_3,
+		}, {
+			/* BT2020 */
+			SCALER_CSC0_ITR_R_2020,
+			SCALER_CSC1_ITR_R_2020,
+			SCALER_CSC2_ITR_R_2020,
+		}
+	}, {
+		/* Full range */
+		{
+			/* JFIF */
+			SCALER_CSC0_JPEG_JFIF,
+			SCALER_CSC1_JPEG_JFIF,
+			SCALER_CSC2_JPEG_JFIF,
+		}, {
+			/* BT709 */
+			SCALER_CSC0_ITR_R_709_3_FR,
+			SCALER_CSC1_ITR_R_709_3_FR,
+			SCALER_CSC2_ITR_R_709_3_FR,
+		}, {
+			/* BT2020 */
+			SCALER_CSC0_ITR_R_2020_FR,
+			SCALER_CSC1_ITR_R_2020_FR,
+			SCALER_CSC2_ITR_R_2020_FR,
+		}
+	}
+};
+
 /* Writes out a full display list for an active plane to the plane's
  * private dlist state.
  */
@@ -996,9 +1041,20 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
 
 	/* Colorspace conversion words */
 	if (vc4_state->is_yuv) {
-		vc4_dlist_write(vc4_state, SCALER_CSC0_ITR_R_601_5);
-		vc4_dlist_write(vc4_state, SCALER_CSC1_ITR_R_601_5);
-		vc4_dlist_write(vc4_state, SCALER_CSC2_ITR_R_601_5);
+		enum drm_color_encoding color_encoding = state->color_encoding;
+		enum drm_color_range color_range = state->color_range;
+		const u32 *ccm;
+
+		if (color_encoding >= DRM_COLOR_ENCODING_MAX)
+			color_encoding = DRM_COLOR_YCBCR_BT601;
+		if (color_range >= DRM_COLOR_RANGE_MAX)
+			color_range = DRM_COLOR_YCBCR_LIMITED_RANGE;
+
+		ccm = colorspace_coeffs[color_range][color_encoding];
+
+		vc4_dlist_write(vc4_state, ccm[0]);
+		vc4_dlist_write(vc4_state, ccm[1]);
+		vc4_dlist_write(vc4_state, ccm[2]);
 	}
 
 	vc4_state->lbm_offset = 0;
@@ -1427,6 +1483,15 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
 					   DRM_MODE_REFLECT_X |
 					   DRM_MODE_REFLECT_Y);
 
+	drm_plane_create_color_properties(plane,
+					  BIT(DRM_COLOR_YCBCR_BT601) |
+					  BIT(DRM_COLOR_YCBCR_BT709) |
+					  BIT(DRM_COLOR_YCBCR_BT2020),
+					  BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
+					  BIT(DRM_COLOR_YCBCR_FULL_RANGE),
+					  DRM_COLOR_YCBCR_BT709,
+					  DRM_COLOR_YCBCR_LIMITED_RANGE);
+
 	return plane;
 }
 
diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h
index 489f921ef44d..7538b84a6dca 100644
--- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -975,7 +975,10 @@ enum hvs_pixel_format {
 #define SCALER_CSC0_COEF_CR_OFS_SHIFT		0
 #define SCALER_CSC0_ITR_R_601_5			0x00f00000
 #define SCALER_CSC0_ITR_R_709_3			0x00f00000
+#define SCALER_CSC0_ITR_R_2020			0x00f00000
 #define SCALER_CSC0_JPEG_JFIF			0x00000000
+#define SCALER_CSC0_ITR_R_709_3_FR		0x00000000
+#define SCALER_CSC0_ITR_R_2020_FR		0x00000000
 
 /* S2.8 contribution of Cb to Green */
 #define SCALER_CSC1_COEF_CB_GRN_MASK		VC4_MASK(31, 22)
@@ -990,8 +993,11 @@ enum hvs_pixel_format {
 #define SCALER_CSC1_COEF_CR_BLU_MASK		VC4_MASK(1, 0)
 #define SCALER_CSC1_COEF_CR_BLU_SHIFT		0
 #define SCALER_CSC1_ITR_R_601_5			0xe73304a8
-#define SCALER_CSC1_ITR_R_709_3			0xf2b784a8
-#define SCALER_CSC1_JPEG_JFIF			0xea34a400
+#define SCALER_CSC1_ITR_R_709_3			0xf27784a8
+#define SCALER_CSC1_ITR_R_2020			0xf43594a8
+#define SCALER_CSC1_JPEG_JFIF			0xea349400
+#define SCALER_CSC1_ITR_R_709_3_FR		0xf4388400
+#define SCALER_CSC1_ITR_R_2020_FR		0xf5b6d400
 
 /* S2.8 contribution of Cb to Red */
 #define SCALER_CSC2_COEF_CB_RED_MASK		VC4_MASK(29, 20)
@@ -1002,9 +1008,12 @@ enum hvs_pixel_format {
 /* S2.8 contribution of Cb to Blue */
 #define SCALER_CSC2_COEF_CB_BLU_MASK		VC4_MASK(19, 10)
 #define SCALER_CSC2_COEF_CB_BLU_SHIFT		10
-#define SCALER_CSC2_ITR_R_601_5			0x00066204
-#define SCALER_CSC2_ITR_R_709_3			0x00072a1c
-#define SCALER_CSC2_JPEG_JFIF			0x000599c5
+#define SCALER_CSC2_ITR_R_601_5			0x00066604
+#define SCALER_CSC2_ITR_R_709_3			0x00072e1d
+#define SCALER_CSC2_ITR_R_2020			0x0006b624
+#define SCALER_CSC2_JPEG_JFIF			0x00059dc6
+#define SCALER_CSC2_ITR_R_709_3_FR		0x00064ddb
+#define SCALER_CSC2_ITR_R_2020_FR		0x0005e5e2
 
 #define SCALER_TPZ0_VERT_RECALC			BIT(31)
 #define SCALER_TPZ0_SCALE_MASK			VC4_MASK(28, 8)
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format
  2021-11-17 14:08 ` [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format Maxime Ripard
@ 2021-11-19 14:31   ` Pekka Paalanen
  2021-11-29 11:54     ` Dave Stevenson
  0 siblings, 1 reply; 9+ messages in thread
From: Pekka Paalanen @ 2021-11-19 14:31 UTC (permalink / raw)
  To: Maxime Ripard
  Cc: Dom Cobley, Tim Gover, Dave Stevenson, David Airlie, dri-devel,
	Thomas Zimmermann, Daniel Vetter, Phil Elwell

[-- Attachment #1: Type: text/plain, Size: 2728 bytes --]

On Wed, 17 Nov 2021 15:08:58 +0100
Maxime Ripard <maxime@cerno.tech> wrote:

> From: Dave Stevenson <dave.stevenson@raspberrypi.com>
> 
> Adds a format that is 3 10bit YUV 4:2:0 samples packed into
> a 32bit work (with 2 spare bits).
> 
> Supported on Broadcom BCM2711 chips.
> 
> Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
> Signed-off-by: Maxime Ripard <maxime@cerno.tech>
> ---
>  drivers/gpu/drm/drm_fourcc.c  |  3 +++
>  include/uapi/drm/drm_fourcc.h | 11 +++++++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
> index 25837b1d6639..07741b678798 100644
> --- a/drivers/gpu/drm/drm_fourcc.c
> +++ b/drivers/gpu/drm/drm_fourcc.c
> @@ -269,6 +269,9 @@ const struct drm_format_info *__drm_format_info(u32 format)
>  		  .num_planes = 3, .char_per_block = { 2, 2, 2 },
>  		  .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 0,
>  		  .vsub = 0, .is_yuv = true },
> +		{ .format = DRM_FORMAT_P030,            .depth = 0,  .num_planes = 2,
> +		  .char_per_block = { 4, 8, 0 }, .block_w = { 3, 3, 0 }, .block_h = { 1, 1, 0 },
> +		  .hsub = 2, .vsub = 2, .is_yuv = true},
>  	};
>  
>  	unsigned int i;
> diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
> index 7f652c96845b..2e6d2ecae45f 100644
> --- a/include/uapi/drm/drm_fourcc.h
> +++ b/include/uapi/drm/drm_fourcc.h
> @@ -330,6 +330,13 @@ extern "C" {
>   */
>  #define DRM_FORMAT_Q401		fourcc_code('Q', '4', '0', '1')
>  
> +/*
> + * 2 plane YCbCr MSB aligned, 3 pixels packed into 4 bytes.

Hi,

what does "MSB aligned" mean? How widely used term is that?

> + * index 0 = Y plane, [31:0] x:Y2:Y1:Y0 2:10:10:10 little endian

Because if I had to say, this looks like LSB aligned?

> + * index 1 = Cr:Cb plane, [63:0] x:Cr2:Cb2:Cr1:x:Cb1:Cr0:Cb0 [2:10:10:10:2:10:10:10] little endian

And this is not really either, I guess.


Thanks,
pq

> + */
> +#define DRM_FORMAT_P030		fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */
> +
>  /*
>   * 3 plane YCbCr
>   * index 0: Y plane, [7:0] Y
> @@ -854,6 +861,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
>   * and UV.  Some SAND-using hardware stores UV in a separate tiled
>   * image from Y to reduce the column height, which is not supported
>   * with these modifiers.
> + *
> + * The DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT modifier is also
> + * supported for DRM_FORMAT_P030 where the columns remain as 128 bytes
> + * wide, but as this is a 10 bpp format that translates to 96 pixels.
>   */
>  
>  #define DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(v) \


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030
  2021-11-17 14:08 ` [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030 Maxime Ripard
  2021-11-26  2:18     ` kernel test robot
@ 2021-11-26  2:18     ` kernel test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-11-26  2:18 UTC (permalink / raw)
  To: Maxime Ripard, Daniel Vetter, David Airlie, Maarten Lankhorst,
	Thomas Zimmermann
  Cc: llvm, kbuild-all, dri-devel, Dom Cobley, Phil Elwell, Tim Gover,
	Dave Stevenson

Hi Maxime,

I love your patch! Perhaps something to improve:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on drm-intel/for-linux-next drm-tip/drm-tip v5.16-rc2 next-20211125]
[cannot apply to anholt/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Maxime-Ripard/drm-vc4-Support-for-30-bits-YUV-formats/20211117-221106
base:   git://anongit.freedesktop.org/drm/drm drm-next
config: x86_64-buildonly-randconfig-r004-20211118 (https://download.01.org/0day-ci/archive/20211126/202111261033.hgimGK21-lkp@intel.com/config)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/d4c05e7a5da7b65c5a37252cc9d2cac75f1f6d78
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Maxime-Ripard/drm-vc4-Support-for-30-bits-YUV-formats/20211117-221106
        git checkout d4c05e7a5da7b65c5a37252cc9d2cac75f1f6d78
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/vc4/vc4_plane.c:811:4: warning: variable 'tile_w' is used uninitialized whenever switch default is taken [-Wsometimes-uninitialized]
                           default:
                           ^~~~~~~
   drivers/gpu/drm/vc4/vc4_plane.c:814:19: note: uninitialized use occurs here
                           pix_per_tile = tile_w / fb->format->cpp[0];
                                          ^~~~~~
   drivers/gpu/drm/vc4/vc4_plane.c:777:13: note: initialize the variable 'tile_w' to silence this warning
                   u32 tile_w, tile, x_off, pix_per_tile;
                             ^
                              = 0
>> drivers/gpu/drm/vc4/vc4_plane.c:816:6: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
                                   (i ? h_subsample : 1) * fb->format->cpp[i];
                                    ^
   drivers/gpu/drm/vc4/vc4_plane.c:652:12: note: initialize the variable 'i' to silence this warning
           int ret, i;
                     ^
                      = 0
   2 warnings generated.


vim +/tile_w +811 drivers/gpu/drm/vc4/vc4_plane.c

0a038c1c29a7a3 Boris Brezillon   2018-11-30   630  
5c6799942003df Eric Anholt       2015-12-28   631  /* Writes out a full display list for an active plane to the plane's
5c6799942003df Eric Anholt       2015-12-28   632   * private dlist state.
5c6799942003df Eric Anholt       2015-12-28   633   */
5c6799942003df Eric Anholt       2015-12-28   634  static int vc4_plane_mode_set(struct drm_plane *plane,
5c6799942003df Eric Anholt       2015-12-28   635  			      struct drm_plane_state *state)
5c6799942003df Eric Anholt       2015-12-28   636  {
21af94cf1a4c2d Eric Anholt       2015-10-20   637  	struct vc4_dev *vc4 = to_vc4_dev(plane->dev);
5c6799942003df Eric Anholt       2015-12-28   638  	struct vc4_plane_state *vc4_state = to_vc4_plane_state(state);
5c6799942003df Eric Anholt       2015-12-28   639  	struct drm_framebuffer *fb = state->fb;
5c6799942003df Eric Anholt       2015-12-28   640  	u32 ctl0_offset = vc4_state->dlist_count;
438b74a5497c36 Ville Syrjälä     2016-12-14   641  	const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
e065a8dd30af70 Dave Stevenson    2018-03-16   642  	u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier);
05c452c115bffa Maxime Ripard     2019-05-16   643  	int num_planes = fb->format->num_planes;
f3e9632cb6241a Maxime Ripard     2019-05-16   644  	u32 h_subsample = fb->format->hsub;
f3e9632cb6241a Maxime Ripard     2019-05-16   645  	u32 v_subsample = fb->format->vsub;
22445f0316a253 Stefan Schake     2018-04-20   646  	bool mix_plane_alpha;
3d67b68a6a3c2d Stefan Schake     2018-03-09   647  	bool covers_screen;
98830d91da082b Eric Anholt       2017-06-07   648  	u32 scl0, scl1, pitch0;
7cd3cf3540a370 Boris Brezillon   2018-12-07   649  	u32 tiling, src_y;
e065a8dd30af70 Dave Stevenson    2018-03-16   650  	u32 hvs_format = format->hvs;
7cd3cf3540a370 Boris Brezillon   2018-12-07   651  	unsigned int rotation;
fc04023fafecf1 Eric Anholt       2015-12-30   652  	int ret, i;
5c6799942003df Eric Anholt       2015-12-28   653  
8d93844965c3d5 Boris Brezillon   2018-11-30   654  	if (vc4_state->dlist_initialized)
8d93844965c3d5 Boris Brezillon   2018-11-30   655  		return 0;
8d93844965c3d5 Boris Brezillon   2018-11-30   656  
5c6799942003df Eric Anholt       2015-12-28   657  	ret = vc4_plane_setup_clipping_and_scaling(state);
21af94cf1a4c2d Eric Anholt       2015-10-20   658  	if (ret)
21af94cf1a4c2d Eric Anholt       2015-10-20   659  		return ret;
21af94cf1a4c2d Eric Anholt       2015-10-20   660  
fc04023fafecf1 Eric Anholt       2015-12-30   661  	/* SCL1 is used for Cb/Cr scaling of planar formats.  For RGB
fc04023fafecf1 Eric Anholt       2015-12-30   662  	 * and 4:4:4, scl1 should be set to scl0 so both channels of
fc04023fafecf1 Eric Anholt       2015-12-30   663  	 * the scaler do the same thing.  For YUV, the Y plane needs
fc04023fafecf1 Eric Anholt       2015-12-30   664  	 * to be put in channel 1 and Cb/Cr in channel 0, so we swap
fc04023fafecf1 Eric Anholt       2015-12-30   665  	 * the scl fields here.
fc04023fafecf1 Eric Anholt       2015-12-30   666  	 */
fc04023fafecf1 Eric Anholt       2015-12-30   667  	if (num_planes == 1) {
9a0e9802217291 Boris Brezillon   2018-05-07   668  		scl0 = vc4_get_scl_field(state, 0);
fc04023fafecf1 Eric Anholt       2015-12-30   669  		scl1 = scl0;
fc04023fafecf1 Eric Anholt       2015-12-30   670  	} else {
fc04023fafecf1 Eric Anholt       2015-12-30   671  		scl0 = vc4_get_scl_field(state, 1);
fc04023fafecf1 Eric Anholt       2015-12-30   672  		scl1 = vc4_get_scl_field(state, 0);
fc04023fafecf1 Eric Anholt       2015-12-30   673  	}
21af94cf1a4c2d Eric Anholt       2015-10-20   674  
7cd3cf3540a370 Boris Brezillon   2018-12-07   675  	rotation = drm_rotation_simplify(state->rotation,
7cd3cf3540a370 Boris Brezillon   2018-12-07   676  					 DRM_MODE_ROTATE_0 |
7cd3cf3540a370 Boris Brezillon   2018-12-07   677  					 DRM_MODE_REFLECT_X |
7cd3cf3540a370 Boris Brezillon   2018-12-07   678  					 DRM_MODE_REFLECT_Y);
7cd3cf3540a370 Boris Brezillon   2018-12-07   679  
7cd3cf3540a370 Boris Brezillon   2018-12-07   680  	/* We must point to the last line when Y reflection is enabled. */
7cd3cf3540a370 Boris Brezillon   2018-12-07   681  	src_y = vc4_state->src_y;
7cd3cf3540a370 Boris Brezillon   2018-12-07   682  	if (rotation & DRM_MODE_REFLECT_Y)
7cd3cf3540a370 Boris Brezillon   2018-12-07   683  		src_y += vc4_state->src_h[0] - 1;
7cd3cf3540a370 Boris Brezillon   2018-12-07   684  
e065a8dd30af70 Dave Stevenson    2018-03-16   685  	switch (base_format_mod) {
98830d91da082b Eric Anholt       2017-06-07   686  	case DRM_FORMAT_MOD_LINEAR:
98830d91da082b Eric Anholt       2017-06-07   687  		tiling = SCALER_CTL0_TILING_LINEAR;
98830d91da082b Eric Anholt       2017-06-07   688  		pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH);
a65511b1cd78e0 Boris Brezillon   2018-08-03   689  
a65511b1cd78e0 Boris Brezillon   2018-08-03   690  		/* Adjust the base pointer to the first pixel to be scanned
a65511b1cd78e0 Boris Brezillon   2018-08-03   691  		 * out.
a65511b1cd78e0 Boris Brezillon   2018-08-03   692  		 */
a65511b1cd78e0 Boris Brezillon   2018-08-03   693  		for (i = 0; i < num_planes; i++) {
7cd3cf3540a370 Boris Brezillon   2018-12-07   694  			vc4_state->offsets[i] += src_y /
a65511b1cd78e0 Boris Brezillon   2018-08-03   695  						 (i ? v_subsample : 1) *
a65511b1cd78e0 Boris Brezillon   2018-08-03   696  						 fb->pitches[i];
7cd3cf3540a370 Boris Brezillon   2018-12-07   697  
a65511b1cd78e0 Boris Brezillon   2018-08-03   698  			vc4_state->offsets[i] += vc4_state->src_x /
a65511b1cd78e0 Boris Brezillon   2018-08-03   699  						 (i ? h_subsample : 1) *
a65511b1cd78e0 Boris Brezillon   2018-08-03   700  						 fb->format->cpp[i];
a65511b1cd78e0 Boris Brezillon   2018-08-03   701  		}
3e407417b1928e Boris Brezillon   2018-08-03   702  
98830d91da082b Eric Anholt       2017-06-07   703  		break;
652badb9458b41 Eric Anholt       2017-09-27   704  
652badb9458b41 Eric Anholt       2017-09-27   705  	case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: {
652badb9458b41 Eric Anholt       2017-09-27   706  		u32 tile_size_shift = 12; /* T tiles are 4kb */
3e407417b1928e Boris Brezillon   2018-08-03   707  		/* Whole-tile offsets, mostly for setting the pitch. */
3e407417b1928e Boris Brezillon   2018-08-03   708  		u32 tile_w_shift = fb->format->cpp[0] == 2 ? 6 : 5;
652badb9458b41 Eric Anholt       2017-09-27   709  		u32 tile_h_shift = 5; /* 16 and 32bpp are 32 pixels high */
3e407417b1928e Boris Brezillon   2018-08-03   710  		u32 tile_w_mask = (1 << tile_w_shift) - 1;
3e407417b1928e Boris Brezillon   2018-08-03   711  		/* The height mask on 32-bit-per-pixel tiles is 63, i.e. twice
3e407417b1928e Boris Brezillon   2018-08-03   712  		 * the height (in pixels) of a 4k tile.
3e407417b1928e Boris Brezillon   2018-08-03   713  		 */
3e407417b1928e Boris Brezillon   2018-08-03   714  		u32 tile_h_mask = (2 << tile_h_shift) - 1;
3e407417b1928e Boris Brezillon   2018-08-03   715  		/* For T-tiled, the FB pitch is "how many bytes from one row to
3e407417b1928e Boris Brezillon   2018-08-03   716  		 * the next, such that
3e407417b1928e Boris Brezillon   2018-08-03   717  		 *
3e407417b1928e Boris Brezillon   2018-08-03   718  		 *	pitch * tile_h == tile_size * tiles_per_row
3e407417b1928e Boris Brezillon   2018-08-03   719  		 */
652badb9458b41 Eric Anholt       2017-09-27   720  		u32 tiles_w = fb->pitches[0] >> (tile_size_shift - tile_h_shift);
3e407417b1928e Boris Brezillon   2018-08-03   721  		u32 tiles_l = vc4_state->src_x >> tile_w_shift;
3e407417b1928e Boris Brezillon   2018-08-03   722  		u32 tiles_r = tiles_w - tiles_l;
7cd3cf3540a370 Boris Brezillon   2018-12-07   723  		u32 tiles_t = src_y >> tile_h_shift;
3e407417b1928e Boris Brezillon   2018-08-03   724  		/* Intra-tile offsets, which modify the base address (the
3e407417b1928e Boris Brezillon   2018-08-03   725  		 * SCALER_PITCH0_TILE_Y_OFFSET tells HVS how to walk from that
3e407417b1928e Boris Brezillon   2018-08-03   726  		 * base address).
3e407417b1928e Boris Brezillon   2018-08-03   727  		 */
7cd3cf3540a370 Boris Brezillon   2018-12-07   728  		u32 tile_y = (src_y >> 4) & 1;
7cd3cf3540a370 Boris Brezillon   2018-12-07   729  		u32 subtile_y = (src_y >> 2) & 3;
7cd3cf3540a370 Boris Brezillon   2018-12-07   730  		u32 utile_y = src_y & 3;
3e407417b1928e Boris Brezillon   2018-08-03   731  		u32 x_off = vc4_state->src_x & tile_w_mask;
7cd3cf3540a370 Boris Brezillon   2018-12-07   732  		u32 y_off = src_y & tile_h_mask;
7cd3cf3540a370 Boris Brezillon   2018-12-07   733  
7cd3cf3540a370 Boris Brezillon   2018-12-07   734  		/* When Y reflection is requested we must set the
7cd3cf3540a370 Boris Brezillon   2018-12-07   735  		 * SCALER_PITCH0_TILE_LINE_DIR flag to tell HVS that all lines
7cd3cf3540a370 Boris Brezillon   2018-12-07   736  		 * after the initial one should be fetched in descending order,
7cd3cf3540a370 Boris Brezillon   2018-12-07   737  		 * which makes sense since we start from the last line and go
7cd3cf3540a370 Boris Brezillon   2018-12-07   738  		 * backward.
7cd3cf3540a370 Boris Brezillon   2018-12-07   739  		 * Don't know why we need y_off = max_y_off - y_off, but it's
7cd3cf3540a370 Boris Brezillon   2018-12-07   740  		 * definitely required (I guess it's also related to the "going
7cd3cf3540a370 Boris Brezillon   2018-12-07   741  		 * backward" situation).
7cd3cf3540a370 Boris Brezillon   2018-12-07   742  		 */
7cd3cf3540a370 Boris Brezillon   2018-12-07   743  		if (rotation & DRM_MODE_REFLECT_Y) {
7cd3cf3540a370 Boris Brezillon   2018-12-07   744  			y_off = tile_h_mask - y_off;
7cd3cf3540a370 Boris Brezillon   2018-12-07   745  			pitch0 = SCALER_PITCH0_TILE_LINE_DIR;
7cd3cf3540a370 Boris Brezillon   2018-12-07   746  		} else {
7cd3cf3540a370 Boris Brezillon   2018-12-07   747  			pitch0 = 0;
7cd3cf3540a370 Boris Brezillon   2018-12-07   748  		}
652badb9458b41 Eric Anholt       2017-09-27   749  
98830d91da082b Eric Anholt       2017-06-07   750  		tiling = SCALER_CTL0_TILING_256B_OR_T;
7cd3cf3540a370 Boris Brezillon   2018-12-07   751  		pitch0 |= (VC4_SET_FIELD(x_off, SCALER_PITCH0_SINK_PIX) |
3e407417b1928e Boris Brezillon   2018-08-03   752  			   VC4_SET_FIELD(y_off, SCALER_PITCH0_TILE_Y_OFFSET) |
3e407417b1928e Boris Brezillon   2018-08-03   753  			   VC4_SET_FIELD(tiles_l, SCALER_PITCH0_TILE_WIDTH_L) |
3e407417b1928e Boris Brezillon   2018-08-03   754  			   VC4_SET_FIELD(tiles_r, SCALER_PITCH0_TILE_WIDTH_R));
3e407417b1928e Boris Brezillon   2018-08-03   755  		vc4_state->offsets[0] += tiles_t * (tiles_w << tile_size_shift);
3e407417b1928e Boris Brezillon   2018-08-03   756  		vc4_state->offsets[0] += subtile_y << 8;
3e407417b1928e Boris Brezillon   2018-08-03   757  		vc4_state->offsets[0] += utile_y << 4;
3e407417b1928e Boris Brezillon   2018-08-03   758  
3e407417b1928e Boris Brezillon   2018-08-03   759  		/* Rows of tiles alternate left-to-right and right-to-left. */
3e407417b1928e Boris Brezillon   2018-08-03   760  		if (tiles_t & 1) {
3e407417b1928e Boris Brezillon   2018-08-03   761  			pitch0 |= SCALER_PITCH0_TILE_INITIAL_LINE_DIR;
3e407417b1928e Boris Brezillon   2018-08-03   762  			vc4_state->offsets[0] += (tiles_w - tiles_l) <<
3e407417b1928e Boris Brezillon   2018-08-03   763  						 tile_size_shift;
3e407417b1928e Boris Brezillon   2018-08-03   764  			vc4_state->offsets[0] -= (1 + !tile_y) << 10;
3e407417b1928e Boris Brezillon   2018-08-03   765  		} else {
3e407417b1928e Boris Brezillon   2018-08-03   766  			vc4_state->offsets[0] += tiles_l << tile_size_shift;
3e407417b1928e Boris Brezillon   2018-08-03   767  			vc4_state->offsets[0] += tile_y << 10;
3e407417b1928e Boris Brezillon   2018-08-03   768  		}
98830d91da082b Eric Anholt       2017-06-07   769  
98830d91da082b Eric Anholt       2017-06-07   770  		break;
652badb9458b41 Eric Anholt       2017-09-27   771  	}
652badb9458b41 Eric Anholt       2017-09-27   772  
e065a8dd30af70 Dave Stevenson    2018-03-16   773  	case DRM_FORMAT_MOD_BROADCOM_SAND64:
e065a8dd30af70 Dave Stevenson    2018-03-16   774  	case DRM_FORMAT_MOD_BROADCOM_SAND128:
e065a8dd30af70 Dave Stevenson    2018-03-16   775  	case DRM_FORMAT_MOD_BROADCOM_SAND256: {
e065a8dd30af70 Dave Stevenson    2018-03-16   776  		uint32_t param = fourcc_mod_broadcom_param(fb->modifier);
8e75d582db02bc Boris Brezillon   2018-12-07   777  		u32 tile_w, tile, x_off, pix_per_tile;
e065a8dd30af70 Dave Stevenson    2018-03-16   778  
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   779  		if (fb->format->format == DRM_FORMAT_P030) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   780  			/*
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   781  			 * Spec says: bits [31:4] of the given address should point to
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   782  			 * the 128-bit word containing the desired starting pixel,
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   783  			 * and bits[3:0] should be between 0 and 11, indicating which
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   784  			 * of the 12-pixels in that 128-bit word is the first pixel to be used
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   785  			 */
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   786  	                u32 remaining_pixels = vc4_state->src_x % 96;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   787  			u32 aligned = remaining_pixels / 12;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   788  			u32 last_bits = remaining_pixels % 12;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   789  
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   790  			x_off = aligned * 16 + last_bits;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   791  			hvs_format = HVS_PIXEL_FORMAT_YCBCR_10BIT;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   792  			tiling = SCALER_CTL0_TILING_128B;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   793  			tile_w = 128;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   794  			pix_per_tile = 96;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   795  		} else {
e065a8dd30af70 Dave Stevenson    2018-03-16   796  			hvs_format = HVS_PIXEL_FORMAT_H264;
e065a8dd30af70 Dave Stevenson    2018-03-16   797  
e065a8dd30af70 Dave Stevenson    2018-03-16   798  			switch (base_format_mod) {
e065a8dd30af70 Dave Stevenson    2018-03-16   799  			case DRM_FORMAT_MOD_BROADCOM_SAND64:
e065a8dd30af70 Dave Stevenson    2018-03-16   800  				tiling = SCALER_CTL0_TILING_64B;
8e75d582db02bc Boris Brezillon   2018-12-07   801  				tile_w = 64;
e065a8dd30af70 Dave Stevenson    2018-03-16   802  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   803  			case DRM_FORMAT_MOD_BROADCOM_SAND128:
e065a8dd30af70 Dave Stevenson    2018-03-16   804  				tiling = SCALER_CTL0_TILING_128B;
8e75d582db02bc Boris Brezillon   2018-12-07   805  				tile_w = 128;
e065a8dd30af70 Dave Stevenson    2018-03-16   806  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   807  			case DRM_FORMAT_MOD_BROADCOM_SAND256:
e065a8dd30af70 Dave Stevenson    2018-03-16   808  				tiling = SCALER_CTL0_TILING_256B_OR_T;
8e75d582db02bc Boris Brezillon   2018-12-07   809  				tile_w = 256;
e065a8dd30af70 Dave Stevenson    2018-03-16   810  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16  @811  			default:
e065a8dd30af70 Dave Stevenson    2018-03-16   812  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   813  			}
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   814  			pix_per_tile = tile_w / fb->format->cpp[0];
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   815  			x_off = (vc4_state->src_x % pix_per_tile) /
d4c05e7a5da7b6 Dave Stevenson    2021-11-17  @816  				(i ? h_subsample : 1) * fb->format->cpp[i];
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   817  		}
e065a8dd30af70 Dave Stevenson    2018-03-16   818  		if (param > SCALER_TILE_HEIGHT_MASK) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   819  			DRM_DEBUG_KMS("SAND height too large (%d)\n",
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   820  				      param);
e065a8dd30af70 Dave Stevenson    2018-03-16   821  			return -EINVAL;
e065a8dd30af70 Dave Stevenson    2018-03-16   822  		}
8e75d582db02bc Boris Brezillon   2018-12-07   823  		tile = vc4_state->src_x / pix_per_tile;
8e75d582db02bc Boris Brezillon   2018-12-07   824  		/* Adjust the base pointer to the first pixel to be scanned
8e75d582db02bc Boris Brezillon   2018-12-07   825  		 * out.
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   826  		 *
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   827  		 * For P030, y_ptr [31:4] is the 128bit word for the start pixel
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   828  		 * y_ptr [3:0] is the pixel (0-11) contained within that 128bit
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   829  		 * word that should be taken as the first pixel.
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   830  		 * Ditto uv_ptr [31:4] vs [3:0], however [3:0] contains the
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   831  		 * element within the 128bit word, eg for pixel 3 the value
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   832  		 * should be 6.
8e75d582db02bc Boris Brezillon   2018-12-07   833  		 */
8e75d582db02bc Boris Brezillon   2018-12-07   834  		for (i = 0; i < num_planes; i++) {
8e75d582db02bc Boris Brezillon   2018-12-07   835  			vc4_state->offsets[i] += param * tile_w * tile;
7cd3cf3540a370 Boris Brezillon   2018-12-07   836  			vc4_state->offsets[i] += src_y /
8e75d582db02bc Boris Brezillon   2018-12-07   837  						 (i ? v_subsample : 1) *
8e75d582db02bc Boris Brezillon   2018-12-07   838  						 tile_w;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   839  			vc4_state->offsets[i] += x_off & ~(i ? 1 : 0);
8e75d582db02bc Boris Brezillon   2018-12-07   840  		}
8e75d582db02bc Boris Brezillon   2018-12-07   841  
e065a8dd30af70 Dave Stevenson    2018-03-16   842  		pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT);
e065a8dd30af70 Dave Stevenson    2018-03-16   843  		break;
e065a8dd30af70 Dave Stevenson    2018-03-16   844  	}
e065a8dd30af70 Dave Stevenson    2018-03-16   845  
98830d91da082b Eric Anholt       2017-06-07   846  	default:
98830d91da082b Eric Anholt       2017-06-07   847  		DRM_DEBUG_KMS("Unsupported FB tiling flag 0x%16llx",
98830d91da082b Eric Anholt       2017-06-07   848  			      (long long)fb->modifier);
98830d91da082b Eric Anholt       2017-06-07   849  		return -EINVAL;
98830d91da082b Eric Anholt       2017-06-07   850  	}
98830d91da082b Eric Anholt       2017-06-07   851  
c54619b0bfb35c Dave Stevenson    2020-09-03   852  	/* Don't waste cycles mixing with plane alpha if the set alpha
c54619b0bfb35c Dave Stevenson    2020-09-03   853  	 * is opaque or there is no per-pixel alpha information.
c54619b0bfb35c Dave Stevenson    2020-09-03   854  	 * In any case we use the alpha property value as the fixed alpha.
c54619b0bfb35c Dave Stevenson    2020-09-03   855  	 */
c54619b0bfb35c Dave Stevenson    2020-09-03   856  	mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE &&
c54619b0bfb35c Dave Stevenson    2020-09-03   857  			  fb->format->has_alpha;
c54619b0bfb35c Dave Stevenson    2020-09-03   858  
c54619b0bfb35c Dave Stevenson    2020-09-03   859  	if (!vc4->hvs->hvs5) {
21af94cf1a4c2d Eric Anholt       2015-10-20   860  	/* Control word */
c8b75bca92cbf0 Eric Anholt       2015-03-02   861  		vc4_dlist_write(vc4_state,
c8b75bca92cbf0 Eric Anholt       2015-03-02   862  				SCALER_CTL0_VALID |
7cd3cf3540a370 Boris Brezillon   2018-12-07   863  				(rotation & DRM_MODE_REFLECT_X ? SCALER_CTL0_HFLIP : 0) |
7cd3cf3540a370 Boris Brezillon   2018-12-07   864  				(rotation & DRM_MODE_REFLECT_Y ? SCALER_CTL0_VFLIP : 0) |
3257ec797d3a8c Maxime Ripard     2018-05-17   865  				VC4_SET_FIELD(SCALER_CTL0_RGBA_EXPAND_ROUND, SCALER_CTL0_RGBA_EXPAND) |
c8b75bca92cbf0 Eric Anholt       2015-03-02   866  				(format->pixel_order << SCALER_CTL0_ORDER_SHIFT) |
e065a8dd30af70 Dave Stevenson    2018-03-16   867  				(hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
98830d91da082b Eric Anholt       2017-06-07   868  				VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
21af94cf1a4c2d Eric Anholt       2015-10-20   869  				(vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) |
fc04023fafecf1 Eric Anholt       2015-12-30   870  				VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
fc04023fafecf1 Eric Anholt       2015-12-30   871  				VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1));
c8b75bca92cbf0 Eric Anholt       2015-03-02   872  
c8b75bca92cbf0 Eric Anholt       2015-03-02   873  		/* Position Word 0: Image Positions and Alpha Value */
6674a904d68041 Eric Anholt       2015-12-30   874  		vc4_state->pos0_offset = vc4_state->dlist_count;
c8b75bca92cbf0 Eric Anholt       2015-03-02   875  		vc4_dlist_write(vc4_state,
22445f0316a253 Stefan Schake     2018-04-20   876  				VC4_SET_FIELD(state->alpha >> 8, SCALER_POS0_FIXED_ALPHA) |
5c6799942003df Eric Anholt       2015-12-28   877  				VC4_SET_FIELD(vc4_state->crtc_x, SCALER_POS0_START_X) |
5c6799942003df Eric Anholt       2015-12-28   878  				VC4_SET_FIELD(vc4_state->crtc_y, SCALER_POS0_START_Y));
c8b75bca92cbf0 Eric Anholt       2015-03-02   879  
21af94cf1a4c2d Eric Anholt       2015-10-20   880  		/* Position Word 1: Scaled Image Dimensions. */
21af94cf1a4c2d Eric Anholt       2015-10-20   881  		if (!vc4_state->is_unity) {
21af94cf1a4c2d Eric Anholt       2015-10-20   882  			vc4_dlist_write(vc4_state,
21af94cf1a4c2d Eric Anholt       2015-10-20   883  					VC4_SET_FIELD(vc4_state->crtc_w,
21af94cf1a4c2d Eric Anholt       2015-10-20   884  						      SCALER_POS1_SCL_WIDTH) |
21af94cf1a4c2d Eric Anholt       2015-10-20   885  					VC4_SET_FIELD(vc4_state->crtc_h,
21af94cf1a4c2d Eric Anholt       2015-10-20   886  						      SCALER_POS1_SCL_HEIGHT));
21af94cf1a4c2d Eric Anholt       2015-10-20   887  		}
c8b75bca92cbf0 Eric Anholt       2015-03-02   888  
05202c241f1476 Stefan Schake     2018-03-09   889  		/* Position Word 2: Source Image Size, Alpha */
6674a904d68041 Eric Anholt       2015-12-30   890  		vc4_state->pos2_offset = vc4_state->dlist_count;
c8b75bca92cbf0 Eric Anholt       2015-03-02   891  		vc4_dlist_write(vc4_state,
124e5dac9a596a Maxime Ripard     2017-12-22   892  				VC4_SET_FIELD(fb->format->has_alpha ?
c8b75bca92cbf0 Eric Anholt       2015-03-02   893  					      SCALER_POS2_ALPHA_MODE_PIPELINE :
c8b75bca92cbf0 Eric Anholt       2015-03-02   894  					      SCALER_POS2_ALPHA_MODE_FIXED,
c8b75bca92cbf0 Eric Anholt       2015-03-02   895  					      SCALER_POS2_ALPHA_MODE) |
22445f0316a253 Stefan Schake     2018-04-20   896  				(mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   897  				(fb->format->has_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   898  						SCALER_POS2_ALPHA_PREMULT : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   899  				VC4_SET_FIELD(vc4_state->src_w[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   900  					      SCALER_POS2_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   901  				VC4_SET_FIELD(vc4_state->src_h[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   902  					      SCALER_POS2_HEIGHT));
c54619b0bfb35c Dave Stevenson    2020-09-03   903  
c54619b0bfb35c Dave Stevenson    2020-09-03   904  		/* Position Word 3: Context.  Written by the HVS. */
c54619b0bfb35c Dave Stevenson    2020-09-03   905  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c54619b0bfb35c Dave Stevenson    2020-09-03   906  
c54619b0bfb35c Dave Stevenson    2020-09-03   907  	} else {
c54619b0bfb35c Dave Stevenson    2020-09-03   908  		u32 hvs_pixel_order = format->pixel_order;
c54619b0bfb35c Dave Stevenson    2020-09-03   909  
c54619b0bfb35c Dave Stevenson    2020-09-03   910  		if (format->pixel_order_hvs5)
c54619b0bfb35c Dave Stevenson    2020-09-03   911  			hvs_pixel_order = format->pixel_order_hvs5;
c54619b0bfb35c Dave Stevenson    2020-09-03   912  
c54619b0bfb35c Dave Stevenson    2020-09-03   913  		/* Control word */
c54619b0bfb35c Dave Stevenson    2020-09-03   914  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   915  				SCALER_CTL0_VALID |
c54619b0bfb35c Dave Stevenson    2020-09-03   916  				(hvs_pixel_order << SCALER_CTL0_ORDER_SHIFT) |
c54619b0bfb35c Dave Stevenson    2020-09-03   917  				(hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
c54619b0bfb35c Dave Stevenson    2020-09-03   918  				VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
c54619b0bfb35c Dave Stevenson    2020-09-03   919  				(vc4_state->is_unity ?
c54619b0bfb35c Dave Stevenson    2020-09-03   920  						SCALER5_CTL0_UNITY : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   921  				VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   922  				VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1) |
c54619b0bfb35c Dave Stevenson    2020-09-03   923  				SCALER5_CTL0_ALPHA_EXPAND |
c54619b0bfb35c Dave Stevenson    2020-09-03   924  				SCALER5_CTL0_RGB_EXPAND);
c54619b0bfb35c Dave Stevenson    2020-09-03   925  
c54619b0bfb35c Dave Stevenson    2020-09-03   926  		/* Position Word 0: Image Positions and Alpha Value */
c54619b0bfb35c Dave Stevenson    2020-09-03   927  		vc4_state->pos0_offset = vc4_state->dlist_count;
c54619b0bfb35c Dave Stevenson    2020-09-03   928  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   929  				(rotation & DRM_MODE_REFLECT_Y ?
c54619b0bfb35c Dave Stevenson    2020-09-03   930  						SCALER5_POS0_VFLIP : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   931  				VC4_SET_FIELD(vc4_state->crtc_x,
c54619b0bfb35c Dave Stevenson    2020-09-03   932  					      SCALER_POS0_START_X) |
c54619b0bfb35c Dave Stevenson    2020-09-03   933  				(rotation & DRM_MODE_REFLECT_X ?
c54619b0bfb35c Dave Stevenson    2020-09-03   934  					      SCALER5_POS0_HFLIP : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   935  				VC4_SET_FIELD(vc4_state->crtc_y,
c54619b0bfb35c Dave Stevenson    2020-09-03   936  					      SCALER5_POS0_START_Y)
c54619b0bfb35c Dave Stevenson    2020-09-03   937  			       );
c54619b0bfb35c Dave Stevenson    2020-09-03   938  
c54619b0bfb35c Dave Stevenson    2020-09-03   939  		/* Control Word 2 */
c54619b0bfb35c Dave Stevenson    2020-09-03   940  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   941  				VC4_SET_FIELD(state->alpha >> 4,
c54619b0bfb35c Dave Stevenson    2020-09-03   942  					      SCALER5_CTL2_ALPHA) |
4494346392204a Nathan Chancellor 2020-09-10   943  				(fb->format->has_alpha ?
4494346392204a Nathan Chancellor 2020-09-10   944  					SCALER5_CTL2_ALPHA_PREMULT : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   945  				(mix_plane_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   946  					SCALER5_CTL2_ALPHA_MIX : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   947  				VC4_SET_FIELD(fb->format->has_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   948  				      SCALER5_CTL2_ALPHA_MODE_PIPELINE :
c54619b0bfb35c Dave Stevenson    2020-09-03   949  				      SCALER5_CTL2_ALPHA_MODE_FIXED,
c54619b0bfb35c Dave Stevenson    2020-09-03   950  				      SCALER5_CTL2_ALPHA_MODE)
c54619b0bfb35c Dave Stevenson    2020-09-03   951  			       );
c54619b0bfb35c Dave Stevenson    2020-09-03   952  
c54619b0bfb35c Dave Stevenson    2020-09-03   953  		/* Position Word 1: Scaled Image Dimensions. */
c54619b0bfb35c Dave Stevenson    2020-09-03   954  		if (!vc4_state->is_unity) {
c54619b0bfb35c Dave Stevenson    2020-09-03   955  			vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   956  					VC4_SET_FIELD(vc4_state->crtc_w,
f6b57101a6b312 Dom Cobley        2021-01-21   957  						      SCALER5_POS1_SCL_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   958  					VC4_SET_FIELD(vc4_state->crtc_h,
f6b57101a6b312 Dom Cobley        2021-01-21   959  						      SCALER5_POS1_SCL_HEIGHT));
c54619b0bfb35c Dave Stevenson    2020-09-03   960  		}
c54619b0bfb35c Dave Stevenson    2020-09-03   961  
c54619b0bfb35c Dave Stevenson    2020-09-03   962  		/* Position Word 2: Source Image Size */
c54619b0bfb35c Dave Stevenson    2020-09-03   963  		vc4_state->pos2_offset = vc4_state->dlist_count;
c54619b0bfb35c Dave Stevenson    2020-09-03   964  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   965  				VC4_SET_FIELD(vc4_state->src_w[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   966  					      SCALER5_POS2_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   967  				VC4_SET_FIELD(vc4_state->src_h[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   968  					      SCALER5_POS2_HEIGHT));
c8b75bca92cbf0 Eric Anholt       2015-03-02   969  
c8b75bca92cbf0 Eric Anholt       2015-03-02   970  		/* Position Word 3: Context.  Written by the HVS. */
c8b75bca92cbf0 Eric Anholt       2015-03-02   971  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c54619b0bfb35c Dave Stevenson    2020-09-03   972  	}
c8b75bca92cbf0 Eric Anholt       2015-03-02   973  
fc04023fafecf1 Eric Anholt       2015-12-30   974  
fc04023fafecf1 Eric Anholt       2015-12-30   975  	/* Pointer Word 0/1/2: RGB / Y / Cb / Cr Pointers
fc04023fafecf1 Eric Anholt       2015-12-30   976  	 *
fc04023fafecf1 Eric Anholt       2015-12-30   977  	 * The pointers may be any byte address.
fc04023fafecf1 Eric Anholt       2015-12-30   978  	 */
6674a904d68041 Eric Anholt       2015-12-30   979  	vc4_state->ptr0_offset = vc4_state->dlist_count;
fc04023fafecf1 Eric Anholt       2015-12-30   980  	for (i = 0; i < num_planes; i++)
fc04023fafecf1 Eric Anholt       2015-12-30   981  		vc4_dlist_write(vc4_state, vc4_state->offsets[i]);
c8b75bca92cbf0 Eric Anholt       2015-03-02   982  
fc04023fafecf1 Eric Anholt       2015-12-30   983  	/* Pointer Context Word 0/1/2: Written by the HVS */
fc04023fafecf1 Eric Anholt       2015-12-30   984  	for (i = 0; i < num_planes; i++)
c8b75bca92cbf0 Eric Anholt       2015-03-02   985  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c8b75bca92cbf0 Eric Anholt       2015-03-02   986  
98830d91da082b Eric Anholt       2017-06-07   987  	/* Pitch word 0 */
98830d91da082b Eric Anholt       2017-06-07   988  	vc4_dlist_write(vc4_state, pitch0);
98830d91da082b Eric Anholt       2017-06-07   989  
98830d91da082b Eric Anholt       2017-06-07   990  	/* Pitch word 1/2 */
98830d91da082b Eric Anholt       2017-06-07   991  	for (i = 1; i < num_planes; i++) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   992  		if (hvs_format != HVS_PIXEL_FORMAT_H264 &&
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   993  		    hvs_format != HVS_PIXEL_FORMAT_YCBCR_10BIT) {
c8b75bca92cbf0 Eric Anholt       2015-03-02   994  			vc4_dlist_write(vc4_state,
e065a8dd30af70 Dave Stevenson    2018-03-16   995  					VC4_SET_FIELD(fb->pitches[i],
e065a8dd30af70 Dave Stevenson    2018-03-16   996  						      SCALER_SRC_PITCH));
e065a8dd30af70 Dave Stevenson    2018-03-16   997  		} else {
e065a8dd30af70 Dave Stevenson    2018-03-16   998  			vc4_dlist_write(vc4_state, pitch0);
e065a8dd30af70 Dave Stevenson    2018-03-16   999  		}
fc04023fafecf1 Eric Anholt       2015-12-30  1000  	}
fc04023fafecf1 Eric Anholt       2015-12-30  1001  
fc04023fafecf1 Eric Anholt       2015-12-30  1002  	/* Colorspace conversion words */
fc04023fafecf1 Eric Anholt       2015-12-30  1003  	if (vc4_state->is_yuv) {
fc04023fafecf1 Eric Anholt       2015-12-30  1004  		vc4_dlist_write(vc4_state, SCALER_CSC0_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1005  		vc4_dlist_write(vc4_state, SCALER_CSC1_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1006  		vc4_dlist_write(vc4_state, SCALER_CSC2_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1007  	}
c8b75bca92cbf0 Eric Anholt       2015-03-02  1008  
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1009  	vc4_state->lbm_offset = 0;
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1010  
658d8cbd07dae2 Boris Brezillon   2018-07-25  1011  	if (vc4_state->x_scaling[0] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1012  	    vc4_state->x_scaling[1] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1013  	    vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1014  	    vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1015  		/* Reserve a slot for the LBM Base Address. The real value will
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1016  		 * be set when calling vc4_plane_allocate_lbm().
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1017  		 */
fc04023fafecf1 Eric Anholt       2015-12-30  1018  		if (vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
facd93f4285c40 Maxime Ripard     2021-01-29  1019  		    vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
facd93f4285c40 Maxime Ripard     2021-01-29  1020  			vc4_state->lbm_offset = vc4_state->dlist_count;
facd93f4285c40 Maxime Ripard     2021-01-29  1021  			vc4_dlist_counter_increment(vc4_state);
facd93f4285c40 Maxime Ripard     2021-01-29  1022  		}
21af94cf1a4c2d Eric Anholt       2015-10-20  1023  
fc04023fafecf1 Eric Anholt       2015-12-30  1024  		if (num_planes > 1) {
fc04023fafecf1 Eric Anholt       2015-12-30  1025  			/* Emit Cb/Cr as channel 0 and Y as channel
fc04023fafecf1 Eric Anholt       2015-12-30  1026  			 * 1. This matches how we set up scl0/scl1
fc04023fafecf1 Eric Anholt       2015-12-30  1027  			 * above.
fc04023fafecf1 Eric Anholt       2015-12-30  1028  			 */
fc04023fafecf1 Eric Anholt       2015-12-30  1029  			vc4_write_scaling_parameters(state, 1);
fc04023fafecf1 Eric Anholt       2015-12-30  1030  		}
fc04023fafecf1 Eric Anholt       2015-12-30  1031  		vc4_write_scaling_parameters(state, 0);
21af94cf1a4c2d Eric Anholt       2015-10-20  1032  
21af94cf1a4c2d Eric Anholt       2015-10-20  1033  		/* If any PPF setup was done, then all the kernel
21af94cf1a4c2d Eric Anholt       2015-10-20  1034  		 * pointers get uploaded.
21af94cf1a4c2d Eric Anholt       2015-10-20  1035  		 */
fc04023fafecf1 Eric Anholt       2015-12-30  1036  		if (vc4_state->x_scaling[0] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1037  		    vc4_state->y_scaling[0] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1038  		    vc4_state->x_scaling[1] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1039  		    vc4_state->y_scaling[1] == VC4_SCALING_PPF) {
21af94cf1a4c2d Eric Anholt       2015-10-20  1040  			u32 kernel = VC4_SET_FIELD(vc4->hvs->mitchell_netravali_filter.start,
21af94cf1a4c2d Eric Anholt       2015-10-20  1041  						   SCALER_PPF_KERNEL_OFFSET);
21af94cf1a4c2d Eric Anholt       2015-10-20  1042  
21af94cf1a4c2d Eric Anholt       2015-10-20  1043  			/* HPPF plane 0 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1044  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1045  			/* VPPF plane 0 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1046  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1047  			/* HPPF plane 1 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1048  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1049  			/* VPPF plane 1 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1050  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1051  		}
21af94cf1a4c2d Eric Anholt       2015-10-20  1052  	}
21af94cf1a4c2d Eric Anholt       2015-10-20  1053  
c8b75bca92cbf0 Eric Anholt       2015-03-02  1054  	vc4_state->dlist[ctl0_offset] |=
c8b75bca92cbf0 Eric Anholt       2015-03-02  1055  		VC4_SET_FIELD(vc4_state->dlist_count, SCALER_CTL0_SIZE);
c8b75bca92cbf0 Eric Anholt       2015-03-02  1056  
3d67b68a6a3c2d Stefan Schake     2018-03-09  1057  	/* crtc_* are already clipped coordinates. */
3d67b68a6a3c2d Stefan Schake     2018-03-09  1058  	covers_screen = vc4_state->crtc_x == 0 && vc4_state->crtc_y == 0 &&
3d67b68a6a3c2d Stefan Schake     2018-03-09  1059  			vc4_state->crtc_w == state->crtc->mode.hdisplay &&
3d67b68a6a3c2d Stefan Schake     2018-03-09  1060  			vc4_state->crtc_h == state->crtc->mode.vdisplay;
3d67b68a6a3c2d Stefan Schake     2018-03-09  1061  	/* Background fill might be necessary when the plane has per-pixel
22445f0316a253 Stefan Schake     2018-04-20  1062  	 * alpha content or a non-opaque plane alpha and could blend from the
22445f0316a253 Stefan Schake     2018-04-20  1063  	 * background or does not cover the entire screen.
3d67b68a6a3c2d Stefan Schake     2018-03-09  1064  	 */
22445f0316a253 Stefan Schake     2018-04-20  1065  	vc4_state->needs_bg_fill = fb->format->has_alpha || !covers_screen ||
22445f0316a253 Stefan Schake     2018-04-20  1066  				   state->alpha != DRM_BLEND_ALPHA_OPAQUE;
3d67b68a6a3c2d Stefan Schake     2018-03-09  1067  
8d93844965c3d5 Boris Brezillon   2018-11-30  1068  	/* Flag the dlist as initialized to avoid checking it twice in case
8d93844965c3d5 Boris Brezillon   2018-11-30  1069  	 * the async update check already called vc4_plane_mode_set() and
8d93844965c3d5 Boris Brezillon   2018-11-30  1070  	 * decided to fallback to sync update because async update was not
8d93844965c3d5 Boris Brezillon   2018-11-30  1071  	 * possible.
8d93844965c3d5 Boris Brezillon   2018-11-30  1072  	 */
8d93844965c3d5 Boris Brezillon   2018-11-30  1073  	vc4_state->dlist_initialized = 1;
8d93844965c3d5 Boris Brezillon   2018-11-30  1074  
4686da83154d87 Boris Brezillon   2019-02-20  1075  	vc4_plane_calc_load(state);
4686da83154d87 Boris Brezillon   2019-02-20  1076  
c8b75bca92cbf0 Eric Anholt       2015-03-02  1077  	return 0;
c8b75bca92cbf0 Eric Anholt       2015-03-02  1078  }
c8b75bca92cbf0 Eric Anholt       2015-03-02  1079  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030
@ 2021-11-26  2:18     ` kernel test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-11-26  2:18 UTC (permalink / raw)
  To: Maxime Ripard, Daniel Vetter, David Airlie, Maarten Lankhorst,
	Thomas Zimmermann
  Cc: kbuild-all, Dom Cobley, Tim Gover, Dave Stevenson, llvm,
	dri-devel, Phil Elwell

Hi Maxime,

I love your patch! Perhaps something to improve:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on drm-intel/for-linux-next drm-tip/drm-tip v5.16-rc2 next-20211125]
[cannot apply to anholt/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Maxime-Ripard/drm-vc4-Support-for-30-bits-YUV-formats/20211117-221106
base:   git://anongit.freedesktop.org/drm/drm drm-next
config: x86_64-buildonly-randconfig-r004-20211118 (https://download.01.org/0day-ci/archive/20211126/202111261033.hgimGK21-lkp@intel.com/config)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/d4c05e7a5da7b65c5a37252cc9d2cac75f1f6d78
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Maxime-Ripard/drm-vc4-Support-for-30-bits-YUV-formats/20211117-221106
        git checkout d4c05e7a5da7b65c5a37252cc9d2cac75f1f6d78
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/vc4/vc4_plane.c:811:4: warning: variable 'tile_w' is used uninitialized whenever switch default is taken [-Wsometimes-uninitialized]
                           default:
                           ^~~~~~~
   drivers/gpu/drm/vc4/vc4_plane.c:814:19: note: uninitialized use occurs here
                           pix_per_tile = tile_w / fb->format->cpp[0];
                                          ^~~~~~
   drivers/gpu/drm/vc4/vc4_plane.c:777:13: note: initialize the variable 'tile_w' to silence this warning
                   u32 tile_w, tile, x_off, pix_per_tile;
                             ^
                              = 0
>> drivers/gpu/drm/vc4/vc4_plane.c:816:6: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
                                   (i ? h_subsample : 1) * fb->format->cpp[i];
                                    ^
   drivers/gpu/drm/vc4/vc4_plane.c:652:12: note: initialize the variable 'i' to silence this warning
           int ret, i;
                     ^
                      = 0
   2 warnings generated.


vim +/tile_w +811 drivers/gpu/drm/vc4/vc4_plane.c

0a038c1c29a7a3 Boris Brezillon   2018-11-30   630  
5c6799942003df Eric Anholt       2015-12-28   631  /* Writes out a full display list for an active plane to the plane's
5c6799942003df Eric Anholt       2015-12-28   632   * private dlist state.
5c6799942003df Eric Anholt       2015-12-28   633   */
5c6799942003df Eric Anholt       2015-12-28   634  static int vc4_plane_mode_set(struct drm_plane *plane,
5c6799942003df Eric Anholt       2015-12-28   635  			      struct drm_plane_state *state)
5c6799942003df Eric Anholt       2015-12-28   636  {
21af94cf1a4c2d Eric Anholt       2015-10-20   637  	struct vc4_dev *vc4 = to_vc4_dev(plane->dev);
5c6799942003df Eric Anholt       2015-12-28   638  	struct vc4_plane_state *vc4_state = to_vc4_plane_state(state);
5c6799942003df Eric Anholt       2015-12-28   639  	struct drm_framebuffer *fb = state->fb;
5c6799942003df Eric Anholt       2015-12-28   640  	u32 ctl0_offset = vc4_state->dlist_count;
438b74a5497c36 Ville Syrjälä     2016-12-14   641  	const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
e065a8dd30af70 Dave Stevenson    2018-03-16   642  	u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier);
05c452c115bffa Maxime Ripard     2019-05-16   643  	int num_planes = fb->format->num_planes;
f3e9632cb6241a Maxime Ripard     2019-05-16   644  	u32 h_subsample = fb->format->hsub;
f3e9632cb6241a Maxime Ripard     2019-05-16   645  	u32 v_subsample = fb->format->vsub;
22445f0316a253 Stefan Schake     2018-04-20   646  	bool mix_plane_alpha;
3d67b68a6a3c2d Stefan Schake     2018-03-09   647  	bool covers_screen;
98830d91da082b Eric Anholt       2017-06-07   648  	u32 scl0, scl1, pitch0;
7cd3cf3540a370 Boris Brezillon   2018-12-07   649  	u32 tiling, src_y;
e065a8dd30af70 Dave Stevenson    2018-03-16   650  	u32 hvs_format = format->hvs;
7cd3cf3540a370 Boris Brezillon   2018-12-07   651  	unsigned int rotation;
fc04023fafecf1 Eric Anholt       2015-12-30   652  	int ret, i;
5c6799942003df Eric Anholt       2015-12-28   653  
8d93844965c3d5 Boris Brezillon   2018-11-30   654  	if (vc4_state->dlist_initialized)
8d93844965c3d5 Boris Brezillon   2018-11-30   655  		return 0;
8d93844965c3d5 Boris Brezillon   2018-11-30   656  
5c6799942003df Eric Anholt       2015-12-28   657  	ret = vc4_plane_setup_clipping_and_scaling(state);
21af94cf1a4c2d Eric Anholt       2015-10-20   658  	if (ret)
21af94cf1a4c2d Eric Anholt       2015-10-20   659  		return ret;
21af94cf1a4c2d Eric Anholt       2015-10-20   660  
fc04023fafecf1 Eric Anholt       2015-12-30   661  	/* SCL1 is used for Cb/Cr scaling of planar formats.  For RGB
fc04023fafecf1 Eric Anholt       2015-12-30   662  	 * and 4:4:4, scl1 should be set to scl0 so both channels of
fc04023fafecf1 Eric Anholt       2015-12-30   663  	 * the scaler do the same thing.  For YUV, the Y plane needs
fc04023fafecf1 Eric Anholt       2015-12-30   664  	 * to be put in channel 1 and Cb/Cr in channel 0, so we swap
fc04023fafecf1 Eric Anholt       2015-12-30   665  	 * the scl fields here.
fc04023fafecf1 Eric Anholt       2015-12-30   666  	 */
fc04023fafecf1 Eric Anholt       2015-12-30   667  	if (num_planes == 1) {
9a0e9802217291 Boris Brezillon   2018-05-07   668  		scl0 = vc4_get_scl_field(state, 0);
fc04023fafecf1 Eric Anholt       2015-12-30   669  		scl1 = scl0;
fc04023fafecf1 Eric Anholt       2015-12-30   670  	} else {
fc04023fafecf1 Eric Anholt       2015-12-30   671  		scl0 = vc4_get_scl_field(state, 1);
fc04023fafecf1 Eric Anholt       2015-12-30   672  		scl1 = vc4_get_scl_field(state, 0);
fc04023fafecf1 Eric Anholt       2015-12-30   673  	}
21af94cf1a4c2d Eric Anholt       2015-10-20   674  
7cd3cf3540a370 Boris Brezillon   2018-12-07   675  	rotation = drm_rotation_simplify(state->rotation,
7cd3cf3540a370 Boris Brezillon   2018-12-07   676  					 DRM_MODE_ROTATE_0 |
7cd3cf3540a370 Boris Brezillon   2018-12-07   677  					 DRM_MODE_REFLECT_X |
7cd3cf3540a370 Boris Brezillon   2018-12-07   678  					 DRM_MODE_REFLECT_Y);
7cd3cf3540a370 Boris Brezillon   2018-12-07   679  
7cd3cf3540a370 Boris Brezillon   2018-12-07   680  	/* We must point to the last line when Y reflection is enabled. */
7cd3cf3540a370 Boris Brezillon   2018-12-07   681  	src_y = vc4_state->src_y;
7cd3cf3540a370 Boris Brezillon   2018-12-07   682  	if (rotation & DRM_MODE_REFLECT_Y)
7cd3cf3540a370 Boris Brezillon   2018-12-07   683  		src_y += vc4_state->src_h[0] - 1;
7cd3cf3540a370 Boris Brezillon   2018-12-07   684  
e065a8dd30af70 Dave Stevenson    2018-03-16   685  	switch (base_format_mod) {
98830d91da082b Eric Anholt       2017-06-07   686  	case DRM_FORMAT_MOD_LINEAR:
98830d91da082b Eric Anholt       2017-06-07   687  		tiling = SCALER_CTL0_TILING_LINEAR;
98830d91da082b Eric Anholt       2017-06-07   688  		pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH);
a65511b1cd78e0 Boris Brezillon   2018-08-03   689  
a65511b1cd78e0 Boris Brezillon   2018-08-03   690  		/* Adjust the base pointer to the first pixel to be scanned
a65511b1cd78e0 Boris Brezillon   2018-08-03   691  		 * out.
a65511b1cd78e0 Boris Brezillon   2018-08-03   692  		 */
a65511b1cd78e0 Boris Brezillon   2018-08-03   693  		for (i = 0; i < num_planes; i++) {
7cd3cf3540a370 Boris Brezillon   2018-12-07   694  			vc4_state->offsets[i] += src_y /
a65511b1cd78e0 Boris Brezillon   2018-08-03   695  						 (i ? v_subsample : 1) *
a65511b1cd78e0 Boris Brezillon   2018-08-03   696  						 fb->pitches[i];
7cd3cf3540a370 Boris Brezillon   2018-12-07   697  
a65511b1cd78e0 Boris Brezillon   2018-08-03   698  			vc4_state->offsets[i] += vc4_state->src_x /
a65511b1cd78e0 Boris Brezillon   2018-08-03   699  						 (i ? h_subsample : 1) *
a65511b1cd78e0 Boris Brezillon   2018-08-03   700  						 fb->format->cpp[i];
a65511b1cd78e0 Boris Brezillon   2018-08-03   701  		}
3e407417b1928e Boris Brezillon   2018-08-03   702  
98830d91da082b Eric Anholt       2017-06-07   703  		break;
652badb9458b41 Eric Anholt       2017-09-27   704  
652badb9458b41 Eric Anholt       2017-09-27   705  	case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: {
652badb9458b41 Eric Anholt       2017-09-27   706  		u32 tile_size_shift = 12; /* T tiles are 4kb */
3e407417b1928e Boris Brezillon   2018-08-03   707  		/* Whole-tile offsets, mostly for setting the pitch. */
3e407417b1928e Boris Brezillon   2018-08-03   708  		u32 tile_w_shift = fb->format->cpp[0] == 2 ? 6 : 5;
652badb9458b41 Eric Anholt       2017-09-27   709  		u32 tile_h_shift = 5; /* 16 and 32bpp are 32 pixels high */
3e407417b1928e Boris Brezillon   2018-08-03   710  		u32 tile_w_mask = (1 << tile_w_shift) - 1;
3e407417b1928e Boris Brezillon   2018-08-03   711  		/* The height mask on 32-bit-per-pixel tiles is 63, i.e. twice
3e407417b1928e Boris Brezillon   2018-08-03   712  		 * the height (in pixels) of a 4k tile.
3e407417b1928e Boris Brezillon   2018-08-03   713  		 */
3e407417b1928e Boris Brezillon   2018-08-03   714  		u32 tile_h_mask = (2 << tile_h_shift) - 1;
3e407417b1928e Boris Brezillon   2018-08-03   715  		/* For T-tiled, the FB pitch is "how many bytes from one row to
3e407417b1928e Boris Brezillon   2018-08-03   716  		 * the next, such that
3e407417b1928e Boris Brezillon   2018-08-03   717  		 *
3e407417b1928e Boris Brezillon   2018-08-03   718  		 *	pitch * tile_h == tile_size * tiles_per_row
3e407417b1928e Boris Brezillon   2018-08-03   719  		 */
652badb9458b41 Eric Anholt       2017-09-27   720  		u32 tiles_w = fb->pitches[0] >> (tile_size_shift - tile_h_shift);
3e407417b1928e Boris Brezillon   2018-08-03   721  		u32 tiles_l = vc4_state->src_x >> tile_w_shift;
3e407417b1928e Boris Brezillon   2018-08-03   722  		u32 tiles_r = tiles_w - tiles_l;
7cd3cf3540a370 Boris Brezillon   2018-12-07   723  		u32 tiles_t = src_y >> tile_h_shift;
3e407417b1928e Boris Brezillon   2018-08-03   724  		/* Intra-tile offsets, which modify the base address (the
3e407417b1928e Boris Brezillon   2018-08-03   725  		 * SCALER_PITCH0_TILE_Y_OFFSET tells HVS how to walk from that
3e407417b1928e Boris Brezillon   2018-08-03   726  		 * base address).
3e407417b1928e Boris Brezillon   2018-08-03   727  		 */
7cd3cf3540a370 Boris Brezillon   2018-12-07   728  		u32 tile_y = (src_y >> 4) & 1;
7cd3cf3540a370 Boris Brezillon   2018-12-07   729  		u32 subtile_y = (src_y >> 2) & 3;
7cd3cf3540a370 Boris Brezillon   2018-12-07   730  		u32 utile_y = src_y & 3;
3e407417b1928e Boris Brezillon   2018-08-03   731  		u32 x_off = vc4_state->src_x & tile_w_mask;
7cd3cf3540a370 Boris Brezillon   2018-12-07   732  		u32 y_off = src_y & tile_h_mask;
7cd3cf3540a370 Boris Brezillon   2018-12-07   733  
7cd3cf3540a370 Boris Brezillon   2018-12-07   734  		/* When Y reflection is requested we must set the
7cd3cf3540a370 Boris Brezillon   2018-12-07   735  		 * SCALER_PITCH0_TILE_LINE_DIR flag to tell HVS that all lines
7cd3cf3540a370 Boris Brezillon   2018-12-07   736  		 * after the initial one should be fetched in descending order,
7cd3cf3540a370 Boris Brezillon   2018-12-07   737  		 * which makes sense since we start from the last line and go
7cd3cf3540a370 Boris Brezillon   2018-12-07   738  		 * backward.
7cd3cf3540a370 Boris Brezillon   2018-12-07   739  		 * Don't know why we need y_off = max_y_off - y_off, but it's
7cd3cf3540a370 Boris Brezillon   2018-12-07   740  		 * definitely required (I guess it's also related to the "going
7cd3cf3540a370 Boris Brezillon   2018-12-07   741  		 * backward" situation).
7cd3cf3540a370 Boris Brezillon   2018-12-07   742  		 */
7cd3cf3540a370 Boris Brezillon   2018-12-07   743  		if (rotation & DRM_MODE_REFLECT_Y) {
7cd3cf3540a370 Boris Brezillon   2018-12-07   744  			y_off = tile_h_mask - y_off;
7cd3cf3540a370 Boris Brezillon   2018-12-07   745  			pitch0 = SCALER_PITCH0_TILE_LINE_DIR;
7cd3cf3540a370 Boris Brezillon   2018-12-07   746  		} else {
7cd3cf3540a370 Boris Brezillon   2018-12-07   747  			pitch0 = 0;
7cd3cf3540a370 Boris Brezillon   2018-12-07   748  		}
652badb9458b41 Eric Anholt       2017-09-27   749  
98830d91da082b Eric Anholt       2017-06-07   750  		tiling = SCALER_CTL0_TILING_256B_OR_T;
7cd3cf3540a370 Boris Brezillon   2018-12-07   751  		pitch0 |= (VC4_SET_FIELD(x_off, SCALER_PITCH0_SINK_PIX) |
3e407417b1928e Boris Brezillon   2018-08-03   752  			   VC4_SET_FIELD(y_off, SCALER_PITCH0_TILE_Y_OFFSET) |
3e407417b1928e Boris Brezillon   2018-08-03   753  			   VC4_SET_FIELD(tiles_l, SCALER_PITCH0_TILE_WIDTH_L) |
3e407417b1928e Boris Brezillon   2018-08-03   754  			   VC4_SET_FIELD(tiles_r, SCALER_PITCH0_TILE_WIDTH_R));
3e407417b1928e Boris Brezillon   2018-08-03   755  		vc4_state->offsets[0] += tiles_t * (tiles_w << tile_size_shift);
3e407417b1928e Boris Brezillon   2018-08-03   756  		vc4_state->offsets[0] += subtile_y << 8;
3e407417b1928e Boris Brezillon   2018-08-03   757  		vc4_state->offsets[0] += utile_y << 4;
3e407417b1928e Boris Brezillon   2018-08-03   758  
3e407417b1928e Boris Brezillon   2018-08-03   759  		/* Rows of tiles alternate left-to-right and right-to-left. */
3e407417b1928e Boris Brezillon   2018-08-03   760  		if (tiles_t & 1) {
3e407417b1928e Boris Brezillon   2018-08-03   761  			pitch0 |= SCALER_PITCH0_TILE_INITIAL_LINE_DIR;
3e407417b1928e Boris Brezillon   2018-08-03   762  			vc4_state->offsets[0] += (tiles_w - tiles_l) <<
3e407417b1928e Boris Brezillon   2018-08-03   763  						 tile_size_shift;
3e407417b1928e Boris Brezillon   2018-08-03   764  			vc4_state->offsets[0] -= (1 + !tile_y) << 10;
3e407417b1928e Boris Brezillon   2018-08-03   765  		} else {
3e407417b1928e Boris Brezillon   2018-08-03   766  			vc4_state->offsets[0] += tiles_l << tile_size_shift;
3e407417b1928e Boris Brezillon   2018-08-03   767  			vc4_state->offsets[0] += tile_y << 10;
3e407417b1928e Boris Brezillon   2018-08-03   768  		}
98830d91da082b Eric Anholt       2017-06-07   769  
98830d91da082b Eric Anholt       2017-06-07   770  		break;
652badb9458b41 Eric Anholt       2017-09-27   771  	}
652badb9458b41 Eric Anholt       2017-09-27   772  
e065a8dd30af70 Dave Stevenson    2018-03-16   773  	case DRM_FORMAT_MOD_BROADCOM_SAND64:
e065a8dd30af70 Dave Stevenson    2018-03-16   774  	case DRM_FORMAT_MOD_BROADCOM_SAND128:
e065a8dd30af70 Dave Stevenson    2018-03-16   775  	case DRM_FORMAT_MOD_BROADCOM_SAND256: {
e065a8dd30af70 Dave Stevenson    2018-03-16   776  		uint32_t param = fourcc_mod_broadcom_param(fb->modifier);
8e75d582db02bc Boris Brezillon   2018-12-07   777  		u32 tile_w, tile, x_off, pix_per_tile;
e065a8dd30af70 Dave Stevenson    2018-03-16   778  
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   779  		if (fb->format->format == DRM_FORMAT_P030) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   780  			/*
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   781  			 * Spec says: bits [31:4] of the given address should point to
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   782  			 * the 128-bit word containing the desired starting pixel,
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   783  			 * and bits[3:0] should be between 0 and 11, indicating which
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   784  			 * of the 12-pixels in that 128-bit word is the first pixel to be used
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   785  			 */
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   786  	                u32 remaining_pixels = vc4_state->src_x % 96;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   787  			u32 aligned = remaining_pixels / 12;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   788  			u32 last_bits = remaining_pixels % 12;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   789  
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   790  			x_off = aligned * 16 + last_bits;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   791  			hvs_format = HVS_PIXEL_FORMAT_YCBCR_10BIT;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   792  			tiling = SCALER_CTL0_TILING_128B;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   793  			tile_w = 128;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   794  			pix_per_tile = 96;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   795  		} else {
e065a8dd30af70 Dave Stevenson    2018-03-16   796  			hvs_format = HVS_PIXEL_FORMAT_H264;
e065a8dd30af70 Dave Stevenson    2018-03-16   797  
e065a8dd30af70 Dave Stevenson    2018-03-16   798  			switch (base_format_mod) {
e065a8dd30af70 Dave Stevenson    2018-03-16   799  			case DRM_FORMAT_MOD_BROADCOM_SAND64:
e065a8dd30af70 Dave Stevenson    2018-03-16   800  				tiling = SCALER_CTL0_TILING_64B;
8e75d582db02bc Boris Brezillon   2018-12-07   801  				tile_w = 64;
e065a8dd30af70 Dave Stevenson    2018-03-16   802  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   803  			case DRM_FORMAT_MOD_BROADCOM_SAND128:
e065a8dd30af70 Dave Stevenson    2018-03-16   804  				tiling = SCALER_CTL0_TILING_128B;
8e75d582db02bc Boris Brezillon   2018-12-07   805  				tile_w = 128;
e065a8dd30af70 Dave Stevenson    2018-03-16   806  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   807  			case DRM_FORMAT_MOD_BROADCOM_SAND256:
e065a8dd30af70 Dave Stevenson    2018-03-16   808  				tiling = SCALER_CTL0_TILING_256B_OR_T;
8e75d582db02bc Boris Brezillon   2018-12-07   809  				tile_w = 256;
e065a8dd30af70 Dave Stevenson    2018-03-16   810  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16  @811  			default:
e065a8dd30af70 Dave Stevenson    2018-03-16   812  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   813  			}
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   814  			pix_per_tile = tile_w / fb->format->cpp[0];
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   815  			x_off = (vc4_state->src_x % pix_per_tile) /
d4c05e7a5da7b6 Dave Stevenson    2021-11-17  @816  				(i ? h_subsample : 1) * fb->format->cpp[i];
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   817  		}
e065a8dd30af70 Dave Stevenson    2018-03-16   818  		if (param > SCALER_TILE_HEIGHT_MASK) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   819  			DRM_DEBUG_KMS("SAND height too large (%d)\n",
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   820  				      param);
e065a8dd30af70 Dave Stevenson    2018-03-16   821  			return -EINVAL;
e065a8dd30af70 Dave Stevenson    2018-03-16   822  		}
8e75d582db02bc Boris Brezillon   2018-12-07   823  		tile = vc4_state->src_x / pix_per_tile;
8e75d582db02bc Boris Brezillon   2018-12-07   824  		/* Adjust the base pointer to the first pixel to be scanned
8e75d582db02bc Boris Brezillon   2018-12-07   825  		 * out.
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   826  		 *
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   827  		 * For P030, y_ptr [31:4] is the 128bit word for the start pixel
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   828  		 * y_ptr [3:0] is the pixel (0-11) contained within that 128bit
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   829  		 * word that should be taken as the first pixel.
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   830  		 * Ditto uv_ptr [31:4] vs [3:0], however [3:0] contains the
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   831  		 * element within the 128bit word, eg for pixel 3 the value
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   832  		 * should be 6.
8e75d582db02bc Boris Brezillon   2018-12-07   833  		 */
8e75d582db02bc Boris Brezillon   2018-12-07   834  		for (i = 0; i < num_planes; i++) {
8e75d582db02bc Boris Brezillon   2018-12-07   835  			vc4_state->offsets[i] += param * tile_w * tile;
7cd3cf3540a370 Boris Brezillon   2018-12-07   836  			vc4_state->offsets[i] += src_y /
8e75d582db02bc Boris Brezillon   2018-12-07   837  						 (i ? v_subsample : 1) *
8e75d582db02bc Boris Brezillon   2018-12-07   838  						 tile_w;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   839  			vc4_state->offsets[i] += x_off & ~(i ? 1 : 0);
8e75d582db02bc Boris Brezillon   2018-12-07   840  		}
8e75d582db02bc Boris Brezillon   2018-12-07   841  
e065a8dd30af70 Dave Stevenson    2018-03-16   842  		pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT);
e065a8dd30af70 Dave Stevenson    2018-03-16   843  		break;
e065a8dd30af70 Dave Stevenson    2018-03-16   844  	}
e065a8dd30af70 Dave Stevenson    2018-03-16   845  
98830d91da082b Eric Anholt       2017-06-07   846  	default:
98830d91da082b Eric Anholt       2017-06-07   847  		DRM_DEBUG_KMS("Unsupported FB tiling flag 0x%16llx",
98830d91da082b Eric Anholt       2017-06-07   848  			      (long long)fb->modifier);
98830d91da082b Eric Anholt       2017-06-07   849  		return -EINVAL;
98830d91da082b Eric Anholt       2017-06-07   850  	}
98830d91da082b Eric Anholt       2017-06-07   851  
c54619b0bfb35c Dave Stevenson    2020-09-03   852  	/* Don't waste cycles mixing with plane alpha if the set alpha
c54619b0bfb35c Dave Stevenson    2020-09-03   853  	 * is opaque or there is no per-pixel alpha information.
c54619b0bfb35c Dave Stevenson    2020-09-03   854  	 * In any case we use the alpha property value as the fixed alpha.
c54619b0bfb35c Dave Stevenson    2020-09-03   855  	 */
c54619b0bfb35c Dave Stevenson    2020-09-03   856  	mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE &&
c54619b0bfb35c Dave Stevenson    2020-09-03   857  			  fb->format->has_alpha;
c54619b0bfb35c Dave Stevenson    2020-09-03   858  
c54619b0bfb35c Dave Stevenson    2020-09-03   859  	if (!vc4->hvs->hvs5) {
21af94cf1a4c2d Eric Anholt       2015-10-20   860  	/* Control word */
c8b75bca92cbf0 Eric Anholt       2015-03-02   861  		vc4_dlist_write(vc4_state,
c8b75bca92cbf0 Eric Anholt       2015-03-02   862  				SCALER_CTL0_VALID |
7cd3cf3540a370 Boris Brezillon   2018-12-07   863  				(rotation & DRM_MODE_REFLECT_X ? SCALER_CTL0_HFLIP : 0) |
7cd3cf3540a370 Boris Brezillon   2018-12-07   864  				(rotation & DRM_MODE_REFLECT_Y ? SCALER_CTL0_VFLIP : 0) |
3257ec797d3a8c Maxime Ripard     2018-05-17   865  				VC4_SET_FIELD(SCALER_CTL0_RGBA_EXPAND_ROUND, SCALER_CTL0_RGBA_EXPAND) |
c8b75bca92cbf0 Eric Anholt       2015-03-02   866  				(format->pixel_order << SCALER_CTL0_ORDER_SHIFT) |
e065a8dd30af70 Dave Stevenson    2018-03-16   867  				(hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
98830d91da082b Eric Anholt       2017-06-07   868  				VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
21af94cf1a4c2d Eric Anholt       2015-10-20   869  				(vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) |
fc04023fafecf1 Eric Anholt       2015-12-30   870  				VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
fc04023fafecf1 Eric Anholt       2015-12-30   871  				VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1));
c8b75bca92cbf0 Eric Anholt       2015-03-02   872  
c8b75bca92cbf0 Eric Anholt       2015-03-02   873  		/* Position Word 0: Image Positions and Alpha Value */
6674a904d68041 Eric Anholt       2015-12-30   874  		vc4_state->pos0_offset = vc4_state->dlist_count;
c8b75bca92cbf0 Eric Anholt       2015-03-02   875  		vc4_dlist_write(vc4_state,
22445f0316a253 Stefan Schake     2018-04-20   876  				VC4_SET_FIELD(state->alpha >> 8, SCALER_POS0_FIXED_ALPHA) |
5c6799942003df Eric Anholt       2015-12-28   877  				VC4_SET_FIELD(vc4_state->crtc_x, SCALER_POS0_START_X) |
5c6799942003df Eric Anholt       2015-12-28   878  				VC4_SET_FIELD(vc4_state->crtc_y, SCALER_POS0_START_Y));
c8b75bca92cbf0 Eric Anholt       2015-03-02   879  
21af94cf1a4c2d Eric Anholt       2015-10-20   880  		/* Position Word 1: Scaled Image Dimensions. */
21af94cf1a4c2d Eric Anholt       2015-10-20   881  		if (!vc4_state->is_unity) {
21af94cf1a4c2d Eric Anholt       2015-10-20   882  			vc4_dlist_write(vc4_state,
21af94cf1a4c2d Eric Anholt       2015-10-20   883  					VC4_SET_FIELD(vc4_state->crtc_w,
21af94cf1a4c2d Eric Anholt       2015-10-20   884  						      SCALER_POS1_SCL_WIDTH) |
21af94cf1a4c2d Eric Anholt       2015-10-20   885  					VC4_SET_FIELD(vc4_state->crtc_h,
21af94cf1a4c2d Eric Anholt       2015-10-20   886  						      SCALER_POS1_SCL_HEIGHT));
21af94cf1a4c2d Eric Anholt       2015-10-20   887  		}
c8b75bca92cbf0 Eric Anholt       2015-03-02   888  
05202c241f1476 Stefan Schake     2018-03-09   889  		/* Position Word 2: Source Image Size, Alpha */
6674a904d68041 Eric Anholt       2015-12-30   890  		vc4_state->pos2_offset = vc4_state->dlist_count;
c8b75bca92cbf0 Eric Anholt       2015-03-02   891  		vc4_dlist_write(vc4_state,
124e5dac9a596a Maxime Ripard     2017-12-22   892  				VC4_SET_FIELD(fb->format->has_alpha ?
c8b75bca92cbf0 Eric Anholt       2015-03-02   893  					      SCALER_POS2_ALPHA_MODE_PIPELINE :
c8b75bca92cbf0 Eric Anholt       2015-03-02   894  					      SCALER_POS2_ALPHA_MODE_FIXED,
c8b75bca92cbf0 Eric Anholt       2015-03-02   895  					      SCALER_POS2_ALPHA_MODE) |
22445f0316a253 Stefan Schake     2018-04-20   896  				(mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   897  				(fb->format->has_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   898  						SCALER_POS2_ALPHA_PREMULT : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   899  				VC4_SET_FIELD(vc4_state->src_w[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   900  					      SCALER_POS2_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   901  				VC4_SET_FIELD(vc4_state->src_h[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   902  					      SCALER_POS2_HEIGHT));
c54619b0bfb35c Dave Stevenson    2020-09-03   903  
c54619b0bfb35c Dave Stevenson    2020-09-03   904  		/* Position Word 3: Context.  Written by the HVS. */
c54619b0bfb35c Dave Stevenson    2020-09-03   905  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c54619b0bfb35c Dave Stevenson    2020-09-03   906  
c54619b0bfb35c Dave Stevenson    2020-09-03   907  	} else {
c54619b0bfb35c Dave Stevenson    2020-09-03   908  		u32 hvs_pixel_order = format->pixel_order;
c54619b0bfb35c Dave Stevenson    2020-09-03   909  
c54619b0bfb35c Dave Stevenson    2020-09-03   910  		if (format->pixel_order_hvs5)
c54619b0bfb35c Dave Stevenson    2020-09-03   911  			hvs_pixel_order = format->pixel_order_hvs5;
c54619b0bfb35c Dave Stevenson    2020-09-03   912  
c54619b0bfb35c Dave Stevenson    2020-09-03   913  		/* Control word */
c54619b0bfb35c Dave Stevenson    2020-09-03   914  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   915  				SCALER_CTL0_VALID |
c54619b0bfb35c Dave Stevenson    2020-09-03   916  				(hvs_pixel_order << SCALER_CTL0_ORDER_SHIFT) |
c54619b0bfb35c Dave Stevenson    2020-09-03   917  				(hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
c54619b0bfb35c Dave Stevenson    2020-09-03   918  				VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
c54619b0bfb35c Dave Stevenson    2020-09-03   919  				(vc4_state->is_unity ?
c54619b0bfb35c Dave Stevenson    2020-09-03   920  						SCALER5_CTL0_UNITY : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   921  				VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   922  				VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1) |
c54619b0bfb35c Dave Stevenson    2020-09-03   923  				SCALER5_CTL0_ALPHA_EXPAND |
c54619b0bfb35c Dave Stevenson    2020-09-03   924  				SCALER5_CTL0_RGB_EXPAND);
c54619b0bfb35c Dave Stevenson    2020-09-03   925  
c54619b0bfb35c Dave Stevenson    2020-09-03   926  		/* Position Word 0: Image Positions and Alpha Value */
c54619b0bfb35c Dave Stevenson    2020-09-03   927  		vc4_state->pos0_offset = vc4_state->dlist_count;
c54619b0bfb35c Dave Stevenson    2020-09-03   928  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   929  				(rotation & DRM_MODE_REFLECT_Y ?
c54619b0bfb35c Dave Stevenson    2020-09-03   930  						SCALER5_POS0_VFLIP : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   931  				VC4_SET_FIELD(vc4_state->crtc_x,
c54619b0bfb35c Dave Stevenson    2020-09-03   932  					      SCALER_POS0_START_X) |
c54619b0bfb35c Dave Stevenson    2020-09-03   933  				(rotation & DRM_MODE_REFLECT_X ?
c54619b0bfb35c Dave Stevenson    2020-09-03   934  					      SCALER5_POS0_HFLIP : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   935  				VC4_SET_FIELD(vc4_state->crtc_y,
c54619b0bfb35c Dave Stevenson    2020-09-03   936  					      SCALER5_POS0_START_Y)
c54619b0bfb35c Dave Stevenson    2020-09-03   937  			       );
c54619b0bfb35c Dave Stevenson    2020-09-03   938  
c54619b0bfb35c Dave Stevenson    2020-09-03   939  		/* Control Word 2 */
c54619b0bfb35c Dave Stevenson    2020-09-03   940  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   941  				VC4_SET_FIELD(state->alpha >> 4,
c54619b0bfb35c Dave Stevenson    2020-09-03   942  					      SCALER5_CTL2_ALPHA) |
4494346392204a Nathan Chancellor 2020-09-10   943  				(fb->format->has_alpha ?
4494346392204a Nathan Chancellor 2020-09-10   944  					SCALER5_CTL2_ALPHA_PREMULT : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   945  				(mix_plane_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   946  					SCALER5_CTL2_ALPHA_MIX : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   947  				VC4_SET_FIELD(fb->format->has_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   948  				      SCALER5_CTL2_ALPHA_MODE_PIPELINE :
c54619b0bfb35c Dave Stevenson    2020-09-03   949  				      SCALER5_CTL2_ALPHA_MODE_FIXED,
c54619b0bfb35c Dave Stevenson    2020-09-03   950  				      SCALER5_CTL2_ALPHA_MODE)
c54619b0bfb35c Dave Stevenson    2020-09-03   951  			       );
c54619b0bfb35c Dave Stevenson    2020-09-03   952  
c54619b0bfb35c Dave Stevenson    2020-09-03   953  		/* Position Word 1: Scaled Image Dimensions. */
c54619b0bfb35c Dave Stevenson    2020-09-03   954  		if (!vc4_state->is_unity) {
c54619b0bfb35c Dave Stevenson    2020-09-03   955  			vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   956  					VC4_SET_FIELD(vc4_state->crtc_w,
f6b57101a6b312 Dom Cobley        2021-01-21   957  						      SCALER5_POS1_SCL_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   958  					VC4_SET_FIELD(vc4_state->crtc_h,
f6b57101a6b312 Dom Cobley        2021-01-21   959  						      SCALER5_POS1_SCL_HEIGHT));
c54619b0bfb35c Dave Stevenson    2020-09-03   960  		}
c54619b0bfb35c Dave Stevenson    2020-09-03   961  
c54619b0bfb35c Dave Stevenson    2020-09-03   962  		/* Position Word 2: Source Image Size */
c54619b0bfb35c Dave Stevenson    2020-09-03   963  		vc4_state->pos2_offset = vc4_state->dlist_count;
c54619b0bfb35c Dave Stevenson    2020-09-03   964  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   965  				VC4_SET_FIELD(vc4_state->src_w[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   966  					      SCALER5_POS2_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   967  				VC4_SET_FIELD(vc4_state->src_h[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   968  					      SCALER5_POS2_HEIGHT));
c8b75bca92cbf0 Eric Anholt       2015-03-02   969  
c8b75bca92cbf0 Eric Anholt       2015-03-02   970  		/* Position Word 3: Context.  Written by the HVS. */
c8b75bca92cbf0 Eric Anholt       2015-03-02   971  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c54619b0bfb35c Dave Stevenson    2020-09-03   972  	}
c8b75bca92cbf0 Eric Anholt       2015-03-02   973  
fc04023fafecf1 Eric Anholt       2015-12-30   974  
fc04023fafecf1 Eric Anholt       2015-12-30   975  	/* Pointer Word 0/1/2: RGB / Y / Cb / Cr Pointers
fc04023fafecf1 Eric Anholt       2015-12-30   976  	 *
fc04023fafecf1 Eric Anholt       2015-12-30   977  	 * The pointers may be any byte address.
fc04023fafecf1 Eric Anholt       2015-12-30   978  	 */
6674a904d68041 Eric Anholt       2015-12-30   979  	vc4_state->ptr0_offset = vc4_state->dlist_count;
fc04023fafecf1 Eric Anholt       2015-12-30   980  	for (i = 0; i < num_planes; i++)
fc04023fafecf1 Eric Anholt       2015-12-30   981  		vc4_dlist_write(vc4_state, vc4_state->offsets[i]);
c8b75bca92cbf0 Eric Anholt       2015-03-02   982  
fc04023fafecf1 Eric Anholt       2015-12-30   983  	/* Pointer Context Word 0/1/2: Written by the HVS */
fc04023fafecf1 Eric Anholt       2015-12-30   984  	for (i = 0; i < num_planes; i++)
c8b75bca92cbf0 Eric Anholt       2015-03-02   985  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c8b75bca92cbf0 Eric Anholt       2015-03-02   986  
98830d91da082b Eric Anholt       2017-06-07   987  	/* Pitch word 0 */
98830d91da082b Eric Anholt       2017-06-07   988  	vc4_dlist_write(vc4_state, pitch0);
98830d91da082b Eric Anholt       2017-06-07   989  
98830d91da082b Eric Anholt       2017-06-07   990  	/* Pitch word 1/2 */
98830d91da082b Eric Anholt       2017-06-07   991  	for (i = 1; i < num_planes; i++) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   992  		if (hvs_format != HVS_PIXEL_FORMAT_H264 &&
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   993  		    hvs_format != HVS_PIXEL_FORMAT_YCBCR_10BIT) {
c8b75bca92cbf0 Eric Anholt       2015-03-02   994  			vc4_dlist_write(vc4_state,
e065a8dd30af70 Dave Stevenson    2018-03-16   995  					VC4_SET_FIELD(fb->pitches[i],
e065a8dd30af70 Dave Stevenson    2018-03-16   996  						      SCALER_SRC_PITCH));
e065a8dd30af70 Dave Stevenson    2018-03-16   997  		} else {
e065a8dd30af70 Dave Stevenson    2018-03-16   998  			vc4_dlist_write(vc4_state, pitch0);
e065a8dd30af70 Dave Stevenson    2018-03-16   999  		}
fc04023fafecf1 Eric Anholt       2015-12-30  1000  	}
fc04023fafecf1 Eric Anholt       2015-12-30  1001  
fc04023fafecf1 Eric Anholt       2015-12-30  1002  	/* Colorspace conversion words */
fc04023fafecf1 Eric Anholt       2015-12-30  1003  	if (vc4_state->is_yuv) {
fc04023fafecf1 Eric Anholt       2015-12-30  1004  		vc4_dlist_write(vc4_state, SCALER_CSC0_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1005  		vc4_dlist_write(vc4_state, SCALER_CSC1_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1006  		vc4_dlist_write(vc4_state, SCALER_CSC2_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1007  	}
c8b75bca92cbf0 Eric Anholt       2015-03-02  1008  
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1009  	vc4_state->lbm_offset = 0;
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1010  
658d8cbd07dae2 Boris Brezillon   2018-07-25  1011  	if (vc4_state->x_scaling[0] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1012  	    vc4_state->x_scaling[1] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1013  	    vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1014  	    vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1015  		/* Reserve a slot for the LBM Base Address. The real value will
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1016  		 * be set when calling vc4_plane_allocate_lbm().
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1017  		 */
fc04023fafecf1 Eric Anholt       2015-12-30  1018  		if (vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
facd93f4285c40 Maxime Ripard     2021-01-29  1019  		    vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
facd93f4285c40 Maxime Ripard     2021-01-29  1020  			vc4_state->lbm_offset = vc4_state->dlist_count;
facd93f4285c40 Maxime Ripard     2021-01-29  1021  			vc4_dlist_counter_increment(vc4_state);
facd93f4285c40 Maxime Ripard     2021-01-29  1022  		}
21af94cf1a4c2d Eric Anholt       2015-10-20  1023  
fc04023fafecf1 Eric Anholt       2015-12-30  1024  		if (num_planes > 1) {
fc04023fafecf1 Eric Anholt       2015-12-30  1025  			/* Emit Cb/Cr as channel 0 and Y as channel
fc04023fafecf1 Eric Anholt       2015-12-30  1026  			 * 1. This matches how we set up scl0/scl1
fc04023fafecf1 Eric Anholt       2015-12-30  1027  			 * above.
fc04023fafecf1 Eric Anholt       2015-12-30  1028  			 */
fc04023fafecf1 Eric Anholt       2015-12-30  1029  			vc4_write_scaling_parameters(state, 1);
fc04023fafecf1 Eric Anholt       2015-12-30  1030  		}
fc04023fafecf1 Eric Anholt       2015-12-30  1031  		vc4_write_scaling_parameters(state, 0);
21af94cf1a4c2d Eric Anholt       2015-10-20  1032  
21af94cf1a4c2d Eric Anholt       2015-10-20  1033  		/* If any PPF setup was done, then all the kernel
21af94cf1a4c2d Eric Anholt       2015-10-20  1034  		 * pointers get uploaded.
21af94cf1a4c2d Eric Anholt       2015-10-20  1035  		 */
fc04023fafecf1 Eric Anholt       2015-12-30  1036  		if (vc4_state->x_scaling[0] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1037  		    vc4_state->y_scaling[0] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1038  		    vc4_state->x_scaling[1] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1039  		    vc4_state->y_scaling[1] == VC4_SCALING_PPF) {
21af94cf1a4c2d Eric Anholt       2015-10-20  1040  			u32 kernel = VC4_SET_FIELD(vc4->hvs->mitchell_netravali_filter.start,
21af94cf1a4c2d Eric Anholt       2015-10-20  1041  						   SCALER_PPF_KERNEL_OFFSET);
21af94cf1a4c2d Eric Anholt       2015-10-20  1042  
21af94cf1a4c2d Eric Anholt       2015-10-20  1043  			/* HPPF plane 0 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1044  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1045  			/* VPPF plane 0 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1046  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1047  			/* HPPF plane 1 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1048  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1049  			/* VPPF plane 1 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1050  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1051  		}
21af94cf1a4c2d Eric Anholt       2015-10-20  1052  	}
21af94cf1a4c2d Eric Anholt       2015-10-20  1053  
c8b75bca92cbf0 Eric Anholt       2015-03-02  1054  	vc4_state->dlist[ctl0_offset] |=
c8b75bca92cbf0 Eric Anholt       2015-03-02  1055  		VC4_SET_FIELD(vc4_state->dlist_count, SCALER_CTL0_SIZE);
c8b75bca92cbf0 Eric Anholt       2015-03-02  1056  
3d67b68a6a3c2d Stefan Schake     2018-03-09  1057  	/* crtc_* are already clipped coordinates. */
3d67b68a6a3c2d Stefan Schake     2018-03-09  1058  	covers_screen = vc4_state->crtc_x == 0 && vc4_state->crtc_y == 0 &&
3d67b68a6a3c2d Stefan Schake     2018-03-09  1059  			vc4_state->crtc_w == state->crtc->mode.hdisplay &&
3d67b68a6a3c2d Stefan Schake     2018-03-09  1060  			vc4_state->crtc_h == state->crtc->mode.vdisplay;
3d67b68a6a3c2d Stefan Schake     2018-03-09  1061  	/* Background fill might be necessary when the plane has per-pixel
22445f0316a253 Stefan Schake     2018-04-20  1062  	 * alpha content or a non-opaque plane alpha and could blend from the
22445f0316a253 Stefan Schake     2018-04-20  1063  	 * background or does not cover the entire screen.
3d67b68a6a3c2d Stefan Schake     2018-03-09  1064  	 */
22445f0316a253 Stefan Schake     2018-04-20  1065  	vc4_state->needs_bg_fill = fb->format->has_alpha || !covers_screen ||
22445f0316a253 Stefan Schake     2018-04-20  1066  				   state->alpha != DRM_BLEND_ALPHA_OPAQUE;
3d67b68a6a3c2d Stefan Schake     2018-03-09  1067  
8d93844965c3d5 Boris Brezillon   2018-11-30  1068  	/* Flag the dlist as initialized to avoid checking it twice in case
8d93844965c3d5 Boris Brezillon   2018-11-30  1069  	 * the async update check already called vc4_plane_mode_set() and
8d93844965c3d5 Boris Brezillon   2018-11-30  1070  	 * decided to fallback to sync update because async update was not
8d93844965c3d5 Boris Brezillon   2018-11-30  1071  	 * possible.
8d93844965c3d5 Boris Brezillon   2018-11-30  1072  	 */
8d93844965c3d5 Boris Brezillon   2018-11-30  1073  	vc4_state->dlist_initialized = 1;
8d93844965c3d5 Boris Brezillon   2018-11-30  1074  
4686da83154d87 Boris Brezillon   2019-02-20  1075  	vc4_plane_calc_load(state);
4686da83154d87 Boris Brezillon   2019-02-20  1076  
c8b75bca92cbf0 Eric Anholt       2015-03-02  1077  	return 0;
c8b75bca92cbf0 Eric Anholt       2015-03-02  1078  }
c8b75bca92cbf0 Eric Anholt       2015-03-02  1079  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030
@ 2021-11-26  2:18     ` kernel test robot
  0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-11-26  2:18 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 40892 bytes --]

Hi Maxime,

I love your patch! Perhaps something to improve:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on drm-intel/for-linux-next drm-tip/drm-tip v5.16-rc2 next-20211125]
[cannot apply to anholt/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Maxime-Ripard/drm-vc4-Support-for-30-bits-YUV-formats/20211117-221106
base:   git://anongit.freedesktop.org/drm/drm drm-next
config: x86_64-buildonly-randconfig-r004-20211118 (https://download.01.org/0day-ci/archive/20211126/202111261033.hgimGK21-lkp(a)intel.com/config)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/d4c05e7a5da7b65c5a37252cc9d2cac75f1f6d78
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Maxime-Ripard/drm-vc4-Support-for-30-bits-YUV-formats/20211117-221106
        git checkout d4c05e7a5da7b65c5a37252cc9d2cac75f1f6d78
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/gpu/drm/vc4/vc4_plane.c:811:4: warning: variable 'tile_w' is used uninitialized whenever switch default is taken [-Wsometimes-uninitialized]
                           default:
                           ^~~~~~~
   drivers/gpu/drm/vc4/vc4_plane.c:814:19: note: uninitialized use occurs here
                           pix_per_tile = tile_w / fb->format->cpp[0];
                                          ^~~~~~
   drivers/gpu/drm/vc4/vc4_plane.c:777:13: note: initialize the variable 'tile_w' to silence this warning
                   u32 tile_w, tile, x_off, pix_per_tile;
                             ^
                              = 0
>> drivers/gpu/drm/vc4/vc4_plane.c:816:6: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
                                   (i ? h_subsample : 1) * fb->format->cpp[i];
                                    ^
   drivers/gpu/drm/vc4/vc4_plane.c:652:12: note: initialize the variable 'i' to silence this warning
           int ret, i;
                     ^
                      = 0
   2 warnings generated.


vim +/tile_w +811 drivers/gpu/drm/vc4/vc4_plane.c

0a038c1c29a7a3 Boris Brezillon   2018-11-30   630  
5c6799942003df Eric Anholt       2015-12-28   631  /* Writes out a full display list for an active plane to the plane's
5c6799942003df Eric Anholt       2015-12-28   632   * private dlist state.
5c6799942003df Eric Anholt       2015-12-28   633   */
5c6799942003df Eric Anholt       2015-12-28   634  static int vc4_plane_mode_set(struct drm_plane *plane,
5c6799942003df Eric Anholt       2015-12-28   635  			      struct drm_plane_state *state)
5c6799942003df Eric Anholt       2015-12-28   636  {
21af94cf1a4c2d Eric Anholt       2015-10-20   637  	struct vc4_dev *vc4 = to_vc4_dev(plane->dev);
5c6799942003df Eric Anholt       2015-12-28   638  	struct vc4_plane_state *vc4_state = to_vc4_plane_state(state);
5c6799942003df Eric Anholt       2015-12-28   639  	struct drm_framebuffer *fb = state->fb;
5c6799942003df Eric Anholt       2015-12-28   640  	u32 ctl0_offset = vc4_state->dlist_count;
438b74a5497c36 Ville Syrjälä     2016-12-14   641  	const struct hvs_format *format = vc4_get_hvs_format(fb->format->format);
e065a8dd30af70 Dave Stevenson    2018-03-16   642  	u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier);
05c452c115bffa Maxime Ripard     2019-05-16   643  	int num_planes = fb->format->num_planes;
f3e9632cb6241a Maxime Ripard     2019-05-16   644  	u32 h_subsample = fb->format->hsub;
f3e9632cb6241a Maxime Ripard     2019-05-16   645  	u32 v_subsample = fb->format->vsub;
22445f0316a253 Stefan Schake     2018-04-20   646  	bool mix_plane_alpha;
3d67b68a6a3c2d Stefan Schake     2018-03-09   647  	bool covers_screen;
98830d91da082b Eric Anholt       2017-06-07   648  	u32 scl0, scl1, pitch0;
7cd3cf3540a370 Boris Brezillon   2018-12-07   649  	u32 tiling, src_y;
e065a8dd30af70 Dave Stevenson    2018-03-16   650  	u32 hvs_format = format->hvs;
7cd3cf3540a370 Boris Brezillon   2018-12-07   651  	unsigned int rotation;
fc04023fafecf1 Eric Anholt       2015-12-30   652  	int ret, i;
5c6799942003df Eric Anholt       2015-12-28   653  
8d93844965c3d5 Boris Brezillon   2018-11-30   654  	if (vc4_state->dlist_initialized)
8d93844965c3d5 Boris Brezillon   2018-11-30   655  		return 0;
8d93844965c3d5 Boris Brezillon   2018-11-30   656  
5c6799942003df Eric Anholt       2015-12-28   657  	ret = vc4_plane_setup_clipping_and_scaling(state);
21af94cf1a4c2d Eric Anholt       2015-10-20   658  	if (ret)
21af94cf1a4c2d Eric Anholt       2015-10-20   659  		return ret;
21af94cf1a4c2d Eric Anholt       2015-10-20   660  
fc04023fafecf1 Eric Anholt       2015-12-30   661  	/* SCL1 is used for Cb/Cr scaling of planar formats.  For RGB
fc04023fafecf1 Eric Anholt       2015-12-30   662  	 * and 4:4:4, scl1 should be set to scl0 so both channels of
fc04023fafecf1 Eric Anholt       2015-12-30   663  	 * the scaler do the same thing.  For YUV, the Y plane needs
fc04023fafecf1 Eric Anholt       2015-12-30   664  	 * to be put in channel 1 and Cb/Cr in channel 0, so we swap
fc04023fafecf1 Eric Anholt       2015-12-30   665  	 * the scl fields here.
fc04023fafecf1 Eric Anholt       2015-12-30   666  	 */
fc04023fafecf1 Eric Anholt       2015-12-30   667  	if (num_planes == 1) {
9a0e9802217291 Boris Brezillon   2018-05-07   668  		scl0 = vc4_get_scl_field(state, 0);
fc04023fafecf1 Eric Anholt       2015-12-30   669  		scl1 = scl0;
fc04023fafecf1 Eric Anholt       2015-12-30   670  	} else {
fc04023fafecf1 Eric Anholt       2015-12-30   671  		scl0 = vc4_get_scl_field(state, 1);
fc04023fafecf1 Eric Anholt       2015-12-30   672  		scl1 = vc4_get_scl_field(state, 0);
fc04023fafecf1 Eric Anholt       2015-12-30   673  	}
21af94cf1a4c2d Eric Anholt       2015-10-20   674  
7cd3cf3540a370 Boris Brezillon   2018-12-07   675  	rotation = drm_rotation_simplify(state->rotation,
7cd3cf3540a370 Boris Brezillon   2018-12-07   676  					 DRM_MODE_ROTATE_0 |
7cd3cf3540a370 Boris Brezillon   2018-12-07   677  					 DRM_MODE_REFLECT_X |
7cd3cf3540a370 Boris Brezillon   2018-12-07   678  					 DRM_MODE_REFLECT_Y);
7cd3cf3540a370 Boris Brezillon   2018-12-07   679  
7cd3cf3540a370 Boris Brezillon   2018-12-07   680  	/* We must point to the last line when Y reflection is enabled. */
7cd3cf3540a370 Boris Brezillon   2018-12-07   681  	src_y = vc4_state->src_y;
7cd3cf3540a370 Boris Brezillon   2018-12-07   682  	if (rotation & DRM_MODE_REFLECT_Y)
7cd3cf3540a370 Boris Brezillon   2018-12-07   683  		src_y += vc4_state->src_h[0] - 1;
7cd3cf3540a370 Boris Brezillon   2018-12-07   684  
e065a8dd30af70 Dave Stevenson    2018-03-16   685  	switch (base_format_mod) {
98830d91da082b Eric Anholt       2017-06-07   686  	case DRM_FORMAT_MOD_LINEAR:
98830d91da082b Eric Anholt       2017-06-07   687  		tiling = SCALER_CTL0_TILING_LINEAR;
98830d91da082b Eric Anholt       2017-06-07   688  		pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH);
a65511b1cd78e0 Boris Brezillon   2018-08-03   689  
a65511b1cd78e0 Boris Brezillon   2018-08-03   690  		/* Adjust the base pointer to the first pixel to be scanned
a65511b1cd78e0 Boris Brezillon   2018-08-03   691  		 * out.
a65511b1cd78e0 Boris Brezillon   2018-08-03   692  		 */
a65511b1cd78e0 Boris Brezillon   2018-08-03   693  		for (i = 0; i < num_planes; i++) {
7cd3cf3540a370 Boris Brezillon   2018-12-07   694  			vc4_state->offsets[i] += src_y /
a65511b1cd78e0 Boris Brezillon   2018-08-03   695  						 (i ? v_subsample : 1) *
a65511b1cd78e0 Boris Brezillon   2018-08-03   696  						 fb->pitches[i];
7cd3cf3540a370 Boris Brezillon   2018-12-07   697  
a65511b1cd78e0 Boris Brezillon   2018-08-03   698  			vc4_state->offsets[i] += vc4_state->src_x /
a65511b1cd78e0 Boris Brezillon   2018-08-03   699  						 (i ? h_subsample : 1) *
a65511b1cd78e0 Boris Brezillon   2018-08-03   700  						 fb->format->cpp[i];
a65511b1cd78e0 Boris Brezillon   2018-08-03   701  		}
3e407417b1928e Boris Brezillon   2018-08-03   702  
98830d91da082b Eric Anholt       2017-06-07   703  		break;
652badb9458b41 Eric Anholt       2017-09-27   704  
652badb9458b41 Eric Anholt       2017-09-27   705  	case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: {
652badb9458b41 Eric Anholt       2017-09-27   706  		u32 tile_size_shift = 12; /* T tiles are 4kb */
3e407417b1928e Boris Brezillon   2018-08-03   707  		/* Whole-tile offsets, mostly for setting the pitch. */
3e407417b1928e Boris Brezillon   2018-08-03   708  		u32 tile_w_shift = fb->format->cpp[0] == 2 ? 6 : 5;
652badb9458b41 Eric Anholt       2017-09-27   709  		u32 tile_h_shift = 5; /* 16 and 32bpp are 32 pixels high */
3e407417b1928e Boris Brezillon   2018-08-03   710  		u32 tile_w_mask = (1 << tile_w_shift) - 1;
3e407417b1928e Boris Brezillon   2018-08-03   711  		/* The height mask on 32-bit-per-pixel tiles is 63, i.e. twice
3e407417b1928e Boris Brezillon   2018-08-03   712  		 * the height (in pixels) of a 4k tile.
3e407417b1928e Boris Brezillon   2018-08-03   713  		 */
3e407417b1928e Boris Brezillon   2018-08-03   714  		u32 tile_h_mask = (2 << tile_h_shift) - 1;
3e407417b1928e Boris Brezillon   2018-08-03   715  		/* For T-tiled, the FB pitch is "how many bytes from one row to
3e407417b1928e Boris Brezillon   2018-08-03   716  		 * the next, such that
3e407417b1928e Boris Brezillon   2018-08-03   717  		 *
3e407417b1928e Boris Brezillon   2018-08-03   718  		 *	pitch * tile_h == tile_size * tiles_per_row
3e407417b1928e Boris Brezillon   2018-08-03   719  		 */
652badb9458b41 Eric Anholt       2017-09-27   720  		u32 tiles_w = fb->pitches[0] >> (tile_size_shift - tile_h_shift);
3e407417b1928e Boris Brezillon   2018-08-03   721  		u32 tiles_l = vc4_state->src_x >> tile_w_shift;
3e407417b1928e Boris Brezillon   2018-08-03   722  		u32 tiles_r = tiles_w - tiles_l;
7cd3cf3540a370 Boris Brezillon   2018-12-07   723  		u32 tiles_t = src_y >> tile_h_shift;
3e407417b1928e Boris Brezillon   2018-08-03   724  		/* Intra-tile offsets, which modify the base address (the
3e407417b1928e Boris Brezillon   2018-08-03   725  		 * SCALER_PITCH0_TILE_Y_OFFSET tells HVS how to walk from that
3e407417b1928e Boris Brezillon   2018-08-03   726  		 * base address).
3e407417b1928e Boris Brezillon   2018-08-03   727  		 */
7cd3cf3540a370 Boris Brezillon   2018-12-07   728  		u32 tile_y = (src_y >> 4) & 1;
7cd3cf3540a370 Boris Brezillon   2018-12-07   729  		u32 subtile_y = (src_y >> 2) & 3;
7cd3cf3540a370 Boris Brezillon   2018-12-07   730  		u32 utile_y = src_y & 3;
3e407417b1928e Boris Brezillon   2018-08-03   731  		u32 x_off = vc4_state->src_x & tile_w_mask;
7cd3cf3540a370 Boris Brezillon   2018-12-07   732  		u32 y_off = src_y & tile_h_mask;
7cd3cf3540a370 Boris Brezillon   2018-12-07   733  
7cd3cf3540a370 Boris Brezillon   2018-12-07   734  		/* When Y reflection is requested we must set the
7cd3cf3540a370 Boris Brezillon   2018-12-07   735  		 * SCALER_PITCH0_TILE_LINE_DIR flag to tell HVS that all lines
7cd3cf3540a370 Boris Brezillon   2018-12-07   736  		 * after the initial one should be fetched in descending order,
7cd3cf3540a370 Boris Brezillon   2018-12-07   737  		 * which makes sense since we start from the last line and go
7cd3cf3540a370 Boris Brezillon   2018-12-07   738  		 * backward.
7cd3cf3540a370 Boris Brezillon   2018-12-07   739  		 * Don't know why we need y_off = max_y_off - y_off, but it's
7cd3cf3540a370 Boris Brezillon   2018-12-07   740  		 * definitely required (I guess it's also related to the "going
7cd3cf3540a370 Boris Brezillon   2018-12-07   741  		 * backward" situation).
7cd3cf3540a370 Boris Brezillon   2018-12-07   742  		 */
7cd3cf3540a370 Boris Brezillon   2018-12-07   743  		if (rotation & DRM_MODE_REFLECT_Y) {
7cd3cf3540a370 Boris Brezillon   2018-12-07   744  			y_off = tile_h_mask - y_off;
7cd3cf3540a370 Boris Brezillon   2018-12-07   745  			pitch0 = SCALER_PITCH0_TILE_LINE_DIR;
7cd3cf3540a370 Boris Brezillon   2018-12-07   746  		} else {
7cd3cf3540a370 Boris Brezillon   2018-12-07   747  			pitch0 = 0;
7cd3cf3540a370 Boris Brezillon   2018-12-07   748  		}
652badb9458b41 Eric Anholt       2017-09-27   749  
98830d91da082b Eric Anholt       2017-06-07   750  		tiling = SCALER_CTL0_TILING_256B_OR_T;
7cd3cf3540a370 Boris Brezillon   2018-12-07   751  		pitch0 |= (VC4_SET_FIELD(x_off, SCALER_PITCH0_SINK_PIX) |
3e407417b1928e Boris Brezillon   2018-08-03   752  			   VC4_SET_FIELD(y_off, SCALER_PITCH0_TILE_Y_OFFSET) |
3e407417b1928e Boris Brezillon   2018-08-03   753  			   VC4_SET_FIELD(tiles_l, SCALER_PITCH0_TILE_WIDTH_L) |
3e407417b1928e Boris Brezillon   2018-08-03   754  			   VC4_SET_FIELD(tiles_r, SCALER_PITCH0_TILE_WIDTH_R));
3e407417b1928e Boris Brezillon   2018-08-03   755  		vc4_state->offsets[0] += tiles_t * (tiles_w << tile_size_shift);
3e407417b1928e Boris Brezillon   2018-08-03   756  		vc4_state->offsets[0] += subtile_y << 8;
3e407417b1928e Boris Brezillon   2018-08-03   757  		vc4_state->offsets[0] += utile_y << 4;
3e407417b1928e Boris Brezillon   2018-08-03   758  
3e407417b1928e Boris Brezillon   2018-08-03   759  		/* Rows of tiles alternate left-to-right and right-to-left. */
3e407417b1928e Boris Brezillon   2018-08-03   760  		if (tiles_t & 1) {
3e407417b1928e Boris Brezillon   2018-08-03   761  			pitch0 |= SCALER_PITCH0_TILE_INITIAL_LINE_DIR;
3e407417b1928e Boris Brezillon   2018-08-03   762  			vc4_state->offsets[0] += (tiles_w - tiles_l) <<
3e407417b1928e Boris Brezillon   2018-08-03   763  						 tile_size_shift;
3e407417b1928e Boris Brezillon   2018-08-03   764  			vc4_state->offsets[0] -= (1 + !tile_y) << 10;
3e407417b1928e Boris Brezillon   2018-08-03   765  		} else {
3e407417b1928e Boris Brezillon   2018-08-03   766  			vc4_state->offsets[0] += tiles_l << tile_size_shift;
3e407417b1928e Boris Brezillon   2018-08-03   767  			vc4_state->offsets[0] += tile_y << 10;
3e407417b1928e Boris Brezillon   2018-08-03   768  		}
98830d91da082b Eric Anholt       2017-06-07   769  
98830d91da082b Eric Anholt       2017-06-07   770  		break;
652badb9458b41 Eric Anholt       2017-09-27   771  	}
652badb9458b41 Eric Anholt       2017-09-27   772  
e065a8dd30af70 Dave Stevenson    2018-03-16   773  	case DRM_FORMAT_MOD_BROADCOM_SAND64:
e065a8dd30af70 Dave Stevenson    2018-03-16   774  	case DRM_FORMAT_MOD_BROADCOM_SAND128:
e065a8dd30af70 Dave Stevenson    2018-03-16   775  	case DRM_FORMAT_MOD_BROADCOM_SAND256: {
e065a8dd30af70 Dave Stevenson    2018-03-16   776  		uint32_t param = fourcc_mod_broadcom_param(fb->modifier);
8e75d582db02bc Boris Brezillon   2018-12-07   777  		u32 tile_w, tile, x_off, pix_per_tile;
e065a8dd30af70 Dave Stevenson    2018-03-16   778  
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   779  		if (fb->format->format == DRM_FORMAT_P030) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   780  			/*
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   781  			 * Spec says: bits [31:4] of the given address should point to
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   782  			 * the 128-bit word containing the desired starting pixel,
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   783  			 * and bits[3:0] should be between 0 and 11, indicating which
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   784  			 * of the 12-pixels in that 128-bit word is the first pixel to be used
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   785  			 */
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   786  	                u32 remaining_pixels = vc4_state->src_x % 96;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   787  			u32 aligned = remaining_pixels / 12;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   788  			u32 last_bits = remaining_pixels % 12;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   789  
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   790  			x_off = aligned * 16 + last_bits;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   791  			hvs_format = HVS_PIXEL_FORMAT_YCBCR_10BIT;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   792  			tiling = SCALER_CTL0_TILING_128B;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   793  			tile_w = 128;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   794  			pix_per_tile = 96;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   795  		} else {
e065a8dd30af70 Dave Stevenson    2018-03-16   796  			hvs_format = HVS_PIXEL_FORMAT_H264;
e065a8dd30af70 Dave Stevenson    2018-03-16   797  
e065a8dd30af70 Dave Stevenson    2018-03-16   798  			switch (base_format_mod) {
e065a8dd30af70 Dave Stevenson    2018-03-16   799  			case DRM_FORMAT_MOD_BROADCOM_SAND64:
e065a8dd30af70 Dave Stevenson    2018-03-16   800  				tiling = SCALER_CTL0_TILING_64B;
8e75d582db02bc Boris Brezillon   2018-12-07   801  				tile_w = 64;
e065a8dd30af70 Dave Stevenson    2018-03-16   802  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   803  			case DRM_FORMAT_MOD_BROADCOM_SAND128:
e065a8dd30af70 Dave Stevenson    2018-03-16   804  				tiling = SCALER_CTL0_TILING_128B;
8e75d582db02bc Boris Brezillon   2018-12-07   805  				tile_w = 128;
e065a8dd30af70 Dave Stevenson    2018-03-16   806  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   807  			case DRM_FORMAT_MOD_BROADCOM_SAND256:
e065a8dd30af70 Dave Stevenson    2018-03-16   808  				tiling = SCALER_CTL0_TILING_256B_OR_T;
8e75d582db02bc Boris Brezillon   2018-12-07   809  				tile_w = 256;
e065a8dd30af70 Dave Stevenson    2018-03-16   810  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16  @811  			default:
e065a8dd30af70 Dave Stevenson    2018-03-16   812  				break;
e065a8dd30af70 Dave Stevenson    2018-03-16   813  			}
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   814  			pix_per_tile = tile_w / fb->format->cpp[0];
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   815  			x_off = (vc4_state->src_x % pix_per_tile) /
d4c05e7a5da7b6 Dave Stevenson    2021-11-17  @816  				(i ? h_subsample : 1) * fb->format->cpp[i];
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   817  		}
e065a8dd30af70 Dave Stevenson    2018-03-16   818  		if (param > SCALER_TILE_HEIGHT_MASK) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   819  			DRM_DEBUG_KMS("SAND height too large (%d)\n",
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   820  				      param);
e065a8dd30af70 Dave Stevenson    2018-03-16   821  			return -EINVAL;
e065a8dd30af70 Dave Stevenson    2018-03-16   822  		}
8e75d582db02bc Boris Brezillon   2018-12-07   823  		tile = vc4_state->src_x / pix_per_tile;
8e75d582db02bc Boris Brezillon   2018-12-07   824  		/* Adjust the base pointer to the first pixel to be scanned
8e75d582db02bc Boris Brezillon   2018-12-07   825  		 * out.
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   826  		 *
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   827  		 * For P030, y_ptr [31:4] is the 128bit word for the start pixel
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   828  		 * y_ptr [3:0] is the pixel (0-11) contained within that 128bit
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   829  		 * word that should be taken as the first pixel.
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   830  		 * Ditto uv_ptr [31:4] vs [3:0], however [3:0] contains the
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   831  		 * element within the 128bit word, eg for pixel 3 the value
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   832  		 * should be 6.
8e75d582db02bc Boris Brezillon   2018-12-07   833  		 */
8e75d582db02bc Boris Brezillon   2018-12-07   834  		for (i = 0; i < num_planes; i++) {
8e75d582db02bc Boris Brezillon   2018-12-07   835  			vc4_state->offsets[i] += param * tile_w * tile;
7cd3cf3540a370 Boris Brezillon   2018-12-07   836  			vc4_state->offsets[i] += src_y /
8e75d582db02bc Boris Brezillon   2018-12-07   837  						 (i ? v_subsample : 1) *
8e75d582db02bc Boris Brezillon   2018-12-07   838  						 tile_w;
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   839  			vc4_state->offsets[i] += x_off & ~(i ? 1 : 0);
8e75d582db02bc Boris Brezillon   2018-12-07   840  		}
8e75d582db02bc Boris Brezillon   2018-12-07   841  
e065a8dd30af70 Dave Stevenson    2018-03-16   842  		pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT);
e065a8dd30af70 Dave Stevenson    2018-03-16   843  		break;
e065a8dd30af70 Dave Stevenson    2018-03-16   844  	}
e065a8dd30af70 Dave Stevenson    2018-03-16   845  
98830d91da082b Eric Anholt       2017-06-07   846  	default:
98830d91da082b Eric Anholt       2017-06-07   847  		DRM_DEBUG_KMS("Unsupported FB tiling flag 0x%16llx",
98830d91da082b Eric Anholt       2017-06-07   848  			      (long long)fb->modifier);
98830d91da082b Eric Anholt       2017-06-07   849  		return -EINVAL;
98830d91da082b Eric Anholt       2017-06-07   850  	}
98830d91da082b Eric Anholt       2017-06-07   851  
c54619b0bfb35c Dave Stevenson    2020-09-03   852  	/* Don't waste cycles mixing with plane alpha if the set alpha
c54619b0bfb35c Dave Stevenson    2020-09-03   853  	 * is opaque or there is no per-pixel alpha information.
c54619b0bfb35c Dave Stevenson    2020-09-03   854  	 * In any case we use the alpha property value as the fixed alpha.
c54619b0bfb35c Dave Stevenson    2020-09-03   855  	 */
c54619b0bfb35c Dave Stevenson    2020-09-03   856  	mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE &&
c54619b0bfb35c Dave Stevenson    2020-09-03   857  			  fb->format->has_alpha;
c54619b0bfb35c Dave Stevenson    2020-09-03   858  
c54619b0bfb35c Dave Stevenson    2020-09-03   859  	if (!vc4->hvs->hvs5) {
21af94cf1a4c2d Eric Anholt       2015-10-20   860  	/* Control word */
c8b75bca92cbf0 Eric Anholt       2015-03-02   861  		vc4_dlist_write(vc4_state,
c8b75bca92cbf0 Eric Anholt       2015-03-02   862  				SCALER_CTL0_VALID |
7cd3cf3540a370 Boris Brezillon   2018-12-07   863  				(rotation & DRM_MODE_REFLECT_X ? SCALER_CTL0_HFLIP : 0) |
7cd3cf3540a370 Boris Brezillon   2018-12-07   864  				(rotation & DRM_MODE_REFLECT_Y ? SCALER_CTL0_VFLIP : 0) |
3257ec797d3a8c Maxime Ripard     2018-05-17   865  				VC4_SET_FIELD(SCALER_CTL0_RGBA_EXPAND_ROUND, SCALER_CTL0_RGBA_EXPAND) |
c8b75bca92cbf0 Eric Anholt       2015-03-02   866  				(format->pixel_order << SCALER_CTL0_ORDER_SHIFT) |
e065a8dd30af70 Dave Stevenson    2018-03-16   867  				(hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
98830d91da082b Eric Anholt       2017-06-07   868  				VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
21af94cf1a4c2d Eric Anholt       2015-10-20   869  				(vc4_state->is_unity ? SCALER_CTL0_UNITY : 0) |
fc04023fafecf1 Eric Anholt       2015-12-30   870  				VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
fc04023fafecf1 Eric Anholt       2015-12-30   871  				VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1));
c8b75bca92cbf0 Eric Anholt       2015-03-02   872  
c8b75bca92cbf0 Eric Anholt       2015-03-02   873  		/* Position Word 0: Image Positions and Alpha Value */
6674a904d68041 Eric Anholt       2015-12-30   874  		vc4_state->pos0_offset = vc4_state->dlist_count;
c8b75bca92cbf0 Eric Anholt       2015-03-02   875  		vc4_dlist_write(vc4_state,
22445f0316a253 Stefan Schake     2018-04-20   876  				VC4_SET_FIELD(state->alpha >> 8, SCALER_POS0_FIXED_ALPHA) |
5c6799942003df Eric Anholt       2015-12-28   877  				VC4_SET_FIELD(vc4_state->crtc_x, SCALER_POS0_START_X) |
5c6799942003df Eric Anholt       2015-12-28   878  				VC4_SET_FIELD(vc4_state->crtc_y, SCALER_POS0_START_Y));
c8b75bca92cbf0 Eric Anholt       2015-03-02   879  
21af94cf1a4c2d Eric Anholt       2015-10-20   880  		/* Position Word 1: Scaled Image Dimensions. */
21af94cf1a4c2d Eric Anholt       2015-10-20   881  		if (!vc4_state->is_unity) {
21af94cf1a4c2d Eric Anholt       2015-10-20   882  			vc4_dlist_write(vc4_state,
21af94cf1a4c2d Eric Anholt       2015-10-20   883  					VC4_SET_FIELD(vc4_state->crtc_w,
21af94cf1a4c2d Eric Anholt       2015-10-20   884  						      SCALER_POS1_SCL_WIDTH) |
21af94cf1a4c2d Eric Anholt       2015-10-20   885  					VC4_SET_FIELD(vc4_state->crtc_h,
21af94cf1a4c2d Eric Anholt       2015-10-20   886  						      SCALER_POS1_SCL_HEIGHT));
21af94cf1a4c2d Eric Anholt       2015-10-20   887  		}
c8b75bca92cbf0 Eric Anholt       2015-03-02   888  
05202c241f1476 Stefan Schake     2018-03-09   889  		/* Position Word 2: Source Image Size, Alpha */
6674a904d68041 Eric Anholt       2015-12-30   890  		vc4_state->pos2_offset = vc4_state->dlist_count;
c8b75bca92cbf0 Eric Anholt       2015-03-02   891  		vc4_dlist_write(vc4_state,
124e5dac9a596a Maxime Ripard     2017-12-22   892  				VC4_SET_FIELD(fb->format->has_alpha ?
c8b75bca92cbf0 Eric Anholt       2015-03-02   893  					      SCALER_POS2_ALPHA_MODE_PIPELINE :
c8b75bca92cbf0 Eric Anholt       2015-03-02   894  					      SCALER_POS2_ALPHA_MODE_FIXED,
c8b75bca92cbf0 Eric Anholt       2015-03-02   895  					      SCALER_POS2_ALPHA_MODE) |
22445f0316a253 Stefan Schake     2018-04-20   896  				(mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   897  				(fb->format->has_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   898  						SCALER_POS2_ALPHA_PREMULT : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   899  				VC4_SET_FIELD(vc4_state->src_w[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   900  					      SCALER_POS2_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   901  				VC4_SET_FIELD(vc4_state->src_h[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   902  					      SCALER_POS2_HEIGHT));
c54619b0bfb35c Dave Stevenson    2020-09-03   903  
c54619b0bfb35c Dave Stevenson    2020-09-03   904  		/* Position Word 3: Context.  Written by the HVS. */
c54619b0bfb35c Dave Stevenson    2020-09-03   905  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c54619b0bfb35c Dave Stevenson    2020-09-03   906  
c54619b0bfb35c Dave Stevenson    2020-09-03   907  	} else {
c54619b0bfb35c Dave Stevenson    2020-09-03   908  		u32 hvs_pixel_order = format->pixel_order;
c54619b0bfb35c Dave Stevenson    2020-09-03   909  
c54619b0bfb35c Dave Stevenson    2020-09-03   910  		if (format->pixel_order_hvs5)
c54619b0bfb35c Dave Stevenson    2020-09-03   911  			hvs_pixel_order = format->pixel_order_hvs5;
c54619b0bfb35c Dave Stevenson    2020-09-03   912  
c54619b0bfb35c Dave Stevenson    2020-09-03   913  		/* Control word */
c54619b0bfb35c Dave Stevenson    2020-09-03   914  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   915  				SCALER_CTL0_VALID |
c54619b0bfb35c Dave Stevenson    2020-09-03   916  				(hvs_pixel_order << SCALER_CTL0_ORDER_SHIFT) |
c54619b0bfb35c Dave Stevenson    2020-09-03   917  				(hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) |
c54619b0bfb35c Dave Stevenson    2020-09-03   918  				VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) |
c54619b0bfb35c Dave Stevenson    2020-09-03   919  				(vc4_state->is_unity ?
c54619b0bfb35c Dave Stevenson    2020-09-03   920  						SCALER5_CTL0_UNITY : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   921  				VC4_SET_FIELD(scl0, SCALER_CTL0_SCL0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   922  				VC4_SET_FIELD(scl1, SCALER_CTL0_SCL1) |
c54619b0bfb35c Dave Stevenson    2020-09-03   923  				SCALER5_CTL0_ALPHA_EXPAND |
c54619b0bfb35c Dave Stevenson    2020-09-03   924  				SCALER5_CTL0_RGB_EXPAND);
c54619b0bfb35c Dave Stevenson    2020-09-03   925  
c54619b0bfb35c Dave Stevenson    2020-09-03   926  		/* Position Word 0: Image Positions and Alpha Value */
c54619b0bfb35c Dave Stevenson    2020-09-03   927  		vc4_state->pos0_offset = vc4_state->dlist_count;
c54619b0bfb35c Dave Stevenson    2020-09-03   928  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   929  				(rotation & DRM_MODE_REFLECT_Y ?
c54619b0bfb35c Dave Stevenson    2020-09-03   930  						SCALER5_POS0_VFLIP : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   931  				VC4_SET_FIELD(vc4_state->crtc_x,
c54619b0bfb35c Dave Stevenson    2020-09-03   932  					      SCALER_POS0_START_X) |
c54619b0bfb35c Dave Stevenson    2020-09-03   933  				(rotation & DRM_MODE_REFLECT_X ?
c54619b0bfb35c Dave Stevenson    2020-09-03   934  					      SCALER5_POS0_HFLIP : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   935  				VC4_SET_FIELD(vc4_state->crtc_y,
c54619b0bfb35c Dave Stevenson    2020-09-03   936  					      SCALER5_POS0_START_Y)
c54619b0bfb35c Dave Stevenson    2020-09-03   937  			       );
c54619b0bfb35c Dave Stevenson    2020-09-03   938  
c54619b0bfb35c Dave Stevenson    2020-09-03   939  		/* Control Word 2 */
c54619b0bfb35c Dave Stevenson    2020-09-03   940  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   941  				VC4_SET_FIELD(state->alpha >> 4,
c54619b0bfb35c Dave Stevenson    2020-09-03   942  					      SCALER5_CTL2_ALPHA) |
4494346392204a Nathan Chancellor 2020-09-10   943  				(fb->format->has_alpha ?
4494346392204a Nathan Chancellor 2020-09-10   944  					SCALER5_CTL2_ALPHA_PREMULT : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   945  				(mix_plane_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   946  					SCALER5_CTL2_ALPHA_MIX : 0) |
c54619b0bfb35c Dave Stevenson    2020-09-03   947  				VC4_SET_FIELD(fb->format->has_alpha ?
c54619b0bfb35c Dave Stevenson    2020-09-03   948  				      SCALER5_CTL2_ALPHA_MODE_PIPELINE :
c54619b0bfb35c Dave Stevenson    2020-09-03   949  				      SCALER5_CTL2_ALPHA_MODE_FIXED,
c54619b0bfb35c Dave Stevenson    2020-09-03   950  				      SCALER5_CTL2_ALPHA_MODE)
c54619b0bfb35c Dave Stevenson    2020-09-03   951  			       );
c54619b0bfb35c Dave Stevenson    2020-09-03   952  
c54619b0bfb35c Dave Stevenson    2020-09-03   953  		/* Position Word 1: Scaled Image Dimensions. */
c54619b0bfb35c Dave Stevenson    2020-09-03   954  		if (!vc4_state->is_unity) {
c54619b0bfb35c Dave Stevenson    2020-09-03   955  			vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   956  					VC4_SET_FIELD(vc4_state->crtc_w,
f6b57101a6b312 Dom Cobley        2021-01-21   957  						      SCALER5_POS1_SCL_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   958  					VC4_SET_FIELD(vc4_state->crtc_h,
f6b57101a6b312 Dom Cobley        2021-01-21   959  						      SCALER5_POS1_SCL_HEIGHT));
c54619b0bfb35c Dave Stevenson    2020-09-03   960  		}
c54619b0bfb35c Dave Stevenson    2020-09-03   961  
c54619b0bfb35c Dave Stevenson    2020-09-03   962  		/* Position Word 2: Source Image Size */
c54619b0bfb35c Dave Stevenson    2020-09-03   963  		vc4_state->pos2_offset = vc4_state->dlist_count;
c54619b0bfb35c Dave Stevenson    2020-09-03   964  		vc4_dlist_write(vc4_state,
c54619b0bfb35c Dave Stevenson    2020-09-03   965  				VC4_SET_FIELD(vc4_state->src_w[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   966  					      SCALER5_POS2_WIDTH) |
c54619b0bfb35c Dave Stevenson    2020-09-03   967  				VC4_SET_FIELD(vc4_state->src_h[0],
c54619b0bfb35c Dave Stevenson    2020-09-03   968  					      SCALER5_POS2_HEIGHT));
c8b75bca92cbf0 Eric Anholt       2015-03-02   969  
c8b75bca92cbf0 Eric Anholt       2015-03-02   970  		/* Position Word 3: Context.  Written by the HVS. */
c8b75bca92cbf0 Eric Anholt       2015-03-02   971  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c54619b0bfb35c Dave Stevenson    2020-09-03   972  	}
c8b75bca92cbf0 Eric Anholt       2015-03-02   973  
fc04023fafecf1 Eric Anholt       2015-12-30   974  
fc04023fafecf1 Eric Anholt       2015-12-30   975  	/* Pointer Word 0/1/2: RGB / Y / Cb / Cr Pointers
fc04023fafecf1 Eric Anholt       2015-12-30   976  	 *
fc04023fafecf1 Eric Anholt       2015-12-30   977  	 * The pointers may be any byte address.
fc04023fafecf1 Eric Anholt       2015-12-30   978  	 */
6674a904d68041 Eric Anholt       2015-12-30   979  	vc4_state->ptr0_offset = vc4_state->dlist_count;
fc04023fafecf1 Eric Anholt       2015-12-30   980  	for (i = 0; i < num_planes; i++)
fc04023fafecf1 Eric Anholt       2015-12-30   981  		vc4_dlist_write(vc4_state, vc4_state->offsets[i]);
c8b75bca92cbf0 Eric Anholt       2015-03-02   982  
fc04023fafecf1 Eric Anholt       2015-12-30   983  	/* Pointer Context Word 0/1/2: Written by the HVS */
fc04023fafecf1 Eric Anholt       2015-12-30   984  	for (i = 0; i < num_planes; i++)
c8b75bca92cbf0 Eric Anholt       2015-03-02   985  		vc4_dlist_write(vc4_state, 0xc0c0c0c0);
c8b75bca92cbf0 Eric Anholt       2015-03-02   986  
98830d91da082b Eric Anholt       2017-06-07   987  	/* Pitch word 0 */
98830d91da082b Eric Anholt       2017-06-07   988  	vc4_dlist_write(vc4_state, pitch0);
98830d91da082b Eric Anholt       2017-06-07   989  
98830d91da082b Eric Anholt       2017-06-07   990  	/* Pitch word 1/2 */
98830d91da082b Eric Anholt       2017-06-07   991  	for (i = 1; i < num_planes; i++) {
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   992  		if (hvs_format != HVS_PIXEL_FORMAT_H264 &&
d4c05e7a5da7b6 Dave Stevenson    2021-11-17   993  		    hvs_format != HVS_PIXEL_FORMAT_YCBCR_10BIT) {
c8b75bca92cbf0 Eric Anholt       2015-03-02   994  			vc4_dlist_write(vc4_state,
e065a8dd30af70 Dave Stevenson    2018-03-16   995  					VC4_SET_FIELD(fb->pitches[i],
e065a8dd30af70 Dave Stevenson    2018-03-16   996  						      SCALER_SRC_PITCH));
e065a8dd30af70 Dave Stevenson    2018-03-16   997  		} else {
e065a8dd30af70 Dave Stevenson    2018-03-16   998  			vc4_dlist_write(vc4_state, pitch0);
e065a8dd30af70 Dave Stevenson    2018-03-16   999  		}
fc04023fafecf1 Eric Anholt       2015-12-30  1000  	}
fc04023fafecf1 Eric Anholt       2015-12-30  1001  
fc04023fafecf1 Eric Anholt       2015-12-30  1002  	/* Colorspace conversion words */
fc04023fafecf1 Eric Anholt       2015-12-30  1003  	if (vc4_state->is_yuv) {
fc04023fafecf1 Eric Anholt       2015-12-30  1004  		vc4_dlist_write(vc4_state, SCALER_CSC0_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1005  		vc4_dlist_write(vc4_state, SCALER_CSC1_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1006  		vc4_dlist_write(vc4_state, SCALER_CSC2_ITR_R_601_5);
fc04023fafecf1 Eric Anholt       2015-12-30  1007  	}
c8b75bca92cbf0 Eric Anholt       2015-03-02  1008  
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1009  	vc4_state->lbm_offset = 0;
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1010  
658d8cbd07dae2 Boris Brezillon   2018-07-25  1011  	if (vc4_state->x_scaling[0] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1012  	    vc4_state->x_scaling[1] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1013  	    vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
658d8cbd07dae2 Boris Brezillon   2018-07-25  1014  	    vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1015  		/* Reserve a slot for the LBM Base Address. The real value will
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1016  		 * be set when calling vc4_plane_allocate_lbm().
0a038c1c29a7a3 Boris Brezillon   2018-11-30  1017  		 */
fc04023fafecf1 Eric Anholt       2015-12-30  1018  		if (vc4_state->y_scaling[0] != VC4_SCALING_NONE ||
facd93f4285c40 Maxime Ripard     2021-01-29  1019  		    vc4_state->y_scaling[1] != VC4_SCALING_NONE) {
facd93f4285c40 Maxime Ripard     2021-01-29  1020  			vc4_state->lbm_offset = vc4_state->dlist_count;
facd93f4285c40 Maxime Ripard     2021-01-29  1021  			vc4_dlist_counter_increment(vc4_state);
facd93f4285c40 Maxime Ripard     2021-01-29  1022  		}
21af94cf1a4c2d Eric Anholt       2015-10-20  1023  
fc04023fafecf1 Eric Anholt       2015-12-30  1024  		if (num_planes > 1) {
fc04023fafecf1 Eric Anholt       2015-12-30  1025  			/* Emit Cb/Cr as channel 0 and Y as channel
fc04023fafecf1 Eric Anholt       2015-12-30  1026  			 * 1. This matches how we set up scl0/scl1
fc04023fafecf1 Eric Anholt       2015-12-30  1027  			 * above.
fc04023fafecf1 Eric Anholt       2015-12-30  1028  			 */
fc04023fafecf1 Eric Anholt       2015-12-30  1029  			vc4_write_scaling_parameters(state, 1);
fc04023fafecf1 Eric Anholt       2015-12-30  1030  		}
fc04023fafecf1 Eric Anholt       2015-12-30  1031  		vc4_write_scaling_parameters(state, 0);
21af94cf1a4c2d Eric Anholt       2015-10-20  1032  
21af94cf1a4c2d Eric Anholt       2015-10-20  1033  		/* If any PPF setup was done, then all the kernel
21af94cf1a4c2d Eric Anholt       2015-10-20  1034  		 * pointers get uploaded.
21af94cf1a4c2d Eric Anholt       2015-10-20  1035  		 */
fc04023fafecf1 Eric Anholt       2015-12-30  1036  		if (vc4_state->x_scaling[0] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1037  		    vc4_state->y_scaling[0] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1038  		    vc4_state->x_scaling[1] == VC4_SCALING_PPF ||
fc04023fafecf1 Eric Anholt       2015-12-30  1039  		    vc4_state->y_scaling[1] == VC4_SCALING_PPF) {
21af94cf1a4c2d Eric Anholt       2015-10-20  1040  			u32 kernel = VC4_SET_FIELD(vc4->hvs->mitchell_netravali_filter.start,
21af94cf1a4c2d Eric Anholt       2015-10-20  1041  						   SCALER_PPF_KERNEL_OFFSET);
21af94cf1a4c2d Eric Anholt       2015-10-20  1042  
21af94cf1a4c2d Eric Anholt       2015-10-20  1043  			/* HPPF plane 0 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1044  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1045  			/* VPPF plane 0 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1046  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1047  			/* HPPF plane 1 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1048  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1049  			/* VPPF plane 1 */
21af94cf1a4c2d Eric Anholt       2015-10-20  1050  			vc4_dlist_write(vc4_state, kernel);
21af94cf1a4c2d Eric Anholt       2015-10-20  1051  		}
21af94cf1a4c2d Eric Anholt       2015-10-20  1052  	}
21af94cf1a4c2d Eric Anholt       2015-10-20  1053  
c8b75bca92cbf0 Eric Anholt       2015-03-02  1054  	vc4_state->dlist[ctl0_offset] |=
c8b75bca92cbf0 Eric Anholt       2015-03-02  1055  		VC4_SET_FIELD(vc4_state->dlist_count, SCALER_CTL0_SIZE);
c8b75bca92cbf0 Eric Anholt       2015-03-02  1056  
3d67b68a6a3c2d Stefan Schake     2018-03-09  1057  	/* crtc_* are already clipped coordinates. */
3d67b68a6a3c2d Stefan Schake     2018-03-09  1058  	covers_screen = vc4_state->crtc_x == 0 && vc4_state->crtc_y == 0 &&
3d67b68a6a3c2d Stefan Schake     2018-03-09  1059  			vc4_state->crtc_w == state->crtc->mode.hdisplay &&
3d67b68a6a3c2d Stefan Schake     2018-03-09  1060  			vc4_state->crtc_h == state->crtc->mode.vdisplay;
3d67b68a6a3c2d Stefan Schake     2018-03-09  1061  	/* Background fill might be necessary when the plane has per-pixel
22445f0316a253 Stefan Schake     2018-04-20  1062  	 * alpha content or a non-opaque plane alpha and could blend from the
22445f0316a253 Stefan Schake     2018-04-20  1063  	 * background or does not cover the entire screen.
3d67b68a6a3c2d Stefan Schake     2018-03-09  1064  	 */
22445f0316a253 Stefan Schake     2018-04-20  1065  	vc4_state->needs_bg_fill = fb->format->has_alpha || !covers_screen ||
22445f0316a253 Stefan Schake     2018-04-20  1066  				   state->alpha != DRM_BLEND_ALPHA_OPAQUE;
3d67b68a6a3c2d Stefan Schake     2018-03-09  1067  
8d93844965c3d5 Boris Brezillon   2018-11-30  1068  	/* Flag the dlist as initialized to avoid checking it twice in case
8d93844965c3d5 Boris Brezillon   2018-11-30  1069  	 * the async update check already called vc4_plane_mode_set() and
8d93844965c3d5 Boris Brezillon   2018-11-30  1070  	 * decided to fallback to sync update because async update was not
8d93844965c3d5 Boris Brezillon   2018-11-30  1071  	 * possible.
8d93844965c3d5 Boris Brezillon   2018-11-30  1072  	 */
8d93844965c3d5 Boris Brezillon   2018-11-30  1073  	vc4_state->dlist_initialized = 1;
8d93844965c3d5 Boris Brezillon   2018-11-30  1074  
4686da83154d87 Boris Brezillon   2019-02-20  1075  	vc4_plane_calc_load(state);
4686da83154d87 Boris Brezillon   2019-02-20  1076  
c8b75bca92cbf0 Eric Anholt       2015-03-02  1077  	return 0;
c8b75bca92cbf0 Eric Anholt       2015-03-02  1078  }
c8b75bca92cbf0 Eric Anholt       2015-03-02  1079  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format
  2021-11-19 14:31   ` Pekka Paalanen
@ 2021-11-29 11:54     ` Dave Stevenson
  0 siblings, 0 replies; 9+ messages in thread
From: Dave Stevenson @ 2021-11-29 11:54 UTC (permalink / raw)
  To: Pekka Paalanen
  Cc: Dom Cobley, Tim Gover, David Airlie, DRI Development,
	Maxime Ripard, Thomas Zimmermann, Daniel Vetter, Phil Elwell

Hi Pekka

On Fri, 19 Nov 2021 at 14:31, Pekka Paalanen <ppaalanen@gmail.com> wrote:
>
> On Wed, 17 Nov 2021 15:08:58 +0100
> Maxime Ripard <maxime@cerno.tech> wrote:
>
> > From: Dave Stevenson <dave.stevenson@raspberrypi.com>
> >
> > Adds a format that is 3 10bit YUV 4:2:0 samples packed into
> > a 32bit work (with 2 spare bits).
> >
> > Supported on Broadcom BCM2711 chips.
> >
> > Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
> > Signed-off-by: Maxime Ripard <maxime@cerno.tech>
> > ---
> >  drivers/gpu/drm/drm_fourcc.c  |  3 +++
> >  include/uapi/drm/drm_fourcc.h | 11 +++++++++++
> >  2 files changed, 14 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
> > index 25837b1d6639..07741b678798 100644
> > --- a/drivers/gpu/drm/drm_fourcc.c
> > +++ b/drivers/gpu/drm/drm_fourcc.c
> > @@ -269,6 +269,9 @@ const struct drm_format_info *__drm_format_info(u32 format)
> >                 .num_planes = 3, .char_per_block = { 2, 2, 2 },
> >                 .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 0,
> >                 .vsub = 0, .is_yuv = true },
> > +             { .format = DRM_FORMAT_P030,            .depth = 0,  .num_planes = 2,
> > +               .char_per_block = { 4, 8, 0 }, .block_w = { 3, 3, 0 }, .block_h = { 1, 1, 0 },
> > +               .hsub = 2, .vsub = 2, .is_yuv = true},
> >       };
> >
> >       unsigned int i;
> > diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
> > index 7f652c96845b..2e6d2ecae45f 100644
> > --- a/include/uapi/drm/drm_fourcc.h
> > +++ b/include/uapi/drm/drm_fourcc.h
> > @@ -330,6 +330,13 @@ extern "C" {
> >   */
> >  #define DRM_FORMAT_Q401              fourcc_code('Q', '4', '0', '1')
> >
> > +/*
> > + * 2 plane YCbCr MSB aligned, 3 pixels packed into 4 bytes.
>
> Hi,
>
> what does "MSB aligned" mean? How widely used term is that?

DRM_FORMAT_P210, DRM_FORMAT_P010, DRM_FORMAT_P012, and DRM_FORMAT_P016
all use it in drm_fourcc.h
https://github.com/torvalds/linux/blob/master/include/uapi/drm/drm_fourcc.h#L290

> > + * index 0 = Y plane, [31:0] x:Y2:Y1:Y0 2:10:10:10 little endian
>
> Because if I had to say, this looks like LSB aligned?
>
> > + * index 1 = Cr:Cb plane, [63:0] x:Cr2:Cb2:Cr1:x:Cb1:Cr0:Cb0 [2:10:10:10:2:10:10:10] little endian
>
> And this is not really either, I guess.

Yup, looks like I was a bit too keen on copy/paste from the Intel formats :-(

/* 2 plane YCbCr420.
 * 3 10 bit components and 2 padding bits packed into 4 bytes.
 * index 0 = Y plane, [31:0] x:Y2:Y1:Y0 2:10:10:10 little endian
 * index 1 = Cr:Cb plane, [63:0] x:Cr2:Cb2:Cr1:x:Cb1:Cr0:Cb0
[2:10:10:10:2:10:10:10] little endian
 */

  Dave

> Thanks,
> pq
>
> > + */
> > +#define DRM_FORMAT_P030              fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */
> > +
> >  /*
> >   * 3 plane YCbCr
> >   * index 0: Y plane, [7:0] Y
> > @@ -854,6 +861,10 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
> >   * and UV.  Some SAND-using hardware stores UV in a separate tiled
> >   * image from Y to reduce the column height, which is not supported
> >   * with these modifiers.
> > + *
> > + * The DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT modifier is also
> > + * supported for DRM_FORMAT_P030 where the columns remain as 128 bytes
> > + * wide, but as this is a 10 bpp format that translates to 96 pixels.
> >   */
> >
> >  #define DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(v) \
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-11-29 11:54 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-17 14:08 [PATCH 0/3] drm/vc4: Support for 30 bits YUV formats Maxime Ripard
2021-11-17 14:08 ` [PATCH 1/3] drm/fourcc: Add packed 10bit YUV 4:2:0 format Maxime Ripard
2021-11-19 14:31   ` Pekka Paalanen
2021-11-29 11:54     ` Dave Stevenson
2021-11-17 14:08 ` [PATCH 2/3] drm/vc4: plane: Add support for DRM_FORMAT_P030 Maxime Ripard
2021-11-26  2:18   ` kernel test robot
2021-11-26  2:18     ` kernel test robot
2021-11-26  2:18     ` kernel test robot
2021-11-17 14:09 ` [PATCH 3/3] drm/vc4: plane: Add support for YUV color encodings and ranges Maxime Ripard

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.