drm/amd/powerplay: try to do a graceful shutdown on SW CTF
authorEvan Quan <evan.quan@amd.com>
Sat, 9 May 2020 05:26:00 +0000 (13:26 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 14 May 2020 20:42:44 +0000 (16:42 -0400)
Normally this(SW CTF) should not happen. And by doing graceful
shutdown we can prevent further damage.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
drivers/gpu/drm/amd/powerplay/smu_v11_0.c

index 91b5d96..782f6d2 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include <linux/pci.h>
+#include <linux/reboot.h>
 
 #include "hwmgr.h"
 #include "pp_debug.h"
@@ -595,12 +596,18 @@ int phm_irq_process(struct amdgpu_device *adev,
        uint32_t src_id = entry->src_id;
 
        if (client_id == AMDGPU_IRQ_CLIENTID_LEGACY) {
-               if (src_id == VISLANDS30_IV_SRCID_CG_TSS_THERMAL_LOW_TO_HIGH)
+               if (src_id == VISLANDS30_IV_SRCID_CG_TSS_THERMAL_LOW_TO_HIGH) {
                        pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n",
                                                PCI_BUS_NUM(adev->pdev->devfn),
                                                PCI_SLOT(adev->pdev->devfn),
                                                PCI_FUNC(adev->pdev->devfn));
-               else if (src_id == VISLANDS30_IV_SRCID_CG_TSS_THERMAL_HIGH_TO_LOW)
+                       /*
+                        * SW CTF just occurred.
+                        * Try to do a graceful shutdown to prevent further damage.
+                        */
+                       dev_emerg(adev->dev, "System is going to shutdown due to SW CTF!\n");
+                       orderly_poweroff(true);
+               } else if (src_id == VISLANDS30_IV_SRCID_CG_TSS_THERMAL_HIGH_TO_LOW)
                        pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n",
                                        PCI_BUS_NUM(adev->pdev->devfn),
                                        PCI_SLOT(adev->pdev->devfn),
@@ -611,12 +618,18 @@ int phm_irq_process(struct amdgpu_device *adev,
                                        PCI_SLOT(adev->pdev->devfn),
                                        PCI_FUNC(adev->pdev->devfn));
        } else if (client_id == SOC15_IH_CLIENTID_THM) {
-               if (src_id == 0)
+               if (src_id == 0) {
                        pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n",
                                                PCI_BUS_NUM(adev->pdev->devfn),
                                                PCI_SLOT(adev->pdev->devfn),
                                                PCI_FUNC(adev->pdev->devfn));
-               else
+                       /*
+                        * SW CTF just occurred.
+                        * Try to do a graceful shutdown to prevent further damage.
+                        */
+                       dev_emerg(adev->dev, "System is going to shutdown due to SW CTF!\n");
+                       orderly_poweroff(true);
+               } else
                        pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n",
                                        PCI_BUS_NUM(adev->pdev->devfn),
                                        PCI_SLOT(adev->pdev->devfn),
index d5a3487..d1fe762 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/firmware.h>
 #include <linux/module.h>
 #include <linux/pci.h>
+#include <linux/reboot.h>
 
 #define SMU_11_0_PARTIAL_PPTABLE
 
@@ -1561,6 +1562,12 @@ static int smu_v11_0_irq_process(struct amdgpu_device *adev,
                                PCI_BUS_NUM(adev->pdev->devfn),
                                PCI_SLOT(adev->pdev->devfn),
                                PCI_FUNC(adev->pdev->devfn));
+                       /*
+                        * SW CTF just occurred.
+                        * Try to do a graceful shutdown to prevent further damage.
+                        */
+                       dev_emerg(adev->dev, "System is going to shutdown due to SW CTF!\n");
+                       orderly_poweroff(true);
                break;
                case THM_11_0__SRCID__THM_DIG_THERM_H2L:
                        pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n",