drm/amdgpu: make audio dev's D-state transition PMFW-aware
authorEvan Quan <evan.quan@amd.com>
Tue, 25 May 2021 02:28:04 +0000 (10:28 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 11 Jun 2021 20:02:17 +0000 (16:02 -0400)
To correctly kick into BACO state, the audio dev's D-state
transition(D0->D3) needs to be PMFW-aware. So, if the audio
dev entered D3 state prior to our driver, we need to bring
it back to D0 state and make sure there will be a D-state
transition on runpm suspend.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c

index 425596c2f6f80813df69eaec8422677f1af45796..617fcbafc75db7ccd5a3493e6429e34a6d62309d 100644 (file)
@@ -124,6 +124,22 @@ void amdgpu_register_gpu_instance(struct amdgpu_device *adev)
        mutex_unlock(&mgpu_info.mutex);
 }
 
+static void amdgpu_get_audio_func(struct amdgpu_device *adev)
+{
+       struct pci_dev *p = NULL;
+
+       p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
+                       adev->pdev->bus->number, 1);
+       if (p) {
+               pm_runtime_get_sync(&p->dev);
+
+               pm_runtime_mark_last_busy(&p->dev);
+               pm_runtime_put_autosuspend(&p->dev);
+
+               pci_dev_put(p);
+       }
+}
+
 /**
  * amdgpu_driver_load_kms - Main load function for KMS.
  *
@@ -213,9 +229,35 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
                                                DPM_FLAG_MAY_SKIP_RESUME);
                pm_runtime_use_autosuspend(dev->dev);
                pm_runtime_set_autosuspend_delay(dev->dev, 5000);
+
                pm_runtime_allow(dev->dev);
+
                pm_runtime_mark_last_busy(dev->dev);
                pm_runtime_put_autosuspend(dev->dev);
+
+               /*
+                * For runpm implemented via BACO, PMFW will handle the
+                * timing for BACO in and out:
+                *   - put ASIC into BACO state only when both video and
+                *     audio functions are in D3 state.
+                *   - pull ASIC out of BACO state when either video or
+                *     audio function is in D0 state.
+                * Also, at startup, PMFW assumes both functions are in
+                * D0 state.
+                *
+                * So if snd driver was loaded prior to amdgpu driver
+                * and audio function was put into D3 state, there will
+                * be no PMFW-aware D-state transition(D0->D3) on runpm
+                * suspend. Thus the BACO will be not correctly kicked in.
+                *
+                * Via amdgpu_get_audio_func(), the audio dev is put
+                * into D0 state. Then there will be a PMFW-aware D-state
+                * transition(D0->D3) on runpm suspend.
+                */
+               if (amdgpu_device_supports_baco(dev) &&
+                   !(adev->flags & AMD_IS_APU) &&
+                   (adev->asic_type >= CHIP_NAVI10))
+                       amdgpu_get_audio_func(adev);
        }
 
        if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_LOAD))