@@ -222,6 +222,130 @@ TRACE_EVENT(cxl_generic_event,
222
222
__print_hex (__entry -> data , CXL_EVENT_RECORD_DATA_LENGTH ))
223
223
);
224
224
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
+
225
349
#endif /* _CXL_EVENTS_H */
226
350
227
351
#define TRACE_INCLUDE_FILE trace
0 commit comments