[PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general media event record

shiju.jose--- via posted 7 patches 3 months, 3 weeks ago
Maintainers: Jonathan Cameron <jonathan.cameron@huawei.com>, Fan Ni <fan.ni@samsung.com>, Eric Blake <eblake@redhat.com>, Markus Armbruster <armbru@redhat.com>
There is a newer version of this series
[PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general media event record
Posted by shiju.jose--- via 3 months, 3 weeks ago
From: Shiju Jose <shiju.jose@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
4. Support for component ID in the PLDM format.

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: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
---
 hw/mem/cxl_type3.c          | 29 +++++++++++++++++++++++++++++
 hw/mem/cxl_type3_stubs.c    |  6 ++++++
 include/hw/cxl/cxl_events.h |  7 +++++--
 qapi/cxl.json               | 18 +++++++++++++++++-
 4 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c
index aa6e5c1a08..a10e6bf518 100644
--- a/hw/mem/cxl_type3.c
+++ b/hw/mem/cxl_type3.c
@@ -1646,6 +1646,11 @@ 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)
+
+#define CXL_GMER_EV_DESC_UCE                            BIT(0)
+#define CXL_GMER_EV_DESC_THRESHOLD_EVENT                BIT(1)
+#define CXL_GMER_EV_DESC_POISON_LIST_OVERFLOW_EVENT     BIT(2)
 
 static int ct3d_qmp_cxl_event_log_enc(CxlEventLog log)
 {
@@ -1677,6 +1682,12 @@ 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,
+                                        bool has_comp_id_pldm,
+                                        uint8_t is_comp_id_pldm,
+                                        bool has_cme_ev_flags,
+                                        uint8_t cme_ev_flags,
+                                        bool has_cme_count, uint32_t cme_count,
+                                        uint8_t sub_type,
                                         Error **errp)
 {
     Object *obj = object_resolve_path(path, NULL);
@@ -1737,10 +1748,28 @@ 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;
+        if (has_comp_id_pldm && is_comp_id_pldm) {
+            valid_flags |= CXL_GMER_VALID_COMPONENT_ID_FORMAT;
+        }
     }
 
     stw_le_p(&gem.validity_flags, valid_flags);
 
+    if (has_cme_ev_flags) {
+        gem.cme_ev_flags = cme_ev_flags;
+    } else {
+        gem.cme_ev_flags = 0;
+    }
+
+    if (has_cme_count) {
+        descriptor |= CXL_GMER_EV_DESC_THRESHOLD_EVENT;
+        st24_le_p(gem.cme_count, cme_count);
+    } else {
+        st24_le_p(gem.cme_count, 0);
+    }
+
+    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 91b1478114..28eb880b30 100644
--- a/hw/mem/cxl_type3_stubs.c
+++ b/hw/mem/cxl_type3_stubs.c
@@ -27,6 +27,12 @@ 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,
+                                        bool has_comp_id_pldm,
+                                        uint8_t is_comp_id_pldm,
+                                        bool has_cme_ev_flags,
+                                        uint8_t cme_ev_flags,
+                                        bool has_cme_count, uint32_t cme_count,
+                                        uint8_t sub_type,
                                         Error **errp) {}
 
 void qmp_cxl_inject_dram_event(const char *path, CxlEventLog log,
diff --git a/include/hw/cxl/cxl_events.h b/include/hw/cxl/cxl_events.h
index 4d9cfdb621..352f9891bd 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 c1fe8319c8..e8060d16f7 100644
--- a/qapi/cxl.json
+++ b/qapi/cxl.json
@@ -82,6 +82,19 @@
 # @component-id: Device specific component identifier for the event.
 #     May describe a field replaceable sub-component of the device.
 #
+# @is-comp-id-pldm: Flag represents device specific component identifier
+#     format is PLDM or not.
+#
+# @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 +104,10 @@
             'dpa': 'uint64', 'descriptor': 'uint8',
             'type': 'uint8', 'transaction-type': 'uint8',
             '*channel': 'uint8', '*rank': 'uint8',
-            '*device': 'uint32', '*component-id': 'str' } }
+            '*device': 'uint32', '*component-id': 'str',
+            '*is-comp-id-pldm':'uint8',
+            '*cme-ev-flags':'uint8', '*cme-count':'uint32',
+            'sub-type':'uint8' } }
 
 ##
 # @cxl-inject-dram-event:
-- 
2.43.0
Re: [PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general media event record
Posted by Markus Armbruster 3 months, 1 week ago
shiju.jose--- via <qemu-devel@nongnu.org> writes:

> From: Shiju Jose <shiju.jose@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
> 4. Support for component ID in the PLDM format.
>
> 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: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>

[...]

> diff --git a/qapi/cxl.json b/qapi/cxl.json
> index c1fe8319c8..e8060d16f7 100644
> --- a/qapi/cxl.json
> +++ b/qapi/cxl.json
> @@ -82,6 +82,19 @@
>  # @component-id: Device specific component identifier for the event.
>  #     May describe a field replaceable sub-component of the device.
>  #
> +# @is-comp-id-pldm: Flag represents device specific component identifier
> +#     format is PLDM or not.

Awkward phrasing.  Before I can suggest a better one, I have a question.
The type is uint8, which isn't a flag.  What are the possible values?

> +#
> +# @cme-ev-flags: Advanced programmable corrected memory error
> +#     threshold event flags.
> +#     See CXL r3.2 Table 8-57 General Media Event Record.

The line break will not make it into generated HTML (it's all one
wrapped paragraph).

We commonly wrap like this:

   # @cme-ev-flags: Advanced programmable corrected memory error
   #     threshold event flags.  See CXL r3.2 Table 8-57 General Media
   #     Event Record.

If you want a line break in generated documentation, you need to start a
new paragraph like this:

   # @cme-ev-flags: Advanced programmable corrected memory error
   #     threshold event flags.
   #
   #     See CXL r3.2 Table 8-57 General Media Event Record.

Same below.

> +#
> +# @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 +104,10 @@
>              'dpa': 'uint64', 'descriptor': 'uint8',
>              'type': 'uint8', 'transaction-type': 'uint8',
>              '*channel': 'uint8', '*rank': 'uint8',
> -            '*device': 'uint32', '*component-id': 'str' } }
> +            '*device': 'uint32', '*component-id': 'str',
> +            '*is-comp-id-pldm':'uint8',
> +            '*cme-ev-flags':'uint8', '*cme-count':'uint32',
> +            'sub-type':'uint8' } }
>  
>  ##
>  # @cxl-inject-dram-event:
RE: [PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general media event record
Posted by Shiju Jose via 3 months, 1 week ago
>-----Original Message-----
>From: Markus Armbruster <armbru@redhat.com>
>Sent: 06 August 2025 08:58
>To: shiju.jose--- via <qemu-devel@nongnu.org>
>Cc: linux-cxl@vger.kernel.org; Jonathan Cameron
><jonathan.cameron@huawei.com>; fan.ni@samsung.com; dave@stgolabs.net;
>Shiju Jose <shiju.jose@huawei.com>; Linuxarm <linuxarm@huawei.com>
>Subject: Re: [PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general
>media event record
>
>shiju.jose--- via <qemu-devel@nongnu.org> writes:
>
>> From: Shiju Jose <shiju.jose@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 4.
>> Support for component ID in the PLDM format.
>>
>> 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: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
>
>[...]
>
>> diff --git a/qapi/cxl.json b/qapi/cxl.json index
>> c1fe8319c8..e8060d16f7 100644
>> --- a/qapi/cxl.json
>> +++ b/qapi/cxl.json
>> @@ -82,6 +82,19 @@
>>  # @component-id: Device specific component identifier for the event.
>>  #     May describe a field replaceable sub-component of the device.
>>  #
>> +# @is-comp-id-pldm: Flag represents device specific component identifier
>> +#     format is PLDM or not.
>
>Awkward phrasing.  Before I can suggest a better one, I have a question.
>The type is uint8, which isn't a flag.  What are the possible values?
Thanks Markus for the comments.

'is-comp-id-pldm' is flag with possible values 0 and 1.
I will use type bool instead of uint8?
>
>> +#
>> +# @cme-ev-flags: Advanced programmable corrected memory error
>> +#     threshold event flags.
>> +#     See CXL r3.2 Table 8-57 General Media Event Record.
>
>The line break will not make it into generated HTML (it's all one wrapped
>paragraph).
>
>We commonly wrap like this:
Will fix.
>
>   # @cme-ev-flags: Advanced programmable corrected memory error
>   #     threshold event flags.  See CXL r3.2 Table 8-57 General Media
>   #     Event Record.
>
>If you want a line break in generated documentation, you need to start a new
>paragraph like this:
>
>   # @cme-ev-flags: Advanced programmable corrected memory error
>   #     threshold event flags.
>   #
>   #     See CXL r3.2 Table 8-57 General Media Event Record.
>
>Same below.
Will fix.
>
>> +#
>> +# @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 +104,10 @@
>>              'dpa': 'uint64', 'descriptor': 'uint8',
>>              'type': 'uint8', 'transaction-type': 'uint8',
>>              '*channel': 'uint8', '*rank': 'uint8',
>> -            '*device': 'uint32', '*component-id': 'str' } }
>> +            '*device': 'uint32', '*component-id': 'str',
>> +            '*is-comp-id-pldm':'uint8',
>> +            '*cme-ev-flags':'uint8', '*cme-count':'uint32',
>> +            'sub-type':'uint8' } }
>>
>>  ##
>>  # @cxl-inject-dram-event:
>

Thanks,
Shiju
Re: [PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general media event record
Posted by Markus Armbruster 3 months, 1 week ago
Shiju Jose <shiju.jose@huawei.com> writes:

>>-----Original Message-----
>>From: Markus Armbruster <armbru@redhat.com>
>>Sent: 06 August 2025 08:58
>>To: shiju.jose--- via <qemu-devel@nongnu.org>
>>Cc: linux-cxl@vger.kernel.org; Jonathan Cameron
>><jonathan.cameron@huawei.com>; fan.ni@samsung.com; dave@stgolabs.net;
>>Shiju Jose <shiju.jose@huawei.com>; Linuxarm <linuxarm@huawei.com>
>>Subject: Re: [PATCH qemu v4 2/7] hw/cxl/events: Updates for rev3.2 general
>>media event record
>>
>>shiju.jose--- via <qemu-devel@nongnu.org> writes:
>>
>>> From: Shiju Jose <shiju.jose@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 4.
>>> Support for component ID in the PLDM format.
>>>
>>> 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: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>>> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
>>
>>[...]
>>
>>> diff --git a/qapi/cxl.json b/qapi/cxl.json index
>>> c1fe8319c8..e8060d16f7 100644
>>> --- a/qapi/cxl.json
>>> +++ b/qapi/cxl.json
>>> @@ -82,6 +82,19 @@
>>>  # @component-id: Device specific component identifier for the event.
>>>  #     May describe a field replaceable sub-component of the device.
>>>  #
>>> +# @is-comp-id-pldm: Flag represents device specific component identifier
>>> +#     format is PLDM or not.
>>
>>Awkward phrasing.  Before I can suggest a better one, I have a question.
>>The type is uint8, which isn't a flag.  What are the possible values?
> Thanks Markus for the comments.

You're welcome!

> 'is-comp-id-pldm' is flag with possible values 0 and 1.
> I will use type bool instead of uint8?

Yes, please!

[...]