]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amdgpu: start to disentangle boco from runtime pm
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 7 Nov 2019 23:13:14 +0000 (18:13 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Nov 2019 21:42:53 +0000 (16:42 -0500)
BACO - Bus Active, Chip Off
BOCO - Bus Off, Chip Off

We originally only supported runtime pm on PX/HG
laptops so most of the runtime pm code looks for this.
Add a new flag to check for runtime pm enablement and
use this rather than checking for PX/HG.

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

index c1e6a5f80c8a844e764a08a66e632facfab35713..dd961f0a5a750ee53d6da0c333a61daf0baa2ee2 100644 (file)
@@ -987,6 +987,8 @@ struct amdgpu_device {
 
        /* device pstate */
        int                             pstate;
+       /* enable runtime pm on the device */
+       bool                            runpm;
 };
 
 static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)
index 43070973d6a6707044a8f0b1ee20011423ebbd2d..348eb2f71e88ef38460419661f0422cc18949c5d 100644 (file)
@@ -1202,9 +1202,10 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct drm_device *drm_dev = pci_get_drvdata(pdev);
+       struct amdgpu_device *adev = drm_dev->dev_private;
        int ret;
 
-       if (!amdgpu_device_supports_boco(drm_dev)) {
+       if (!adev->runpm) {
                pm_runtime_forbid(dev);
                return -EBUSY;
        }
@@ -1234,9 +1235,10 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct drm_device *drm_dev = pci_get_drvdata(pdev);
+       struct amdgpu_device *adev = drm_dev->dev_private;
        int ret;
 
-       if (!amdgpu_device_supports_boco(drm_dev))
+       if (!adev->runpm)
                return -EINVAL;
 
        if (amdgpu_device_supports_boco(drm_dev)) {
@@ -1263,9 +1265,10 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
 static int amdgpu_pmops_runtime_idle(struct device *dev)
 {
        struct drm_device *drm_dev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_dev->dev_private;
        struct drm_crtc *crtc;
 
-       if (!amdgpu_device_supports_boco(drm_dev)) {
+       if (!adev->runpm) {
                pm_runtime_forbid(dev);
                return -EBUSY;
        }
index a1628e95573f4a8133dd1383398674ce9c95f2dd..402040a2c36f45d1ccd29a0a3a06f9f7bda6ce2e 100644 (file)
@@ -91,7 +91,7 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
        if (amdgpu_sriov_vf(adev))
                amdgpu_virt_request_full_gpu(adev, false);
 
-       if (amdgpu_device_supports_boco(dev)) {
+       if (adev->runpm) {
                pm_runtime_get_sync(dev->dev);
                pm_runtime_forbid(dev->dev);
        }
@@ -150,14 +150,17 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
        }
        dev->dev_private = (void *)adev;
 
-       if ((amdgpu_runtime_pm != 0) &&
-           amdgpu_has_atpx() &&
+       if (amdgpu_has_atpx() &&
            (amdgpu_is_atpx_hybrid() ||
             amdgpu_has_atpx_dgpu_power_cntl()) &&
            ((flags & AMD_IS_APU) == 0) &&
            !pci_is_thunderbolt_attached(dev->pdev))
                flags |= AMD_IS_PX;
 
+       if ((amdgpu_runtime_pm != 0) &&
+           (flags & AMD_IS_PX))
+               adev->runpm = true;
+
        /* amdgpu_device_init should report only fatal error
         * like memory allocation failure or iomapping failure,
         * or memory manager initialization failure, it must
@@ -180,7 +183,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
                                "Error during ACPI methods call\n");
        }
 
-       if (amdgpu_device_supports_boco(dev)) {
+       if (adev->runpm) {
                dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP);
                pm_runtime_use_autosuspend(dev->dev);
                pm_runtime_set_autosuspend_delay(dev->dev, 5000);
@@ -193,7 +196,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
 out:
        if (r) {
                /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
-               if (adev->rmmio && amdgpu_device_supports_boco(dev))
+               if (adev->rmmio && adev->runpm)
                        pm_runtime_put_noidle(dev->dev);
                amdgpu_driver_unload_kms(dev);
        }