@@ -488,9 +488,11 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
488
488
struct iwl_fw_error_dump_trigger_desc * dump_trig ;
489
489
struct iwl_mvm_dump_ptrs * fw_error_dump ;
490
490
u32 sram_len , sram_ofs ;
491
+ struct iwl_fw_dbg_mem_seg_tlv * const * fw_dbg_mem =
492
+ mvm -> fw -> dbg_mem_tlv ;
491
493
u32 file_len , fifo_data_len = 0 , prph_len = 0 , radio_len = 0 ;
492
- u32 smem_len = mvm -> cfg -> smem_len ;
493
- u32 sram2_len = mvm -> cfg -> dccm2_len ;
494
+ u32 smem_len = mvm -> fw -> dbg_dynamic_mem ? 0 : mvm -> cfg -> smem_len ;
495
+ u32 sram2_len = mvm -> fw -> dbg_dynamic_mem ? 0 : mvm -> cfg -> dccm2_len ;
494
496
bool monitor_dump_only = false;
495
497
int i ;
496
498
@@ -586,7 +588,6 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
586
588
587
589
file_len = sizeof (* dump_file ) +
588
590
sizeof (* dump_data ) * 2 +
589
- sram_len + sizeof (* dump_mem ) +
590
591
fifo_data_len +
591
592
prph_len +
592
593
radio_len +
@@ -600,6 +601,13 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
600
601
if (sram2_len )
601
602
file_len += sizeof (* dump_data ) + sizeof (* dump_mem ) + sram2_len ;
602
603
604
+ /* Make room for MEM segments */
605
+ for (i = 0 ; i < ARRAY_SIZE (mvm -> fw -> dbg_mem_tlv ); i ++ ) {
606
+ if (fw_dbg_mem [i ])
607
+ file_len += sizeof (* dump_data ) + sizeof (* dump_mem ) +
608
+ le32_to_cpu (fw_dbg_mem [i ]-> len );
609
+ }
610
+
603
611
/* Make room for fw's virtual image pages, if it exists */
604
612
if (mvm -> fw -> img [mvm -> cur_ucode ].paging_mem_size )
605
613
file_len += mvm -> num_of_paging_blk *
@@ -625,6 +633,9 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
625
633
file_len += sizeof (* dump_data ) + sizeof (* dump_trig ) +
626
634
mvm -> fw_dump_desc -> len ;
627
635
636
+ if (!mvm -> fw -> dbg_dynamic_mem )
637
+ file_len += sram_len + sizeof (* dump_mem );
638
+
628
639
dump_file = vzalloc (file_len );
629
640
if (!dump_file ) {
630
641
kfree (fw_error_dump );
@@ -674,39 +685,59 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
674
685
if (monitor_dump_only )
675
686
goto dump_trans_data ;
676
687
677
- dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM );
678
- dump_data -> len = cpu_to_le32 (sram_len + sizeof (* dump_mem ));
679
- dump_mem = (void * )dump_data -> data ;
680
- dump_mem -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM_SRAM );
681
- dump_mem -> offset = cpu_to_le32 (sram_ofs );
682
- iwl_trans_read_mem_bytes (mvm -> trans , sram_ofs , dump_mem -> data ,
683
- sram_len );
688
+ if (!mvm -> fw -> dbg_dynamic_mem ) {
689
+ dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM );
690
+ dump_data -> len = cpu_to_le32 (sram_len + sizeof (* dump_mem ));
691
+ dump_mem = (void * )dump_data -> data ;
692
+ dump_mem -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM_SRAM );
693
+ dump_mem -> offset = cpu_to_le32 (sram_ofs );
694
+ iwl_trans_read_mem_bytes (mvm -> trans , sram_ofs , dump_mem -> data ,
695
+ sram_len );
696
+ dump_data = iwl_fw_error_next_data (dump_data );
697
+ }
698
+
699
+ for (i = 0 ; i < ARRAY_SIZE (mvm -> fw -> dbg_mem_tlv ); i ++ ) {
700
+ if (fw_dbg_mem [i ]) {
701
+ u32 len = le32_to_cpu (fw_dbg_mem [i ]-> len );
702
+ u32 ofs = le32_to_cpu (fw_dbg_mem [i ]-> ofs );
703
+
704
+ dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM );
705
+ dump_data -> len = cpu_to_le32 (len +
706
+ sizeof (* dump_mem ));
707
+ dump_mem = (void * )dump_data -> data ;
708
+ dump_mem -> type = fw_dbg_mem [i ]-> data_type ;
709
+ dump_mem -> offset = cpu_to_le32 (ofs );
710
+ iwl_trans_read_mem_bytes (mvm -> trans , ofs ,
711
+ dump_mem -> data ,
712
+ len );
713
+ dump_data = iwl_fw_error_next_data (dump_data );
714
+ }
715
+ }
684
716
685
717
if (smem_len ) {
686
- dump_data = iwl_fw_error_next_data (dump_data );
687
718
dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM );
688
719
dump_data -> len = cpu_to_le32 (smem_len + sizeof (* dump_mem ));
689
720
dump_mem = (void * )dump_data -> data ;
690
721
dump_mem -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM_SMEM );
691
722
dump_mem -> offset = cpu_to_le32 (mvm -> cfg -> smem_offset );
692
723
iwl_trans_read_mem_bytes (mvm -> trans , mvm -> cfg -> smem_offset ,
693
724
dump_mem -> data , smem_len );
725
+ dump_data = iwl_fw_error_next_data (dump_data );
694
726
}
695
727
696
728
if (sram2_len ) {
697
- dump_data = iwl_fw_error_next_data (dump_data );
698
729
dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM );
699
730
dump_data -> len = cpu_to_le32 (sram2_len + sizeof (* dump_mem ));
700
731
dump_mem = (void * )dump_data -> data ;
701
732
dump_mem -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM_SRAM );
702
733
dump_mem -> offset = cpu_to_le32 (mvm -> cfg -> dccm2_offset );
703
734
iwl_trans_read_mem_bytes (mvm -> trans , mvm -> cfg -> dccm2_offset ,
704
735
dump_mem -> data , sram2_len );
736
+ dump_data = iwl_fw_error_next_data (dump_data );
705
737
}
706
738
707
739
if (mvm -> cfg -> device_family == IWL_DEVICE_FAMILY_8000 &&
708
740
CSR_HW_REV_STEP (mvm -> trans -> hw_rev ) == SILICON_B_STEP ) {
709
- dump_data = iwl_fw_error_next_data (dump_data );
710
741
dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_MEM );
711
742
dump_data -> len = cpu_to_le32 (IWL8260_ICCM_LEN +
712
743
sizeof (* dump_mem ));
@@ -715,6 +746,7 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
715
746
dump_mem -> offset = cpu_to_le32 (IWL8260_ICCM_OFFSET );
716
747
iwl_trans_read_mem_bytes (mvm -> trans , IWL8260_ICCM_OFFSET ,
717
748
dump_mem -> data , IWL8260_ICCM_LEN );
749
+ dump_data = iwl_fw_error_next_data (dump_data );
718
750
}
719
751
720
752
/* Dump fw's virtual image */
@@ -724,18 +756,17 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
724
756
struct page * pages =
725
757
mvm -> fw_paging_db [i ].fw_paging_block ;
726
758
727
- dump_data = iwl_fw_error_next_data (dump_data );
728
759
dump_data -> type = cpu_to_le32 (IWL_FW_ERROR_DUMP_PAGING );
729
760
dump_data -> len = cpu_to_le32 (sizeof (* paging ) +
730
761
PAGING_BLOCK_SIZE );
731
762
paging = (void * )dump_data -> data ;
732
763
paging -> index = cpu_to_le32 (i );
733
764
memcpy (paging -> data , page_address (pages ),
734
765
PAGING_BLOCK_SIZE );
766
+ dump_data = iwl_fw_error_next_data (dump_data );
735
767
}
736
768
}
737
769
738
- dump_data = iwl_fw_error_next_data (dump_data );
739
770
if (prph_len )
740
771
iwl_dump_prph (mvm -> trans , & dump_data );
741
772
0 commit comments