mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
linux (RPi): add backport patch of PR6741 RPi5 SAND fixes
Signed-off-by: Matthias Reichl <hias@horus.com>
This commit is contained in:
parent
d1781f6d10
commit
f3fa3d2341
@ -0,0 +1,130 @@
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user