Skip to content

Commit 887f75c

Browse files
Kai-Heng Fengalexdeucher
authored andcommitted
drm/amdgpu: Ensure HDA function is suspended before ASIC reset
DP/HDMI audio on AMD PRO VII stops working after S3: [ 149.450391] amdgpu 0000:63:00.0: amdgpu: MODE1 reset [ 149.450395] amdgpu 0000:63:00.0: amdgpu: GPU mode1 reset [ 149.450494] amdgpu 0000:63:00.0: amdgpu: GPU psp mode1 reset [ 149.983693] snd_hda_intel 0000:63:00.1: refused to change power state from D0 to D3hot [ 150.003439] amdgpu 0000:63:00.0: refused to change power state from D0 to D3hot ... [ 155.432975] snd_hda_intel 0000:63:00.1: CORB reset timeout#2, CORBRP = 65535 The offending commit is daf8de0 ("drm/amdgpu: always reset the asic in suspend (v2)"). Commit 34452ac ("drm/amdgpu: don't use BACO for reset in S3 ") doesn't help, so the issue is something different. Assuming that to make HDA resume to D0 fully realized, it needs to be successfully put to D3 first. And this guesswork proves working, by moving amdgpu_asic_reset() to noirq callback, so it's called after HDA function is in D3. Fixes: daf8de0 ("drm/amdgpu: always reset the asic in suspend (v2)") Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
1 parent e3cf2e0 commit 887f75c

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,18 +2323,23 @@ static int amdgpu_pmops_suspend(struct device *dev)
23232323
{
23242324
struct drm_device *drm_dev = dev_get_drvdata(dev);
23252325
struct amdgpu_device *adev = drm_to_adev(drm_dev);
2326-
int r;
23272326

23282327
if (amdgpu_acpi_is_s0ix_active(adev))
23292328
adev->in_s0ix = true;
23302329
else
23312330
adev->in_s3 = true;
2332-
r = amdgpu_device_suspend(drm_dev, true);
2333-
if (r)
2334-
return r;
2331+
return amdgpu_device_suspend(drm_dev, true);
2332+
}
2333+
2334+
static int amdgpu_pmops_suspend_noirq(struct device *dev)
2335+
{
2336+
struct drm_device *drm_dev = dev_get_drvdata(dev);
2337+
struct amdgpu_device *adev = drm_to_adev(drm_dev);
2338+
23352339
if (!adev->in_s0ix)
2336-
r = amdgpu_asic_reset(adev);
2337-
return r;
2340+
return amdgpu_asic_reset(adev);
2341+
2342+
return 0;
23382343
}
23392344

23402345
static int amdgpu_pmops_resume(struct device *dev)
@@ -2575,6 +2580,7 @@ static const struct dev_pm_ops amdgpu_pm_ops = {
25752580
.prepare = amdgpu_pmops_prepare,
25762581
.complete = amdgpu_pmops_complete,
25772582
.suspend = amdgpu_pmops_suspend,
2583+
.suspend_noirq = amdgpu_pmops_suspend_noirq,
25782584
.resume = amdgpu_pmops_resume,
25792585
.freeze = amdgpu_pmops_freeze,
25802586
.thaw = amdgpu_pmops_thaw,

0 commit comments

Comments
 (0)