From: YiPeng Chai <[email protected]>

Add interface and improve extensibility.

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/core.c     | 11 +++++++++++
 drivers/gpu/drm/amd/ras/core/log_ring.c | 17 +++++++++++++----
 drivers/gpu/drm/amd/ras/core/log_ring.h |  3 ++-
 drivers/gpu/drm/amd/ras/core/ras.h      |  2 ++
 4 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/ras/core/core.c 
b/drivers/gpu/drm/amd/ras/core/core.c
index d833e7de16d9e..b668c2cc1554e 100644
--- a/drivers/gpu/drm/amd/ras/core/core.c
+++ b/drivers/gpu/drm/amd/ras/core/core.c
@@ -848,3 +848,14 @@ int ras_core_get_module_param(struct ras_core_context 
*ras_core,
 
        return 0;
 }
+
+int ras_core_add_log_event(struct ras_core_context *ras_core,
+               uint32_t event, void *data, uint32_t data_sz)
+{
+       if (event >= RAS_LOG_EVENT_COUNT_MAX) {
+               RAS_DEV_ERR(ras_core->dev, "Invalid ras log event(0x%x)!\n", 
event);
+               return -EINVAL;
+       }
+
+       return ras_log_ring_add_log_event(ras_core, event, data, data_sz, NULL);
+}
diff --git a/drivers/gpu/drm/amd/ras/core/log_ring.c 
b/drivers/gpu/drm/amd/ras/core/log_ring.c
index 28cda7528e2bd..fb42449fbd6c4 100644
--- a/drivers/gpu/drm/amd/ras/core/log_ring.c
+++ b/drivers/gpu/drm/amd/ras/core/log_ring.c
@@ -222,7 +222,7 @@ void ras_log_ring_destroy_batch_tag(struct ras_core_context 
*ras_core,
        kfree(batch_tag);
 }
 
-void ras_log_ring_add_log_event(struct ras_core_context *ras_core,
+int ras_log_ring_add_log_event(struct ras_core_context *ras_core,
                enum ras_log_event event,
                void *data, uint32_t size, struct ras_log_batch_tag *batch_tag)
 {
@@ -232,6 +232,12 @@ void ras_log_ring_add_log_event(struct ras_core_context 
*ras_core,
        uint64_t socket_id;
        void *obj;
 
+       if (size > sizeof(union ras_log_body)) {
+               RAS_DEV_ERR(ras_core->dev,
+                       "Log event(0x%x) data size exceeded buffer!\n", event);
+               return -EINVAL;
+       }
+
        obj = mempool_alloc_preallocated(log_ring->ras_log_mempool);
        if (!obj ||
           (ras_log_ring_get_logged_ecc_count(ras_core) >= 
RAS_LOG_MEMPOOL_SIZE)) {
@@ -242,7 +248,7 @@ void ras_log_ring_add_log_event(struct ras_core_context 
*ras_core,
 
        if (!obj) {
                RAS_DEV_ERR(ras_core->dev, "ERROR: Failed to alloc ras log 
buffer!\n");
-               return;
+               return -ENOMEM;
        }
 
        log = (struct ras_log_info *)obj;
@@ -252,8 +258,10 @@ void ras_log_ring_add_log_event(struct ras_core_context 
*ras_core,
                batch_tag ? batch_tag->timestamp : ktime_get_real_ns();
        log->event = event;
 
-       if (data && size && size <= sizeof(log->body))
+       if (data && size && size <= sizeof(log->body)) {
                memcpy(&log->body, data, size);
+               log->size = size;
+       }
 
        if (event == RAS_LOG_EVENT_RMA) {
                memcpy(&log->body.aca_reg, ras_rma_aca_reg, 
sizeof(log->body.aca_reg));
@@ -261,9 +269,10 @@ void ras_log_ring_add_log_event(struct ras_core_context 
*ras_core,
                socket_id = dev_info.socket_id;
                log->body.aca_reg.regs[ACA_REG_IDX__IPID] |= ((socket_id / 4) & 
0x01);
                log->body.aca_reg.regs[ACA_REG_IDX__IPID] |= (((socket_id % 4) 
& 0x3) << 44);
+               log->size = sizeof(log->body.aca_reg);
        }
 
-       ras_log_ring_add_data(ras_core, log, batch_tag);
+       return ras_log_ring_add_data(ras_core, log, batch_tag);
 }
 
 static int ras_log_ring_lookup_data(struct ras_core_context *ras_core,
diff --git a/drivers/gpu/drm/amd/ras/core/log_ring.h 
b/drivers/gpu/drm/amd/ras/core/log_ring.h
index bcefd228aad3c..ed68664bf3c68 100644
--- a/drivers/gpu/drm/amd/ras/core/log_ring.h
+++ b/drivers/gpu/drm/amd/ras/core/log_ring.h
@@ -65,6 +65,7 @@ struct ras_log_info {
        uint64_t seqno;
        uint64_t timestamp;
        enum ras_log_event event;
+       uint32_t size;
        union ras_log_body body;
 };
 
@@ -97,7 +98,7 @@ int ras_log_ring_sw_fini(struct ras_core_context *ras_core);
 struct ras_log_batch_tag *ras_log_ring_create_batch_tag(struct 
ras_core_context *ras_core);
 void ras_log_ring_destroy_batch_tag(struct ras_core_context *ras_core,
                        struct ras_log_batch_tag *tag);
-void ras_log_ring_add_log_event(struct ras_core_context *ras_core,
+int ras_log_ring_add_log_event(struct ras_core_context *ras_core,
                enum ras_log_event event,
                void *data, uint32_t size, struct ras_log_batch_tag *batch_tag);
 
diff --git a/drivers/gpu/drm/amd/ras/core/ras.h 
b/drivers/gpu/drm/amd/ras/core/ras.h
index 464ad7381c5c0..6509bd798e48e 100644
--- a/drivers/gpu/drm/amd/ras/core/ras.h
+++ b/drivers/gpu/drm/amd/ras/core/ras.h
@@ -490,4 +490,6 @@ bool ras_core_early_init_service_enabled(struct 
ras_core_context *ras_core);
 int ras_core_eeprom_early_init_service(struct ras_core_context *ras_core);
 int ras_core_get_module_param(struct ras_core_context *ras_core,
                struct ras_module_param *param);
+int ras_core_add_log_event(struct ras_core_context *ras_core,
+               uint32_t event, void *data, uint32_t data_sz);
 #endif
-- 
2.55.0

Reply via email to