From: YiPeng Chai <[email protected]>

Add dedicated interface to obtain cper info.

Signed-off-by: YiPeng Chai <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/ras/core/cmd.c            | 12 ++----
 .../gpu/drm/amd/ras/ras_mgr/amdgpu_ras_cmd.c  | 38 +++++++++++++++++++
 2 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/core/cmd.c 
b/drivers/gpu/drm/amd/ras/core/cmd.c
index 6c37dc519eed5..35c53f47e4500 100644
--- a/drivers/gpu/drm/amd/ras/core/cmd.c
+++ b/drivers/gpu/drm/amd/ras/core/cmd.c
@@ -207,7 +207,7 @@ static int ras_cmd_get_cper_records(struct ras_core_context 
*ras_core,
        struct ras_log_batch_overview overview;
        uint32_t offset = 0, real_data_len = 0;
        uint64_t batch_id;
-       uint8_t *buffer = NULL;
+       uint8_t *buf_ptr = (uint8_t *)(uintptr_t)req->buf_ptr;
        int ret = 0, i, count;
 
        if ((cmd->input_size != sizeof(struct ras_cmd_cper_record_req)) ||
@@ -218,10 +218,6 @@ static int ras_cmd_get_cper_records(struct 
ras_core_context *ras_core,
            req->buf_size > RAS_CMD_MAX_CPER_BUF_SZ)
                return RAS_CMD__ERROR_INVALID_INPUT_DATA;
 
-       buffer = kzalloc(req->buf_size, GFP_KERNEL);
-       if (!buffer)
-               return RAS_CMD__ERROR_GENERIC;
-
        trace = kcalloc(trace_count, sizeof(*trace), GFP_KERNEL);
        if (!trace) {
                ret = RAS_CMD__ERROR_GENERIC;
@@ -238,7 +234,7 @@ static int ras_cmd_get_cper_records(struct ras_core_context 
*ras_core,
                                        trace_count);
                if (count > 0) {
                        ret = ras_cper_generate_cper(ras_core, trace, count,
-                                       &buffer[offset], req->buf_size - 
offset, &real_data_len);
+                                       &buf_ptr[offset], req->buf_size - 
offset, &real_data_len);
                        if (ret)
                                break;
 
@@ -246,8 +242,7 @@ static int ras_cmd_get_cper_records(struct ras_core_context 
*ras_core,
                }
        }
 
-       if ((ret && (ret != -ENOMEM)) ||
-               copy_to_user(u64_to_user_ptr(req->buf_ptr), buffer, offset)) {
+       if ((ret && (ret != -ENOMEM))) {
                ret = RAS_CMD__ERROR_GENERIC;
                goto out;
        }
@@ -262,7 +257,6 @@ static int ras_cmd_get_cper_records(struct ras_core_context 
*ras_core,
 
 out:
        kfree(trace);
-       kfree(buffer);
        return ret;
 }
 
diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_cmd.c 
b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_cmd.c
index f9ee297a67450..49a17b60bf80e 100644
--- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_cmd.c
+++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_ras_cmd.c
@@ -259,10 +259,48 @@ static int amdgpu_ras_translate_fb_address(struct 
ras_core_context *ras_core,
        return RAS_CMD__SUCCESS;
 }
 
+static int amdgpu_ras_get_cper_records(struct ras_core_context *ras_core,
+                       struct ras_cmd_ctx *cmd, void *data)
+{
+       struct ras_cmd_cper_record_req *req =
+               (struct ras_cmd_cper_record_req *)cmd->input_buff_raw;
+       uint64_t user_addr = 0;
+       uint8_t *buf_ptr = NULL;
+       int ret;
+
+       if (cmd->input_size != sizeof(struct ras_cmd_cper_record_req))
+               return RAS_CMD__ERROR_INVALID_INPUT_SIZE;
+
+       if (!req->buf_size || !req->buf_ptr || !req->cper_num)
+               return RAS_CMD__ERROR_INVALID_INPUT_DATA;
+
+       buf_ptr = kzalloc(req->buf_size, GFP_KERNEL);
+       if (!buf_ptr)
+               return RAS_CMD__ERROR_GENERIC;
+
+       user_addr = req->buf_ptr;
+       req->buf_ptr = (uintptr_t)buf_ptr;
+
+       ret = rascore_handle_cmd(ras_core, cmd, data);
+       if (ret) {
+               kfree(buf_ptr);
+               return ret;
+       }
+
+       if (copy_to_user((void __user *)(uintptr_t)user_addr, buf_ptr, 
req->buf_size))
+               ret = RAS_CMD__ERROR_GENERIC;
+
+       req->buf_ptr = user_addr;
+       kfree(buf_ptr);
+
+       return ret;
+}
+
 static struct ras_cmd_func_map amdgpu_ras_cmd_maps[] = {
        {RAS_CMD__INJECT_ERROR, amdgpu_ras_inject_error},
        {RAS_CMD__GET_SAFE_FB_ADDRESS_RANGES, 
amdgpu_ras_get_ras_safe_fb_addr_ranges},
        {RAS_CMD__TRANSLATE_FB_ADDRESS, amdgpu_ras_translate_fb_address},
+       {RAS_CMD__GET_CPER_RECORD, amdgpu_ras_get_cper_records},
 };
 
 int amdgpu_ras_handle_cmd(struct ras_core_context *ras_core, struct 
ras_cmd_ctx *cmd, void *data)
-- 
2.55.0

Reply via email to