Retrieve ras error info via common interface and message for mp1_v13_0.

Signed-off-by: YiPeng Chai <[email protected]>
---
 drivers/gpu/drm/amd/ras/core/ras_mp1.h        |  8 +++
 drivers/gpu/drm/amd/ras/core/ras_mp1_v13_0.c  | 61 +++++++++++++------
 .../gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mp1.c  |  4 ++
 3 files changed, 53 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/core/ras_mp1.h 
b/drivers/gpu/drm/amd/ras/core/ras_mp1.h
index d70070645ced..81d5f1eed676 100644
--- a/drivers/gpu/drm/amd/ras/core/ras_mp1.h
+++ b/drivers/gpu/drm/amd/ras/core/ras_mp1.h
@@ -25,7 +25,15 @@
 #define __RAS_MP1_H__
 #include "ras.h"
 
+#define MAX_UE_BANKS_PER_QUERY  12
+#define MAX_CE_BANKS_PER_QUERY  12
+
 enum ras_mp1_msg_id {
+       RAS_MP1_MSG_QueryValidMcaCount,
+       RAS_MP1_MSG_McaBankDumpDW,
+       RAS_MP1_MSG_ClearMcaOnRead,
+       RAS_MP1_MSG_QueryValidMcaCeCount,
+       RAS_MP1_MSG_McaBankCeDumpDW,
        RAS_MP1_MSG_GetRasTableVersion,
        RAS_MP1_MSG_GetRmaStatus,
        RAS_MP1_MSG_GetBadPageCount,
diff --git a/drivers/gpu/drm/amd/ras/core/ras_mp1_v13_0.c 
b/drivers/gpu/drm/amd/ras/core/ras_mp1_v13_0.c
index 6fd746fe64c4..bdedaadd85b3 100644
--- a/drivers/gpu/drm/amd/ras/core/ras_mp1_v13_0.c
+++ b/drivers/gpu/drm/amd/ras/core/ras_mp1_v13_0.c
@@ -26,30 +26,52 @@
 #include "core_status.h"
 #include "ras_mp1_v13_0.h"
 
-#define RAS_MP1_MSG_QueryValidMcaCount                0x36
-#define RAS_MP1_MSG_McaBankDumpDW                     0x37
-#define RAS_MP1_MSG_ClearMcaOnRead                    0x39
-#define RAS_MP1_MSG_QueryValidMcaCeCount              0x3A
-#define RAS_MP1_MSG_McaBankCeDumpDW                   0x3B
+static int __send_mp1_msg32(struct ras_core_context *ras_core,
+               enum ras_mp1_msg_id msg_id, u32 input, u32 *output)
+{
+       if (!ras_core->ras_mp1.sys_func ||
+           !ras_core->ras_mp1.sys_func->mp1_send_ras_msg)
+               return -EOPNOTSUPP;
+
+       return ras_core->ras_mp1.sys_func->mp1_send_ras_msg(ras_core,
+                               msg_id, &input, 1, output, output ? 1 : 0);
+}
+
+static int __dump_mp1_bank_reg64(struct ras_core_context *ras_core,
+                                    u32 msg, u32 idx, u32 reg_idx, u64 *val)
+{
+       u32 data[2] = {0, 0};
+       u32 param;
+       int ret;
+       u32 i, offset;
+
+       offset = reg_idx * 8;
+       for (i = 0; i < ARRAY_SIZE(data); i++) {
+               param = ((idx & 0xffff) << 16) | ((offset + (i << 2)) & 0xfffc);
+               ret = __send_mp1_msg32(ras_core, msg, param, &data[i]);
+               if (ret) {
+                       RAS_DEV_ERR(ras_core->dev,
+                               "ACA failed to read register[%u], 
offset:0x%x\n",
+                               reg_idx, offset);
+                       return ret;
+               }
+       }
 
-#define MAX_UE_BANKS_PER_QUERY  12
-#define MAX_CE_BANKS_PER_QUERY  12
+       *val = ((u64)data[1] << 32) | data[0];
+
+       return 0;
+}
 
 static int mp1_v13_0_get_bank_count(struct ras_core_context *ras_core,
                            enum ras_err_type type, u32 *count)
 {
-       struct ras_mp1 *mp1 = &ras_core->ras_mp1;
-       const struct ras_mp1_sys_func *sys_func = mp1->sys_func;
-       uint32_t bank_count = 0;
+       u32 bank_count = 0;
        u32 msg;
        int ret;
 
        if (!count)
                return -EINVAL;
 
-       if (!sys_func || !sys_func->mp1_get_valid_bank_count)
-               return -RAS_CORE_NOT_SUPPORTED;
-
        switch (type) {
        case RAS_ERR_TYPE__UE:
                msg = RAS_MP1_MSG_QueryValidMcaCount;
@@ -62,10 +84,11 @@ static int mp1_v13_0_get_bank_count(struct ras_core_context 
*ras_core,
                return -EINVAL;
        }
 
-       ret = sys_func->mp1_get_valid_bank_count(ras_core, msg, &bank_count);
+       ret = __send_mp1_msg32(ras_core, msg, 0, &bank_count);
        if (!ret) {
                if (((type == RAS_ERR_TYPE__UE) && (bank_count >= 
MAX_UE_BANKS_PER_QUERY)) ||
-                       ((type == RAS_ERR_TYPE__CE) && (bank_count >= 
MAX_CE_BANKS_PER_QUERY)))
+                       ((type == RAS_ERR_TYPE__CE || type == RAS_ERR_TYPE__DE) 
&&
+                        (bank_count >= MAX_CE_BANKS_PER_QUERY)))
                        return -EINVAL;
 
                *count = bank_count;
@@ -77,13 +100,11 @@ static int mp1_v13_0_get_bank_count(struct 
ras_core_context *ras_core,
 static int mp1_v13_0_dump_bank(struct ras_core_context *ras_core,
                        enum ras_err_type type, u32 idx, u64 *regs, u32 regs_sz)
 {
-       struct ras_mp1 *mp1 = &ras_core->ras_mp1;
-       const struct ras_mp1_sys_func *sys_func = mp1->sys_func;
        int i, ret, reg_cnt;
        u32 msg;
 
-       if (!sys_func || !sys_func->mp1_dump_valid_bank)
-               return -RAS_CORE_NOT_SUPPORTED;
+       if (!regs || !regs_sz || (idx > 0xffff))
+               return -EINVAL;
 
        switch (type) {
        case RAS_ERR_TYPE__UE:
@@ -99,7 +120,7 @@ static int mp1_v13_0_dump_bank(struct ras_core_context 
*ras_core,
 
        reg_cnt = min_t(int, 16, regs_sz);
        for (i = 0; i < reg_cnt; i++) {
-               ret = sys_func->mp1_dump_valid_bank(ras_core, msg, idx, i, 
&regs[i]);
+               ret = __dump_mp1_bank_reg64(ras_core, msg, idx, i, &regs[i]);
                if (ret)
                        return ret;
        }
diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mp1.c 
b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mp1.c
index baf5f156fc6f..8dd4b678e13a 100644
--- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mp1.c
+++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_mp1.c
@@ -26,6 +26,10 @@
 #include "ras.h"
 
 static const enum smu_message_type ras_smu_msg_maps[RAS_MP1_MSG_MAX] = {
+       [RAS_MP1_MSG_QueryValidMcaCount] = SMU_MSG_QueryValidMcaCount,
+       [RAS_MP1_MSG_McaBankDumpDW] = SMU_MSG_McaBankDumpDW,
+       [RAS_MP1_MSG_QueryValidMcaCeCount] = SMU_MSG_QueryValidMcaCeCount,
+       [RAS_MP1_MSG_McaBankCeDumpDW] = SMU_MSG_McaBankCeDumpDW,
        [RAS_MP1_MSG_GetRasTableVersion] = SMU_MSG_GetRASTableVersion,
        [RAS_MP1_MSG_GetBadPageCount] = SMU_MSG_GetBadPageCount,
        [RAS_MP1_MSG_GetBadPageMcaAddr] = SMU_MSG_GetBadPageMcaAddr,
-- 
2.43.0

Reply via email to