mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
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>
This commit is contained in:
committed by
Dom Cobley
parent
a7b115dbd4
commit
7e9bcb1ef2
@@ -1895,6 +1895,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;
|
||||
@@ -2016,24 +2034,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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user