From: Shiju Jose <shiju.j...@huawei.com> CXL spec rev3.2 section 8.2.10.2.1.1 Table 8-57, general media event table has updated with following new fields. 1. Advanced Programmable Corrected Memory Error Threshold Event Flags 2. Corrected Memory Error Count at Event 3. Memory Event Sub-Type
Add updates for the above spec changes in the CXL general media event reporting and QMP command to inject general media event. Signed-off-by: Shiju Jose <shiju.j...@huawei.com> --- hw/mem/cxl_type3.c | 9 +++++++++ hw/mem/cxl_type3_stubs.c | 3 +++ include/hw/cxl/cxl_events.h | 7 +++++-- qapi/cxl.json | 14 +++++++++++++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index 841d04d925..14e146b74f 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -1716,6 +1716,7 @@ static const QemuUUID memory_module_uuid = { #define CXL_GMER_VALID_RANK BIT(1) #define CXL_GMER_VALID_DEVICE BIT(2) #define CXL_GMER_VALID_COMPONENT BIT(3) +#define CXL_GMER_VALID_COMPONENT_ID_FORMAT BIT(4) static int ct3d_qmp_cxl_event_log_enc(CxlEventLog log) { @@ -1743,6 +1744,9 @@ void qmp_cxl_inject_general_media_event(const char *path, CxlEventLog log, bool has_rank, uint8_t rank, bool has_device, uint32_t device, const char *component_id, + uint8_t cme_ev_flags, + uint32_t cme_count, + uint8_t sub_type, Error **errp) { Object *obj = object_resolve_path(path, NULL); @@ -1801,10 +1805,15 @@ void qmp_cxl_inject_general_media_event(const char *path, CxlEventLog log, strncpy((char *)gem.component_id, component_id, sizeof(gem.component_id) - 1); valid_flags |= CXL_GMER_VALID_COMPONENT; + valid_flags |= CXL_GMER_VALID_COMPONENT_ID_FORMAT; } stw_le_p(&gem.validity_flags, valid_flags); + gem.cme_ev_flags = cme_ev_flags; + st24_le_p(gem.cme_count, cme_count); + gem.sub_type = sub_type; + if (cxl_event_insert(cxlds, enc_log, (CXLEventRecordRaw *)&gem)) { cxl_event_irq_assert(ct3d); } diff --git a/hw/mem/cxl_type3_stubs.c b/hw/mem/cxl_type3_stubs.c index 9f95e4e6ec..63ef5763e1 100644 --- a/hw/mem/cxl_type3_stubs.c +++ b/hw/mem/cxl_type3_stubs.c @@ -23,6 +23,9 @@ void qmp_cxl_inject_general_media_event(const char *path, CxlEventLog log, bool has_rank, uint8_t rank, bool has_device, uint32_t device, const char *component_id, + uint8_t cme_ev_flags, + uint32_t cme_count, + uint8_t sub_type, Error **errp) {} void qmp_cxl_inject_dram_event(const char *path, CxlEventLog log, uint8_t flags, diff --git a/include/hw/cxl/cxl_events.h b/include/hw/cxl/cxl_events.h index 79a40f88bb..7542599534 100644 --- a/include/hw/cxl/cxl_events.h +++ b/include/hw/cxl/cxl_events.h @@ -115,10 +115,10 @@ typedef struct CXLEventInterruptPolicy { /* * General Media Event Record - * CXL r3.1 Section 8.2.9.2.1.1; Table 8-45 + * CXL r3.2 Section 8.2.10.2.1.1; Table 8-57 */ #define CXL_EVENT_GEN_MED_COMP_ID_SIZE 0x10 -#define CXL_EVENT_GEN_MED_RES_SIZE 0x2e +#define CXL_EVENT_GEN_MED_RES_SIZE 0x29 typedef struct CXLEventGenMedia { CXLEventRecordHdr hdr; uint64_t phys_addr; @@ -130,6 +130,9 @@ typedef struct CXLEventGenMedia { uint8_t rank; uint8_t device[3]; uint8_t component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE]; + uint8_t cme_ev_flags; + uint8_t cme_count[3]; + uint8_t sub_type; uint8_t reserved[CXL_EVENT_GEN_MED_RES_SIZE]; } QEMU_PACKED CXLEventGenMedia; diff --git a/qapi/cxl.json b/qapi/cxl.json index 2518d3d32a..6442d68113 100644 --- a/qapi/cxl.json +++ b/qapi/cxl.json @@ -82,6 +82,16 @@ # @component-id: Device specific component identifier for the event. # May describe a field replaceable sub-component of the device. # +# @cme-ev-flags: Advanced programmable corrected memory error +# threshold event flags. +# See CXL r3.2 Table 8-57 General Media Event Record. +# +# @cme-count: Corrected memory error count at event. +# See CXL r3.2 Table 8-57 General Media Event Record. +# +# @sub-type: Memory event sub-type. +# See CXL r3.2 Table 8-57 General Media Event Record. +# # Since: 8.1 ## { 'command': 'cxl-inject-general-media-event', @@ -91,7 +101,9 @@ 'dpa': 'uint64', 'descriptor': 'uint8', 'type': 'uint8', 'transaction-type': 'uint8', '*channel': 'uint8', '*rank': 'uint8', - '*device': 'uint32', '*component-id': 'str' } } + '*device': 'uint32', '*component-id': 'str', + 'cme-ev-flags':'uint8', 'cme-count':'uint32', + 'sub-type':'uint8' } } ## # @cxl-inject-dram-event: -- 2.43.0