]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cxl/events: Create a CXL event union
authorIra Weiny <ira.weiny@intel.com>
Thu, 21 Dec 2023 00:17:33 +0000 (16:17 -0800)
committerDan Williams <dan.j.williams@intel.com>
Tue, 9 Jan 2024 23:41:22 +0000 (15:41 -0800)
The CXL CPER and event log records share everything but a UUID/GUID in
their structures.

Define a cxl_event union without the UUID/GUID to be shared between the
CPER and event log record formats.  Adjust the code to use this union.

Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Link: https://lore.kernel.org/r/20231220-cxl-cper-v5-6-1bb8a4ca2c7a@intel.com
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/mbox.c
drivers/cxl/core/trace.h
include/linux/cxl-event.h
tools/testing/cxl/test/mem.c

index 4c516189682644a5c5b10592f344a64f146a32bd..06957696247bdd3924558f4383b1170f32f5d956 100644 (file)
@@ -840,26 +840,17 @@ static void cxl_event_trace_record(const struct cxl_memdev *cxlmd,
                                   enum cxl_event_log_type type,
                                   struct cxl_event_record_raw *record)
 {
+       union cxl_event *evt = &record->event;
        uuid_t *id = &record->id;
 
-       if (uuid_equal(id, &CXL_EVENT_GEN_MEDIA_UUID)) {
-               struct cxl_event_gen_media *rec =
-                               (struct cxl_event_gen_media *)record;
-
-               trace_cxl_general_media(cxlmd, type, rec);
-       } else if (uuid_equal(id, &CXL_EVENT_DRAM_UUID)) {
-               struct cxl_event_dram *rec = (struct cxl_event_dram *)record;
-
-               trace_cxl_dram(cxlmd, type, rec);
-       } else if (uuid_equal(id, &CXL_EVENT_MEM_MODULE_UUID)) {
-               struct cxl_event_mem_module *rec =
-                               (struct cxl_event_mem_module *)record;
-
-               trace_cxl_memory_module(cxlmd, type, rec);
-       } else {
-               /* For unknown record types print just the header */
-               trace_cxl_generic_event(cxlmd, type, id, record);
-       }
+       if (uuid_equal(id, &CXL_EVENT_GEN_MEDIA_UUID))
+               trace_cxl_general_media(cxlmd, type, &evt->gen_media);
+       else if (uuid_equal(id, &CXL_EVENT_DRAM_UUID))
+               trace_cxl_dram(cxlmd, type, &evt->dram);
+       else if (uuid_equal(id, &CXL_EVENT_MEM_MODULE_UUID))
+               trace_cxl_memory_module(cxlmd, type, &evt->mem_module);
+       else
+               trace_cxl_generic_event(cxlmd, type, id, &evt->generic);
 }
 
 static int cxl_clear_event_record(struct cxl_memdev_state *mds,
@@ -902,7 +893,10 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
         */
        i = 0;
        for (cnt = 0; cnt < total; cnt++) {
-               payload->handles[i++] = get_pl->records[cnt].hdr.handle;
+               struct cxl_event_record_raw *raw = &get_pl->records[cnt];
+               struct cxl_event_generic *gen = &raw->event.generic;
+
+               payload->handles[i++] = gen->hdr.handle;
                dev_dbg(mds->cxlds.dev, "Event log '%d': Clearing %u\n", log,
                        le16_to_cpu(payload->handles[i]));
 
index 312cfa9e00045a9fb29080217d90af8931874312..89445435303aac4d043c964a0ada866548889917 100644 (file)
@@ -225,9 +225,9 @@ TRACE_EVENT(cxl_overflow,
 TRACE_EVENT(cxl_generic_event,
 
        TP_PROTO(const struct cxl_memdev *cxlmd, enum cxl_event_log_type log,
-                const uuid_t *uuid, struct cxl_event_record_raw *rec),
+                const uuid_t *uuid, struct cxl_event_generic *gen_rec),
 
-       TP_ARGS(cxlmd, log, uuid, rec),
+       TP_ARGS(cxlmd, log, uuid, gen_rec),
 
        TP_STRUCT__entry(
                CXL_EVT_TP_entry
@@ -235,9 +235,9 @@ TRACE_EVENT(cxl_generic_event,
        ),
 
        TP_fast_assign(
-               CXL_EVT_TP_fast_assign(cxlmd, log, rec->hdr);
+               CXL_EVT_TP_fast_assign(cxlmd, log, gen_rec->hdr);
                memcpy(&__entry->hdr_uuid, uuid, sizeof(uuid_t));
-               memcpy(__entry->data, &rec->data, CXL_EVENT_RECORD_DATA_LENGTH);
+               memcpy(__entry->data, gen_rec->data, CXL_EVENT_RECORD_DATA_LENGTH);
        ),
 
        CXL_EVT_TP_printk("%s",
index 3d9b5954d0c11c459262132abb77f234331408d7..4d6c05f535f80ad7b5a08329326987b253789019 100644 (file)
@@ -17,13 +17,8 @@ struct cxl_event_record_hdr {
        u8 reserved[15];
 } __packed;
 
-/*
- * Common Event Record Format
- * CXL rev 3.0 section 8.2.9.2.1; Table 8-42
- */
 #define CXL_EVENT_RECORD_DATA_LENGTH 0x50
-struct cxl_event_record_raw {
-       uuid_t id;
+struct cxl_event_generic {
        struct cxl_event_record_hdr hdr;
        u8 data[CXL_EVENT_RECORD_DATA_LENGTH];
 } __packed;
@@ -96,4 +91,20 @@ struct cxl_event_mem_module {
        u8 reserved[0x3d];
 } __packed;
 
+union cxl_event {
+       struct cxl_event_generic generic;
+       struct cxl_event_gen_media gen_media;
+       struct cxl_event_dram dram;
+       struct cxl_event_mem_module mem_module;
+} __packed;
+
+/*
+ * Common Event Record Format; in event logs
+ * CXL rev 3.0 section 8.2.9.2.1; Table 8-42
+ */
+struct cxl_event_record_raw {
+       uuid_t id;
+       union cxl_event event;
+} __packed;
+
 #endif /* _LINUX_CXL_EVENT_H */
index 9cc2b8ce1efd098fdf10980168409c99827411c2..35ee41e435ab3a531187b57fd0ea8f2291a8435d 100644 (file)
@@ -251,7 +251,8 @@ static int mock_get_event(struct device *dev, struct cxl_mbox_cmd *cmd)
        for (i = 0; i < CXL_TEST_EVENT_CNT && !event_log_empty(log); i++) {
                memcpy(&pl->records[i], event_get_current(log),
                       sizeof(pl->records[i]));
-               pl->records[i].hdr.handle = event_get_cur_event_handle(log);
+               pl->records[i].event.generic.hdr.handle =
+                               event_get_cur_event_handle(log);
                log->cur_idx++;
        }
 
@@ -339,25 +340,29 @@ static void cxl_mock_event_trigger(struct device *dev)
 struct cxl_event_record_raw maint_needed = {
        .id = UUID_INIT(0xBA5EBA11, 0xABCD, 0xEFEB,
                        0xa5, 0x5a, 0xa5, 0x5a, 0xa5, 0xa5, 0x5a, 0xa5),
-       .hdr = {
-               .length = sizeof(struct cxl_event_record_raw),
-               .flags[0] = CXL_EVENT_RECORD_FLAG_MAINT_NEEDED,
-               /* .handle = Set dynamically */
-               .related_handle = cpu_to_le16(0xa5b6),
+       .event.generic = {
+               .hdr = {
+                       .length = sizeof(struct cxl_event_record_raw),
+                       .flags[0] = CXL_EVENT_RECORD_FLAG_MAINT_NEEDED,
+                       /* .handle = Set dynamically */
+                       .related_handle = cpu_to_le16(0xa5b6),
+               },
+               .data = { 0xDE, 0xAD, 0xBE, 0xEF },
        },
-       .data = { 0xDE, 0xAD, 0xBE, 0xEF },
 };
 
 struct cxl_event_record_raw hardware_replace = {
        .id = UUID_INIT(0xABCDEFEB, 0xBA11, 0xBA5E,
                        0xa5, 0x5a, 0xa5, 0x5a, 0xa5, 0xa5, 0x5a, 0xa5),
-       .hdr = {
-               .length = sizeof(struct cxl_event_record_raw),
-               .flags[0] = CXL_EVENT_RECORD_FLAG_HW_REPLACE,
-               /* .handle = Set dynamically */
-               .related_handle = cpu_to_le16(0xb6a5),
+       .event.generic = {
+               .hdr = {
+                       .length = sizeof(struct cxl_event_record_raw),
+                       .flags[0] = CXL_EVENT_RECORD_FLAG_HW_REPLACE,
+                       /* .handle = Set dynamically */
+                       .related_handle = cpu_to_le16(0xb6a5),
+               },
+               .data = { 0xDE, 0xAD, 0xBE, 0xEF },
        },
-       .data = { 0xDE, 0xAD, 0xBE, 0xEF },
 };
 
 struct cxl_test_gen_media {