rasdaemon: cxl: Add Component Identifier formatting for CXL spec rev 3.1
authorShiju Jose <shiju.jose@huawei.com>
Mon, 11 Nov 2024 11:00:53 +0000 (11:00 +0000)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 10 Mar 2025 10:22:42 +0000 (11:22 +0100)
Add Component Identifier formatting for CXL spec rev 3.1, Section
8.2.9.2.1, Table 8-44.

Add helper function to print component ID, parse and log PLDM entity ID
and resource ID.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
ras-cxl-handler.c
ras-record.h

index e34c4641762751e530c8e3cbd442e785f6202db6..cdfb1bdf050e0ba5a26eeb1103a7c05fd305e96d 100644 (file)
@@ -574,6 +574,47 @@ int ras_cxl_overflow_event_handler(struct trace_seq *s,
        return 0;
 }
 
+/*
+ * Component ID Format
+ * CXL 3.1 section 8.2.9.2.1; Table 8-44
+ */
+#define CXL_PLDM_COMPONENT_ID_ENTITY_VALID     BIT(0)
+#define CXL_PLDM_COMPONENT_ID_RES_VALID                BIT(1)
+static const struct  cxl_event_flags cxl_pldm_comp_id_flags[] = {
+       { .bit = CXL_PLDM_COMPONENT_ID_ENTITY_VALID, .flag = "PLDM Entity ID" },
+       { .bit = CXL_PLDM_COMPONENT_ID_RES_VALID, .flag = "Resource ID" },
+};
+
+static int ras_cxl_print_component_id(struct trace_seq *s, uint8_t *comp_id,
+                                     uint8_t *entity_id, uint8_t *res_id)
+{
+       int i;
+
+       if (comp_id[0] & CXL_PLDM_COMPONENT_ID_ENTITY_VALID) {
+               if (trace_seq_printf(s, "PLDM Entity ID:") <= 0)
+                       return -1;
+               for (i = 1; i < 7; i++) {
+                       if (trace_seq_printf(s, "%02x ", comp_id[i]) <= 0)
+                               return -1;
+               }
+               if (entity_id)
+                       memcpy(entity_id, &comp_id[1], CXL_PLDM_ENTITY_ID_LEN);
+       }
+
+       if (comp_id[0] & CXL_PLDM_COMPONENT_ID_RES_VALID) {
+               if (trace_seq_printf(s, "Resource ID:") <= 0)
+                       return -1;
+               for (i = 7; i < 11; i++) {
+                       if (trace_seq_printf(s, "%02x ", comp_id[i]) <= 0)
+                               return -1;
+               }
+               if (res_id)
+                       memcpy(res_id, &comp_id[7], CXL_PLDM_RES_ID_LEN);
+       }
+
+       return 0;
+}
+
 /*
  * Common Event Record Format
  * CXL 3.1 section 8.2.9.2.1; Table 8-43
index 2a0124ad0e92ce8e27ea83a60546de81484555c5..a3a88eb9804f80bd4e2c53baab6faaa7cd0689b6 100644 (file)
@@ -137,6 +137,9 @@ struct ras_cxl_poison_event {
 #define CXL_EVENT_GEN_MED_COMP_ID_SIZE 0x10
 #define CXL_EVENT_DER_CORRECTION_MASK_SIZE     0x20
 
+#define CXL_PLDM_ENTITY_ID_LEN 6
+#define CXL_PLDM_RES_ID_LEN    4
+
 struct ras_cxl_aer_ue_event {
        char timestamp[64];
        const char *memdev;