diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.19/950-0662-drm-vc4-Move-offsets-adjustment-out-of-setup_clippin.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.19/950-0662-drm-vc4-Move-offsets-adjustment-out-of-setup_clippin.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.19/950-0662-drm-vc4-Move-offsets-adjustment-out-of-setup_clippin.patch b/target/linux/brcm2708/patches-4.19/950-0662-drm-vc4-Move-offsets-adjustment-out-of-setup_clippin.patch new file mode 100644 index 0000000000..9820c91d60 --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0662-drm-vc4-Move-offsets-adjustment-out-of-setup_clippin.patch @@ -0,0 +1,73 @@ +From 58a92eae6ed463c294381e72eefec701d23fcdaf Mon Sep 17 00:00:00 2001 +From: Boris Brezillon <boris.brezillon@bootlin.com> +Date: Fri, 3 Aug 2018 11:22:30 +0200 +Subject: [PATCH] adjustment out of + setup_clipping_and_scaling() + +The offset adjustment depends on the framebuffer modified, so let's +just move this operation in the DRM_FORMAT_MOD_LINEAR case inside +vc4_plane_mode_set(). + +This we'll be able to fix offset calculation for +DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED and DRM_FORMAT_MOD_BROADCOM_SANDXXX. + +Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> +Reviewed-by: Eric Anholt <eric@anholt.net> +Link: https://patchwork.freedesktop.org/patch/msgid/20180803092231.26446-4-boris.brezillon@bootlin.com +--- + drivers/gpu/drm/vc4/vc4_plane.c | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -406,16 +406,6 @@ static int vc4_plane_setup_clipping_and_ + vc4_state->y_scaling[1] = VC4_SCALING_NONE; + } + +- /* Adjust the base pointer to the first pixel to be scanned out. */ +- for (i = 0; i < num_planes; i++) { +- vc4_state->offsets[i] += (vc4_state->src_y / +- (i ? v_subsample : 1)) * +- fb->pitches[i]; +- vc4_state->offsets[i] += (vc4_state->src_x / +- (i ? h_subsample : 1)) * +- fb->format->cpp[i]; +- } +- + return 0; + } + +@@ -523,6 +513,7 @@ static int vc4_plane_mode_set(struct drm + const struct hvs_format *format = vc4_get_hvs_format(fb->format->format); + u64 base_format_mod = fourcc_mod_broadcom_mod(fb->modifier); + int num_planes = drm_format_num_planes(format->drm); ++ u32 h_subsample, v_subsample; + bool mix_plane_alpha; + bool covers_screen; + u32 scl0, scl1, pitch0; +@@ -568,10 +559,25 @@ static int vc4_plane_mode_set(struct drm + scl1 = vc4_get_scl_field(state, 0); + } + ++ h_subsample = drm_format_horz_chroma_subsampling(format->drm); ++ v_subsample = drm_format_vert_chroma_subsampling(format->drm); ++ + switch (base_format_mod) { + case DRM_FORMAT_MOD_LINEAR: + tiling = SCALER_CTL0_TILING_LINEAR; + pitch0 = VC4_SET_FIELD(fb->pitches[0], SCALER_SRC_PITCH); ++ ++ /* Adjust the base pointer to the first pixel to be scanned ++ * out. ++ */ ++ for (i = 0; i < num_planes; i++) { ++ vc4_state->offsets[i] += vc4_state->src_y / ++ (i ? v_subsample : 1) * ++ fb->pitches[i]; ++ vc4_state->offsets[i] += vc4_state->src_x / ++ (i ? h_subsample : 1) * ++ fb->format->cpp[i]; ++ } + break; + + case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: { |