aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4550-drm-amdgpu-start-to-disentangle-boco-from-runtime-pm.patch
diff options
context:
space:
mode:
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.patch131
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
+