aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0423-drm-amd-display-fix-scaling-calculation-for-proper-s.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0423-drm-amd-display-fix-scaling-calculation-for-proper-s.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0423-drm-amd-display-fix-scaling-calculation-for-proper-s.patch245
1 files changed, 245 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0423-drm-amd-display-fix-scaling-calculation-for-proper-s.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0423-drm-amd-display-fix-scaling-calculation-for-proper-s.patch
new file mode 100644
index 00000000..426f73b8
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0423-drm-amd-display-fix-scaling-calculation-for-proper-s.patch
@@ -0,0 +1,245 @@
+From bd025418437344338ac79ef90af461a068cc8163 Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Tue, 9 May 2017 16:39:26 -0400
+Subject: [PATCH 0423/4131] drm/amd/display: fix scaling calculation for proper
+ surface input format
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 60 +++++++++++++++--------
+ drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 20 ++++----
+ 2 files changed, 49 insertions(+), 31 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+index 9588217..7ca03d1 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -431,6 +431,7 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
+ const struct dc_surface *surface = &pipe_ctx->surface->public;
+ const struct dc_stream *stream = &pipe_ctx->stream->public;
+ struct scaler_data *data = &pipe_ctx->scl_data;
++ struct rect surf_src = surface->src_rect;
+ struct rect clip = { 0 };
+ int vpc_div = (data->format == PIXEL_FORMAT_420BPP12
+ || data->format == PIXEL_FORMAT_420BPP15) ? 2 : 1;
+@@ -444,6 +445,11 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
+ pri_split = false;
+ sec_split = false;
+ }
++
++ if (pipe_ctx->surface->public.rotation == ROTATION_ANGLE_90 ||
++ pipe_ctx->surface->public.rotation == ROTATION_ANGLE_270)
++ rect_swap_helper(&surf_src);
++
+ /* The actual clip is an intersection between stream
+ * source and surface clip
+ */
+@@ -463,18 +469,18 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
+ stream->src.y + stream->src.height - clip.y :
+ surface->clip_rect.y + surface->clip_rect.height - clip.y ;
+
+- /* offset = src.ofs + (clip.ofs - surface->dst_rect.ofs) * scl_ratio
++ /* offset = surf_src.ofs + (clip.ofs - surface->dst_rect.ofs) * scl_ratio
+ * num_pixels = clip.num_pix * scl_ratio
+ */
+- data->viewport.x = surface->src_rect.x + (clip.x - surface->dst_rect.x) *
+- surface->src_rect.width / surface->dst_rect.width;
++ data->viewport.x = surf_src.x + (clip.x - surface->dst_rect.x) *
++ surf_src.width / surface->dst_rect.width;
+ data->viewport.width = clip.width *
+- surface->src_rect.width / surface->dst_rect.width;
++ surf_src.width / surface->dst_rect.width;
+
+- data->viewport.y = surface->src_rect.y + (clip.y - surface->dst_rect.y) *
+- surface->src_rect.height / surface->dst_rect.height;
++ data->viewport.y = surf_src.y + (clip.y - surface->dst_rect.y) *
++ surf_src.height / surface->dst_rect.height;
+ data->viewport.height = clip.height *
+- surface->src_rect.height / surface->dst_rect.height;
++ surf_src.height / surface->dst_rect.height;
+
+ /* Round down, compensate in init */
+ data->viewport_c.x = data->viewport.x / vpc_div;
+@@ -523,16 +529,21 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
+ {
+ const struct dc_surface *surface = &pipe_ctx->surface->public;
+ struct core_stream *stream = pipe_ctx->stream;
+- struct rect clip = surface->clip_rect;
++ struct rect surf_src = surface->src_rect;
++ struct rect surf_clip = surface->clip_rect;
+ int recout_full_x, recout_full_y;
+
++ if (pipe_ctx->surface->public.rotation == ROTATION_ANGLE_90 ||
++ pipe_ctx->surface->public.rotation == ROTATION_ANGLE_270)
++ rect_swap_helper(&surf_src);
++
+ pipe_ctx->scl_data.recout.x = stream->public.dst.x;
+- if (stream->public.src.x < clip.x)
+- pipe_ctx->scl_data.recout.x += (clip.x
++ if (stream->public.src.x < surf_clip.x)
++ pipe_ctx->scl_data.recout.x += (surf_clip.x
+ - stream->public.src.x) * stream->public.dst.width
+ / stream->public.src.width;
+
+- pipe_ctx->scl_data.recout.width = clip.width *
++ pipe_ctx->scl_data.recout.width = surf_clip.width *
+ stream->public.dst.width / stream->public.src.width;
+ if (pipe_ctx->scl_data.recout.width + pipe_ctx->scl_data.recout.x >
+ stream->public.dst.x + stream->public.dst.width)
+@@ -541,12 +552,12 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
+ - pipe_ctx->scl_data.recout.x;
+
+ pipe_ctx->scl_data.recout.y = stream->public.dst.y;
+- if (stream->public.src.y < clip.y)
+- pipe_ctx->scl_data.recout.y += (clip.y
++ if (stream->public.src.y < surf_clip.y)
++ pipe_ctx->scl_data.recout.y += (surf_clip.y
+ - stream->public.src.y) * stream->public.dst.height
+ / stream->public.src.height;
+
+- pipe_ctx->scl_data.recout.height = clip.height *
++ pipe_ctx->scl_data.recout.height = surf_clip.height *
+ stream->public.dst.height / stream->public.src.height;
+ if (pipe_ctx->scl_data.recout.height + pipe_ctx->scl_data.recout.y >
+ stream->public.dst.y + stream->public.dst.height)
+@@ -569,7 +580,7 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
+ pipe_ctx->scl_data.recout.width += pipe_ctx->scl_data.recout.width % 2;
+ }
+ } else if (pipe_ctx->bottom_pipe &&
+- pipe_ctx->bottom_pipe->surface == pipe_ctx->surface) {
++ pipe_ctx->bottom_pipe->surface == pipe_ctx->surface) {
+ if (stream->public.timing.timing_3d_format ==
+ TIMING_3D_FORMAT_TOP_AND_BOTTOM)
+ pipe_ctx->scl_data.recout.height /= 2;
+@@ -577,17 +588,17 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
+ pipe_ctx->scl_data.recout.width /= 2;
+ }
+
+- /* Unclipped recout offset = stream dst offset + ((surf dst offset - stream src offset)
+- * * 1/ stream scaling ratio) - (surf src offset * 1/ full scl
++ /* Unclipped recout offset = stream dst offset + ((surf dst offset - stream surf_src offset)
++ * * 1/ stream scaling ratio) - (surf surf_src offset * 1/ full scl
+ * ratio)
+ */
+ recout_full_x = stream->public.dst.x + (surface->dst_rect.x - stream->public.src.x)
+ * stream->public.dst.width / stream->public.src.width -
+- surface->src_rect.x * surface->dst_rect.width / surface->src_rect.width
++ surf_src.x * surface->dst_rect.width / surf_src.width
+ * stream->public.dst.width / stream->public.src.width;
+ recout_full_y = stream->public.dst.y + (surface->dst_rect.y - stream->public.src.y)
+ * stream->public.dst.height / stream->public.src.height -
+- surface->src_rect.y * surface->dst_rect.height / surface->src_rect.height
++ surf_src.y * surface->dst_rect.height / surf_src.height
+ * stream->public.dst.height / stream->public.src.height;
+
+ recout_skip->width = pipe_ctx->scl_data.recout.x - recout_full_x;
+@@ -598,16 +609,21 @@ static void calculate_scaling_ratios(struct pipe_ctx *pipe_ctx)
+ {
+ const struct dc_surface *surface = &pipe_ctx->surface->public;
+ struct core_stream *stream = pipe_ctx->stream;
++ struct rect surf_src = surface->src_rect;
+ const int in_w = stream->public.src.width;
+ const int in_h = stream->public.src.height;
+ const int out_w = stream->public.dst.width;
+ const int out_h = stream->public.dst.height;
+
++ if (pipe_ctx->surface->public.rotation == ROTATION_ANGLE_90 ||
++ pipe_ctx->surface->public.rotation == ROTATION_ANGLE_270)
++ rect_swap_helper(&surf_src);
++
+ pipe_ctx->scl_data.ratios.horz = dal_fixed31_32_from_fraction(
+- surface->src_rect.width,
++ surf_src.width,
+ surface->dst_rect.width);
+ pipe_ctx->scl_data.ratios.vert = dal_fixed31_32_from_fraction(
+- surface->src_rect.height,
++ surf_src.height,
+ surface->dst_rect.height);
+
+ if (surface->stereo_format == PLANE_STEREO_FORMAT_SIDE_BY_SIDE)
+@@ -637,8 +653,10 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
+ int vpc_div = (data->format == PIXEL_FORMAT_420BPP12
+ || data->format == PIXEL_FORMAT_420BPP15) ? 2 : 1;
+
++
+ if (pipe_ctx->surface->public.rotation == ROTATION_ANGLE_90 ||
+ pipe_ctx->surface->public.rotation == ROTATION_ANGLE_270) {
++ rect_swap_helper(&src);
+ rect_swap_helper(&data->viewport_c);
+ rect_swap_helper(&data->viewport);
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+index 1a7ce06..58a3bcd 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+@@ -99,15 +99,15 @@ struct dc_plane_address {
+ };
+
+ struct dc_size {
+- uint32_t width;
+- uint32_t height;
++ int width;
++ int height;
+ };
+
+ struct rect {
+ int x;
+ int y;
+- uint32_t width;
+- uint32_t height;
++ int width;
++ int height;
+ };
+
+ union plane_size {
+@@ -123,7 +123,7 @@ union plane_size {
+ * In LINEAR_GENERAL mode, pitch
+ * is 32 pixel aligned.
+ */
+- uint32_t surface_pitch;
++ int surface_pitch;
+ } grph;
+
+ struct {
+@@ -132,14 +132,14 @@ union plane_size {
+ * In LINEAR_GENERAL mode, pitch is
+ * 32 pixel aligned.
+ */
+- uint32_t luma_pitch;
++ int luma_pitch;
+
+ struct rect chroma_size;
+ /* Graphic surface pitch in pixels.
+ * In LINEAR_GENERAL mode, pitch is
+ * 32 pixel aligned.
+ */
+- uint32_t chroma_pitch;
++ int chroma_pitch;
+ } video;
+ };
+
+@@ -148,15 +148,15 @@ struct dc_plane_dcc_param {
+
+ union {
+ struct {
+- uint32_t meta_pitch;
++ int meta_pitch;
+ bool independent_64b_blks;
+ } grph;
+
+ struct {
+- uint32_t meta_pitch_l;
++ int meta_pitch_l;
+ bool independent_64b_blks_l;
+
+- uint32_t meta_pitch_c;
++ int meta_pitch_c;
+ bool independent_64b_blks_c;
+ } video;
+ };
+--
+2.7.4
+