drm/amdgpu: add tracking for the enablement of SCPM
authorLikun Gao <Likun.Gao@amd.com>
Wed, 4 May 2022 13:56:33 +0000 (09:56 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 4 May 2022 13:56:51 +0000 (09:56 -0400)
Add parmeter to shows whether SCPM feature is enabled or not, and
whether is valid.

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h

index cb57ccf..fc3225e 100644 (file)
@@ -1016,6 +1016,9 @@ struct amdgpu_device {
        /* reset dump register */
        uint32_t                        *reset_dump_reg_list;
        int                             num_regs;
+
+       bool                            scpm_enabled;
+       uint32_t                        scpm_status;
 };
 
 static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev)
index 5aba4cb..7010944 100644 (file)
@@ -282,7 +282,7 @@ static bool psp_get_runtime_db_entry(struct amdgpu_device *adev,
                        case PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG:
                                if (db_dir.entry_list[i].size < sizeof(struct psp_runtime_boot_cfg_entry)) {
                                        /* invalid db entry size */
-                                       dev_warn(adev->dev, "Invalid PSP runtime database entry size\n");
+                                       dev_warn(adev->dev, "Invalid PSP runtime database boot cfg entry size\n");
                                        return false;
                                }
                                /* read runtime database entry */
@@ -290,6 +290,17 @@ static bool psp_get_runtime_db_entry(struct amdgpu_device *adev,
                                                          (uint32_t *)db_entry, sizeof(struct psp_runtime_boot_cfg_entry), false);
                                ret = true;
                                break;
+                       case PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS:
+                               if (db_dir.entry_list[i].size < sizeof(struct psp_runtime_scpm_entry)) {
+                                       /* invalid db entry size */
+                                       dev_warn(adev->dev, "Invalid PSP runtime database scpm entry size\n");
+                                       return false;
+                               }
+                               /* read runtime database entry */
+                               amdgpu_device_vram_access(adev, db_header_pos + db_dir.entry_list[i].offset,
+                                                         (uint32_t *)db_entry, sizeof(struct psp_runtime_scpm_entry), false);
+                               ret = true;
+                               break;
                        default:
                                ret = false;
                                break;
@@ -334,6 +345,7 @@ static int psp_sw_init(void *handle)
        int ret;
        struct psp_runtime_boot_cfg_entry boot_cfg_entry;
        struct psp_memory_training_context *mem_training_ctx = &psp->mem_train_ctx;
+       struct psp_runtime_scpm_entry scpm_entry;
 
        psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
        if (!psp->cmd) {
@@ -354,6 +366,20 @@ static int psp_sw_init(void *handle)
                !adev->gmc.xgmi.connected_to_cpu &&
                        adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 2);
 
+       memset(&scpm_entry, 0, sizeof(scpm_entry));
+       if ((psp_get_runtime_db_entry(adev,
+                               PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS,
+                               &scpm_entry)) &&
+           (SCPM_DISABLE != scpm_entry.scpm_status)) {
+               adev->scpm_enabled = true;
+               adev->scpm_status = scpm_entry.scpm_status;
+       } else {
+               adev->scpm_enabled = false;
+               adev->scpm_status = SCPM_DISABLE;
+       }
+
+       /* TODO: stop gpu driver services and print alarm if scpm is enabled with error status */
+
        memset(&boot_cfg_entry, 0, sizeof(boot_cfg_entry));
        if (psp_get_runtime_db_entry(adev,
                                PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG,
index cf8d319..a9fe05c 100644 (file)
@@ -244,6 +244,7 @@ enum psp_runtime_entry_type {
        PSP_RUNTIME_ENTRY_TYPE_MGPU_WAFL        = 0x3,  /* WAFL runtime data */
        PSP_RUNTIME_ENTRY_TYPE_MGPU_XGMI        = 0x4,  /* XGMI runtime data */
        PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG      = 0x5,  /* Boot Config runtime data */
+       PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS = 0x6, /* SCPM validation data */
 };
 
 /* PSP runtime DB header */
@@ -278,12 +279,24 @@ enum psp_runtime_boot_cfg_feature {
        BOOT_CFG_FEATURE_TWO_STAGE_DRAM_TRAINING    = 0x2,
 };
 
+/* PSP run time DB SCPM authentication defines */
+enum psp_runtime_scpm_authentication {
+       SCPM_DISABLE                     = 0x0,
+       SCPM_ENABLE                      = 0x1,
+       SCPM_ENABLE_WITH_SCPM_ERR        = 0x2,
+};
+
 /* PSP runtime DB boot config entry */
 struct psp_runtime_boot_cfg_entry {
        uint32_t boot_cfg_bitmask;
        uint32_t reserved;
 };
 
+/* PSP runtime DB SCPM entry */
+struct psp_runtime_scpm_entry {
+       enum psp_runtime_scpm_authentication scpm_status;
+};
+
 struct psp_context
 {
        struct amdgpu_device            *adev;