drm/amdgpu: move atom scratch register save/restore to common code
We need this for more than just DCE. Move it out of the DCE modules and into the device code. This way we can be sure the scratch registers are initialized properly before we run asic_init which happens before DCE IPs are restored. Fixes atombios hangs in asic_init. Reviewed-by: JimQu <Jim.Qu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
08e23a02e3
Коммит
e695e77c6b
|
@ -1959,6 +1959,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
|
|||
/* evict remaining vram memory */
|
||||
amdgpu_bo_evict_vram(adev);
|
||||
|
||||
amdgpu_atombios_scratch_regs_save(adev);
|
||||
pci_save_state(dev->pdev);
|
||||
if (suspend) {
|
||||
/* Shut down the device */
|
||||
|
@ -2010,6 +2011,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
|
|||
return r;
|
||||
}
|
||||
}
|
||||
amdgpu_atombios_scratch_regs_restore(adev);
|
||||
|
||||
/* post card */
|
||||
if (!amdgpu_card_posted(adev) || !resume) {
|
||||
|
@ -2277,8 +2279,9 @@ retry:
|
|||
amdgpu_display_stop_mc_access(adev, &save);
|
||||
amdgpu_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GMC);
|
||||
}
|
||||
|
||||
amdgpu_atombios_scratch_regs_save(adev);
|
||||
r = amdgpu_asic_reset(adev);
|
||||
amdgpu_atombios_scratch_regs_restore(adev);
|
||||
/* post card */
|
||||
amdgpu_atom_asic_init(adev->mode_info.atom_context);
|
||||
|
||||
|
|
|
@ -3151,10 +3151,6 @@ static int dce_v10_0_hw_fini(void *handle)
|
|||
|
||||
static int dce_v10_0_suspend(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
amdgpu_atombios_scratch_regs_save(adev);
|
||||
|
||||
return dce_v10_0_hw_fini(handle);
|
||||
}
|
||||
|
||||
|
@ -3165,8 +3161,6 @@ static int dce_v10_0_resume(void *handle)
|
|||
|
||||
ret = dce_v10_0_hw_init(handle);
|
||||
|
||||
amdgpu_atombios_scratch_regs_restore(adev);
|
||||
|
||||
/* turn on the BL */
|
||||
if (adev->mode_info.bl_encoder) {
|
||||
u8 bl_level = amdgpu_display_backlight_get_level(adev,
|
||||
|
|
|
@ -3215,10 +3215,6 @@ static int dce_v11_0_hw_fini(void *handle)
|
|||
|
||||
static int dce_v11_0_suspend(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
amdgpu_atombios_scratch_regs_save(adev);
|
||||
|
||||
return dce_v11_0_hw_fini(handle);
|
||||
}
|
||||
|
||||
|
@ -3229,8 +3225,6 @@ static int dce_v11_0_resume(void *handle)
|
|||
|
||||
ret = dce_v11_0_hw_init(handle);
|
||||
|
||||
amdgpu_atombios_scratch_regs_restore(adev);
|
||||
|
||||
/* turn on the BL */
|
||||
if (adev->mode_info.bl_encoder) {
|
||||
u8 bl_level = amdgpu_display_backlight_get_level(adev,
|
||||
|
|
|
@ -2482,10 +2482,6 @@ static int dce_v6_0_hw_fini(void *handle)
|
|||
|
||||
static int dce_v6_0_suspend(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
amdgpu_atombios_scratch_regs_save(adev);
|
||||
|
||||
return dce_v6_0_hw_fini(handle);
|
||||
}
|
||||
|
||||
|
@ -2496,8 +2492,6 @@ static int dce_v6_0_resume(void *handle)
|
|||
|
||||
ret = dce_v6_0_hw_init(handle);
|
||||
|
||||
amdgpu_atombios_scratch_regs_restore(adev);
|
||||
|
||||
/* turn on the BL */
|
||||
if (adev->mode_info.bl_encoder) {
|
||||
u8 bl_level = amdgpu_display_backlight_get_level(adev,
|
||||
|
|
|
@ -3033,10 +3033,6 @@ static int dce_v8_0_hw_fini(void *handle)
|
|||
|
||||
static int dce_v8_0_suspend(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
amdgpu_atombios_scratch_regs_save(adev);
|
||||
|
||||
return dce_v8_0_hw_fini(handle);
|
||||
}
|
||||
|
||||
|
@ -3047,8 +3043,6 @@ static int dce_v8_0_resume(void *handle)
|
|||
|
||||
ret = dce_v8_0_hw_init(handle);
|
||||
|
||||
amdgpu_atombios_scratch_regs_restore(adev);
|
||||
|
||||
/* turn on the BL */
|
||||
if (adev->mode_info.bl_encoder) {
|
||||
u8 bl_level = amdgpu_display_backlight_get_level(adev,
|
||||
|
|
Загрузка…
Ссылка в новой задаче