aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0709-drm-amd-dal-Add-PreModeChange-event-to-PPLIB.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0709-drm-amd-dal-Add-PreModeChange-event-to-PPLIB.patch')
-rw-r--r--common/recipes-kernel/linux/files/0709-drm-amd-dal-Add-PreModeChange-event-to-PPLIB.patch116
1 files changed, 116 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0709-drm-amd-dal-Add-PreModeChange-event-to-PPLIB.patch b/common/recipes-kernel/linux/files/0709-drm-amd-dal-Add-PreModeChange-event-to-PPLIB.patch
new file mode 100644
index 00000000..8cbf3b98
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0709-drm-amd-dal-Add-PreModeChange-event-to-PPLIB.patch
@@ -0,0 +1,116 @@
+From c3eeb9ac6864b945dcb60a84847d1afe9ef59776 Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Thu, 14 Jan 2016 14:49:08 -0500
+Subject: [PATCH 0709/1110] drm/amd/dal: Add PreModeChange event to PPLIB
+
+[Description]
+Before this change, we only send PostModeChange event.
+What happens is that PPLIB does not know we are changing
+display configuration beforehand. By the time we send Post
+event, it is already too late, and this may cause soft hang
+waiting on SMU to transition power states.
+
+This issues was found specifically during S3 resume tests,
+when we commit 0 targets while entering S3 state. On
+resume, we re-enable the display without first telling PPLIB.
+
+This change adds a PreModeChange notification at the start
+of dc_commit_targets.
+
+Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c | 16 ++++++++++++++++
+ drivers/gpu/drm/amd/dal/dc/core/dc.c | 2 ++
+ drivers/gpu/drm/amd/dal/dc/core/dc_resource.c | 6 ++++++
+ drivers/gpu/drm/amd/dal/dc/dc_services.h | 3 +++
+ drivers/gpu/drm/amd/dal/dc/inc/resource.h | 2 ++
+ 5 files changed, 29 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c
+index 12b9475..b67599d 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dal_services.c
+@@ -157,6 +157,22 @@ bool dc_service_pp_pre_dce_clock_change(
+ return false;
+ }
+
++bool dc_service_pp_apply_safe_state(
++ const struct dc_context *ctx)
++{
++#ifdef CONFIG_DRM_AMD_POWERPLAY
++ struct amdgpu_device *adev = ctx->driver_context;
++
++ if (adev->pm.dpm_enabled) {
++ /* TODO: Does this require PreModeChange event to PPLIB? */
++ }
++
++ return true;
++#else
++ return false;
++#endif
++}
++
+ bool dc_service_pp_apply_display_requirements(
+ const struct dc_context *ctx,
+ const struct dc_pp_display_configuration *pp_display_cfg)
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+index e49ec86..b68ecb7 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+@@ -549,6 +549,8 @@ bool dc_commit_targets(
+ goto fail;
+ }
+
++ pplib_apply_safe_state(dc);
++
+ if (!dal_adapter_service_is_in_accelerated_mode(
+ dc->res_pool.adapter_srv)) {
+ dc->hwss.enable_accelerated_mode(dc);
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
+index 52fcdc1..7cc4ed2 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
+@@ -485,6 +485,12 @@ static void fill_display_configs(
+ pp_display_cfg->display_count = num_cfgs;
+ }
+
++void pplib_apply_safe_state(
++ const struct dc *dc)
++{
++ dc_service_pp_apply_safe_state(dc->ctx);
++}
++
+ void pplib_apply_display_requirements(
+ const struct dc *dc,
+ const struct validate_context *context)
+diff --git a/drivers/gpu/drm/amd/dal/dc/dc_services.h b/drivers/gpu/drm/amd/dal/dc/dc_services.h
+index 907b415..b8b8b20 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dc_services.h
++++ b/drivers/gpu/drm/amd/dal/dc/dc_services.h
+@@ -201,6 +201,9 @@ bool dc_service_pp_get_clock_levels_by_type(
+ struct dc_pp_clock_levels *clk_level_info);
+
+
++bool dc_service_pp_apply_safe_state(
++ const struct dc_context *ctx);
++
+ /* DAL calls this function to notify PP about completion of Mode Set.
+ * For PP it means that current DCE clocks are those which were returned
+ * by dc_service_pp_pre_dce_clock_change(), in the 'output' parameter.
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/resource.h b/drivers/gpu/drm/amd/dal/dc/inc/resource.h
+index fac4c8b..ea6be75 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/resource.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/resource.h
+@@ -61,6 +61,8 @@ bool logical_attach_surfaces_to_target(
+ uint8_t surface_count,
+ struct dc_target *dc_target);
+
++void pplib_apply_safe_state(const struct dc *dc);
++
+ void pplib_apply_display_requirements(
+ const struct dc *dc,
+ const struct validate_context *context);
+--
+2.7.4
+