On Mon, Jan 19, 2026 at 3:18 AM Jonathan Cameron
<[email protected]> wrote:
>
> From: Shiju Jose <[email protected]>
>
> 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.
>
> Updated all references for this command to the CXL r3.2
> specification.
>
> Signed-off-by: Shiju Jose <[email protected]>
> Signed-off-by: Jonathan Cameron <[email protected]>
>
> ---
> v4: Update spec reference in the actual command as well (Markus)
> V3: Update spec references for whole command (Markus)
> ---
>  qapi/cxl.json               | 30 ++++++++++++++++++++----------
>  include/hw/cxl/cxl_events.h |  7 +++++--
>  hw/mem/cxl_type3.c          | 20 ++++++++++++++++++++
>  hw/mem/cxl_type3_stubs.c    |  4 ++++
>  4 files changed, 49 insertions(+), 12 deletions(-)
>
> diff --git a/qapi/cxl.json b/qapi/cxl.json
> index 1dc8b08ca301..81d6198ba030 100644
> --- a/qapi/cxl.json
> +++ b/qapi/cxl.json
> @@ -214,20 +214,20 @@
>  ##
>  # @CXLMemModuleEvent:
>  #
> -# Event record for a Memory Module Event (CXL r3.0 8.2.9.2.1.3).
> +# Event record for a Memory Module Event (CXL r3.2 8.2.10.2.1.3).
>  #
> -# @type: Device Event Type.  See CXL r3.0 Table 8-45 Memory Module
> +# @type: Device Event Type.  See CXL r3.2 Table 8-59 Memory Module
>  #     Event Record for bit definitions for bit definiions.
>  #
> -# @health-status: Overall health summary bitmap.  See CXL r3.0 Table
> -#     8-100 Get Health Info Output Payload, Health Status for bit
> +# @health-status: Overall health summary bitmap.  See CXL r3.2 Table
> +#     8-148 Get Health Info Output Payload, Health Status for bit
>  #     definitions.
>  #
> -# @media-status: Overall media health summary.  See CXL r3.0 Table
> -#     8-100 Get Health Info Output Payload, Media Status for bit
> +# @media-status: Overall media health summary.  See CXL r3.2 Table
> +#     8-148 Get Health Info Output Payload, Media Status for bit
>  #     definitions.
>  #
> -# @additional-status: See CXL r3.0 Table 8-100 Get Health Info Output
> +# @additional-status: See CXL r3.2 Table 8-148 Get Health Info Output
>  #     Payload, Additional Status for subfield definitions.
>  #
>  # @life-used: Percentage (0-100) of factory expected life span.
> @@ -243,6 +243,14 @@
>  # @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.
> +#
> +# @is-comp-id-pldm: This flag specifies whether the device-specific
> +#     component identifier format follows PLDM.
> +#
> +# @sub-type: Device event sub-type.
> +#
>  # Since: 8.1
>  ##
>  { 'struct': 'CXLMemModuleEvent',
> @@ -252,14 +260,16 @@
>              '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', '*is-comp-id-pldm':'bool',
> +            'sub-type':'uint8'
>              }}
>
>  ##
>  # @cxl-inject-memory-module-event:
>  #
> -# Inject an event record for a Memory Module Event (CXL r3.0
> -# 8.2.9.2.1.3).  This event includes a copy of the Device Health info
> +# Inject an event record for a Memory Module Event (CXL r3.2
> +# 8.2.10.2.1.3).  This event includes a copy of the Device Health info
>  # at the time of the event.
>  #
>  # Since: 8.1
> diff --git a/include/hw/cxl/cxl_events.h b/include/hw/cxl/cxl_events.h
> index a3c5f2ec20e6..4a7836ad7227 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

Minor Nitpick : Table reference in commit message should match code
reference of 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/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c
> index 3da538bafb64..4dc9b223f476 100644
> --- a/hw/mem/cxl_type3.c
> +++ b/hw/mem/cxl_type3.c
> @@ -1937,6 +1937,9 @@ void qmp_cxl_inject_dram_event(const char *path, 
> CxlEventLog log,
>      }
>  }
>
> +#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,
>                                          uint32_t flags, bool 
> has_maint_op_class,
>                                          uint8_t maint_op_class,
> @@ -1953,11 +1956,16 @@ 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,
> +                                        bool has_comp_id_pldm,
> +                                        bool is_comp_id_pldm,
> +                                        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;
> @@ -2000,6 +2008,18 @@ 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;
> +        if (has_comp_id_pldm && is_comp_id_pldm) {
> +            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 231dda263fa4..98292a931c16 100644
> --- a/hw/mem/cxl_type3_stubs.c
> +++ b/hw/mem/cxl_type3_stubs.c
> @@ -78,6 +78,10 @@ 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,
> +                                        bool has_comp_id_pldm,
> +                                        bool is_comp_id_pldm,
> +                                        uint8_t sub_type,
>                                          Error **errp) {}
>
>  void qmp_cxl_inject_poison(const char *path, uint64_t start, uint64_t length,
> --
> 2.48.1
>
>

Reply via email to