drm/amd/pm: support new mca smu error code decoding
authorYang Wang <kevinyang.wang@amd.com>
Mon, 4 Dec 2023 02:17:57 +0000 (10:17 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Dec 2023 21:05:32 +0000 (16:05 -0500)
support new mca smu error code decoding from smu 85.86.0 for smu v13.0.6

Signed-off-by: Yang Wang <kevinyang.wang@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_mca.h
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c

index 2b488fcf2f95b2021872383c39c1c03b22004531..e51e8918e6671aa27bb7ce239a19594a43638f10 100644 (file)
@@ -46,6 +46,8 @@
 #define MCA_REG__STATUS__ERRORCODEEXT(x)       MCA_REG_FIELD(x, 21, 16)
 #define MCA_REG__STATUS__ERRORCODE(x)          MCA_REG_FIELD(x, 15, 0)
 
+#define MCA_REG__SYND__ERRORINFORMATION(x)     MCA_REG_FIELD(x, 17, 0)
+
 enum amdgpu_mca_ip {
        AMDGPU_MCA_IP_UNKNOW = -1,
        AMDGPU_MCA_IP_PSP = 0,
index 0e5a77c3c2e216362b2e5363f1ec25f62940ede3..900a2d9e6d85481abd728cbdd11c9fe66e826a09 100644 (file)
@@ -2593,13 +2593,20 @@ static bool mca_gfx_smu_bank_is_valid(const struct mca_ras_info *mca_ras, struct
 static bool mca_smu_bank_is_valid(const struct mca_ras_info *mca_ras, struct amdgpu_device *adev,
                                  enum amdgpu_mca_error_type type, struct mca_bank_entry *entry)
 {
+       struct smu_context *smu = adev->powerplay.pp_handle;
        uint32_t errcode, instlo;
 
        instlo = REG_GET_FIELD(entry->regs[MCA_REG_IDX_IPID], MCMP1_IPIDT0, InstanceIdLo);
        if (instlo != 0x03b30400)
                return false;
 
-       errcode = REG_GET_FIELD(entry->regs[MCA_REG_IDX_STATUS], MCMP1_STATUST0, ErrorCode);
+       if (!(adev->flags & AMD_IS_APU) && smu->smc_fw_version >= 0x00555600) {
+               errcode = MCA_REG__SYND__ERRORINFORMATION(entry->regs[MCA_REG_IDX_SYND]);
+               errcode &= 0xff;
+       } else {
+               errcode = REG_GET_FIELD(entry->regs[MCA_REG_IDX_STATUS], MCMP1_STATUST0, ErrorCode);
+       }
+
        return mca_smu_check_error_code(adev, mca_ras, errcode);
 }