@@ -214,12 +214,16 @@ TRACE_EVENT(cxl_overflow,
214
214
#define CXL_EVENT_RECORD_FLAG_PERF_DEGRADED BIT(4)
215
215
#define CXL_EVENT_RECORD_FLAG_HW_REPLACE BIT(5)
216
216
#define CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID BIT(6)
217
+ #define CXL_EVENT_RECORD_FLAG_LD_ID_VALID BIT(7)
218
+ #define CXL_EVENT_RECORD_FLAG_HEAD_ID_VALID BIT(8)
217
219
#define show_hdr_flags (flags ) __print_flags(flags, " | ", \
218
220
{ CXL_EVENT_RECORD_FLAG_PERMANENT, "PERMANENT_CONDITION" }, \
219
221
{ CXL_EVENT_RECORD_FLAG_MAINT_NEEDED, "MAINTENANCE_NEEDED" }, \
220
222
{ CXL_EVENT_RECORD_FLAG_PERF_DEGRADED, "PERFORMANCE_DEGRADED" }, \
221
223
{ CXL_EVENT_RECORD_FLAG_HW_REPLACE, "HARDWARE_REPLACEMENT_NEEDED" }, \
222
- { CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID, "MAINT_OP_SUB_CLASS_VALID" } \
224
+ { CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID, "MAINT_OP_SUB_CLASS_VALID" }, \
225
+ { CXL_EVENT_RECORD_FLAG_LD_ID_VALID, "LD_ID_VALID" }, \
226
+ { CXL_EVENT_RECORD_FLAG_HEAD_ID_VALID, "HEAD_ID_VALID" } \
223
227
)
224
228
225
229
/*
@@ -247,7 +251,9 @@ TRACE_EVENT(cxl_overflow,
247
251
__field(u64, hdr_timestamp) \
248
252
__field(u8, hdr_length) \
249
253
__field(u8, hdr_maint_op_class) \
250
- __field(u8, hdr_maint_op_sub_class)
254
+ __field(u8, hdr_maint_op_sub_class) \
255
+ __field(u16, hdr_ld_id) \
256
+ __field(u8, hdr_head_id)
251
257
252
258
#define CXL_EVT_TP_fast_assign (cxlmd , l , hdr ) \
253
259
__assign_str(memdev); \
@@ -260,18 +266,22 @@ TRACE_EVENT(cxl_overflow,
260
266
__entry->hdr_related_handle = le16_to_cpu((hdr).related_handle); \
261
267
__entry->hdr_timestamp = le64_to_cpu((hdr).timestamp); \
262
268
__entry->hdr_maint_op_class = (hdr).maint_op_class; \
263
- __entry->hdr_maint_op_sub_class = (hdr).maint_op_sub_class
269
+ __entry->hdr_maint_op_sub_class = (hdr).maint_op_sub_class; \
270
+ __entry->hdr_ld_id = le16_to_cpu((hdr).ld_id); \
271
+ __entry->hdr_head_id = (hdr).head_id
264
272
265
273
#define CXL_EVT_TP_printk (fmt , ...) \
266
274
TP_printk("memdev=%s host=%s serial=%lld log=%s : time=%llu uuid=%pUb " \
267
275
"len=%d flags='%s' handle=%x related_handle=%x " \
268
- "maint_op_class=%u maint_op_sub_class=%u : " fmt, \
276
+ "maint_op_class=%u maint_op_sub_class=%u " \
277
+ "ld_id=%x head_id=%x : " fmt, \
269
278
__get_str(memdev), __get_str(host), __entry->serial, \
270
279
cxl_event_log_type_str(__entry->log), \
271
280
__entry->hdr_timestamp, &__entry->hdr_uuid, __entry->hdr_length,\
272
281
show_hdr_flags(__entry->hdr_flags), __entry->hdr_handle, \
273
282
__entry->hdr_related_handle, __entry->hdr_maint_op_class, \
274
283
__entry->hdr_maint_op_sub_class, \
284
+ __entry->hdr_ld_id, __entry->hdr_head_id, \
275
285
##__VA_ARGS__)
276
286
277
287
TRACE_EVENT (cxl_generic_event ,
@@ -496,7 +506,10 @@ TRACE_EVENT(cxl_general_media,
496
506
uuid_copy (& __entry -> region_uuid , & uuid_null );
497
507
}
498
508
__entry -> cme_threshold_ev_flags = rec -> cme_threshold_ev_flags ;
499
- __entry -> cme_count = get_unaligned_le24 (rec -> cme_count );
509
+ if (rec -> media_hdr .descriptor & CXL_GMER_EVT_DESC_THRESHOLD_EVENT )
510
+ __entry -> cme_count = get_unaligned_le24 (rec -> cme_count );
511
+ else
512
+ __entry -> cme_count = 0 ;
500
513
),
501
514
502
515
CXL_EVT_TP_printk ("dpa=%llx dpa_flags='%s' " \
@@ -648,7 +661,10 @@ TRACE_EVENT(cxl_dram,
648
661
CXL_EVENT_GEN_MED_COMP_ID_SIZE );
649
662
__entry -> sub_channel = rec -> sub_channel ;
650
663
__entry -> cme_threshold_ev_flags = rec -> cme_threshold_ev_flags ;
651
- __entry -> cvme_count = get_unaligned_le24 (rec -> cvme_count );
664
+ if (rec -> media_hdr .descriptor & CXL_GMER_EVT_DESC_THRESHOLD_EVENT )
665
+ __entry -> cvme_count = get_unaligned_le24 (rec -> cvme_count );
666
+ else
667
+ __entry -> cvme_count = 0 ;
652
668
),
653
669
654
670
CXL_EVT_TP_printk ("dpa=%llx dpa_flags='%s' descriptor='%s' type='%s' sub_type='%s' " \
@@ -871,6 +887,111 @@ TRACE_EVENT(cxl_memory_module,
871
887
)
872
888
);
873
889
890
+ /*
891
+ * Memory Sparing Event Record - MSER
892
+ *
893
+ * CXL rev 3.2 section 8.2.10.2.1.4; Table 8-60
894
+ */
895
+ #define CXL_MSER_QUERY_RESOURCE_FLAG BIT(0)
896
+ #define CXL_MSER_HARD_SPARING_FLAG BIT(1)
897
+ #define CXL_MSER_DEV_INITED_FLAG BIT(2)
898
+ #define show_mem_sparing_flags (flags ) __print_flags(flags, "|", \
899
+ { CXL_MSER_QUERY_RESOURCE_FLAG, "Query Resources" }, \
900
+ { CXL_MSER_HARD_SPARING_FLAG, "Hard Sparing" }, \
901
+ { CXL_MSER_DEV_INITED_FLAG, "Device Initiated Sparing" } \
902
+ )
903
+
904
+ #define CXL_MSER_VALID_CHANNEL BIT(0)
905
+ #define CXL_MSER_VALID_RANK BIT(1)
906
+ #define CXL_MSER_VALID_NIBBLE BIT(2)
907
+ #define CXL_MSER_VALID_BANK_GROUP BIT(3)
908
+ #define CXL_MSER_VALID_BANK BIT(4)
909
+ #define CXL_MSER_VALID_ROW BIT(5)
910
+ #define CXL_MSER_VALID_COLUMN BIT(6)
911
+ #define CXL_MSER_VALID_COMPONENT_ID BIT(7)
912
+ #define CXL_MSER_VALID_COMPONENT_ID_FORMAT BIT(8)
913
+ #define CXL_MSER_VALID_SUB_CHANNEL BIT(9)
914
+ #define show_mem_sparing_valid_flags (flags ) __print_flags(flags, "|", \
915
+ { CXL_MSER_VALID_CHANNEL, "CHANNEL" }, \
916
+ { CXL_MSER_VALID_RANK, "RANK" }, \
917
+ { CXL_MSER_VALID_NIBBLE, "NIBBLE" }, \
918
+ { CXL_MSER_VALID_BANK_GROUP, "BANK GROUP" }, \
919
+ { CXL_MSER_VALID_BANK, "BANK" }, \
920
+ { CXL_MSER_VALID_ROW, "ROW" }, \
921
+ { CXL_MSER_VALID_COLUMN, "COLUMN" }, \
922
+ { CXL_MSER_VALID_COMPONENT_ID, "COMPONENT ID" }, \
923
+ { CXL_MSER_VALID_COMPONENT_ID_FORMAT, "COMPONENT ID PLDM FORMAT" }, \
924
+ { CXL_MSER_VALID_SUB_CHANNEL, "SUB CHANNEL" } \
925
+ )
926
+
927
+ TRACE_EVENT (cxl_memory_sparing ,
928
+
929
+ TP_PROTO (const struct cxl_memdev * cxlmd , enum cxl_event_log_type log ,
930
+ struct cxl_event_mem_sparing * rec ),
931
+
932
+ TP_ARGS (cxlmd , log , rec ),
933
+
934
+ TP_STRUCT__entry (
935
+ CXL_EVT_TP_entry
936
+
937
+ /* Memory Sparing Event */
938
+ __field (u8 , flags )
939
+ __field (u8 , result )
940
+ __field (u16 , validity_flags )
941
+ __field (u16 , res_avail )
942
+ __field (u8 , channel )
943
+ __field (u8 , rank )
944
+ __field (u32 , nibble_mask )
945
+ __field (u8 , bank_group )
946
+ __field (u8 , bank )
947
+ __field (u32 , row )
948
+ __field (u16 , column )
949
+ __field (u8 , sub_channel )
950
+ __array (u8 , comp_id , CXL_EVENT_GEN_MED_COMP_ID_SIZE )
951
+ ),
952
+
953
+ TP_fast_assign (
954
+ CXL_EVT_TP_fast_assign (cxlmd , log , rec -> hdr );
955
+ __entry -> hdr_uuid = CXL_EVENT_MEM_SPARING_UUID ;
956
+
957
+ /* Memory Sparing Event */
958
+ __entry -> flags = rec -> flags ;
959
+ __entry -> result = rec -> result ;
960
+ __entry -> validity_flags = le16_to_cpu (rec -> validity_flags );
961
+ __entry -> res_avail = le16_to_cpu (rec -> res_avail );
962
+ __entry -> channel = rec -> channel ;
963
+ __entry -> rank = rec -> rank ;
964
+ __entry -> nibble_mask = get_unaligned_le24 (rec -> nibble_mask );
965
+ __entry -> bank_group = rec -> bank_group ;
966
+ __entry -> bank = rec -> bank ;
967
+ __entry -> row = get_unaligned_le24 (rec -> row );
968
+ __entry -> column = le16_to_cpu (rec -> column );
969
+ __entry -> sub_channel = rec -> sub_channel ;
970
+ memcpy (__entry -> comp_id , & rec -> component_id ,
971
+ CXL_EVENT_GEN_MED_COMP_ID_SIZE );
972
+ ),
973
+
974
+ CXL_EVT_TP_printk ("flags='%s' result=%u validity_flags='%s' " \
975
+ "spare resource avail=%u channel=%u rank=%u " \
976
+ "nibble_mask=%x bank_group=%u bank=%u " \
977
+ "row=%u column=%u sub_channel=%u " \
978
+ "comp_id=%s comp_id_pldm_valid_flags='%s' " \
979
+ "pldm_entity_id=%s pldm_resource_id=%s" ,
980
+ show_mem_sparing_flags (__entry -> flags ),
981
+ __entry -> result ,
982
+ show_mem_sparing_valid_flags (__entry -> validity_flags ),
983
+ __entry -> res_avail , __entry -> channel , __entry -> rank ,
984
+ __entry -> nibble_mask , __entry -> bank_group , __entry -> bank ,
985
+ __entry -> row , __entry -> column , __entry -> sub_channel ,
986
+ __print_hex (__entry -> comp_id , CXL_EVENT_GEN_MED_COMP_ID_SIZE ),
987
+ show_comp_id_pldm_flags (__entry -> comp_id [0 ]),
988
+ show_pldm_entity_id (__entry -> validity_flags , CXL_MSER_VALID_COMPONENT_ID ,
989
+ CXL_MSER_VALID_COMPONENT_ID_FORMAT , __entry -> comp_id ),
990
+ show_pldm_resource_id (__entry -> validity_flags , CXL_MSER_VALID_COMPONENT_ID ,
991
+ CXL_MSER_VALID_COMPONENT_ID_FORMAT , __entry -> comp_id )
992
+ )
993
+ );
994
+
874
995
#define show_poison_trace_type (type ) \
875
996
__print_symbolic(type, \
876
997
{ CXL_POISON_TRACE_LIST, "List" }, \
0 commit comments