0
0
mirror of https://github.com/libretro/Lakka-LibreELEC.git synced 2025-07-20 07:41:51 +00:00
Files
Lakka-LibreELEC/packages/linux/patches/raspberrypi/linux-001-backport-pr6741-rpi5-sand-fixes.patch
Matthias Reichl f3fa3d2341 linux (RPi): add backport patch of PR6741 RPi5 SAND fixes
Signed-off-by: Matthias Reichl <hias@horus.com>
2025-04-04 19:55:37 +02:00

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