drm/amdgpu: Decode deferred error type in aca bank parser
authorXiang Liu <xiang.liu@amd.com>
Wed, 26 Feb 2025 03:36:55 +0000 (11:36 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Feb 2025 21:50:03 +0000 (16:50 -0500)
In the case of poison inband log, the error type need to be specified
by checking the deferred or poison bit of status register.

v2: check both deferred and poison bit

Signed-off-by: Xiang Liu <xiang.liu@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_aca.h
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c
drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c

index b84a3489b1161ce467da02936ec31bf0846c434e..6f62e5d80ed6b2d6a1106d250ae276f01ba103e4 100644 (file)
@@ -76,6 +76,12 @@ struct ras_query_context;
 #define mmSMNAID_XCD1_MCA_SMU          0x38430400      /* SMN AID XCD1 */
 #define mmSMNXCD_XCD0_MCA_SMU          0x40430400      /* SMN XCD XCD0 */
 
+#define ACA_BANK_ERR_CE_DE_DECODE(bank)                                  \
+       ((ACA_REG__STATUS__POISON((bank)->regs[ACA_REG_IDX_STATUS]) ||   \
+         ACA_REG__STATUS__DEFERRED((bank)->regs[ACA_REG_IDX_STATUS])) ? \
+               ACA_ERROR_TYPE_DEFERRED :                                \
+               ACA_ERROR_TYPE_CE)
+
 enum aca_reg_idx {
        ACA_REG_IDX_CTL                 = 0,
        ACA_REG_IDX_STATUS              = 1,
index 49da137d42c91488bd57bfa4fa2a1bc06e7fd802..c313c2cf69697685aa9b7eaade6f685fc65cfc55 100644 (file)
@@ -1169,8 +1169,8 @@ static int xgmi_v6_4_0_aca_bank_parser(struct aca_handle *handle, struct aca_ban
                break;
        case ACA_SMU_TYPE_CE:
                count = ext_error_code == 6 ? count : 0ULL;
-               bank->aca_err_type = ACA_ERROR_TYPE_CE;
-               ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_CE, count);
+               bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
+               ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type, count);
                break;
        default:
                return -EINVAL;
index 50eb856249d57abe2c4aa510d30474ed2ab7954e..87add6274b98ade548834cbd57915997685c74b9 100644 (file)
@@ -883,9 +883,10 @@ static int gfx_v9_4_3_aca_bank_parser(struct aca_handle *handle,
                                                     ACA_ERROR_TYPE_UE, 1ULL);
                break;
        case ACA_SMU_TYPE_CE:
-               bank->aca_err_type = ACA_ERROR_TYPE_CE;
+               bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
                ret = aca_error_cache_log_bank_error(handle, &info,
-                                                    ACA_ERROR_TYPE_CE, ACA_REG__MISC0__ERRCNT(misc0));
+                                                    bank->aca_err_type,
+                                                    ACA_REG__MISC0__ERRCNT(misc0));
                break;
        default:
                return -EINVAL;
index b8f06e9c9e6265c6b561f010346b3f3b8dd83f5a..1fcab0ef21c385bd0a69302cf19e516e1df9cfa0 100644 (file)
@@ -1332,8 +1332,8 @@ static int jpeg_v4_0_3_aca_bank_parser(struct aca_handle *handle, struct aca_ban
                                                     1ULL);
                break;
        case ACA_SMU_TYPE_CE:
-               bank->aca_err_type = ACA_ERROR_TYPE_CE;
-               ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_CE,
+               bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
+               ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
                                                     ACA_REG__MISC0__ERRCNT(misc0));
                break;
        default:
index 58d22f0d5a68fc5e0418587404beea0aeefabfe4..a54e7b92929599bb98cd38a0c71bdddcd01eb341 100644 (file)
@@ -751,8 +751,8 @@ static int mmhub_v1_8_aca_bank_parser(struct aca_handle *handle, struct aca_bank
                                                     1ULL);
                break;
        case ACA_SMU_TYPE_CE:
-               bank->aca_err_type = ACA_ERROR_TYPE_CE;
-               ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_CE,
+               bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
+               ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
                                                     ACA_REG__MISC0__ERRCNT(misc0));
                break;
        default:
index 03e47fad217f4f66a9c93841a08f36ca2d6028fd..fd34dc13808110cf010d1fbfe29eff81d08742ec 100644 (file)
@@ -2532,8 +2532,8 @@ static int sdma_v4_4_2_aca_bank_parser(struct aca_handle *handle, struct aca_ban
                                                     1ULL);
                break;
        case ACA_SMU_TYPE_CE:
-               bank->aca_err_type = ACA_ERROR_TYPE_CE;
-               ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_CE,
+               bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
+               ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
                                                     ACA_REG__MISC0__ERRCNT(misc0));
                break;
        default:
index 2681c40704a15dac1c2b700c20115d830bd6b8f2..20f6bd9255dbf1a2955656c2f49fe552caed34ee 100644 (file)
@@ -1963,8 +1963,8 @@ static int vcn_v4_0_3_aca_bank_parser(struct aca_handle *handle, struct aca_bank
                                                     1ULL);
                break;
        case ACA_SMU_TYPE_CE:
-               bank->aca_err_type = ACA_ERROR_TYPE_CE;
-               ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_CE,
+               bank->aca_err_type = ACA_BANK_ERR_CE_DE_DECODE(bank);
+               ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
                                                     ACA_REG__MISC0__ERRCNT(misc0));
                break;
        default: