[PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
[Why] Video plane gets rejected for non-zero src_y and src_x on DCN2.x. [How] Limit the rejection till DCN1.x and verified MPO, by dragging video playback beyond display's left (0, 0) co-ordinates. Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for video planes") Signed-off-by: Shirish S Reviewed-by: Harry Wentland --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- 1 file changed, 11 insertions(+), 9 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 7a54ccb794f9..00b3ef41b752 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4581,7 +4581,8 @@ static void get_min_max_dc_plane_scaling(struct drm_device *dev, } -static int fill_dc_scaling_info(const struct drm_plane_state *state, +static int fill_dc_scaling_info(struct amdgpu_device *adev, + const struct drm_plane_state *state, struct dc_scaling_info *scaling_info) { int scale_w, scale_h, min_downscale, max_upscale; @@ -4595,7 +4596,8 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, /* * For reasons we don't (yet) fully understand a non-zero * src_y coordinate into an NV12 buffer can cause a -* system hang. To avoid hangs (and maybe be overly cautious) +* system hang on DCN1x. +* To avoid hangs (and maybe be overly cautious) * let's reject both non-zero src_x and src_y. * * We currently know of only one use-case to reproduce a @@ -4603,10 +4605,10 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, * is to gesture the YouTube Android app into full screen * on ChromeOS. */ - if (state->fb && - state->fb->format->format == DRM_FORMAT_NV12 && - (scaling_info->src_rect.x != 0 || -scaling_info->src_rect.y != 0)) + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) return -EINVAL; scaling_info->src_rect.width = state->src_w >> 16; @@ -5512,7 +5514,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, int ret; bool force_disable_dcc = false; - ret = fill_dc_scaling_info(plane_state, _info); + ret = fill_dc_scaling_info(adev, plane_state, _info); if (ret) return ret; @@ -7575,7 +7577,7 @@ static int dm_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - ret = fill_dc_scaling_info(new_plane_state, _info); + ret = fill_dc_scaling_info(adev, new_plane_state, _info); if (ret) return ret; @@ -9023,7 +9025,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, bundle->surface_updates[planes_count].gamut_remap_matrix = _plane->gamut_remap_matrix; } - fill_dc_scaling_info(new_plane_state, + fill_dc_scaling_info(dm->adev, new_plane_state, >scaling_infos[planes_count]); bundle->surface_updates[planes_count].scaling_info = -- 2.17.1
Re: [PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
On 2021-11-08 03:15, Shirish S wrote: > limit the MPO rejection only for DCN1x as its not required on later > versions. > > Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for > video planes") > > Signed-off-by: Shirish S With Paul's suggestions addressed (mainly the mention of what you tested, e.g. "gesturing full-screen in Youtube Android app on DCN2.x") this patch is Reviewed-by: Harry Wentland Harry > --- > .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- > 1 file changed, 11 insertions(+), 9 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 1e26d9be8993..26b29d561919 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > @@ -4572,7 +4572,8 @@ static void get_min_max_dc_plane_scaling(struct > drm_device *dev, > } > > > -static int fill_dc_scaling_info(const struct drm_plane_state *state, > +static int fill_dc_scaling_info(struct amdgpu_device *adev, > + const struct drm_plane_state *state, > struct dc_scaling_info *scaling_info) > { > int scale_w, scale_h, min_downscale, max_upscale; > @@ -4586,7 +4587,8 @@ static int fill_dc_scaling_info(const struct > drm_plane_state *state, > /* >* For reasons we don't (yet) fully understand a non-zero >* src_y coordinate into an NV12 buffer can cause a > - * system hang. To avoid hangs (and maybe be overly cautious) > + * system hang on DCN1x. > + * To avoid hangs (and maybe be overly cautious) >* let's reject both non-zero src_x and src_y. >* >* We currently know of only one use-case to reproduce a > @@ -4594,10 +4596,10 @@ static int fill_dc_scaling_info(const struct > drm_plane_state *state, >* is to gesture the YouTube Android app into full screen >* on ChromeOS. >*/ > - if (state->fb && > - state->fb->format->format == DRM_FORMAT_NV12 && > - (scaling_info->src_rect.x != 0 || > - scaling_info->src_rect.y != 0)) > + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || > + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && > + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && > + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) > return -EINVAL; > > scaling_info->src_rect.width = state->src_w >> 16; > @@ -5503,7 +5505,7 @@ static int fill_dc_plane_attributes(struct > amdgpu_device *adev, > int ret; > bool force_disable_dcc = false; > > - ret = fill_dc_scaling_info(plane_state, _info); > + ret = fill_dc_scaling_info(adev, plane_state, _info); > if (ret) > return ret; > > @@ -7566,7 +7568,7 @@ static int dm_plane_atomic_check(struct drm_plane > *plane, > if (ret) > return ret; > > - ret = fill_dc_scaling_info(new_plane_state, _info); > + ret = fill_dc_scaling_info(adev, new_plane_state, _info); > if (ret) > return ret; > > @@ -9014,7 +9016,7 @@ static void amdgpu_dm_commit_planes(struct > drm_atomic_state *state, > > bundle->surface_updates[planes_count].gamut_remap_matrix = > _plane->gamut_remap_matrix; > } > > - fill_dc_scaling_info(new_plane_state, > + fill_dc_scaling_info(dm->adev, new_plane_state, >>scaling_infos[planes_count]); > > bundle->surface_updates[planes_count].scaling_info = >
Re: [PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
Hi Paul, On 11/8/2021 7:51 PM, Paul Menzel wrote: [Which address should be used: sshan...@amd.com or shiris...@amd.com?] "shiris...@amd.com" Dear Shirish, Am 08.11.21 um 12:11 schrieb S, Shirish: On 11/8/2021 2:25 PM, Paul Menzel wrote: Am 08.11.21 um 09:15 schrieb Shirish S: limit the MPO rejection only for DCN1x as its not required on later it’s versions. Where is it documented, that it’s not required for later versions? This is a workaround to avoid system hang & I've verified its not required DCN2.0. Please extend the commit message with that information, and also add how you verified, that it’s not required for DCN2.0 exactly. (Just test one system?) We generally don't have documentation for WA's. WA is workaround? yes. Regards, Shirish S Kind regards, Paul Shortly describing the implementation is also useful. Something like: Require `fill_dc_scaling_info()` to receive the device to be able to check the version. Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for video planes") I’d remove the blank line. Signed-off-by: Shirish S --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- 1 file changed, 11 insertions(+), 9 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 1e26d9be8993..26b29d561919 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4572,7 +4572,8 @@ static void get_min_max_dc_plane_scaling(struct drm_device *dev, } -static int fill_dc_scaling_info(const struct drm_plane_state *state, +static int fill_dc_scaling_info(struct amdgpu_device *adev, + const struct drm_plane_state *state, struct dc_scaling_info *scaling_info) { int scale_w, scale_h, min_downscale, max_upscale; @@ -4586,7 +4587,8 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, /* * For reasons we don't (yet) fully understand a non-zero * src_y coordinate into an NV12 buffer can cause a - * system hang. To avoid hangs (and maybe be overly cautious) + * system hang on DCN1x. + * To avoid hangs (and maybe be overly cautious) I’d remove the added line break. * let's reject both non-zero src_x and src_y. * * We currently know of only one use-case to reproduce a @@ -4594,10 +4596,10 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, * is to gesture the YouTube Android app into full screen * on ChromeOS. */ - if (state->fb && - state->fb->format->format == DRM_FORMAT_NV12 && - (scaling_info->src_rect.x != 0 || - scaling_info->src_rect.y != 0)) + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) return -EINVAL; scaling_info->src_rect.width = state->src_w >> 16; @@ -5503,7 +5505,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, int ret; bool force_disable_dcc = false; - ret = fill_dc_scaling_info(plane_state, _info); + ret = fill_dc_scaling_info(adev, plane_state, _info); if (ret) return ret; @@ -7566,7 +7568,7 @@ static int dm_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - ret = fill_dc_scaling_info(new_plane_state, _info); + ret = fill_dc_scaling_info(adev, new_plane_state, _info); if (ret) return ret; @@ -9014,7 +9016,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, bundle->surface_updates[planes_count].gamut_remap_matrix = _plane->gamut_remap_matrix; } - fill_dc_scaling_info(new_plane_state, + fill_dc_scaling_info(dm->adev, new_plane_state, >scaling_infos[planes_count]); bundle->surface_updates[planes_count].scaling_info =
Re: [PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
[Which address should be used: sshan...@amd.com or shiris...@amd.com?] Dear Shirish, Am 08.11.21 um 12:11 schrieb S, Shirish: On 11/8/2021 2:25 PM, Paul Menzel wrote: Am 08.11.21 um 09:15 schrieb Shirish S: limit the MPO rejection only for DCN1x as its not required on later it’s versions. Where is it documented, that it’s not required for later versions? This is a workaround to avoid system hang & I've verified its not required DCN2.0. Please extend the commit message with that information, and also add how you verified, that it’s not required for DCN2.0 exactly. (Just test one system?) We generally don't have documentation for WA's. WA is workaround? Kind regards, Paul Shortly describing the implementation is also useful. Something like: Require `fill_dc_scaling_info()` to receive the device to be able to check the version. Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for video planes") I’d remove the blank line. Signed-off-by: Shirish S --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- 1 file changed, 11 insertions(+), 9 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 1e26d9be8993..26b29d561919 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4572,7 +4572,8 @@ static void get_min_max_dc_plane_scaling(struct drm_device *dev, } -static int fill_dc_scaling_info(const struct drm_plane_state *state, +static int fill_dc_scaling_info(struct amdgpu_device *adev, + const struct drm_plane_state *state, struct dc_scaling_info *scaling_info) { int scale_w, scale_h, min_downscale, max_upscale; @@ -4586,7 +4587,8 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, /* * For reasons we don't (yet) fully understand a non-zero * src_y coordinate into an NV12 buffer can cause a - * system hang. To avoid hangs (and maybe be overly cautious) + * system hang on DCN1x. + * To avoid hangs (and maybe be overly cautious) I’d remove the added line break. * let's reject both non-zero src_x and src_y. * * We currently know of only one use-case to reproduce a @@ -4594,10 +4596,10 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, * is to gesture the YouTube Android app into full screen * on ChromeOS. */ - if (state->fb && - state->fb->format->format == DRM_FORMAT_NV12 && - (scaling_info->src_rect.x != 0 || - scaling_info->src_rect.y != 0)) + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) return -EINVAL; scaling_info->src_rect.width = state->src_w >> 16; @@ -5503,7 +5505,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, int ret; bool force_disable_dcc = false; - ret = fill_dc_scaling_info(plane_state, _info); + ret = fill_dc_scaling_info(adev, plane_state, _info); if (ret) return ret; @@ -7566,7 +7568,7 @@ static int dm_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - ret = fill_dc_scaling_info(new_plane_state, _info); + ret = fill_dc_scaling_info(adev, new_plane_state, _info); if (ret) return ret; @@ -9014,7 +9016,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, bundle->surface_updates[planes_count].gamut_remap_matrix = _plane->gamut_remap_matrix; } - fill_dc_scaling_info(new_plane_state, + fill_dc_scaling_info(dm->adev, new_plane_state, >scaling_infos[planes_count]); bundle->surface_updates[planes_count].scaling_info =
Re: [PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
Hi Paul, On 11/8/2021 2:25 PM, Paul Menzel wrote: Dear Shirish, Am 08.11.21 um 09:15 schrieb Shirish S: limit the MPO rejection only for DCN1x as its not required on later it’s versions. Where is it documented, that it’s not required for later versions? This is a workaround to avoid system hang & I've verified its not required DCN2.0. We generally don't have documentation for WA's. Regards, Shirish S Shortly describing the implementation is also useful. Something like: Require `fill_dc_scaling_info()` to receive the device to be able to check the version. Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for video planes") I’d remove the blank line. Signed-off-by: Shirish S --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- 1 file changed, 11 insertions(+), 9 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 1e26d9be8993..26b29d561919 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4572,7 +4572,8 @@ static void get_min_max_dc_plane_scaling(struct drm_device *dev, } -static int fill_dc_scaling_info(const struct drm_plane_state *state, +static int fill_dc_scaling_info(struct amdgpu_device *adev, + const struct drm_plane_state *state, struct dc_scaling_info *scaling_info) { int scale_w, scale_h, min_downscale, max_upscale; @@ -4586,7 +4587,8 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, /* * For reasons we don't (yet) fully understand a non-zero * src_y coordinate into an NV12 buffer can cause a - * system hang. To avoid hangs (and maybe be overly cautious) + * system hang on DCN1x. + * To avoid hangs (and maybe be overly cautious) I’d remove the added line break. * let's reject both non-zero src_x and src_y. * * We currently know of only one use-case to reproduce a @@ -4594,10 +4596,10 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, * is to gesture the YouTube Android app into full screen * on ChromeOS. */ - if (state->fb && - state->fb->format->format == DRM_FORMAT_NV12 && - (scaling_info->src_rect.x != 0 || - scaling_info->src_rect.y != 0)) + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) return -EINVAL; scaling_info->src_rect.width = state->src_w >> 16; @@ -5503,7 +5505,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, int ret; bool force_disable_dcc = false; - ret = fill_dc_scaling_info(plane_state, _info); + ret = fill_dc_scaling_info(adev, plane_state, _info); if (ret) return ret; @@ -7566,7 +7568,7 @@ static int dm_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - ret = fill_dc_scaling_info(new_plane_state, _info); + ret = fill_dc_scaling_info(adev, new_plane_state, _info); if (ret) return ret; @@ -9014,7 +9016,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, bundle->surface_updates[planes_count].gamut_remap_matrix = _plane->gamut_remap_matrix; } - fill_dc_scaling_info(new_plane_state, + fill_dc_scaling_info(dm->adev, new_plane_state, >scaling_infos[planes_count]); bundle->surface_updates[planes_count].scaling_info =
Re: [PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
Dear Shirish, Am 08.11.21 um 09:15 schrieb Shirish S: limit the MPO rejection only for DCN1x as its not required on later it’s versions. Where is it documented, that it’s not required for later versions? Shortly describing the implementation is also useful. Something like: Require `fill_dc_scaling_info()` to receive the device to be able to check the version. Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for video planes") I’d remove the blank line. Signed-off-by: Shirish S --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- 1 file changed, 11 insertions(+), 9 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 1e26d9be8993..26b29d561919 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4572,7 +4572,8 @@ static void get_min_max_dc_plane_scaling(struct drm_device *dev, } -static int fill_dc_scaling_info(const struct drm_plane_state *state, +static int fill_dc_scaling_info(struct amdgpu_device *adev, + const struct drm_plane_state *state, struct dc_scaling_info *scaling_info) { int scale_w, scale_h, min_downscale, max_upscale; @@ -4586,7 +4587,8 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, /* * For reasons we don't (yet) fully understand a non-zero * src_y coordinate into an NV12 buffer can cause a -* system hang. To avoid hangs (and maybe be overly cautious) +* system hang on DCN1x. +* To avoid hangs (and maybe be overly cautious) I’d remove the added line break. * let's reject both non-zero src_x and src_y. * * We currently know of only one use-case to reproduce a @@ -4594,10 +4596,10 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, * is to gesture the YouTube Android app into full screen * on ChromeOS. */ - if (state->fb && - state->fb->format->format == DRM_FORMAT_NV12 && - (scaling_info->src_rect.x != 0 || -scaling_info->src_rect.y != 0)) + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) return -EINVAL; scaling_info->src_rect.width = state->src_w >> 16; @@ -5503,7 +5505,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, int ret; bool force_disable_dcc = false; - ret = fill_dc_scaling_info(plane_state, _info); + ret = fill_dc_scaling_info(adev, plane_state, _info); if (ret) return ret; @@ -7566,7 +7568,7 @@ static int dm_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - ret = fill_dc_scaling_info(new_plane_state, _info); + ret = fill_dc_scaling_info(adev, new_plane_state, _info); if (ret) return ret; @@ -9014,7 +9016,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, bundle->surface_updates[planes_count].gamut_remap_matrix = _plane->gamut_remap_matrix; } - fill_dc_scaling_info(new_plane_state, + fill_dc_scaling_info(dm->adev, new_plane_state, >scaling_infos[planes_count]); bundle->surface_updates[planes_count].scaling_info =
[PATCH] drm/amd/display: reject both non-zero src_x and src_y only for DCN1x
limit the MPO rejection only for DCN1x as its not required on later versions. Fixes: d89f6048bdcb ("drm/amd/display: Reject non-zero src_y and src_x for video planes") Signed-off-by: Shirish S --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 20 ++- 1 file changed, 11 insertions(+), 9 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 1e26d9be8993..26b29d561919 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -4572,7 +4572,8 @@ static void get_min_max_dc_plane_scaling(struct drm_device *dev, } -static int fill_dc_scaling_info(const struct drm_plane_state *state, +static int fill_dc_scaling_info(struct amdgpu_device *adev, + const struct drm_plane_state *state, struct dc_scaling_info *scaling_info) { int scale_w, scale_h, min_downscale, max_upscale; @@ -4586,7 +4587,8 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, /* * For reasons we don't (yet) fully understand a non-zero * src_y coordinate into an NV12 buffer can cause a -* system hang. To avoid hangs (and maybe be overly cautious) +* system hang on DCN1x. +* To avoid hangs (and maybe be overly cautious) * let's reject both non-zero src_x and src_y. * * We currently know of only one use-case to reproduce a @@ -4594,10 +4596,10 @@ static int fill_dc_scaling_info(const struct drm_plane_state *state, * is to gesture the YouTube Android app into full screen * on ChromeOS. */ - if (state->fb && - state->fb->format->format == DRM_FORMAT_NV12 && - (scaling_info->src_rect.x != 0 || -scaling_info->src_rect.y != 0)) + if (((adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 0)) || + (adev->ip_versions[DCE_HWIP][0] == IP_VERSION(1, 0, 1))) && + (state->fb && state->fb->format->format == DRM_FORMAT_NV12 && + (scaling_info->src_rect.x != 0 || scaling_info->src_rect.y != 0))) return -EINVAL; scaling_info->src_rect.width = state->src_w >> 16; @@ -5503,7 +5505,7 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev, int ret; bool force_disable_dcc = false; - ret = fill_dc_scaling_info(plane_state, _info); + ret = fill_dc_scaling_info(adev, plane_state, _info); if (ret) return ret; @@ -7566,7 +7568,7 @@ static int dm_plane_atomic_check(struct drm_plane *plane, if (ret) return ret; - ret = fill_dc_scaling_info(new_plane_state, _info); + ret = fill_dc_scaling_info(adev, new_plane_state, _info); if (ret) return ret; @@ -9014,7 +9016,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, bundle->surface_updates[planes_count].gamut_remap_matrix = _plane->gamut_remap_matrix; } - fill_dc_scaling_info(new_plane_state, + fill_dc_scaling_info(dm->adev, new_plane_state, >scaling_infos[planes_count]); bundle->surface_updates[planes_count].scaling_info = -- 2.17.1