@@ -222,6 +222,130 @@ TRACE_EVENT(cxl_generic_event,
222222 __print_hex (__entry -> data , CXL_EVENT_RECORD_DATA_LENGTH ))
223223);
224224
225+ /*
226+ * Physical Address field masks
227+ *
228+ * General Media Event Record
229+ * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
230+ *
231+ * DRAM Event Record
232+ * CXL rev 3.0 section 8.2.9.2.1.2; Table 8-44
233+ */
234+ #define CXL_DPA_FLAGS_MASK 0x3F
235+ #define CXL_DPA_MASK (~CXL_DPA_FLAGS_MASK)
236+
237+ #define CXL_DPA_VOLATILE BIT(0)
238+ #define CXL_DPA_NOT_REPAIRABLE BIT(1)
239+ #define show_dpa_flags (flags ) __print_flags(flags, "|", \
240+ { CXL_DPA_VOLATILE, "VOLATILE" }, \
241+ { CXL_DPA_NOT_REPAIRABLE, "NOT_REPAIRABLE" } \
242+ )
243+
244+ /*
245+ * General Media Event Record - GMER
246+ * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
247+ */
248+ #define CXL_GMER_EVT_DESC_UNCORECTABLE_EVENT BIT(0)
249+ #define CXL_GMER_EVT_DESC_THRESHOLD_EVENT BIT(1)
250+ #define CXL_GMER_EVT_DESC_POISON_LIST_OVERFLOW BIT(2)
251+ #define show_event_desc_flags (flags ) __print_flags(flags, "|", \
252+ { CXL_GMER_EVT_DESC_UNCORECTABLE_EVENT, "UNCORRECTABLE_EVENT" }, \
253+ { CXL_GMER_EVT_DESC_THRESHOLD_EVENT, "THRESHOLD_EVENT" }, \
254+ { CXL_GMER_EVT_DESC_POISON_LIST_OVERFLOW, "POISON_LIST_OVERFLOW" } \
255+ )
256+
257+ #define CXL_GMER_MEM_EVT_TYPE_ECC_ERROR 0x00
258+ #define CXL_GMER_MEM_EVT_TYPE_INV_ADDR 0x01
259+ #define CXL_GMER_MEM_EVT_TYPE_DATA_PATH_ERROR 0x02
260+ #define show_mem_event_type (type ) __print_symbolic(type, \
261+ { CXL_GMER_MEM_EVT_TYPE_ECC_ERROR, "ECC Error" }, \
262+ { CXL_GMER_MEM_EVT_TYPE_INV_ADDR, "Invalid Address" }, \
263+ { CXL_GMER_MEM_EVT_TYPE_DATA_PATH_ERROR, "Data Path Error" } \
264+ )
265+
266+ #define CXL_GMER_TRANS_UNKNOWN 0x00
267+ #define CXL_GMER_TRANS_HOST_READ 0x01
268+ #define CXL_GMER_TRANS_HOST_WRITE 0x02
269+ #define CXL_GMER_TRANS_HOST_SCAN_MEDIA 0x03
270+ #define CXL_GMER_TRANS_HOST_INJECT_POISON 0x04
271+ #define CXL_GMER_TRANS_INTERNAL_MEDIA_SCRUB 0x05
272+ #define CXL_GMER_TRANS_INTERNAL_MEDIA_MANAGEMENT 0x06
273+ #define show_trans_type (type ) __print_symbolic(type, \
274+ { CXL_GMER_TRANS_UNKNOWN, "Unknown" }, \
275+ { CXL_GMER_TRANS_HOST_READ, "Host Read" }, \
276+ { CXL_GMER_TRANS_HOST_WRITE, "Host Write" }, \
277+ { CXL_GMER_TRANS_HOST_SCAN_MEDIA, "Host Scan Media" }, \
278+ { CXL_GMER_TRANS_HOST_INJECT_POISON, "Host Inject Poison" }, \
279+ { CXL_GMER_TRANS_INTERNAL_MEDIA_SCRUB, "Internal Media Scrub" }, \
280+ { CXL_GMER_TRANS_INTERNAL_MEDIA_MANAGEMENT, "Internal Media Management" } \
281+ )
282+
283+ #define CXL_GMER_VALID_CHANNEL BIT(0)
284+ #define CXL_GMER_VALID_RANK BIT(1)
285+ #define CXL_GMER_VALID_DEVICE BIT(2)
286+ #define CXL_GMER_VALID_COMPONENT BIT(3)
287+ #define show_valid_flags (flags ) __print_flags(flags, "|", \
288+ { CXL_GMER_VALID_CHANNEL, "CHANNEL" }, \
289+ { CXL_GMER_VALID_RANK, "RANK" }, \
290+ { CXL_GMER_VALID_DEVICE, "DEVICE" }, \
291+ { CXL_GMER_VALID_COMPONENT, "COMPONENT" } \
292+ )
293+
294+ TRACE_EVENT (cxl_general_media ,
295+
296+ TP_PROTO (const struct device * dev , enum cxl_event_log_type log ,
297+ struct cxl_event_gen_media * rec ),
298+
299+ TP_ARGS (dev , log , rec ),
300+
301+ TP_STRUCT__entry (
302+ CXL_EVT_TP_entry
303+ /* General Media */
304+ __field (u64 , dpa )
305+ __field (u8 , descriptor )
306+ __field (u8 , type )
307+ __field (u8 , transaction_type )
308+ __field (u8 , channel )
309+ __field (u32 , device )
310+ __array (u8 , comp_id , CXL_EVENT_GEN_MED_COMP_ID_SIZE )
311+ __field (u16 , validity_flags )
312+ /* Following are out of order to pack trace record */
313+ __field (u8 , rank )
314+ __field (u8 , dpa_flags )
315+ ),
316+
317+ TP_fast_assign (
318+ CXL_EVT_TP_fast_assign (dev , log , rec -> hdr );
319+
320+ /* General Media */
321+ __entry -> dpa = le64_to_cpu (rec -> phys_addr );
322+ __entry -> dpa_flags = __entry -> dpa & CXL_DPA_FLAGS_MASK ;
323+ /* Mask after flags have been parsed */
324+ __entry -> dpa &= CXL_DPA_MASK ;
325+ __entry -> descriptor = rec -> descriptor ;
326+ __entry -> type = rec -> type ;
327+ __entry -> transaction_type = rec -> transaction_type ;
328+ __entry -> channel = rec -> channel ;
329+ __entry -> rank = rec -> rank ;
330+ __entry -> device = get_unaligned_le24 (rec -> device );
331+ memcpy (__entry -> comp_id , & rec -> component_id ,
332+ CXL_EVENT_GEN_MED_COMP_ID_SIZE );
333+ __entry -> validity_flags = get_unaligned_le16 (& rec -> validity_flags );
334+ ),
335+
336+ CXL_EVT_TP_printk ("dpa=%llx dpa_flags='%s' " \
337+ "descriptor='%s' type='%s' transaction_type='%s' channel=%u rank=%u " \
338+ "device=%x comp_id=%s validity_flags='%s'" ,
339+ __entry -> dpa , show_dpa_flags (__entry -> dpa_flags ),
340+ show_event_desc_flags (__entry -> descriptor ),
341+ show_mem_event_type (__entry -> type ),
342+ show_trans_type (__entry -> transaction_type ),
343+ __entry -> channel , __entry -> rank , __entry -> device ,
344+ __print_hex (__entry -> comp_id , CXL_EVENT_GEN_MED_COMP_ID_SIZE ),
345+ show_valid_flags (__entry -> validity_flags )
346+ )
347+ );
348+
225349#endif /* _CXL_EVENTS_H */
226350
227351#define TRACE_INCLUDE_FILE trace
0 commit comments