diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1777-drm-amd-display-Update-plane-scaling-parameters-for-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1777-drm-amd-display-Update-plane-scaling-parameters-for-.patch | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1777-drm-amd-display-Update-plane-scaling-parameters-for-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1777-drm-amd-display-Update-plane-scaling-parameters-for-.patch new file mode 100644 index 00000000..d3cad602 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1777-drm-amd-display-Update-plane-scaling-parameters-for-.patch @@ -0,0 +1,170 @@ +From 76ee1e7807a611fcadc8fb1fc2591b6b99949af8 Mon Sep 17 00:00:00 2001 +From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Date: Mon, 25 Mar 2019 12:06:23 -0400 +Subject: [PATCH 1777/2940] drm/amd/display: Update plane scaling parameters + for fast updates + +[Why] +Plane scaling parameters are not correctly filled or updated when +performing fast updates. + +They're filled when creating the dc plane state and during atomic check. + +While the atomic check code path happens for the plane even during fast +updates, the issue is that they're done in place on the dc_plane_state +directly. This dc_plane_state may be the current state plane state +being used by the hardware, so these parameters won't be correctly +programmed. + +The new scaling parameters should instead be passed as an update +to the plane. + +[How] +Update fill_rects_from_plane_state to not modify dc_plane_state +directly. Update the call sites that use this to fill in the appropriate +values. + +Change-Id: I1db42853aeb469cd2a4dfa59d43fa46d710de71b +Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Reviewed-by: Sun peng Li <Sunpeng.Li@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 63 ++++++++++++------- + 1 file changed, 39 insertions(+), 24 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index e014a00a0021..11d608de408d 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -2474,50 +2474,53 @@ static const struct drm_encoder_funcs amdgpu_dm_encoder_funcs = { + }; + + static bool fill_rects_from_plane_state(const struct drm_plane_state *state, +- struct dc_plane_state *plane_state) ++ struct rect *src_rect, ++ struct rect *dst_rect, ++ struct rect *clip_rect, ++ enum dc_rotation_angle *rotation) + { +- plane_state->src_rect.x = state->src_x >> 16; +- plane_state->src_rect.y = state->src_y >> 16; ++ src_rect->x = state->src_x >> 16; ++ src_rect->y = state->src_y >> 16; + /* we ignore the mantissa for now and do not deal with floating pixels :( */ +- plane_state->src_rect.width = state->src_w >> 16; ++ src_rect->width = state->src_w >> 16; + +- if (plane_state->src_rect.width == 0) ++ if (src_rect->width == 0) + return false; + +- plane_state->src_rect.height = state->src_h >> 16; +- if (plane_state->src_rect.height == 0) ++ src_rect->height = state->src_h >> 16; ++ if (src_rect->height == 0) + return false; + +- plane_state->dst_rect.x = state->crtc_x; +- plane_state->dst_rect.y = state->crtc_y; ++ dst_rect->x = state->crtc_x; ++ dst_rect->y = state->crtc_y; + + if (state->crtc_w == 0) + return false; + +- plane_state->dst_rect.width = state->crtc_w; ++ dst_rect->width = state->crtc_w; + + if (state->crtc_h == 0) + return false; + +- plane_state->dst_rect.height = state->crtc_h; ++ dst_rect->height = state->crtc_h; + +- plane_state->clip_rect = plane_state->dst_rect; ++ *clip_rect = *dst_rect; + + switch (state->rotation & DRM_MODE_ROTATE_MASK) { + case DRM_MODE_ROTATE_0: +- plane_state->rotation = ROTATION_ANGLE_0; ++ *rotation = ROTATION_ANGLE_0; + break; + case DRM_MODE_ROTATE_90: +- plane_state->rotation = ROTATION_ANGLE_90; ++ *rotation = ROTATION_ANGLE_90; + break; + case DRM_MODE_ROTATE_180: +- plane_state->rotation = ROTATION_ANGLE_180; ++ *rotation = ROTATION_ANGLE_180; + break; + case DRM_MODE_ROTATE_270: +- plane_state->rotation = ROTATION_ANGLE_270; ++ *rotation = ROTATION_ANGLE_270; + break; + default: +- plane_state->rotation = ROTATION_ANGLE_0; ++ *rotation = ROTATION_ANGLE_0; + break; + } + +@@ -2897,7 +2900,11 @@ static int fill_plane_attributes(struct amdgpu_device *adev, + const struct drm_crtc *crtc = plane_state->crtc; + int ret = 0; + +- if (!fill_rects_from_plane_state(plane_state, dc_plane_state)) ++ if (!fill_rects_from_plane_state(plane_state, ++ &dc_plane_state->src_rect, ++ &dc_plane_state->dst_rect, ++ &dc_plane_state->clip_rect, ++ &dc_plane_state->rotation)) + return -EINVAL; + + ret = fill_plane_attributes_from_fb( +@@ -4142,12 +4149,17 @@ static int dm_plane_atomic_check(struct drm_plane *plane, + { + struct amdgpu_device *adev = plane->dev->dev_private; + struct dc *dc = adev->dm.dc; +- struct dm_plane_state *dm_plane_state = to_dm_plane_state(state); ++ struct dm_plane_state *dm_plane_state; ++ struct rect src_rect, dst_rect, clip_rect; ++ enum dc_rotation_angle rotation; ++ ++ dm_plane_state = to_dm_plane_state(state); + + if (!dm_plane_state->dc_state) + return 0; + +- if (!fill_rects_from_plane_state(state, dm_plane_state->dc_state)) ++ if (!fill_rects_from_plane_state(state, &src_rect, &dst_rect, ++ &clip_rect, &rotation)) + return -EINVAL; + + if (dc_validate_plane(dc, dm_plane_state->dc_state) == DC_OK) +@@ -5225,9 +5237,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, + + + bundle->scaling_infos[planes_count].scaling_quality = dc_plane->scaling_quality; +- bundle->scaling_infos[planes_count].src_rect = dc_plane->src_rect; +- bundle->scaling_infos[planes_count].dst_rect = dc_plane->dst_rect; +- bundle->scaling_infos[planes_count].clip_rect = dc_plane->clip_rect; ++ ++ fill_rects_from_plane_state(new_plane_state, ++ &bundle->scaling_infos[planes_count].src_rect, ++ &bundle->scaling_infos[planes_count].dst_rect, ++ &bundle->scaling_infos[planes_count].clip_rect, ++ &bundle->plane_infos[planes_count].rotation); ++ + bundle->surface_updates[planes_count].scaling_info = &bundle->scaling_infos[planes_count]; + + fill_plane_color_attributes( +@@ -5236,7 +5252,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, + + bundle->plane_infos[planes_count].format = dc_plane->format; + bundle->plane_infos[planes_count].plane_size = dc_plane->plane_size; +- bundle->plane_infos[planes_count].rotation = dc_plane->rotation; + bundle->plane_infos[planes_count].horizontal_mirror = dc_plane->horizontal_mirror; + bundle->plane_infos[planes_count].stereo_format = dc_plane->stereo_format; + bundle->plane_infos[planes_count].tiling_info = dc_plane->tiling_info; +-- +2.17.1 + |