diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0264-drm-amd-display-Switch-to-DRM-helpers-in-s3.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0264-drm-amd-display-Switch-to-DRM-helpers-in-s3.patch | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0264-drm-amd-display-Switch-to-DRM-helpers-in-s3.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0264-drm-amd-display-Switch-to-DRM-helpers-in-s3.patch new file mode 100644 index 00000000..8bb3cabf --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0264-drm-amd-display-Switch-to-DRM-helpers-in-s3.patch @@ -0,0 +1,304 @@ +From f1a3ab42a07fd5a7fc99beca4d43505feb81bf45 Mon Sep 17 00:00:00 2001 +From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Date: Thu, 20 Apr 2017 15:59:25 -0400 +Subject: [PATCH 0264/4131] drm/amd/display: Switch to DRM helpers in s3. + +Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Reviewed-by: Jordan Lazare <Jordan.Lazare@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 157 ++-------------------- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 5 + + drivers/gpu/drm/amd/display/dc/core/dc.c | 8 +- + drivers/gpu/drm/amd/display/dc/dc.h | 3 +- + drivers/gpu/drm/amd/display/dc/inc/core_dc.h | 4 - + 5 files changed, 21 insertions(+), 156 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 4cae515..54d8d2c 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -451,28 +451,17 @@ static int dm_suspend(void *handle) + struct amdgpu_device *adev = handle; + struct amdgpu_display_manager *dm = &adev->dm; + int ret = 0; +- struct drm_crtc *crtc; + + s3_handle_mst(adev->ddev, true); + +- /* flash all pending vblank events and turn interrupt off +- * before disabling CRTCs. They will be enabled back in +- * dm_display_resume +- */ +- drm_modeset_lock_all(adev->ddev); +- list_for_each_entry(crtc, &adev->ddev->mode_config.crtc_list, head) { +- struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); +- if (acrtc->stream) +- drm_crtc_vblank_off(crtc); +- } +- drm_modeset_unlock_all(adev->ddev); +- + amdgpu_dm_irq_suspend(adev); + ++ adev->dm.cached_state = drm_atomic_helper_suspend(adev->ddev); ++ + dc_set_power_state( + dm->dc, +- DC_ACPI_CM_POWER_STATE_D3, +- DC_VIDEO_POWER_SUSPEND); ++ DC_ACPI_CM_POWER_STATE_D3 ++ ); + + return ret; + } +@@ -504,120 +493,6 @@ struct amdgpu_connector *amdgpu_dm_find_first_crct_matching_connector( + return NULL; + } + +-static int dm_display_resume(struct drm_device *ddev) +-{ +- int ret = 0; +- struct drm_connector *connector; +- +- struct drm_atomic_state *state = drm_atomic_state_alloc(ddev); +- struct drm_plane *plane; +- struct drm_crtc *crtc; +- struct amdgpu_connector *aconnector; +- struct drm_connector_state *conn_state; +- +- if (!state) +- return ENOMEM; +- +- state->acquire_ctx = ddev->mode_config.acquire_ctx; +- +- /* Construct an atomic state to restore previous display setting */ +- +- /* +- * Attach connectors to drm_atomic_state +- * Should be done in the first place in order to make connectors +- * available in state during crtc state processing. It is used for +- * making decision if crtc should be disabled in case sink got +- * disconnected. +- * +- * Connectors state crtc with NULL dc_sink should be cleared, because it +- * will fail validation during commit +- */ +- list_for_each_entry(connector, &ddev->mode_config.connector_list, head) { +- aconnector = to_amdgpu_connector(connector); +- conn_state = drm_atomic_get_connector_state(state, connector); +- +- ret = PTR_ERR_OR_ZERO(conn_state); +- if (ret) +- goto err; +- } +- +- /* Attach crtcs to drm_atomic_state*/ +- list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) { +- struct drm_crtc_state *crtc_state = +- drm_atomic_get_crtc_state(state, crtc); +- +- ret = PTR_ERR_OR_ZERO(crtc_state); +- if (ret) +- goto err; +- +- /* force a restore */ +- crtc_state->mode_changed = true; +- } +- +- +- /* Attach planes to drm_atomic_state */ +- list_for_each_entry(plane, &ddev->mode_config.plane_list, head) { +- +- struct drm_crtc *crtc; +- struct drm_gem_object *obj; +- struct drm_framebuffer *fb; +- struct amdgpu_framebuffer *afb; +- struct amdgpu_bo *rbo; +- int r; +- struct drm_plane_state *plane_state = drm_atomic_get_plane_state(state, plane); +- +- ret = PTR_ERR_OR_ZERO(plane_state); +- if (ret) +- goto err; +- +- crtc = plane_state->crtc; +- fb = plane_state->fb; +- +- if (!crtc || !crtc->state || !crtc->state->active) +- continue; +- +- if (!fb) { +- DRM_DEBUG_KMS("No FB bound\n"); +- return 0; +- } +- +- /* +- * Pin back the front buffers, cursor buffer was already pinned +- * back in amdgpu_resume_kms +- */ +- +- afb = to_amdgpu_framebuffer(fb); +- +- obj = afb->obj; +- rbo = gem_to_amdgpu_bo(obj); +- r = amdgpu_bo_reserve(rbo, false); +- if (unlikely(r != 0)) +- return r; +- +- r = amdgpu_bo_pin(rbo, AMDGPU_GEM_DOMAIN_VRAM, NULL); +- +- amdgpu_bo_unreserve(rbo); +- +- if (unlikely(r != 0)) { +- DRM_ERROR("Failed to pin framebuffer\n"); +- return r; +- } +- +- } +- +- +- /* Call commit internally with the state we just constructed */ +- ret = drm_atomic_commit(state); +- if (!ret) +- return 0; +- +-err: +- DRM_ERROR("Restoring old state failed with %i\n", ret); +- drm_atomic_state_put(state); +- +- return ret; +-} +- + static int dm_resume(void *handle) + { + struct amdgpu_device *adev = handle; +@@ -626,8 +501,8 @@ static int dm_resume(void *handle) + /* power on hardware */ + dc_set_power_state( + dm->dc, +- DC_ACPI_CM_POWER_STATE_D0, +- DC_VIDEO_POWER_ON); ++ DC_ACPI_CM_POWER_STATE_D0 ++ ); + + return 0; + } +@@ -638,8 +513,10 @@ int amdgpu_dm_display_resume(struct amdgpu_device *adev ) + struct amdgpu_display_manager *dm = &adev->dm; + struct amdgpu_connector *aconnector; + struct drm_connector *connector; +- int ret = 0; + struct drm_crtc *crtc; ++ struct drm_crtc_state *crtc_state; ++ int ret = 0; ++ int i; + + /* program HPD filter */ + dc_resume(dm->dc); +@@ -653,14 +530,6 @@ int amdgpu_dm_display_resume(struct amdgpu_device *adev ) + */ + amdgpu_dm_irq_resume_early(adev); + +- drm_modeset_lock_all(ddev); +- list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) { +- struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); +- if (acrtc->stream) +- drm_crtc_vblank_on(crtc); +- } +- drm_modeset_unlock_all(ddev); +- + /* Do detection*/ + list_for_each_entry(connector, + &ddev->mode_config.connector_list, head) { +@@ -678,9 +547,11 @@ int amdgpu_dm_display_resume(struct amdgpu_device *adev ) + amdgpu_dm_update_connector_after_detect(aconnector); + } + +- drm_modeset_lock_all(ddev); +- ret = dm_display_resume(ddev); +- drm_modeset_unlock_all(ddev); ++ /* Force mode set in atomic comit */ ++ for_each_crtc_in_state(adev->dm.cached_state, crtc, crtc_state, i) ++ crtc_state->active_changed = true; ++ ++ ret = drm_atomic_helper_resume(ddev, adev->dm.cached_state); + + amdgpu_dm_irq_resume(adev); + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +index d6ebba0..ee69179 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +@@ -128,6 +128,11 @@ struct amdgpu_display_manager { + struct work_struct mst_hotplug_work; + + struct mod_freesync *freesync_module; ++ ++ /** ++ * Caches device atomic state for suspend/resume ++ */ ++ struct drm_atomic_state *cached_state; + }; + + /* basic init/fini API */ +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index a39b998..edcb731 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1589,21 +1589,15 @@ void dc_interrupt_ack(struct dc *dc, enum dc_irq_source src) + + void dc_set_power_state( + struct dc *dc, +- enum dc_acpi_cm_power_state power_state, +- enum dc_video_power_state video_power_state) ++ enum dc_acpi_cm_power_state power_state) + { + struct core_dc *core_dc = DC_TO_CORE(dc); + +- core_dc->previous_power_state = core_dc->current_power_state; +- core_dc->current_power_state = video_power_state; +- + switch (power_state) { + case DC_ACPI_CM_POWER_STATE_D0: + core_dc->hwss.init_hw(core_dc); + break; + default: +- /* NULL means "reset/release all DC streams" */ +- dc_commit_streams(dc, NULL, 0); + + core_dc->hwss.power_down(core_dc); + +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 69ae94b..e2c2a0b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -705,8 +705,7 @@ enum dc_irq_source dc_get_hpd_irq_source_at_index( + + void dc_set_power_state( + struct dc *dc, +- enum dc_acpi_cm_power_state power_state, +- enum dc_video_power_state video_power_state); ++ enum dc_acpi_cm_power_state power_state); + void dc_resume(const struct dc *dc); + + /******************************************************************************* +diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_dc.h b/drivers/gpu/drm/amd/display/dc/inc/core_dc.h +index 7a6444d..8d87f49 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/core_dc.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/core_dc.h +@@ -26,10 +26,6 @@ struct core_dc { + struct validate_context *scratch_val_ctx; + struct resource_pool *res_pool; + +- /*Power State*/ +- enum dc_video_power_state previous_power_state; +- enum dc_video_power_state current_power_state; +- + /* Display Engine Clock levels */ + struct dm_pp_clock_levels sclk_lvls; + +-- +2.7.4 + |