mirror of
https://github.com/libretro/Lakka-LibreELEC.git
synced 2025-07-20 07:41:51 +00:00
131 lines
4.5 KiB
Diff
131 lines
4.5 KiB
Diff
From 7ac0b48fa963cbc7e8b1f3702a4ae8d1947e65a2 Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
Date: Tue, 25 Mar 2025 16:02:24 +0000
|
|
Subject: [PATCH 1/2] drm/vc4: plane: Correct SAND30 word sizing for cropping
|
|
on BCM2712
|
|
|
|
BCM2712/vc6 uses 256bit words when reading in P030/SAND128,
|
|
increased from 128bit on BCM2711/vc5.
|
|
|
|
Update the code for cropping the read area to handle the correct
|
|
word length.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_plane.c | 16 ++++++++--------
|
|
1 file changed, 8 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
|
|
index fdd6ba310324..f1333d89cd92 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
|
@@ -1934,18 +1934,18 @@ static int vc6_plane_mode_set(struct drm_plane *plane,
|
|
|
|
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
|
|
+ * Spec says: bits [31:5] of the given address
|
|
+ * should point to the 256-bit word containing
|
|
+ * the desired starting pixel, and bits[4:0]
|
|
+ * should be between 0 and 23, indicating which
|
|
+ * of the 24-pixels in that 256-bit word is the
|
|
* first pixel to be used
|
|
*/
|
|
u32 remaining_pixels = src_x % 96;
|
|
- u32 aligned = remaining_pixels / 12;
|
|
- u32 last_bits = remaining_pixels % 12;
|
|
+ u32 aligned = remaining_pixels / 24;
|
|
+ u32 last_bits = remaining_pixels % 24;
|
|
|
|
- x_off = aligned * 16 + last_bits;
|
|
+ x_off = aligned * 32 + last_bits;
|
|
tile_w = 128;
|
|
pix_per_tile = 96;
|
|
} else {
|
|
--
|
|
2.39.5
|
|
|
|
|
|
From 3064adb25c5af41920f62d80dabf47a252b233a0 Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
Date: Mon, 31 Mar 2025 17:03:40 +0100
|
|
Subject: [PATCH 2/2] drm/vc4: plane: Ensure fetch_count is sufficient for hw
|
|
in SAND mode
|
|
|
|
The number of words to fetch for SAND formats on vc6 needs to account
|
|
for all pixels requested by width.
|
|
|
|
If cropping fractional pixels, then the width was being increased, but
|
|
fetch_count had already been computed. That led to insufficient words
|
|
being fetched, and the HVS locked up solid.
|
|
|
|
Apply the fixup for fractional pixel source cropping before computing
|
|
fetch_count.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_plane.c | 36 ++++++++++++++++-----------------
|
|
1 file changed, 18 insertions(+), 18 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
|
|
index f1333d89cd92..7a203a702c22 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
|
@@ -1874,6 +1874,24 @@ static int vc6_plane_mode_set(struct drm_plane *plane,
|
|
|
|
src_x = vc4_state->src_x >> 16;
|
|
|
|
+ /* fetch an extra pixel if we don't actually line up with the left edge. */
|
|
+ if ((vc4_state->src_x & 0xffff) && vc4_state->src_x < (state->fb->width << 16))
|
|
+ width++;
|
|
+
|
|
+ /* same for the right side */
|
|
+ if (((vc4_state->src_x + vc4_state->src_w[0]) & 0xffff) &&
|
|
+ vc4_state->src_x + vc4_state->src_w[0] < (state->fb->width << 16))
|
|
+ width++;
|
|
+
|
|
+ /* now for the top */
|
|
+ if ((vc4_state->src_y & 0xffff) && vc4_state->src_y < (state->fb->height << 16))
|
|
+ height++;
|
|
+
|
|
+ /* and the bottom */
|
|
+ if (((vc4_state->src_y + vc4_state->src_h[0]) & 0xffff) &&
|
|
+ vc4_state->src_y + vc4_state->src_h[0] < (state->fb->height << 16))
|
|
+ height++;
|
|
+
|
|
switch (base_format_mod) {
|
|
case DRM_FORMAT_MOD_LINEAR:
|
|
tiling = SCALER6_CTL0_ADDR_MODE_LINEAR;
|
|
@@ -1988,24 +2006,6 @@ static int vc6_plane_mode_set(struct drm_plane *plane,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- /* fetch an extra pixel if we don't actually line up with the left edge. */
|
|
- if ((vc4_state->src_x & 0xffff) && vc4_state->src_x < (state->fb->width << 16))
|
|
- width++;
|
|
-
|
|
- /* same for the right side */
|
|
- if (((vc4_state->src_x + vc4_state->src_w[0]) & 0xffff) &&
|
|
- vc4_state->src_x + vc4_state->src_w[0] < (state->fb->width << 16))
|
|
- width++;
|
|
-
|
|
- /* now for the top */
|
|
- if ((vc4_state->src_y & 0xffff) && vc4_state->src_y < (state->fb->height << 16))
|
|
- height++;
|
|
-
|
|
- /* and the bottom */
|
|
- if (((vc4_state->src_y + vc4_state->src_h[0]) & 0xffff) &&
|
|
- vc4_state->src_y + vc4_state->src_h[0] < (state->fb->height << 16))
|
|
- height++;
|
|
-
|
|
/* for YUV444 hardware wants double the width, otherwise it doesn't
|
|
* fetch full width of chroma
|
|
*/
|
|
--
|
|
2.39.5
|
|
|