]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amdgpu: add new aca smu callback func parse_error_code()
authorYang Wang <kevinyang.wang@amd.com>
Fri, 12 Apr 2024 01:53:15 +0000 (09:53 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 17 Apr 2024 02:39:15 +0000 (22:39 -0400)
add new aca smu callback parse_error_code{} to avoid specific asic check
in amdgpu_aca.c file

Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Tao Zhou <tao.zhou1@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c

index c02634a124dd9587038b489e1521db1d853d5174..c50202215f6b19f5360d200ecce280856ff89cde 100644 (file)
@@ -753,23 +753,13 @@ int aca_bank_info_decode(struct aca_bank *bank, struct aca_bank_info *info)
 
 static int aca_bank_get_error_code(struct amdgpu_device *adev, struct aca_bank *bank)
 {
-       int error_code;
-
-       switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) {
-       case IP_VERSION(13, 0, 6):
-               if (!(adev->flags & AMD_IS_APU) && adev->pm.fw_version >= 0x00555600) {
-                       error_code = ACA_REG__SYND__ERRORINFORMATION(bank->regs[ACA_REG_IDX_SYND]);
-                       return error_code & 0xff;
-               }
-               break;
-       default:
-               break;
-       }
+       struct amdgpu_aca *aca = &adev->aca;
+       const struct aca_smu_funcs *smu_funcs = aca->smu_funcs;
 
-       /* NOTE: the true error code is encoded in status.errorcode[0:7] */
-       error_code = ACA_REG__STATUS__ERRORCODE(bank->regs[ACA_REG_IDX_STATUS]);
+       if (!smu_funcs || !smu_funcs->parse_error_code)
+               return -EOPNOTSUPP;
 
-       return error_code & 0xff;
+       return smu_funcs->parse_error_code(adev, bank);
 }
 
 int aca_bank_check_error_codes(struct amdgpu_device *adev, struct aca_bank *bank, int *err_codes, int size)
@@ -780,6 +770,9 @@ int aca_bank_check_error_codes(struct amdgpu_device *adev, struct aca_bank *bank
                return -EINVAL;
 
        error_code = aca_bank_get_error_code(adev, bank);
+       if (error_code < 0)
+               return error_code;
+
        for (i = 0; i < size; i++) {
                if (err_codes[i] == error_code)
                        return 0;
index 3765843ea648bca906a98fdf5a3d50c9d8e401f4..5ef6b745f2223b8dd3eb94a33763a79c7d94d491 100644 (file)
@@ -173,6 +173,7 @@ struct aca_smu_funcs {
        int (*set_debug_mode)(struct amdgpu_device *adev, bool enable);
        int (*get_valid_aca_count)(struct amdgpu_device *adev, enum aca_smu_type type, u32 *count);
        int (*get_valid_aca_bank)(struct amdgpu_device *adev, enum aca_smu_type type, int idx, struct aca_bank *bank);
+       int (*parse_error_code)(struct amdgpu_device *adev, struct aca_bank *bank);
 };
 
 struct amdgpu_aca {
index 16179e1708744b69dfb62a6b476f149faae8b6c2..bc1f3fe4d82aa4e7cc66a36bb3779cf4a5ab5466 100644 (file)
@@ -3118,12 +3118,25 @@ static int aca_smu_get_valid_aca_bank(struct amdgpu_device *adev,
        return 0;
 }
 
+static int aca_smu_parse_error_code(struct amdgpu_device *adev, struct aca_bank *bank)
+{
+       int error_code;
+
+       if (!(adev->flags & AMD_IS_APU) && adev->pm.fw_version >= 0x00555600)
+               error_code = ACA_REG__SYND__ERRORINFORMATION(bank->regs[ACA_REG_IDX_SYND]);
+       else
+               error_code = ACA_REG__STATUS__ERRORCODE(bank->regs[ACA_REG_IDX_STATUS]);
+
+       return error_code & 0xff;
+}
+
 static const struct aca_smu_funcs smu_v13_0_6_aca_smu_funcs = {
        .max_ue_bank_count = 12,
        .max_ce_bank_count = 12,
        .set_debug_mode = aca_smu_set_debug_mode,
        .get_valid_aca_count = aca_smu_get_valid_aca_count,
        .get_valid_aca_bank = aca_smu_get_valid_aca_bank,
+       .parse_error_code = aca_smu_parse_error_code,
 };
 
 static int smu_v13_0_6_select_xgmi_plpd_policy(struct smu_context *smu,