From: Shiju Jose <shiju.j...@huawei.com> CXL spec rev3.2 section 8.2.10.2.1.3 Table 8-50, memory module event record has updated with following new fields. 1. Validity Flags 2. Component Identifier 3. Device Event Sub-Type
Add updates for the above spec changes in the CXL memory module event reporting and QMP command to inject memory module event. Signed-off-by: Shiju Jose <shiju.j...@huawei.com> --- hw/mem/cxl_type3.c | 16 ++++++++++++++++ hw/mem/cxl_type3_stubs.c | 2 ++ include/hw/cxl/cxl_events.h | 7 +++++-- qapi/cxl.json | 10 +++++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index 7e1690d4b8..ca61e7c34a 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -1958,6 +1958,9 @@ void qmp_cxl_inject_dram_event(const char *path, CxlEventLog log, uint8_t flags, return; } +#define CXL_MMER_VALID_COMPONENT BIT(0) +#define CXL_MMER_VALID_COMPONENT_ID_FORMAT BIT(1) + void qmp_cxl_inject_memory_module_event(const char *path, CxlEventLog log, uint8_t flags, uint8_t class, uint8_t subclass, uint16_t ld_id, @@ -1970,11 +1973,14 @@ void qmp_cxl_inject_memory_module_event(const char *path, CxlEventLog log, uint32_t dirty_shutdown_count, uint32_t corrected_volatile_error_count, uint32_t corrected_persist_error_count, + const char *component_id, + uint8_t sub_type, Error **errp) { Object *obj = object_resolve_path(path, NULL); CXLEventMemoryModule module; CXLEventRecordHdr *hdr = &module.hdr; + uint16_t valid_flags = 0; CXLDeviceState *cxlds; CXLType3Dev *ct3d; uint8_t enc_log; @@ -2015,6 +2021,16 @@ void qmp_cxl_inject_memory_module_event(const char *path, CxlEventLog log, stl_le_p(&module.corrected_persistent_error_count, corrected_persist_error_count); + if (component_id) { + strncpy((char *)module.component_id, component_id, + sizeof(module.component_id) - 1); + valid_flags |= CXL_MMER_VALID_COMPONENT; + valid_flags |= CXL_MMER_VALID_COMPONENT_ID_FORMAT; + } + module.sub_type = sub_type; + + stw_le_p(&module.validity_flags, valid_flags); + if (cxl_event_insert(cxlds, enc_log, (CXLEventRecordRaw *)&module)) { cxl_event_irq_assert(ct3d); } diff --git a/hw/mem/cxl_type3_stubs.c b/hw/mem/cxl_type3_stubs.c index 911133ad22..bbe0661f1d 100644 --- a/hw/mem/cxl_type3_stubs.c +++ b/hw/mem/cxl_type3_stubs.c @@ -61,6 +61,8 @@ void qmp_cxl_inject_memory_module_event(const char *path, CxlEventLog log, uint32_t dirty_shutdown_count, uint32_t corrected_volatile_error_count, uint32_t corrected_persist_error_count, + const char *component_id, + uint8_t sub_type, Error **errp) {} void qmp_cxl_inject_poison(const char *path, uint64_t start, uint64_t length, diff --git a/include/hw/cxl/cxl_events.h b/include/hw/cxl/cxl_events.h index 2d883d106c..4f730440bf 100644 --- a/include/hw/cxl/cxl_events.h +++ b/include/hw/cxl/cxl_events.h @@ -166,7 +166,7 @@ typedef struct CXLEventDram { /* * Memory Module Event Record - * CXL r3.1 Section 8.2.9.2.1.3: Table 8-47 + * CXL r3.2 Section 8.2.10.2.1.3: Table 8-59 * All fields little endian. */ typedef struct CXLEventMemoryModule { @@ -180,7 +180,10 @@ typedef struct CXLEventMemoryModule { uint32_t dirty_shutdown_count; uint32_t corrected_volatile_error_count; uint32_t corrected_persistent_error_count; - uint8_t reserved[0x3d]; + uint16_t validity_flags; + uint8_t component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE]; + uint8_t sub_type; + uint8_t reserved[0x2a]; } QEMU_PACKED CXLEventMemoryModule; /* diff --git a/qapi/cxl.json b/qapi/cxl.json index 6b82a909d9..9aafe7c795 100644 --- a/qapi/cxl.json +++ b/qapi/cxl.json @@ -253,6 +253,13 @@ # @corrected-persistent-error-count: Total number of correctable # errors in persistent memory # +# @component-id: Device specific component identifier for the event. +# May describe a field replaceable sub-component of the device. +# See CXL r3.2 Table 8-59 Memory Module Event Record. +# +# @sub-type: Device event sub-type. +# See CXL r3.2 Table 8-59 Memory Module Event Record. +# # Since: 8.1 ## { 'command': 'cxl-inject-memory-module-event', @@ -264,7 +271,8 @@ 'life-used': 'uint8', 'temperature' : 'int16', 'dirty-shutdown-count': 'uint32', 'corrected-volatile-error-count': 'uint32', - 'corrected-persistent-error-count': 'uint32' + 'corrected-persistent-error-count': 'uint32', + '*component-id': 'str', 'sub-type':'uint8' }} ## -- 2.43.0