drm/amd/display: Don't reinitialize DMCUB on s0ix resume
[Why] PSP will suspend and resume DMCUB. Driver should just wait for DMCUB to finish the auto load before continuining instead of placing it into reset, wiping its firmware state and reinitializing. If we don't let DMCUB fully finish initializing for S0ix then some state will be lost and screen corruption can occur due to incorrect address translation. [How] Use dmub_srv callbacks to determine in DMCUB is running and wait for auto-load to complete before continuining. In S0ix DMCUB will be running and DAL fw so initialize will skip. In S3 DMCUB will not be running and we will do a full hardware init. In S3 DMCUB will be running but will not be DAL fw so we will also do a full hardware init. Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Reviewed-by: Mikita Lipski <Mikita.Lipski@amd.com> Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
580013b2ce
Коммит
79d6b9351f
|
@ -1161,6 +1161,32 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void dm_dmub_hw_resume(struct amdgpu_device *adev)
|
||||
{
|
||||
struct dmub_srv *dmub_srv = adev->dm.dmub_srv;
|
||||
enum dmub_status status;
|
||||
bool init;
|
||||
|
||||
if (!dmub_srv) {
|
||||
/* DMUB isn't supported on the ASIC. */
|
||||
return;
|
||||
}
|
||||
|
||||
status = dmub_srv_is_hw_init(dmub_srv, &init);
|
||||
if (status != DMUB_STATUS_OK)
|
||||
DRM_WARN("DMUB hardware init check failed: %d\n", status);
|
||||
|
||||
if (status == DMUB_STATUS_OK && init) {
|
||||
/* Wait for firmware load to finish. */
|
||||
status = dmub_srv_wait_for_auto_load(dmub_srv, 100000);
|
||||
if (status != DMUB_STATUS_OK)
|
||||
DRM_WARN("Wait for DMUB auto-load failed: %d\n", status);
|
||||
} else {
|
||||
/* Perform the full hardware initialization. */
|
||||
dm_dmub_hw_init(adev);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_addr_space_config *pa_config)
|
||||
{
|
||||
|
@ -2637,9 +2663,7 @@ static int dm_resume(void *handle)
|
|||
amdgpu_dm_outbox_init(adev);
|
||||
|
||||
/* Before powering on DC we need to re-initialize DMUB. */
|
||||
r = dm_dmub_hw_init(adev);
|
||||
if (r)
|
||||
DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
|
||||
dm_dmub_hw_resume(adev);
|
||||
|
||||
/* power on hardware */
|
||||
dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
|
||||
|
|
Загрузка…
Ссылка в новой задаче