[PATCH 008/109] drm/amd/ras: Add dedicated interface to obtain cper info
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
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