Lines Matching +full:fw +full:- +full:cfg

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2005-2014, 2018-2023 Intel Corporation
4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5 * Copyright (C) 2015-2017 Intel Deutschland GmbH
8 #include "iwl-drv.h"
12 #include "iwl-io.h"
13 #include "iwl-prph.h"
14 #include "iwl-csr.h"
15 #include "iwl-fh.h"
17 * struct iwl_fw_dump_ptrs - set of pointers needed for the fw-error-dump
35 u8 *pos = (void *)(*dump_data)->data; in iwl_read_radio_regs()
40 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_read_radio_regs()
43 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RADIO_REG); in iwl_read_radio_regs()
44 (*dump_data)->len = cpu_to_le32(RADIO_REG_MAX_READ); in iwl_read_radio_regs()
50 iwl_write_prph_no_grab(fwrt->trans, RSP_RADIO_CMD, rd_cmd); in iwl_read_radio_regs()
51 *pos = (u8)iwl_read_prph_no_grab(fwrt->trans, RSP_RADIO_RDDAT); in iwl_read_radio_regs()
58 iwl_trans_release_nic_access(fwrt->trans); in iwl_read_radio_regs()
70 fifo_hdr = (void *)(*dump_data)->data; in iwl_fwrt_dump_rxf()
71 fifo_data = (void *)fifo_hdr->data; in iwl_fwrt_dump_rxf()
79 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF); in iwl_fwrt_dump_rxf()
80 (*dump_data)->len = cpu_to_le32(fifo_len + sizeof(*fifo_hdr)); in iwl_fwrt_dump_rxf()
82 fifo_hdr->fifo_num = cpu_to_le32(fifo_num); in iwl_fwrt_dump_rxf()
83 fifo_hdr->available_bytes = in iwl_fwrt_dump_rxf()
84 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
86 fifo_hdr->wr_ptr = in iwl_fwrt_dump_rxf()
87 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
89 fifo_hdr->rd_ptr = in iwl_fwrt_dump_rxf()
90 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
92 fifo_hdr->fence_ptr = in iwl_fwrt_dump_rxf()
93 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
95 fifo_hdr->fence_mode = in iwl_fwrt_dump_rxf()
96 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
100 iwl_trans_write_prph(fwrt->trans, RXF_SET_FENCE_MODE + offset, 0x1); in iwl_fwrt_dump_rxf()
102 iwl_trans_write_prph(fwrt->trans, RXF_LD_WR2FENCE + offset, 0x1); in iwl_fwrt_dump_rxf()
104 iwl_trans_write_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
110 fifo_data[i] = iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
125 fifo_hdr = (void *)(*dump_data)->data; in iwl_fwrt_dump_txf()
126 fifo_data = (void *)fifo_hdr->data; in iwl_fwrt_dump_txf()
134 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_TXF); in iwl_fwrt_dump_txf()
135 (*dump_data)->len = cpu_to_le32(fifo_len + sizeof(*fifo_hdr)); in iwl_fwrt_dump_txf()
137 fifo_hdr->fifo_num = cpu_to_le32(fifo_num); in iwl_fwrt_dump_txf()
138 fifo_hdr->available_bytes = in iwl_fwrt_dump_txf()
139 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
141 fifo_hdr->wr_ptr = in iwl_fwrt_dump_txf()
142 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
144 fifo_hdr->rd_ptr = in iwl_fwrt_dump_txf()
145 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
147 fifo_hdr->fence_ptr = in iwl_fwrt_dump_txf()
148 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
150 fifo_hdr->fence_mode = in iwl_fwrt_dump_txf()
151 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
155 iwl_trans_write_prph(fwrt->trans, TXF_READ_MODIFY_ADDR + offset, in iwl_fwrt_dump_txf()
158 /* Dummy-read to advance the read pointer to the head */ in iwl_fwrt_dump_txf()
159 iwl_trans_read_prph(fwrt->trans, TXF_READ_MODIFY_DATA + offset); in iwl_fwrt_dump_txf()
163 fifo_data[i] = iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
167 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_txf) in iwl_fwrt_dump_txf()
168 fwrt->sanitize_ops->frob_txf(fwrt->sanitize_ctx, in iwl_fwrt_dump_txf()
177 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_fw_dump_rxf() local
181 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_fw_dump_rxf()
187 cfg->lmac[0].rxfifo1_size, 0, 0); in iwl_fw_dump_rxf()
189 iwl_fwrt_dump_rxf(fwrt, dump_data, cfg->rxfifo2_size, in iwl_fw_dump_rxf()
191 fwrt->trans->trans_cfg->umac_prph_offset, 1); in iwl_fw_dump_rxf()
193 if (fwrt->smem_cfg.num_lmacs > 1) in iwl_fw_dump_rxf()
195 cfg->lmac[1].rxfifo1_size, in iwl_fw_dump_rxf()
199 iwl_trans_release_nic_access(fwrt->trans); in iwl_fw_dump_rxf()
206 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_fw_dump_txf() local
213 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_fw_dump_txf()
218 for (i = 0; i < fwrt->smem_cfg.num_txfifo_entries; i++) { in iwl_fw_dump_txf()
220 iwl_trans_write_prph(fwrt->trans, TXF_LARC_NUM, i); in iwl_fw_dump_txf()
222 cfg->lmac[0].txfifo_size[i], 0, i); in iwl_fw_dump_txf()
226 if (fwrt->smem_cfg.num_lmacs > 1) { in iwl_fw_dump_txf()
227 for (i = 0; i < fwrt->smem_cfg.num_txfifo_entries; in iwl_fw_dump_txf()
230 iwl_trans_write_prph(fwrt->trans, in iwl_fw_dump_txf()
234 cfg->lmac[1].txfifo_size[i], in iwl_fw_dump_txf()
236 i + cfg->num_txfifo_entries); in iwl_fw_dump_txf()
242 fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_dump_txf()
246 i < ARRAY_SIZE(fwrt->smem_cfg.internal_txfifo_size); in iwl_fw_dump_txf()
248 fifo_hdr = (void *)(*dump_data)->data; in iwl_fw_dump_txf()
249 fifo_data = (void *)fifo_hdr->data; in iwl_fw_dump_txf()
250 fifo_len = fwrt->smem_cfg.internal_txfifo_size[i]; in iwl_fw_dump_txf()
257 (*dump_data)->type = in iwl_fw_dump_txf()
259 (*dump_data)->len = in iwl_fw_dump_txf()
262 fifo_hdr->fifo_num = cpu_to_le32(i); in iwl_fw_dump_txf()
265 iwl_trans_write_prph(fwrt->trans, TXF_CPU2_NUM, i + in iwl_fw_dump_txf()
266 fwrt->smem_cfg.num_txfifo_entries); in iwl_fw_dump_txf()
268 fifo_hdr->available_bytes = in iwl_fw_dump_txf()
269 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
271 fifo_hdr->wr_ptr = in iwl_fw_dump_txf()
272 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
274 fifo_hdr->rd_ptr = in iwl_fw_dump_txf()
275 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
277 fifo_hdr->fence_ptr = in iwl_fw_dump_txf()
278 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
280 fifo_hdr->fence_mode = in iwl_fw_dump_txf()
281 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
285 iwl_trans_write_prph(fwrt->trans, in iwl_fw_dump_txf()
289 /* Dummy-read to advance the read pointer to head */ in iwl_fw_dump_txf()
290 iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
297 iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
303 iwl_trans_release_nic_access(fwrt->trans); in iwl_fw_dump_txf()
525 struct iwl_trans *trans = fwrt->trans; in iwl_dump_prph()
540 int num_bytes_in_chunk = iwl_prph_dump_addr[i].end - in iwl_dump_prph()
543 (*data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_PRPH); in iwl_dump_prph()
544 (*data)->len = cpu_to_le32(sizeof(*prph) + in iwl_dump_prph()
546 prph = (void *)(*data)->data; in iwl_dump_prph()
547 prph->prph_start = cpu_to_le32(iwl_prph_dump_addr[i].start); in iwl_dump_prph()
551 iwl_prph_dump_addr[i].end - in iwl_dump_prph()
553 (void *)prph->data); in iwl_dump_prph()
562 * alloc_sgtable - allocates scallerlist table in the given size,
593 size -= PAGE_SIZE; in alloc_sgtable()
612 iwl_prph_dump_addr[i].end - in iwl_fw_get_prph_len()
628 if (fwrt->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) { in iwl_fw_prph_handler()
631 } else if (fwrt->trans->trans_cfg->device_family >= in iwl_fw_prph_handler()
639 if (fwrt->trans->trans_cfg->mq_rx_supported) { in iwl_fw_prph_handler()
655 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM); in iwl_fw_dump_mem()
656 (*dump_data)->len = cpu_to_le32(len + sizeof(*dump_mem)); in iwl_fw_dump_mem()
657 dump_mem = (void *)(*dump_data)->data; in iwl_fw_dump_mem()
658 dump_mem->type = cpu_to_le32(type); in iwl_fw_dump_mem()
659 dump_mem->offset = cpu_to_le32(ofs); in iwl_fw_dump_mem()
660 iwl_trans_read_mem_bytes(fwrt->trans, ofs, dump_mem->data, len); in iwl_fw_dump_mem()
663 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_fw_dump_mem()
664 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, ofs, in iwl_fw_dump_mem()
665 dump_mem->data, len); in iwl_fw_dump_mem()
667 IWL_DEBUG_INFO(fwrt, "WRT memory dump. Type=%u\n", dump_mem->type); in iwl_fw_dump_mem()
686 ADD_LEN(fifo_len, mem_cfg->rxfifo2_size, hdr_len); in iwl_fw_rxf_len()
689 if (WARN_ON(mem_cfg->num_lmacs > MAX_NUM_LMAC)) in iwl_fw_rxf_len()
690 mem_cfg->num_lmacs = MAX_NUM_LMAC; in iwl_fw_rxf_len()
692 for (i = 0; i < mem_cfg->num_lmacs; i++) in iwl_fw_rxf_len()
693 ADD_LEN(fifo_len, mem_cfg->lmac[i].rxfifo1_size, hdr_len); in iwl_fw_rxf_len()
710 if (WARN_ON(mem_cfg->num_lmacs > MAX_NUM_LMAC)) in iwl_fw_txf_len()
711 mem_cfg->num_lmacs = MAX_NUM_LMAC; in iwl_fw_txf_len()
713 for (i = 0; i < mem_cfg->num_lmacs; i++) { in iwl_fw_txf_len()
716 for (j = 0; j < mem_cfg->num_txfifo_entries; j++) in iwl_fw_txf_len()
717 ADD_LEN(fifo_len, mem_cfg->lmac[i].txfifo_size[j], in iwl_fw_txf_len()
723 fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_txf_len()
727 for (i = 0; i < ARRAY_SIZE(mem_cfg->internal_txfifo_size); i++) in iwl_fw_txf_len()
728 ADD_LEN(fifo_len, mem_cfg->internal_txfifo_size[i], hdr_len); in iwl_fw_txf_len()
740 for (i = 1; i < fwrt->num_of_paging_blk + 1; i++) { in iwl_dump_paging()
743 fwrt->fw_paging_db[i].fw_paging_block; in iwl_dump_paging()
744 dma_addr_t addr = fwrt->fw_paging_db[i].fw_paging_phys; in iwl_dump_paging()
746 (*data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_PAGING); in iwl_dump_paging()
747 (*data)->len = cpu_to_le32(sizeof(*paging) + in iwl_dump_paging()
749 paging = (void *)(*data)->data; in iwl_dump_paging()
750 paging->index = cpu_to_le32(i); in iwl_dump_paging()
751 dma_sync_single_for_cpu(fwrt->trans->dev, addr, in iwl_dump_paging()
754 memcpy(paging->data, page_address(pages), in iwl_dump_paging()
756 dma_sync_single_for_device(fwrt->trans->dev, addr, in iwl_dump_paging()
761 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_dump_paging()
762 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, in iwl_dump_paging()
763 fwrt->fw_paging_db[i].fw_offs, in iwl_dump_paging()
764 paging->data, in iwl_dump_paging()
780 const struct iwl_fw_dbg_mem_seg_tlv *fw_mem = fwrt->fw->dbg.mem_tlv; in iwl_fw_error_dump_file()
781 struct iwl_fwrt_shared_mem_cfg *mem_cfg = &fwrt->smem_cfg; in iwl_fw_error_dump_file()
783 u32 smem_len = fwrt->fw->dbg.n_mem_tlv ? 0 : fwrt->trans->cfg->smem_len; in iwl_fw_error_dump_file()
784 u32 sram2_len = fwrt->fw->dbg.n_mem_tlv ? in iwl_fw_error_dump_file()
785 0 : fwrt->trans->cfg->dccm2_len; in iwl_fw_error_dump_file()
788 /* SRAM - include stack CCM if driver knows the values for it */ in iwl_fw_error_dump_file()
789 if (!fwrt->trans->cfg->dccm_offset || !fwrt->trans->cfg->dccm_len) { in iwl_fw_error_dump_file()
792 if (fwrt->cur_fw_img >= IWL_UCODE_TYPE_MAX) in iwl_fw_error_dump_file()
794 img = &fwrt->fw->img[fwrt->cur_fw_img]; in iwl_fw_error_dump_file()
795 sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset; in iwl_fw_error_dump_file()
796 sram_len = img->sec[IWL_UCODE_SECTION_DATA].len; in iwl_fw_error_dump_file()
798 sram_ofs = fwrt->trans->cfg->dccm_offset; in iwl_fw_error_dump_file()
799 sram_len = fwrt->trans->cfg->dccm_len; in iwl_fw_error_dump_file()
803 if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) { in iwl_fw_error_dump_file()
812 if (fwrt->trans->trans_cfg->device_family == in iwl_fw_error_dump_file()
830 if (!fwrt->fw->dbg.n_mem_tlv) in iwl_fw_error_dump_file()
837 for (i = 0; i < fwrt->fw->dbg.n_mem_tlv; i++) in iwl_fw_error_dump_file()
841 /* Make room for fw's virtual image pages, if it exists */ in iwl_fw_error_dump_file()
843 file_len += fwrt->num_of_paging_blk * in iwl_fw_error_dump_file()
848 if (iwl_fw_dbg_is_d3_debug_enabled(fwrt) && fwrt->dump.d3_debug_data) { in iwl_fw_error_dump_file()
850 fwrt->trans->cfg->d3_debug_data_length * 2; in iwl_fw_error_dump_file()
854 if (data->monitor_only) { in iwl_fw_error_dump_file()
860 data->desc) in iwl_fw_error_dump_file()
862 data->desc->len; in iwl_fw_error_dump_file()
868 fw_error_dump->fwrt_ptr = dump_file; in iwl_fw_error_dump_file()
870 dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER); in iwl_fw_error_dump_file()
871 dump_data = (void *)dump_file->data; in iwl_fw_error_dump_file()
874 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO); in iwl_fw_error_dump_file()
875 dump_data->len = cpu_to_le32(sizeof(*dump_info)); in iwl_fw_error_dump_file()
876 dump_info = (void *)dump_data->data; in iwl_fw_error_dump_file()
877 dump_info->hw_type = in iwl_fw_error_dump_file()
878 cpu_to_le32(CSR_HW_REV_TYPE(fwrt->trans->hw_rev)); in iwl_fw_error_dump_file()
879 dump_info->hw_step = in iwl_fw_error_dump_file()
880 cpu_to_le32(fwrt->trans->hw_rev_step); in iwl_fw_error_dump_file()
881 memcpy(dump_info->fw_human_readable, fwrt->fw->human_readable, in iwl_fw_error_dump_file()
882 sizeof(dump_info->fw_human_readable)); in iwl_fw_error_dump_file()
883 strncpy(dump_info->dev_human_readable, fwrt->trans->name, in iwl_fw_error_dump_file()
884 sizeof(dump_info->dev_human_readable) - 1); in iwl_fw_error_dump_file()
885 strncpy(dump_info->bus_human_readable, fwrt->dev->bus->name, in iwl_fw_error_dump_file()
886 sizeof(dump_info->bus_human_readable) - 1); in iwl_fw_error_dump_file()
887 dump_info->num_of_lmacs = fwrt->smem_cfg.num_lmacs; in iwl_fw_error_dump_file()
888 dump_info->lmac_err_id[0] = in iwl_fw_error_dump_file()
889 cpu_to_le32(fwrt->dump.lmac_err_id[0]); in iwl_fw_error_dump_file()
890 if (fwrt->smem_cfg.num_lmacs > 1) in iwl_fw_error_dump_file()
891 dump_info->lmac_err_id[1] = in iwl_fw_error_dump_file()
892 cpu_to_le32(fwrt->dump.lmac_err_id[1]); in iwl_fw_error_dump_file()
893 dump_info->umac_err_id = cpu_to_le32(fwrt->dump.umac_err_id); in iwl_fw_error_dump_file()
900 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_CFG); in iwl_fw_error_dump_file()
901 dump_data->len = cpu_to_le32(sizeof(*dump_smem_cfg)); in iwl_fw_error_dump_file()
902 dump_smem_cfg = (void *)dump_data->data; in iwl_fw_error_dump_file()
903 dump_smem_cfg->num_lmacs = cpu_to_le32(mem_cfg->num_lmacs); in iwl_fw_error_dump_file()
904 dump_smem_cfg->num_txfifo_entries = in iwl_fw_error_dump_file()
905 cpu_to_le32(mem_cfg->num_txfifo_entries); in iwl_fw_error_dump_file()
908 u32 *txf_size = mem_cfg->lmac[i].txfifo_size; in iwl_fw_error_dump_file()
911 dump_smem_cfg->lmac[i].txfifo_size[j] = in iwl_fw_error_dump_file()
913 dump_smem_cfg->lmac[i].rxfifo1_size = in iwl_fw_error_dump_file()
914 cpu_to_le32(mem_cfg->lmac[i].rxfifo1_size); in iwl_fw_error_dump_file()
916 dump_smem_cfg->rxfifo2_size = in iwl_fw_error_dump_file()
917 cpu_to_le32(mem_cfg->rxfifo2_size); in iwl_fw_error_dump_file()
918 dump_smem_cfg->internal_txfifo_addr = in iwl_fw_error_dump_file()
919 cpu_to_le32(mem_cfg->internal_txfifo_addr); in iwl_fw_error_dump_file()
921 dump_smem_cfg->internal_txfifo_size[i] = in iwl_fw_error_dump_file()
922 cpu_to_le32(mem_cfg->internal_txfifo_size[i]); in iwl_fw_error_dump_file()
928 /* We only dump the FIFOs if the FW is in error state */ in iwl_fw_error_dump_file()
938 data->desc) { in iwl_fw_error_dump_file()
939 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_ERROR_INFO); in iwl_fw_error_dump_file()
940 dump_data->len = cpu_to_le32(sizeof(*dump_trig) + in iwl_fw_error_dump_file()
941 data->desc->len); in iwl_fw_error_dump_file()
942 dump_trig = (void *)dump_data->data; in iwl_fw_error_dump_file()
943 memcpy(dump_trig, &data->desc->trig_desc, in iwl_fw_error_dump_file()
944 sizeof(*dump_trig) + data->desc->len); in iwl_fw_error_dump_file()
950 if (data->monitor_only) in iwl_fw_error_dump_file()
955 fwrt->fw->dbg.mem_tlv; in iwl_fw_error_dump_file()
957 if (!fwrt->fw->dbg.n_mem_tlv) in iwl_fw_error_dump_file()
961 for (i = 0; i < fwrt->fw->dbg.n_mem_tlv; i++) { in iwl_fw_error_dump_file()
970 fwrt->trans->cfg->smem_offset, in iwl_fw_error_dump_file()
974 fwrt->trans->cfg->dccm2_offset, in iwl_fw_error_dump_file()
978 if (iwl_fw_dbg_is_d3_debug_enabled(fwrt) && fwrt->dump.d3_debug_data) { in iwl_fw_error_dump_file()
979 u32 addr = fwrt->trans->cfg->d3_debug_data_base_addr; in iwl_fw_error_dump_file()
980 size_t data_size = fwrt->trans->cfg->d3_debug_data_length; in iwl_fw_error_dump_file()
982 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_D3_DEBUG_DATA); in iwl_fw_error_dump_file()
983 dump_data->len = cpu_to_le32(data_size * 2); in iwl_fw_error_dump_file()
985 memcpy(dump_data->data, fwrt->dump.d3_debug_data, data_size); in iwl_fw_error_dump_file()
987 kfree(fwrt->dump.d3_debug_data); in iwl_fw_error_dump_file()
988 fwrt->dump.d3_debug_data = NULL; in iwl_fw_error_dump_file()
990 iwl_trans_read_mem_bytes(fwrt->trans, addr, in iwl_fw_error_dump_file()
991 dump_data->data + data_size, in iwl_fw_error_dump_file()
994 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_fw_error_dump_file()
995 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, addr, in iwl_fw_error_dump_file()
996 dump_data->data + data_size, in iwl_fw_error_dump_file()
1002 /* Dump fw's virtual image */ in iwl_fw_error_dump_file()
1010 dump_file->file_len = cpu_to_le32(file_len); in iwl_fw_error_dump_file()
1015 * struct iwl_dump_ini_region_data - region data
1029 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_mac_iter()
1031 __le32 *val = range->data; in iwl_dump_ini_prph_mac_iter()
1033 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_prph_mac_iter()
1034 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_prph_mac_iter()
1037 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_prph_mac_iter()
1038 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_prph_mac_iter()
1039 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) { in iwl_dump_ini_prph_mac_iter()
1040 prph_val = iwl_read_prph(fwrt->trans, addr + i); in iwl_dump_ini_prph_mac_iter()
1042 return -EBUSY; in iwl_dump_ini_prph_mac_iter()
1046 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_prph_mac_iter()
1054 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_phy_iter()
1056 __le32 *val = range->data; in iwl_dump_ini_prph_phy_iter()
1060 u32 addr = le32_to_cpu(reg->addrs[idx]); in iwl_dump_ini_prph_phy_iter()
1065 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_prph_phy_iter()
1066 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_prph_phy_iter()
1068 if (fwrt->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_AX210) in iwl_dump_ini_prph_phy_iter()
1071 indirect_wr_addr += le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_prph_phy_iter()
1072 indirect_rd_addr += le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_prph_phy_iter()
1074 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_prph_phy_iter()
1075 return -EBUSY; in iwl_dump_ini_prph_phy_iter()
1077 dphy_addr = (reg->dev_addr.offset) ? WFPM_LMAC2_PS_CTL_RW : in iwl_dump_ini_prph_phy_iter()
1079 dphy_state = iwl_read_umac_prph_no_grab(fwrt->trans, dphy_addr); in iwl_dump_ini_prph_phy_iter()
1081 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) { in iwl_dump_ini_prph_phy_iter()
1089 iwl_write_prph_no_grab(fwrt->trans, indirect_wr_addr, in iwl_dump_ini_prph_phy_iter()
1091 prph_val = iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_prph_phy_iter()
1096 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_prph_phy_iter()
1097 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_prph_phy_iter()
1104 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_csr_iter()
1106 __le32 *val = range->data; in iwl_dump_ini_csr_iter()
1107 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_csr_iter()
1108 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_csr_iter()
1111 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_csr_iter()
1112 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_csr_iter()
1113 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) in iwl_dump_ini_csr_iter()
1114 *val++ = cpu_to_le32(iwl_trans_read32(fwrt->trans, addr + i)); in iwl_dump_ini_csr_iter()
1116 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_csr_iter()
1123 struct iwl_trans *trans = fwrt->trans; in iwl_dump_ini_config_iter()
1124 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_config_iter()
1126 __le32 *val = range->data; in iwl_dump_ini_config_iter()
1127 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_config_iter()
1128 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_config_iter()
1132 if (WARN_ON_ONCE(!trans->ops->read_config32)) in iwl_dump_ini_config_iter()
1133 return -EOPNOTSUPP; in iwl_dump_ini_config_iter()
1135 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_config_iter()
1136 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_config_iter()
1137 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) { in iwl_dump_ini_config_iter()
1141 ret = trans->ops->read_config32(trans, addr + i, &tmp); in iwl_dump_ini_config_iter()
1148 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_config_iter()
1155 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_dev_mem_iter()
1157 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_dev_mem_iter()
1158 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_dev_mem_iter()
1160 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_dev_mem_iter()
1161 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_dev_mem_iter()
1162 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_dev_mem_iter()
1163 le32_to_cpu(reg->dev_addr.size)); in iwl_dump_ini_dev_mem_iter()
1165 if (reg->sub_type == IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_HW_SMEM && in iwl_dump_ini_dev_mem_iter()
1166 fwrt->sanitize_ops && fwrt->sanitize_ops->frob_txf) in iwl_dump_ini_dev_mem_iter()
1167 fwrt->sanitize_ops->frob_txf(fwrt->sanitize_ctx, in iwl_dump_ini_dev_mem_iter()
1168 range->data, in iwl_dump_ini_dev_mem_iter()
1169 le32_to_cpu(reg->dev_addr.size)); in iwl_dump_ini_dev_mem_iter()
1171 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_dev_mem_iter()
1177 struct page *page = fwrt->fw_paging_db[idx].fw_paging_block; in _iwl_dump_ini_paging_iter()
1179 dma_addr_t addr = fwrt->fw_paging_db[idx].fw_paging_phys; in _iwl_dump_ini_paging_iter()
1180 u32 page_size = fwrt->fw_paging_db[idx].fw_paging_size; in _iwl_dump_ini_paging_iter()
1182 range->page_num = cpu_to_le32(idx); in _iwl_dump_ini_paging_iter()
1183 range->range_data_size = cpu_to_le32(page_size); in _iwl_dump_ini_paging_iter()
1184 dma_sync_single_for_cpu(fwrt->trans->dev, addr, page_size, in _iwl_dump_ini_paging_iter()
1186 memcpy(range->data, page_address(page), page_size); in _iwl_dump_ini_paging_iter()
1187 dma_sync_single_for_device(fwrt->trans->dev, addr, page_size, in _iwl_dump_ini_paging_iter()
1190 return sizeof(*range) + le32_to_cpu(range->range_data_size); in _iwl_dump_ini_paging_iter()
1203 if (!fwrt->trans->trans_cfg->gen2) in iwl_dump_ini_paging_iter()
1207 page_size = fwrt->trans->init_dram.paging[idx].size; in iwl_dump_ini_paging_iter()
1209 range->page_num = cpu_to_le32(idx); in iwl_dump_ini_paging_iter()
1210 range->range_data_size = cpu_to_le32(page_size); in iwl_dump_ini_paging_iter()
1211 memcpy(range->data, fwrt->trans->init_dram.paging[idx].block, in iwl_dump_ini_paging_iter()
1214 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_paging_iter()
1222 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_iter()
1225 u32 alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_iter()
1227 frag = &fwrt->trans->dbg.fw_mon_ini[alloc_id].frags[idx]; in iwl_dump_ini_mon_dram_iter()
1229 range->dram_base_addr = cpu_to_le64(frag->physical); in iwl_dump_ini_mon_dram_iter()
1230 range->range_data_size = cpu_to_le32(frag->size); in iwl_dump_ini_mon_dram_iter()
1232 memcpy(range->data, frag->block, frag->size); in iwl_dump_ini_mon_dram_iter()
1234 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_mon_dram_iter()
1241 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_smem_iter()
1243 u32 addr = le32_to_cpu(reg->internal_buffer.base_addr); in iwl_dump_ini_mon_smem_iter()
1245 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_mon_smem_iter()
1246 range->range_data_size = reg->internal_buffer.size; in iwl_dump_ini_mon_smem_iter()
1247 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_mon_smem_iter()
1248 le32_to_cpu(reg->internal_buffer.size)); in iwl_dump_ini_mon_smem_iter()
1250 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_mon_smem_iter()
1256 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_ini_txf_iter()
1257 struct iwl_txf_iter_data *iter = &fwrt->dump.txf_iter_data; in iwl_ini_txf_iter()
1258 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_ini_txf_iter() local
1259 int txf_num = cfg->num_txfifo_entries; in iwl_ini_txf_iter()
1260 int int_txf_num = ARRAY_SIZE(cfg->internal_txfifo_size); in iwl_ini_txf_iter()
1261 u32 lmac_bitmap = le32_to_cpu(reg->fifos.fid[0]); in iwl_ini_txf_iter()
1264 if (le32_to_cpu(reg->fifos.offset) && cfg->num_lmacs == 1) { in iwl_ini_txf_iter()
1266 le32_to_cpu(reg->fifos.offset)); in iwl_ini_txf_iter()
1270 iter->internal_txf = 0; in iwl_ini_txf_iter()
1271 iter->fifo_size = 0; in iwl_ini_txf_iter()
1272 iter->fifo = -1; in iwl_ini_txf_iter()
1273 if (le32_to_cpu(reg->fifos.offset)) in iwl_ini_txf_iter()
1274 iter->lmac = 1; in iwl_ini_txf_iter()
1276 iter->lmac = 0; in iwl_ini_txf_iter()
1279 if (!iter->internal_txf) { in iwl_ini_txf_iter()
1280 for (iter->fifo++; iter->fifo < txf_num; iter->fifo++) { in iwl_ini_txf_iter()
1281 iter->fifo_size = in iwl_ini_txf_iter()
1282 cfg->lmac[iter->lmac].txfifo_size[iter->fifo]; in iwl_ini_txf_iter()
1283 if (iter->fifo_size && (lmac_bitmap & BIT(iter->fifo))) in iwl_ini_txf_iter()
1286 iter->fifo--; in iwl_ini_txf_iter()
1289 iter->internal_txf = 1; in iwl_ini_txf_iter()
1291 if (!fw_has_capa(&fwrt->fw->ucode_capa, in iwl_ini_txf_iter()
1295 for (iter->fifo++; iter->fifo < int_txf_num + txf_num; iter->fifo++) { in iwl_ini_txf_iter()
1296 iter->fifo_size = in iwl_ini_txf_iter()
1297 cfg->internal_txfifo_size[iter->fifo - txf_num]; in iwl_ini_txf_iter()
1298 if (iter->fifo_size && (lmac_bitmap & BIT(iter->fifo))) in iwl_ini_txf_iter()
1309 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_txf_iter()
1311 struct iwl_txf_iter_data *iter = &fwrt->dump.txf_iter_data; in iwl_dump_ini_txf_iter()
1312 struct iwl_fw_ini_error_dump_register *reg_dump = (void *)range->data; in iwl_dump_ini_txf_iter()
1313 u32 offs = le32_to_cpu(reg->fifos.offset), addr; in iwl_dump_ini_txf_iter()
1314 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_txf_iter()
1320 return -EIO; in iwl_dump_ini_txf_iter()
1322 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_txf_iter()
1323 return -EBUSY; in iwl_dump_ini_txf_iter()
1325 range->fifo_hdr.fifo_num = cpu_to_le32(iter->fifo); in iwl_dump_ini_txf_iter()
1326 range->fifo_hdr.num_of_registers = cpu_to_le32(registers_num); in iwl_dump_ini_txf_iter()
1327 range->range_data_size = cpu_to_le32(iter->fifo_size + registers_size); in iwl_dump_ini_txf_iter()
1329 iwl_write_prph_no_grab(fwrt->trans, TXF_LARC_NUM + offs, iter->fifo); in iwl_dump_ini_txf_iter()
1336 addr = le32_to_cpu(reg->addrs[i]) + offs; in iwl_dump_ini_txf_iter()
1338 reg_dump->addr = cpu_to_le32(addr); in iwl_dump_ini_txf_iter()
1339 reg_dump->data = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_txf_iter()
1345 if (reg->fifos.hdr_only) { in iwl_dump_ini_txf_iter()
1346 range->range_data_size = cpu_to_le32(registers_size); in iwl_dump_ini_txf_iter()
1351 iwl_write_prph_no_grab(fwrt->trans, TXF_READ_MODIFY_ADDR + offs, in iwl_dump_ini_txf_iter()
1354 /* Dummy-read to advance the read pointer to the head */ in iwl_dump_ini_txf_iter()
1355 iwl_read_prph_no_grab(fwrt->trans, TXF_READ_MODIFY_DATA + offs); in iwl_dump_ini_txf_iter()
1360 for (i = 0; i < iter->fifo_size; i += sizeof(*data)) in iwl_dump_ini_txf_iter()
1361 *data++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr)); in iwl_dump_ini_txf_iter()
1363 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_txf) in iwl_dump_ini_txf_iter()
1364 fwrt->sanitize_ops->frob_txf(fwrt->sanitize_ctx, in iwl_dump_ini_txf_iter()
1365 reg_dump, iter->fifo_size); in iwl_dump_ini_txf_iter()
1368 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_txf_iter()
1370 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_txf_iter()
1383 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_ini_get_rxf_data()
1384 u32 fid1 = le32_to_cpu(reg->fifos.fid[0]); in iwl_ini_get_rxf_data()
1385 u32 fid2 = le32_to_cpu(reg->fifos.fid[1]); in iwl_ini_get_rxf_data()
1399 fifo_idx = ffs(fid1) - 1; in iwl_ini_get_rxf_data()
1404 data->size = fwrt->smem_cfg.lmac[fifo_idx].rxfifo1_size; in iwl_ini_get_rxf_data()
1405 data->fifo_num = fifo_idx; in iwl_ini_get_rxf_data()
1409 fifo_idx = ffs(fid2) - 1; in iwl_ini_get_rxf_data()
1410 if (iwl_fw_lookup_notif_ver(fwrt->fw, SYSTEM_GROUP, in iwl_ini_get_rxf_data()
1423 data->fifo_num = fifo_idx | IWL_RXF_UMAC_BIT; in iwl_ini_get_rxf_data()
1427 data->size = fwrt->smem_cfg.rxfifo2_size; in iwl_ini_get_rxf_data()
1428 data->offset = iwl_umac_prph(fwrt->trans, in iwl_ini_get_rxf_data()
1432 data->size = fwrt->smem_cfg.rxfifo2_control_size; in iwl_ini_get_rxf_data()
1433 data->offset = iwl_umac_prph(fwrt->trans, in iwl_ini_get_rxf_data()
1444 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_rxf_iter()
1447 struct iwl_fw_ini_error_dump_register *reg_dump = (void *)range->data; in iwl_dump_ini_rxf_iter()
1448 u32 offs = le32_to_cpu(reg->fifos.offset), addr; in iwl_dump_ini_rxf_iter()
1449 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_rxf_iter()
1456 return -EIO; in iwl_dump_ini_rxf_iter()
1458 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_rxf_iter()
1459 return -EBUSY; in iwl_dump_ini_rxf_iter()
1461 range->fifo_hdr.fifo_num = cpu_to_le32(rxf_data.fifo_num); in iwl_dump_ini_rxf_iter()
1462 range->fifo_hdr.num_of_registers = cpu_to_le32(registers_num); in iwl_dump_ini_rxf_iter()
1463 range->range_data_size = cpu_to_le32(rxf_data.size + registers_size); in iwl_dump_ini_rxf_iter()
1470 addr = le32_to_cpu(reg->addrs[i]) + offs; in iwl_dump_ini_rxf_iter()
1472 reg_dump->addr = cpu_to_le32(addr); in iwl_dump_ini_rxf_iter()
1473 reg_dump->data = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_rxf_iter()
1479 if (reg->fifos.hdr_only) { in iwl_dump_ini_rxf_iter()
1480 range->range_data_size = cpu_to_le32(registers_size); in iwl_dump_ini_rxf_iter()
1487 iwl_write_prph_no_grab(fwrt->trans, RXF_SET_FENCE_MODE + offs, 0x1); in iwl_dump_ini_rxf_iter()
1489 iwl_write_prph_no_grab(fwrt->trans, RXF_LD_WR2FENCE + offs, 0x1); in iwl_dump_ini_rxf_iter()
1491 iwl_write_prph_no_grab(fwrt->trans, RXF_LD_FENCE_OFFSET_ADDR + offs, in iwl_dump_ini_rxf_iter()
1498 *data++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr)); in iwl_dump_ini_rxf_iter()
1501 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_rxf_iter()
1503 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_rxf_iter()
1511 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_err_table_iter()
1512 struct iwl_fw_ini_region_err_table *err_table = &reg->err_table; in iwl_dump_ini_err_table_iter()
1514 u32 addr = le32_to_cpu(err_table->base_addr) + in iwl_dump_ini_err_table_iter()
1515 le32_to_cpu(err_table->offset); in iwl_dump_ini_err_table_iter()
1517 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_err_table_iter()
1518 range->range_data_size = err_table->size; in iwl_dump_ini_err_table_iter()
1519 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_err_table_iter()
1520 le32_to_cpu(err_table->size)); in iwl_dump_ini_err_table_iter()
1522 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_err_table_iter()
1530 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_special_mem_iter()
1532 &reg->special_mem; in iwl_dump_ini_special_mem_iter()
1535 u32 addr = le32_to_cpu(special_mem->base_addr) + in iwl_dump_ini_special_mem_iter()
1536 le32_to_cpu(special_mem->offset); in iwl_dump_ini_special_mem_iter()
1538 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_special_mem_iter()
1539 range->range_data_size = special_mem->size; in iwl_dump_ini_special_mem_iter()
1540 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_special_mem_iter()
1541 le32_to_cpu(special_mem->size)); in iwl_dump_ini_special_mem_iter()
1543 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_special_mem_iter()
1551 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_dbgi_sram_iter()
1553 __le32 *val = range->data; in iwl_dump_ini_dbgi_sram_iter()
1557 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_dbgi_sram_iter()
1558 return -EBUSY; in iwl_dump_ini_dbgi_sram_iter()
1560 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_dbgi_sram_iter()
1561 for (i = 0; i < (le32_to_cpu(reg->dev_addr.size) / 4); i++) { in iwl_dump_ini_dbgi_sram_iter()
1562 prph_data = iwl_read_prph_no_grab(fwrt->trans, (i % 2) ? in iwl_dump_ini_dbgi_sram_iter()
1566 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_dbgi_sram_iter()
1567 return -EBUSY; in iwl_dump_ini_dbgi_sram_iter()
1571 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_dbgi_sram_iter()
1572 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_dbgi_sram_iter()
1580 struct iwl_rx_packet *pkt = reg_data->dump_data->fw_pkt; in iwl_dump_ini_fw_pkt_iter()
1584 return -EIO; in iwl_dump_ini_fw_pkt_iter()
1588 memcpy(&range->fw_pkt_hdr, &pkt->hdr, sizeof(range->fw_pkt_hdr)); in iwl_dump_ini_fw_pkt_iter()
1589 range->range_data_size = cpu_to_le32(pkt_len); in iwl_dump_ini_fw_pkt_iter()
1591 memcpy(range->data, pkt->data, pkt_len); in iwl_dump_ini_fw_pkt_iter()
1593 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_fw_pkt_iter()
1602 u64 imr_curr_addr = fwrt->trans->dbg.imr_data.imr_curr_addr; in iwl_dump_ini_imr_iter()
1603 u32 imr_rem_bytes = fwrt->trans->dbg.imr_data.imr2sram_remainbyte; in iwl_dump_ini_imr_iter()
1604 u32 sram_addr = fwrt->trans->dbg.imr_data.sram_addr; in iwl_dump_ini_imr_iter()
1605 u32 sram_size = fwrt->trans->dbg.imr_data.sram_size; in iwl_dump_ini_imr_iter()
1608 range->range_data_size = cpu_to_le32(size_to_dump); in iwl_dump_ini_imr_iter()
1609 if (iwl_trans_write_imr_mem(fwrt->trans, sram_addr, in iwl_dump_ini_imr_iter()
1612 return -1; in iwl_dump_ini_imr_iter()
1615 fwrt->trans->dbg.imr_data.imr_curr_addr = imr_curr_addr + size_to_dump; in iwl_dump_ini_imr_iter()
1616 fwrt->trans->dbg.imr_data.imr2sram_remainbyte -= size_to_dump; in iwl_dump_ini_imr_iter()
1618 iwl_trans_read_mem_bytes(fwrt->trans, sram_addr, range->data, in iwl_dump_ini_imr_iter()
1620 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_imr_iter()
1630 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_mem_fill_header()
1632 return dump->data; in iwl_dump_ini_mem_fill_header()
1636 * mask_apply_and_normalize - applies mask on val and normalize the result
1645 return (val & mask) >> (ffs(mask) - 1); in mask_apply_and_normalize()
1656 offs = (alloc_id - IWL_FW_INI_ALLOCATION_ID_DBGC1) * 0x100; in iwl_get_mon_reg()
1658 if (!reg_info || !reg_info->addr || !reg_info->mask) in iwl_get_mon_reg()
1661 val = iwl_read_prph_no_grab(fwrt->trans, reg_info->addr + offs); in iwl_get_mon_reg()
1663 return cpu_to_le32(mask_apply_and_normalize(val, reg_info->mask)); in iwl_get_mon_reg()
1671 if (!iwl_trans_grab_nic_access(fwrt->trans)) { in iwl_dump_ini_mon_fill_header()
1676 data->write_ptr = iwl_get_mon_reg(fwrt, alloc_id, in iwl_dump_ini_mon_fill_header()
1677 &addrs->write_ptr); in iwl_dump_ini_mon_fill_header()
1678 if (fwrt->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) { in iwl_dump_ini_mon_fill_header()
1679 u32 wrt_ptr = le32_to_cpu(data->write_ptr); in iwl_dump_ini_mon_fill_header()
1681 data->write_ptr = cpu_to_le32(wrt_ptr >> 2); in iwl_dump_ini_mon_fill_header()
1683 data->cycle_cnt = iwl_get_mon_reg(fwrt, alloc_id, in iwl_dump_ini_mon_fill_header()
1684 &addrs->cycle_cnt); in iwl_dump_ini_mon_fill_header()
1685 data->cur_frag = iwl_get_mon_reg(fwrt, alloc_id, in iwl_dump_ini_mon_fill_header()
1686 &addrs->cur_frag); in iwl_dump_ini_mon_fill_header()
1688 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_mon_fill_header()
1690 data->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_mon_fill_header()
1692 return data->data; in iwl_dump_ini_mon_fill_header()
1701 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_fill_header()
1702 u32 alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_fill_header()
1705 &fwrt->trans->cfg->mon_dram_regs); in iwl_dump_ini_mon_dram_fill_header()
1714 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_smem_fill_header()
1715 u32 alloc_id = le32_to_cpu(reg->internal_buffer.alloc_id); in iwl_dump_ini_mon_smem_fill_header()
1718 &fwrt->trans->cfg->mon_smem_regs); in iwl_dump_ini_mon_smem_fill_header()
1732 &fwrt->trans->cfg->mon_dbgi_regs); in iwl_dump_ini_mon_dbgi_fill_header()
1740 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_err_table_fill_header()
1743 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_err_table_fill_header()
1744 dump->version = reg->err_table.version; in iwl_dump_ini_err_table_fill_header()
1746 return dump->data; in iwl_dump_ini_err_table_fill_header()
1754 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_special_mem_fill_header()
1757 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_special_mem_fill_header()
1758 dump->type = reg->special_mem.type; in iwl_dump_ini_special_mem_fill_header()
1759 dump->version = reg->special_mem.version; in iwl_dump_ini_special_mem_fill_header()
1761 return dump->data; in iwl_dump_ini_special_mem_fill_header()
1771 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_imr_fill_header()
1773 return dump->data; in iwl_dump_ini_imr_fill_header()
1779 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem_ranges()
1781 return iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_mem_ranges()
1787 if (fwrt->trans->trans_cfg->gen2) { in iwl_dump_ini_paging_ranges()
1788 if (fwrt->trans->init_dram.paging_cnt) in iwl_dump_ini_paging_ranges()
1789 return fwrt->trans->init_dram.paging_cnt - 1; in iwl_dump_ini_paging_ranges()
1794 return fwrt->num_of_paging_blk; in iwl_dump_ini_paging_ranges()
1801 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_ranges()
1803 u32 ranges = 0, alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_ranges()
1806 fw_mon = &fwrt->trans->dbg.fw_mon_ini[alloc_id]; in iwl_dump_ini_mon_dram_ranges()
1808 for (i = 0; i < fw_mon->num_frags; i++) { in iwl_dump_ini_mon_dram_ranges()
1809 if (!fw_mon->frags[i].size) in iwl_dump_ini_mon_dram_ranges()
1841 u32 imr_enable = fwrt->trans->dbg.imr_data.imr_enable; in iwl_dump_ini_imr_ranges()
1842 u32 imr_size = fwrt->trans->dbg.imr_data.imr_size; in iwl_dump_ini_imr_ranges()
1843 u32 sram_size = fwrt->trans->dbg.imr_data.sram_size; in iwl_dump_ini_imr_ranges()
1858 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem_get_size()
1859 u32 size = le32_to_cpu(reg->dev_addr.size); in iwl_dump_ini_mem_get_size()
1880 if (fwrt->trans->trans_cfg->gen2) in iwl_dump_ini_paging_get_size()
1881 size += fwrt->trans->init_dram.paging[i].size; in iwl_dump_ini_paging_get_size()
1883 size += fwrt->fw_paging_db[i].fw_paging_size; in iwl_dump_ini_paging_get_size()
1893 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_get_size()
1895 u32 size = 0, alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_get_size()
1898 fw_mon = &fwrt->trans->dbg.fw_mon_ini[alloc_id]; in iwl_dump_ini_mon_dram_get_size()
1900 for (i = 0; i < fw_mon->num_frags; i++) { in iwl_dump_ini_mon_dram_get_size()
1901 struct iwl_dram_data *frag = &fw_mon->frags[i]; in iwl_dump_ini_mon_dram_get_size()
1903 if (!frag->size) in iwl_dump_ini_mon_dram_get_size()
1906 size += sizeof(struct iwl_fw_ini_error_dump_range) + frag->size; in iwl_dump_ini_mon_dram_get_size()
1919 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_smem_get_size()
1922 size = le32_to_cpu(reg->internal_buffer.size); in iwl_dump_ini_mon_smem_get_size()
1935 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dbgi_get_size()
1936 u32 size = le32_to_cpu(reg->dev_addr.size); in iwl_dump_ini_mon_dbgi_get_size()
1949 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_txf_get_size()
1950 struct iwl_txf_iter_data *iter = &fwrt->dump.txf_iter_data; in iwl_dump_ini_txf_get_size()
1951 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_txf_get_size()
1959 if (!reg->fifos.hdr_only) in iwl_dump_ini_txf_get_size()
1960 size += iter->fifo_size; in iwl_dump_ini_txf_get_size()
1972 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_rxf_get_size()
1974 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_rxf_get_size()
1979 if (reg->fifos.hdr_only) in iwl_dump_ini_rxf_get_size()
1992 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_err_table_get_size()
1993 u32 size = le32_to_cpu(reg->err_table.size); in iwl_dump_ini_err_table_get_size()
2006 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_special_mem_get_size()
2007 u32 size = le32_to_cpu(reg->special_mem.size); in iwl_dump_ini_special_mem_get_size()
2022 if (!reg_data->dump_data->fw_pkt) in iwl_dump_ini_fw_pkt_get_size()
2025 size += iwl_rx_packet_payload_len(reg_data->dump_data->fw_pkt); in iwl_dump_ini_fw_pkt_get_size()
2038 u32 imr_enable = fwrt->trans->dbg.imr_data.imr_enable; in iwl_dump_ini_imr_get_size()
2039 u32 imr_size = fwrt->trans->dbg.imr_data.imr_size; in iwl_dump_ini_imr_get_size()
2040 u32 sram_size = fwrt->trans->dbg.imr_data.sram_size; in iwl_dump_ini_imr_get_size()
2059 * struct iwl_dump_ini_mem_ops - ini memory dump operations
2086 * @fwrt: fw runtime struct
2095 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem()
2099 u32 type = reg->type; in iwl_dump_ini_mem()
2100 u32 id = le32_get_bits(reg->id, IWL_FW_INI_REGION_ID_MASK); in iwl_dump_ini_mem()
2110 if (le32_to_cpu(reg->hdr.version) >= 2) { in iwl_dump_ini_mem()
2111 u32 dp = le32_get_bits(reg->id, in iwl_dump_ini_mem()
2117 "WRT: no dump - type %d and policy mismatch=%d\n", in iwl_dump_ini_mem()
2123 "WRT: no dump - type %d and policy mismatch=%d\n", in iwl_dump_ini_mem()
2129 "WRT: no dump - type %d and policy mismatch=%d\n", in iwl_dump_ini_mem()
2135 if (!ops->get_num_of_ranges || !ops->get_size || !ops->fill_mem_hdr || in iwl_dump_ini_mem()
2136 !ops->fill_range) { in iwl_dump_ini_mem()
2141 size = ops->get_size(fwrt, reg_data); in iwl_dump_ini_mem()
2152 entry->size = sizeof(*tlv) + size; in iwl_dump_ini_mem()
2154 tlv = (void *)entry->data; in iwl_dump_ini_mem()
2155 tlv->type = reg->type; in iwl_dump_ini_mem()
2156 tlv->sub_type = reg->sub_type; in iwl_dump_ini_mem()
2157 tlv->sub_type_ver = reg->sub_type_ver; in iwl_dump_ini_mem()
2158 tlv->reserved = reg->reserved; in iwl_dump_ini_mem()
2159 tlv->len = cpu_to_le32(size); in iwl_dump_ini_mem()
2161 num_of_ranges = ops->get_num_of_ranges(fwrt, reg_data); in iwl_dump_ini_mem()
2163 header = (void *)tlv->data; in iwl_dump_ini_mem()
2164 header->region_id = cpu_to_le32(id); in iwl_dump_ini_mem()
2165 header->num_of_ranges = cpu_to_le32(num_of_ranges); in iwl_dump_ini_mem()
2166 header->name_len = cpu_to_le32(IWL_FW_INI_MAX_NAME); in iwl_dump_ini_mem()
2167 memcpy(header->name, reg->name, IWL_FW_INI_MAX_NAME); in iwl_dump_ini_mem()
2170 range = ops->fill_mem_hdr(fwrt, reg_data, header, free_size); in iwl_dump_ini_mem()
2178 header_size = range - (u8 *)header; in iwl_dump_ini_mem()
2188 free_size -= header_size; in iwl_dump_ini_mem()
2191 int range_size = ops->fill_range(fwrt, reg_data, range, in iwl_dump_ini_mem()
2208 free_size -= range_size; in iwl_dump_ini_mem()
2212 list_add_tail(&entry->list, list); in iwl_dump_ini_mem()
2214 return entry->size; in iwl_dump_ini_mem()
2235 list_for_each_entry(node, &fwrt->trans->dbg.debug_info_tlv_list, list) { in iwl_dump_ini_info()
2244 entry->size = size; in iwl_dump_ini_info()
2246 tlv = (void *)entry->data; in iwl_dump_ini_info()
2247 tlv->type = cpu_to_le32(IWL_INI_DUMP_INFO_TYPE); in iwl_dump_ini_info()
2248 tlv->len = cpu_to_le32(size - sizeof(*tlv)); in iwl_dump_ini_info()
2250 dump = (void *)tlv->data; in iwl_dump_ini_info()
2252 dump->version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_info()
2253 dump->time_point = trigger->time_point; in iwl_dump_ini_info()
2254 dump->trigger_reason = trigger->trigger_reason; in iwl_dump_ini_info()
2255 dump->external_cfg_state = in iwl_dump_ini_info()
2256 cpu_to_le32(fwrt->trans->dbg.external_ini_cfg); in iwl_dump_ini_info()
2258 dump->ver_type = cpu_to_le32(fwrt->dump.fw_ver.type); in iwl_dump_ini_info()
2259 dump->ver_subtype = cpu_to_le32(fwrt->dump.fw_ver.subtype); in iwl_dump_ini_info()
2261 dump->hw_step = cpu_to_le32(fwrt->trans->hw_rev_step); in iwl_dump_ini_info()
2267 hw_type = CSR_HW_REV_TYPE(fwrt->trans->hw_rev); in iwl_dump_ini_info()
2269 u32 prph_val = iwl_read_umac_prph(fwrt->trans, WFPM_OTP_CFG1_ADDR); in iwl_dump_ini_info()
2281 dump->hw_type = cpu_to_le32(hw_type); in iwl_dump_ini_info()
2283 dump->rf_id_flavor = in iwl_dump_ini_info()
2284 cpu_to_le32(CSR_HW_RFID_FLAVOR(fwrt->trans->hw_rf_id)); in iwl_dump_ini_info()
2285 dump->rf_id_dash = cpu_to_le32(CSR_HW_RFID_DASH(fwrt->trans->hw_rf_id)); in iwl_dump_ini_info()
2286 dump->rf_id_step = cpu_to_le32(CSR_HW_RFID_STEP(fwrt->trans->hw_rf_id)); in iwl_dump_ini_info()
2287 dump->rf_id_type = cpu_to_le32(CSR_HW_RFID_TYPE(fwrt->trans->hw_rf_id)); in iwl_dump_ini_info()
2289 dump->lmac_major = cpu_to_le32(fwrt->dump.fw_ver.lmac_major); in iwl_dump_ini_info()
2290 dump->lmac_minor = cpu_to_le32(fwrt->dump.fw_ver.lmac_minor); in iwl_dump_ini_info()
2291 dump->umac_major = cpu_to_le32(fwrt->dump.fw_ver.umac_major); in iwl_dump_ini_info()
2292 dump->umac_minor = cpu_to_le32(fwrt->dump.fw_ver.umac_minor); in iwl_dump_ini_info()
2294 dump->fw_mon_mode = cpu_to_le32(fwrt->trans->dbg.ini_dest); in iwl_dump_ini_info()
2295 dump->regions_mask = trigger->regions_mask & in iwl_dump_ini_info()
2296 ~cpu_to_le64(fwrt->trans->dbg.unsupported_region_msk); in iwl_dump_ini_info()
2298 dump->build_tag_len = cpu_to_le32(sizeof(dump->build_tag)); in iwl_dump_ini_info()
2299 memcpy(dump->build_tag, fwrt->fw->human_readable, in iwl_dump_ini_info()
2300 sizeof(dump->build_tag)); in iwl_dump_ini_info()
2302 cfg_name = dump->cfg_names; in iwl_dump_ini_info()
2303 dump->num_of_cfg_names = cpu_to_le32(num_of_cfg_names); in iwl_dump_ini_info()
2304 list_for_each_entry(node, &fwrt->trans->dbg.debug_info_tlv_list, list) { in iwl_dump_ini_info()
2306 (void *)node->tlv.data; in iwl_dump_ini_info()
2308 cfg_name->image_type = debug_info->image_type; in iwl_dump_ini_info()
2309 cfg_name->cfg_name_len = in iwl_dump_ini_info()
2311 memcpy(cfg_name->cfg_name, debug_info->debug_cfg_name, in iwl_dump_ini_info()
2312 sizeof(cfg_name->cfg_name)); in iwl_dump_ini_info()
2319 list_add(&entry->list, list); in iwl_dump_ini_info()
2321 return entry->size; in iwl_dump_ini_info()
2329 u32 len = strnlen(fwrt->trans->dbg.dump_file_name_ext, in iwl_dump_ini_file_name_info()
2332 if (!fwrt->trans->dbg.dump_file_name_ext_valid) in iwl_dump_ini_file_name_info()
2339 entry->size = sizeof(*tlv) + len; in iwl_dump_ini_file_name_info()
2341 tlv = (void *)entry->data; in iwl_dump_ini_file_name_info()
2342 tlv->type = cpu_to_le32(IWL_INI_DUMP_NAME_TYPE); in iwl_dump_ini_file_name_info()
2343 tlv->len = cpu_to_le32(len); in iwl_dump_ini_file_name_info()
2344 memcpy(tlv->data, fwrt->trans->dbg.dump_file_name_ext, len); in iwl_dump_ini_file_name_info()
2347 list_add_tail(&entry->list, list); in iwl_dump_ini_file_name_info()
2349 fwrt->trans->dbg.dump_file_name_ext_valid = false; in iwl_dump_ini_file_name_info()
2351 return entry->size; in iwl_dump_ini_file_name_info()
2459 struct iwl_fw_ini_trigger_tlv *trigger = dump_data->trig; in iwl_dump_ini_trigger()
2460 enum iwl_fw_ini_time_point tp_id = le32_to_cpu(trigger->time_point); in iwl_dump_ini_trigger()
2469 u64 regions_mask = le64_to_cpu(trigger->regions_mask) & in iwl_dump_ini_trigger()
2470 ~(fwrt->trans->dbg.unsupported_region_msk); in iwl_dump_ini_trigger()
2472 BUILD_BUG_ON(sizeof(trigger->regions_mask) != sizeof(regions_mask)); in iwl_dump_ini_trigger()
2473 BUILD_BUG_ON((sizeof(trigger->regions_mask) * BITS_PER_BYTE) < in iwl_dump_ini_trigger()
2474 ARRAY_SIZE(fwrt->trans->dbg.active_regions)); in iwl_dump_ini_trigger()
2476 for (i = 0; i < ARRAY_SIZE(fwrt->trans->dbg.active_regions); i++) { in iwl_dump_ini_trigger()
2483 reg_data.reg_tlv = fwrt->trans->dbg.active_regions[i]; in iwl_dump_ini_trigger()
2490 reg = (void *)reg_data.reg_tlv->data; in iwl_dump_ini_trigger()
2491 reg_type = reg->type; in iwl_dump_ini_trigger()
2503 * DRAM_IMR can be collected only for FW/HW error timepoint in iwl_dump_ini_trigger()
2504 * when fw is not alive. In addition, it must be collected in iwl_dump_ini_trigger()
2511 imr_reg_data.reg_tlv = fwrt->trans->dbg.active_regions[i]; in iwl_dump_ini_trigger()
2540 enum iwl_fw_ini_time_point tp_id = le32_to_cpu(trig->time_point); in iwl_fw_ini_trigger_on()
2541 u32 usec = le32_to_cpu(trig->ignore_consec); in iwl_fw_ini_trigger_on()
2543 if (!iwl_trans_dbg_ini_valid(fwrt->trans) || in iwl_fw_ini_trigger_on()
2556 struct iwl_fw_ini_trigger_tlv *trigger = dump_data->trig; in iwl_dump_ini_file_gen()
2562 !le64_to_cpu(trigger->regions_mask)) in iwl_dump_ini_file_gen()
2569 entry->size = sizeof(*hdr); in iwl_dump_ini_file_gen()
2577 hdr = (void *)entry->data; in iwl_dump_ini_file_gen()
2578 hdr->barker = cpu_to_le32(IWL_FW_INI_ERROR_DUMP_BARKER); in iwl_dump_ini_file_gen()
2579 hdr->file_len = cpu_to_le32(size + entry->size); in iwl_dump_ini_file_gen()
2581 list_add(&entry->list, list); in iwl_dump_ini_file_gen()
2583 return le32_to_cpu(hdr->file_len); in iwl_dump_ini_file_gen()
2592 fwrt->dump.lmac_err_id[0] = 0; in iwl_fw_free_dump_desc()
2593 if (fwrt->smem_cfg.num_lmacs > 1) in iwl_fw_free_dump_desc()
2594 fwrt->dump.lmac_err_id[1] = 0; in iwl_fw_free_dump_desc()
2595 fwrt->dump.umac_err_id = 0; in iwl_fw_free_dump_desc()
2605 u32 dump_mask = fwrt->fw->dbg.dump_mask; in iwl_fw_error_dump()
2611 if (dump_data->monitor_only) in iwl_fw_error_dump()
2614 fw_error_dump.trans_ptr = iwl_trans_dump_data(fwrt->trans, dump_mask, in iwl_fw_error_dump()
2615 fwrt->sanitize_ops, in iwl_fw_error_dump()
2616 fwrt->sanitize_ctx); in iwl_fw_error_dump()
2617 file_len = le32_to_cpu(dump_file->file_len); in iwl_fw_error_dump()
2621 file_len += fw_error_dump.trans_ptr->len; in iwl_fw_error_dump()
2622 dump_file->file_len = cpu_to_le32(file_len); in iwl_fw_error_dump()
2634 fw_error_dump.trans_ptr->data, in iwl_fw_error_dump()
2635 fw_error_dump.trans_ptr->len, in iwl_fw_error_dump()
2637 dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len, in iwl_fw_error_dump()
2648 list_entry(list->next, typeof(*entry), list); in iwl_dump_ini_list_free()
2650 list_del(&entry->list); in iwl_dump_ini_list_free()
2657 dump_data->trig = NULL; in iwl_fw_error_dump_data_free()
2658 kfree(dump_data->fw_pkt); in iwl_fw_error_dump_data_free()
2659 dump_data->fw_pkt = NULL; in iwl_fw_error_dump_data_free()
2680 entry->data, entry->size, offs); in iwl_fw_error_ini_dump()
2681 offs += entry->size; in iwl_fw_error_ini_dump()
2683 dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len, in iwl_fw_error_ini_dump()
2704 if (iwl_trans_dbg_ini_valid(fwrt->trans)) { in iwl_fw_dbg_collect_desc()
2714 if (fwrt->dump.active_wks == ~0UL) in iwl_fw_dbg_collect_desc()
2715 return -EBUSY; in iwl_fw_dbg_collect_desc()
2717 idx = ffz(fwrt->dump.active_wks); in iwl_fw_dbg_collect_desc()
2720 test_and_set_bit(fwrt->dump.wks[idx].idx, &fwrt->dump.active_wks)) in iwl_fw_dbg_collect_desc()
2721 return -EBUSY; in iwl_fw_dbg_collect_desc()
2723 wk_data = &fwrt->dump.wks[idx]; in iwl_fw_dbg_collect_desc()
2725 if (WARN_ON(wk_data->dump_data.desc)) in iwl_fw_dbg_collect_desc()
2726 iwl_fw_free_dump_desc(fwrt, wk_data->dump_data.desc); in iwl_fw_dbg_collect_desc()
2728 wk_data->dump_data.desc = desc; in iwl_fw_dbg_collect_desc()
2729 wk_data->dump_data.monitor_only = monitor_only; in iwl_fw_dbg_collect_desc()
2732 le32_to_cpu(desc->trig_desc.type)); in iwl_fw_dbg_collect_desc()
2734 schedule_delayed_work(&wk_data->wk, usecs_to_jiffies(delay)); in iwl_fw_dbg_collect_desc()
2743 if (!test_bit(STATUS_DEVICE_ENABLED, &fwrt->trans->status)) in iwl_fw_dbg_error_collect()
2744 return -EIO; in iwl_fw_dbg_error_collect()
2746 if (iwl_trans_dbg_ini_valid(fwrt->trans)) { in iwl_fw_dbg_error_collect()
2749 return -EIO; in iwl_fw_dbg_error_collect()
2762 return -ENOMEM; in iwl_fw_dbg_error_collect()
2764 iwl_dump_error_desc->trig_desc.type = cpu_to_le32(trig_type); in iwl_fw_dbg_error_collect()
2765 iwl_dump_error_desc->len = 0; in iwl_fw_dbg_error_collect()
2775 iwl_trans_sync_nmi(fwrt->trans); in iwl_fw_dbg_error_collect()
2791 u16 occurrences = le16_to_cpu(trigger->occurrences) - 1; in iwl_fw_dbg_collect()
2793 if (!le16_to_cpu(trigger->occurrences)) in iwl_fw_dbg_collect()
2796 if (trigger->flags & IWL_FW_DBG_FORCE_RESTART) { in iwl_fw_dbg_collect()
2799 iwl_force_nmi(fwrt->trans); in iwl_fw_dbg_collect()
2803 trigger->occurrences = cpu_to_le16(occurrences); in iwl_fw_dbg_collect()
2804 monitor_only = trigger->mode & IWL_FW_DBG_TRIGGER_MONITOR_ONLY; in iwl_fw_dbg_collect()
2807 delay = le32_to_cpu(trigger->stop_delay) * USEC_PER_MSEC; in iwl_fw_dbg_collect()
2812 return -ENOMEM; in iwl_fw_dbg_collect()
2815 desc->len = len; in iwl_fw_dbg_collect()
2816 desc->trig_desc.type = cpu_to_le32(trig); in iwl_fw_dbg_collect()
2817 memcpy(desc->trig_desc.data, str, len); in iwl_fw_dbg_collect()
2830 if (iwl_trans_dbg_ini_valid(fwrt->trans)) in iwl_fw_dbg_collect_trig()
2836 buf[sizeof(buf) - 1] = '\0'; in iwl_fw_dbg_collect_trig()
2843 if (WARN_ON_ONCE(buf[sizeof(buf) - 1])) in iwl_fw_dbg_collect_trig()
2844 buf[sizeof(buf) - 1] = '\0'; in iwl_fw_dbg_collect_trig()
2849 ret = iwl_fw_dbg_collect(fwrt, le32_to_cpu(trigger->id), buf, len, in iwl_fw_dbg_collect_trig()
2865 if (WARN_ONCE(conf_id >= ARRAY_SIZE(fwrt->fw->dbg.conf_tlv), in iwl_fw_start_dbg_conf()
2867 return -EINVAL; in iwl_fw_start_dbg_conf()
2869 /* EARLY START - firmware's configuration is hard coded */ in iwl_fw_start_dbg_conf()
2870 if ((!fwrt->fw->dbg.conf_tlv[conf_id] || in iwl_fw_start_dbg_conf()
2871 !fwrt->fw->dbg.conf_tlv[conf_id]->num_of_hcmds) && in iwl_fw_start_dbg_conf()
2875 if (!fwrt->fw->dbg.conf_tlv[conf_id]) in iwl_fw_start_dbg_conf()
2876 return -EINVAL; in iwl_fw_start_dbg_conf()
2878 if (fwrt->dump.conf != FW_DBG_INVALID) in iwl_fw_start_dbg_conf()
2879 IWL_INFO(fwrt, "FW already configured (%d) - re-configuring\n", in iwl_fw_start_dbg_conf()
2880 fwrt->dump.conf); in iwl_fw_start_dbg_conf()
2882 /* Send all HCMDs for configuring the FW debug */ in iwl_fw_start_dbg_conf()
2883 ptr = (void *)&fwrt->fw->dbg.conf_tlv[conf_id]->hcmd; in iwl_fw_start_dbg_conf()
2884 for (i = 0; i < fwrt->fw->dbg.conf_tlv[conf_id]->num_of_hcmds; i++) { in iwl_fw_start_dbg_conf()
2887 .id = cmd->id, in iwl_fw_start_dbg_conf()
2888 .len = { le16_to_cpu(cmd->len), }, in iwl_fw_start_dbg_conf()
2889 .data = { cmd->data, }, in iwl_fw_start_dbg_conf()
2892 ret = iwl_trans_send_cmd(fwrt->trans, &hcmd); in iwl_fw_start_dbg_conf()
2897 ptr += le16_to_cpu(cmd->len); in iwl_fw_start_dbg_conf()
2900 fwrt->dump.conf = conf_id; in iwl_fw_start_dbg_conf()
2917 if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) in iwl_send_dbg_dump_complete_cmd()
2920 if (fw_has_capa(&fwrt->fw->ucode_capa, in iwl_send_dbg_dump_complete_cmd()
2924 iwl_trans_send_cmd(fwrt->trans, &hcmd); in iwl_send_dbg_dump_complete_cmd()
2935 &fwrt->dump.wks[wk_idx].dump_data; in iwl_fw_dbg_collect_sync()
2936 if (!test_bit(wk_idx, &fwrt->dump.active_wks)) in iwl_fw_dbg_collect_sync()
2939 if (!dump_data->trig) { in iwl_fw_dbg_collect_sync()
2944 if (!test_bit(STATUS_DEVICE_ENABLED, &fwrt->trans->status)) { in iwl_fw_dbg_collect_sync()
2945 IWL_ERR(fwrt, "Device is not enabled - cannot dump error\n"); in iwl_fw_dbg_collect_sync()
2949 /* there's no point in fw dump if the bus is dead */ in iwl_fw_dbg_collect_sync()
2950 if (test_bit(STATUS_TRANS_DEAD, &fwrt->trans->status)) { in iwl_fw_dbg_collect_sync()
2951 IWL_ERR(fwrt, "Skip fw error dump since bus is dead\n"); in iwl_fw_dbg_collect_sync()
2958 if (iwl_trans_dbg_ini_valid(fwrt->trans)) in iwl_fw_dbg_collect_sync()
2959 iwl_fw_error_ini_dump(fwrt, &fwrt->dump.wks[wk_idx].dump_data); in iwl_fw_dbg_collect_sync()
2961 iwl_fw_error_dump(fwrt, &fwrt->dump.wks[wk_idx].dump_data); in iwl_fw_dbg_collect_sync()
2966 if (iwl_trans_dbg_ini_valid(fwrt->trans)) { in iwl_fw_dbg_collect_sync()
2967 u32 policy = le32_to_cpu(dump_data->trig->apply_policy); in iwl_fw_dbg_collect_sync()
2968 u32 time_point = le32_to_cpu(dump_data->trig->time_point); in iwl_fw_dbg_collect_sync()
2976 if (fwrt->trans->dbg.last_tp_resetfw == IWL_FW_INI_RESET_FW_MODE_STOP_FW_ONLY) in iwl_fw_dbg_collect_sync()
2977 iwl_force_nmi(fwrt->trans); in iwl_fw_dbg_collect_sync()
2980 if (iwl_trans_dbg_ini_valid(fwrt->trans)) { in iwl_fw_dbg_collect_sync()
2983 iwl_fw_free_dump_desc(fwrt, dump_data->desc); in iwl_fw_dbg_collect_sync()
2984 dump_data->desc = NULL; in iwl_fw_dbg_collect_sync()
2987 clear_bit(wk_idx, &fwrt->dump.active_wks); in iwl_fw_dbg_collect_sync()
2994 struct iwl_fw_ini_trigger_tlv *trig = dump_data->trig; in iwl_fw_dbg_ini_collect()
2995 enum iwl_fw_ini_time_point tp_id = le32_to_cpu(trig->time_point); in iwl_fw_dbg_ini_collect()
3002 return -EINVAL; in iwl_fw_dbg_ini_collect()
3005 delay = le32_to_cpu(trig->dump_delay); in iwl_fw_dbg_ini_collect()
3006 occur = le32_to_cpu(trig->occurrences); in iwl_fw_dbg_ini_collect()
3010 trig->occurrences = cpu_to_le32(--occur); in iwl_fw_dbg_ini_collect()
3016 if (fwrt->dump.active_wks == ~0UL) in iwl_fw_dbg_ini_collect()
3017 return -EBUSY; in iwl_fw_dbg_ini_collect()
3019 idx = ffz(fwrt->dump.active_wks); in iwl_fw_dbg_ini_collect()
3022 test_and_set_bit(fwrt->dump.wks[idx].idx, &fwrt->dump.active_wks)) in iwl_fw_dbg_ini_collect()
3023 return -EBUSY; in iwl_fw_dbg_ini_collect()
3025 fwrt->dump.wks[idx].dump_data = *dump_data; in iwl_fw_dbg_ini_collect()
3037 schedule_delayed_work(&fwrt->dump.wks[idx].wk, usecs_to_jiffies(delay)); in iwl_fw_dbg_ini_collect()
3047 container_of(wks, typeof(*fwrt), dump.wks[wks->idx]); in iwl_fw_error_dump_wk()
3052 if (fwrt->ops && fwrt->ops->dump_start) in iwl_fw_error_dump_wk()
3053 fwrt->ops->dump_start(fwrt->ops_ctx); in iwl_fw_error_dump_wk()
3055 iwl_fw_dbg_collect_sync(fwrt, wks->idx); in iwl_fw_error_dump_wk()
3057 if (fwrt->ops && fwrt->ops->dump_end) in iwl_fw_error_dump_wk()
3058 fwrt->ops->dump_end(fwrt->ops_ctx); in iwl_fw_error_dump_wk()
3063 const struct iwl_cfg *cfg = fwrt->trans->cfg; in iwl_fw_dbg_read_d3_debug_data() local
3068 if (!fwrt->dump.d3_debug_data) { in iwl_fw_dbg_read_d3_debug_data()
3069 fwrt->dump.d3_debug_data = kmalloc(cfg->d3_debug_data_length, in iwl_fw_dbg_read_d3_debug_data()
3071 if (!fwrt->dump.d3_debug_data) { in iwl_fw_dbg_read_d3_debug_data()
3079 iwl_trans_read_mem_bytes(fwrt->trans, cfg->d3_debug_data_base_addr, in iwl_fw_dbg_read_d3_debug_data()
3080 fwrt->dump.d3_debug_data, in iwl_fw_dbg_read_d3_debug_data()
3081 cfg->d3_debug_data_length); in iwl_fw_dbg_read_d3_debug_data()
3083 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_fw_dbg_read_d3_debug_data()
3084 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, in iwl_fw_dbg_read_d3_debug_data()
3085 cfg->d3_debug_data_base_addr, in iwl_fw_dbg_read_d3_debug_data()
3086 fwrt->dump.d3_debug_data, in iwl_fw_dbg_read_d3_debug_data()
3087 cfg->d3_debug_data_length); in iwl_fw_dbg_read_d3_debug_data()
3095 iwl_dbg_tlv_del_timers(fwrt->trans); in iwl_fw_dbg_stop_sync()
3122 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) { in iwl_fw_dbg_stop_recording()
3128 params->in_sample = iwl_read_umac_prph(trans, DBGC_IN_SAMPLE); in iwl_fw_dbg_stop_recording()
3129 params->out_ctrl = iwl_read_umac_prph(trans, DBGC_OUT_CTRL); in iwl_fw_dbg_stop_recording()
3144 return -EIO; in iwl_fw_dbg_restart_recording()
3146 if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) { in iwl_fw_dbg_restart_recording()
3151 iwl_write_umac_prph(trans, DBGC_IN_SAMPLE, params->in_sample); in iwl_fw_dbg_restart_recording()
3152 iwl_write_umac_prph(trans, DBGC_OUT_CTRL, params->out_ctrl); in iwl_fw_dbg_restart_recording()
3170 int cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw, in iwl_fw_send_timestamp_marker_cmd()
3177 * this is for finding the match between fw and kernel logs in iwl_fw_send_timestamp_marker_cmd()
3179 marker.timestamp = cpu_to_le64(fwrt->timestamp.seq++); in iwl_fw_send_timestamp_marker_cmd()
3186 return -EINVAL; in iwl_fw_send_timestamp_marker_cmd()
3192 ret = iwl_trans_send_cmd(fwrt->trans, &hcmd); in iwl_fw_send_timestamp_marker_cmd()
3195 resp = (void *)hcmd.resp_pkt->data; in iwl_fw_send_timestamp_marker_cmd()
3196 IWL_DEBUG_INFO(fwrt, "FW GP2 time: %u\n", in iwl_fw_send_timestamp_marker_cmd()
3197 le32_to_cpu(resp->gp2)); in iwl_fw_send_timestamp_marker_cmd()
3209 if (!iwl_trans_fw_running(fwrt->trans)) in iwl_fw_dbg_stop_restart_recording()
3212 if (fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_dbg_stop_restart_recording()
3216 ret = iwl_fw_dbg_suspend_resume_hcmd(fwrt->trans, stop); in iwl_fw_dbg_stop_restart_recording()
3218 iwl_fw_dbg_stop_recording(fwrt->trans, params); in iwl_fw_dbg_stop_restart_recording()
3220 ret = iwl_fw_dbg_restart_recording(fwrt->trans, params); in iwl_fw_dbg_stop_restart_recording()
3225 fwrt->trans->dbg.rec_on = false; in iwl_fw_dbg_stop_restart_recording()