@@ -294,6 +294,72 @@ static void iwl_fwrt_dump_tcm_error_log(struct iwl_fw_runtime *fwrt, int idx)
294294 table .sw_status [i ], i );
295295}
296296
297+ /*
298+ * RCM error struct.
299+ * Note: This structure is read from the device with IO accesses,
300+ * and the reading already does the endian conversion. As it is
301+ * read with u32-sized accesses, any members with a different size
302+ * need to be ordered correctly though!
303+ */
304+ struct iwl_rcm_error_event_table {
305+ u32 valid ;
306+ u32 error_id ;
307+ u32 blink2 ;
308+ u32 ilink1 ;
309+ u32 ilink2 ;
310+ u32 data1 , data2 , data3 ;
311+ u32 logpc ;
312+ u32 frame_pointer ;
313+ u32 stack_pointer ;
314+ u32 msgid ;
315+ u32 isr ;
316+ u32 frame_hw_status ;
317+ u32 mbx_lmac_to_rcm_req ;
318+ u32 mbx_rcm_to_lmac_req ;
319+ u32 mh_ctl ;
320+ u32 mh_addr1_lo ;
321+ u32 mh_info ;
322+ u32 mh_err ;
323+ u32 reserved [3 ];
324+ } __packed ; /* RCM_LOG_ERROR_TABLE_API_S_VER_1 */
325+
326+ static void iwl_fwrt_dump_rcm_error_log (struct iwl_fw_runtime * fwrt , int idx )
327+ {
328+ struct iwl_trans * trans = fwrt -> trans ;
329+ struct iwl_rcm_error_event_table table = {};
330+ u32 base = fwrt -> trans -> dbg .rcm_error_event_table [idx ];
331+ u32 flag = idx ? IWL_ERROR_EVENT_TABLE_RCM2 :
332+ IWL_ERROR_EVENT_TABLE_RCM1 ;
333+
334+ if (!base || !(fwrt -> trans -> dbg .error_event_table_tlv_status & flag ))
335+ return ;
336+
337+ iwl_trans_read_mem_bytes (trans , base , & table , sizeof (table ));
338+
339+ IWL_ERR (fwrt , "RCM%d status:\n" , idx + 1 );
340+ IWL_ERR (fwrt , "0x%08X | error ID\n" , table .error_id );
341+ IWL_ERR (fwrt , "0x%08X | rcm branchlink2\n" , table .blink2 );
342+ IWL_ERR (fwrt , "0x%08X | rcm interruptlink1\n" , table .ilink1 );
343+ IWL_ERR (fwrt , "0x%08X | rcm interruptlink2\n" , table .ilink2 );
344+ IWL_ERR (fwrt , "0x%08X | rcm data1\n" , table .data1 );
345+ IWL_ERR (fwrt , "0x%08X | rcm data2\n" , table .data2 );
346+ IWL_ERR (fwrt , "0x%08X | rcm data3\n" , table .data3 );
347+ IWL_ERR (fwrt , "0x%08X | rcm log PC\n" , table .logpc );
348+ IWL_ERR (fwrt , "0x%08X | rcm frame pointer\n" , table .frame_pointer );
349+ IWL_ERR (fwrt , "0x%08X | rcm stack pointer\n" , table .stack_pointer );
350+ IWL_ERR (fwrt , "0x%08X | rcm msg ID\n" , table .msgid );
351+ IWL_ERR (fwrt , "0x%08X | rcm ISR status\n" , table .isr );
352+ IWL_ERR (fwrt , "0x%08X | frame HW status\n" , table .frame_hw_status );
353+ IWL_ERR (fwrt , "0x%08X | LMAC-to-RCM request mbox\n" ,
354+ table .mbx_lmac_to_rcm_req );
355+ IWL_ERR (fwrt , "0x%08X | RCM-to-LMAC request mbox\n" ,
356+ table .mbx_rcm_to_lmac_req );
357+ IWL_ERR (fwrt , "0x%08X | MAC header control\n" , table .mh_ctl );
358+ IWL_ERR (fwrt , "0x%08X | MAC header addr1 low\n" , table .mh_addr1_lo );
359+ IWL_ERR (fwrt , "0x%08X | MAC header info\n" , table .mh_info );
360+ IWL_ERR (fwrt , "0x%08X | MAC header error\n" , table .mh_err );
361+ }
362+
297363static void iwl_fwrt_dump_iml_error_log (struct iwl_fw_runtime * fwrt )
298364{
299365 struct iwl_trans * trans = fwrt -> trans ;
@@ -376,7 +442,9 @@ void iwl_fwrt_dump_error_logs(struct iwl_fw_runtime *fwrt)
376442 iwl_fwrt_dump_lmac_error_log (fwrt , 1 );
377443 iwl_fwrt_dump_umac_error_log (fwrt );
378444 iwl_fwrt_dump_tcm_error_log (fwrt , 0 );
445+ iwl_fwrt_dump_rcm_error_log (fwrt , 0 );
379446 iwl_fwrt_dump_tcm_error_log (fwrt , 1 );
447+ iwl_fwrt_dump_rcm_error_log (fwrt , 1 );
380448 iwl_fwrt_dump_iml_error_log (fwrt );
381449 iwl_fwrt_dump_fseq_regs (fwrt );
382450
0 commit comments