<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<p style="font-family:Arial;font-size:10pt;color:#0000FF;margin:5pt;" align="Left">
[AMD Official Use Only - General]<br>
</p>
<br>
<div>
<div style="color: rgb(33, 33, 33); background-color: rgb(255, 255, 255);" dir="auto">
Runtime PM can be disabled with a module param. BACO state is supported for non-RPM use cases also like regular suspend or a reset. Relying on RPM mode for BACO state is not the right thing to do.</div>
<div id="ms-outlook-mobile-signature" dir="auto">
<div><br>
</div>
Thanks,<br>
Lijo</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Chen, Guchun <Guchun.Chen@amd.com><br>
<b>Sent:</b> Monday, November 21, 2022 6:08:58 AM<br>
<b>To:</b> amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>; Deucher, Alexander <Alexander.Deucher@amd.com>; Zhang, Hawking <Hawking.Zhang@amd.com>; Lazar, Lijo <Lijo.Lazar@amd.com>; Quan, Evan <Evan.Quan@amd.com><br>
<b>Cc:</b> Chen, Guchun <Guchun.Chen@amd.com><br>
<b>Subject:</b> [PATCH 1/2] drm/amdgpu: use rpm_mode as runtime pm check flag</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Driver was not calling BACO exit at all in runtime pm<br>
resume, and it caused the timing issue leading to a PCI<br>
AER error, as once system enters BACO, it's not reliable<br>
to check runtime pm mode by talking to SMU. So use rpm_mode<br>
instead as a general pm mode check to ensure driver executes<br>
BACO exit in runtime pm resume.<br>
<br>
Fixes: 8795e182b02d ("PCI/portdrv: Don't disable AER reporting in get_port_device_capability()")<br>
<br>
Signed-off-by: Guchun Chen <guchun.chen@amd.com><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  4 ++--<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c    | 25 +++++++++++-----------<br>
 2 files changed, 15 insertions(+), 14 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
index ab8f970b2849..40af21040b47 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<br>
@@ -5619,7 +5619,7 @@ int amdgpu_device_baco_enter(struct drm_device *dev)<br>
         struct amdgpu_device *adev = drm_to_adev(dev);<br>
         struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);<br>
 <br>
-       if (!amdgpu_device_supports_baco(adev_to_drm(adev)))<br>
+       if (adev->pm.rpm_mode != AMDGPU_RUNPM_BACO)<br>
                 return -ENOTSUPP;<br>
 <br>
         if (ras && adev->ras_enabled &&<br>
@@ -5635,7 +5635,7 @@ int amdgpu_device_baco_exit(struct drm_device *dev)<br>
         struct amdgpu_ras *ras = amdgpu_ras_get_context(adev);<br>
         int ret = 0;<br>
 <br>
-       if (!amdgpu_device_supports_baco(adev_to_drm(adev)))<br>
+       if (adev->pm.rpm_mode != AMDGPU_RUNPM_BACO)<br>
                 return -ENOTSUPP;<br>
 <br>
         ret = amdgpu_dpm_baco_exit(adev);<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<br>
index 3c9fecdd6b2f..be03f7b1cee1 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<br>
@@ -2532,7 +2532,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)<br>
         }<br>
 <br>
         adev->in_runpm = true;<br>
-       if (amdgpu_device_supports_px(drm_dev))<br>
+       if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX)<br>
                 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;<br>
 <br>
         /*<br>
@@ -2542,21 +2542,21 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)<br>
          * platforms.<br>
          * TODO: this may be also needed for PX capable platform.<br>
          */<br>
-       if (amdgpu_device_supports_boco(drm_dev))<br>
+       if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO)<br>
                 adev->mp1_state = PP_MP1_STATE_UNLOAD;<br>
 <br>
         ret = amdgpu_device_suspend(drm_dev, false);<br>
         if (ret) {<br>
                 adev->in_runpm = false;<br>
-               if (amdgpu_device_supports_boco(drm_dev))<br>
+               if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO)<br>
                         adev->mp1_state = PP_MP1_STATE_NONE;<br>
                 return ret;<br>
         }<br>
 <br>
-       if (amdgpu_device_supports_boco(drm_dev))<br>
+       if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO)<br>
                 adev->mp1_state = PP_MP1_STATE_NONE;<br>
 <br>
-       if (amdgpu_device_supports_px(drm_dev)) {<br>
+       if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX) {<br>
                 /* Only need to handle PCI state in the driver for ATPX<br>
                  * PCI core handles it for _PR3.<br>
                  */<br>
@@ -2565,9 +2565,9 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)<br>
                 pci_ignore_hotplug(pdev);<br>
                 pci_set_power_state(pdev, PCI_D3cold);<br>
                 drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;<br>
-       } else if (amdgpu_device_supports_boco(drm_dev)) {<br>
+       } else if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO) {<br>
                 /* nothing to do */<br>
-       } else if (amdgpu_device_supports_baco(drm_dev)) {<br>
+       } else {<br>
                 amdgpu_device_baco_enter(drm_dev);<br>
         }<br>
 <br>
@@ -2588,7 +2588,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)<br>
         if (!pci_device_is_present(adev->pdev))<br>
                 adev->no_hw_access = true;<br>
 <br>
-       if (amdgpu_device_supports_px(drm_dev)) {<br>
+       if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX) {<br>
                 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;<br>
 <br>
                 /* Only need to handle PCI state in the driver for ATPX<br>
@@ -2600,22 +2600,23 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)<br>
                 if (ret)<br>
                         return ret;<br>
                 pci_set_master(pdev);<br>
-       } else if (amdgpu_device_supports_boco(drm_dev)) {<br>
+       } else if (adev->pm.rpm_mode == AMDGPU_RUNPM_BOCO) {<br>
                 /* Only need to handle PCI state in the driver for ATPX<br>
                  * PCI core handles it for _PR3.<br>
                  */<br>
                 pci_set_master(pdev);<br>
-       } else if (amdgpu_device_supports_baco(drm_dev)) {<br>
+       } else {<br>
                 amdgpu_device_baco_exit(drm_dev);<br>
         }<br>
+<br>
         ret = amdgpu_device_resume(drm_dev, false);<br>
         if (ret) {<br>
-               if (amdgpu_device_supports_px(drm_dev))<br>
+               if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX)<br>
                         pci_disable_device(pdev);<br>
                 return ret;<br>
         }<br>
 <br>
-       if (amdgpu_device_supports_px(drm_dev))<br>
+       if (adev->pm.rpm_mode == AMDGPU_RUNPM_PX)<br>
                 drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;<br>
         adev->in_runpm = false;<br>
         return 0;<br>
-- <br>
2.25.1<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>