diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4550-drm-amdgpu-start-to-disentangle-boco-from-runtime-pm.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4550-drm-amdgpu-start-to-disentangle-boco-from-runtime-pm.patch | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4550-drm-amdgpu-start-to-disentangle-boco-from-runtime-pm.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4550-drm-amdgpu-start-to-disentangle-boco-from-runtime-pm.patch new file mode 100644 index 00000000..bdfaf13b --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4550-drm-amdgpu-start-to-disentangle-boco-from-runtime-pm.patch @@ -0,0 +1,131 @@ +From 3f6b71254c91d80d5a77a0124ecb6a5587ec4b10 Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexander.deucher@amd.com> +Date: Thu, 7 Nov 2019 18:13:14 -0500 +Subject: [PATCH 4550/4736] drm/amdgpu: start to disentangle boco from runtime + pm + +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. + +Change-Id: I09683aeef460c4a64ce904d0b21f8d949617a97c +Reviewed-by: Evan Quan <evan.quan@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Rahul Kumar <rahul.kumar1@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 9 ++++++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 13 ++++++++----- + 3 files changed, 16 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 9679649082cb..ccb1fd7cd2b6 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -1035,6 +1035,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) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +index 036e253def85..6957ef4ef514 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +@@ -1247,9 +1247,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; + } +@@ -1279,9 +1280,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)) { +@@ -1308,9 +1310,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; + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +index 591558fc6a9f..ab7697d7b70a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +@@ -88,7 +88,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); + } +@@ -147,14 +147,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 +@@ -177,7 +180,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); +@@ -190,7 +193,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); + } +-- +2.17.1 + |