diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0433-drm-amd-display-Use-dc_update_surfaces_for_stream-fo.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0433-drm-amd-display-Use-dc_update_surfaces_for_stream-fo.patch | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0433-drm-amd-display-Use-dc_update_surfaces_for_stream-fo.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0433-drm-amd-display-Use-dc_update_surfaces_for_stream-fo.patch new file mode 100644 index 00000000..2499c651 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0433-drm-amd-display-Use-dc_update_surfaces_for_stream-fo.patch @@ -0,0 +1,118 @@ +From 2a9dcc8e5425684a789db36644235ea81c80a160 Mon Sep 17 00:00:00 2001 +From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Date: Mon, 15 May 2017 13:59:31 -0400 +Subject: [PATCH 0433/4131] drm/amd/display: Use dc_update_surfaces_for_stream + for flip. + +Today we use special interface for flip because of fear of cuncurency issues +over dc->current_ctx. This should be no longer an issue when flipping on +multiple CRTCs concurently since for fast update (as flip is) no new context +is created and the exsisitng is not destroyed. For full updates case when +removing or adding streams on once CRTC while flipping on another +Adding all current active CRTC's states to the atomic commit in +amdgpu_dm_atomic_check will garntee that any such full update commit +will wait for completion of any outstanding flip. + +Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Reviewed-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 9 ++++++--- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 23 +++++++++++++++++++++- + 2 files changed, 28 insertions(+), 4 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 4e9899c..ec68463 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -1349,6 +1349,7 @@ static void dm_page_flip(struct amdgpu_device *adev, + struct amdgpu_crtc *acrtc; + const struct dc_stream *stream; + struct dc_flip_addrs addr = { {0} }; ++ struct dc_surface_update surface_updates[1] = { {0} }; + + /* + * TODO risk of concurrency issues +@@ -1411,9 +1412,11 @@ static void dm_page_flip(struct amdgpu_device *adev, + acrtc->base.state->event = NULL; + } + +- dc_flip_surface_addrs(adev->dm.dc, +- dc_stream_get_status(stream)->surfaces, +- &addr, 1); ++ surface_updates->surface = dc_stream_get_status(stream)->surfaces[0]; ++ surface_updates->flip_addr = &addr; ++ ++ ++ dc_update_surfaces_for_stream(adev->dm.dc, surface_updates, 1, stream); + + DRM_DEBUG_DRIVER("%s Flipping to hi: 0x%x, low: 0x%x \n", + __func__, +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +index 00cc385..c0f2699 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +@@ -3079,6 +3079,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + struct dc *dc = adev->dm.dc; + bool need_to_validate = false; + struct validate_context *context; ++ bool wait_4_prev_commits = false; + + ret = drm_atomic_helper_check(dev, state); + +@@ -3155,6 +3156,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + + new_stream_count++; + need_to_validate = true; ++ wait_4_prev_commits = true; + break; + } + +@@ -3200,6 +3202,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + + new_stream_count++; + need_to_validate = true; ++ wait_4_prev_commits = true; + + break; + } +@@ -3211,6 +3214,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + set, + set_count, + acrtc->stream); ++ wait_4_prev_commits = true; + } + break; + } +@@ -3303,9 +3307,26 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + + context = dc_get_validate_context(dc, set, set_count); + +- if (need_to_validate == false || set_count == 0 || context) ++ if (need_to_validate == false || set_count == 0 || context) { ++ + ret = 0; + ++ if (wait_4_prev_commits) { ++ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { ++ struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); ++ struct drm_crtc_state *crtc_state; ++ ++ if (acrtc->stream) { ++ crtc_state = drm_atomic_get_crtc_state(state, crtc); ++ if (IS_ERR(crtc_state)) { ++ ret = PTR_ERR(crtc_state); ++ break; ++ } ++ } ++ } ++ } ++ } ++ + if (context) { + dc_resource_validate_ctx_destruct(context); + dm_free(context); +-- +2.7.4 + |