Lines Matching +full:umac +full:- +full:reset
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2005-2014, 2018-2025 Intel Corporation
4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5 * Copyright (C) 2015-2017 Intel Deutschland GmbH
11 #include "iwl-drv.h"
15 #include "iwl-io.h"
16 #include "iwl-prph.h"
17 #include "iwl-csr.h"
18 #include "iwl-fh.h"
20 * struct iwl_fw_dump_ptrs - set of pointers needed for the fw-error-dump
37 u8 *pos = (void *)(*dump_data)->data; in iwl_read_radio_regs()
42 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_read_radio_regs()
45 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RADIO_REG); in iwl_read_radio_regs()
46 (*dump_data)->len = cpu_to_le32(RADIO_REG_MAX_READ); in iwl_read_radio_regs()
52 iwl_write_prph_no_grab(fwrt->trans, RSP_RADIO_CMD, rd_cmd); in iwl_read_radio_regs()
53 *pos = (u8)iwl_read_prph_no_grab(fwrt->trans, RSP_RADIO_RDDAT); in iwl_read_radio_regs()
60 iwl_trans_release_nic_access(fwrt->trans); in iwl_read_radio_regs()
72 fifo_hdr = (void *)(*dump_data)->data; in iwl_fwrt_dump_rxf()
73 fifo_data = (void *)fifo_hdr->data; in iwl_fwrt_dump_rxf()
81 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF); in iwl_fwrt_dump_rxf()
82 (*dump_data)->len = cpu_to_le32(fifo_len + sizeof(*fifo_hdr)); in iwl_fwrt_dump_rxf()
84 fifo_hdr->fifo_num = cpu_to_le32(fifo_num); in iwl_fwrt_dump_rxf()
85 fifo_hdr->available_bytes = in iwl_fwrt_dump_rxf()
86 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
88 fifo_hdr->wr_ptr = in iwl_fwrt_dump_rxf()
89 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
91 fifo_hdr->rd_ptr = in iwl_fwrt_dump_rxf()
92 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
94 fifo_hdr->fence_ptr = in iwl_fwrt_dump_rxf()
95 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
97 fifo_hdr->fence_mode = in iwl_fwrt_dump_rxf()
98 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
102 iwl_trans_write_prph(fwrt->trans, RXF_SET_FENCE_MODE + offset, 0x1); in iwl_fwrt_dump_rxf()
104 iwl_trans_write_prph(fwrt->trans, RXF_LD_WR2FENCE + offset, 0x1); in iwl_fwrt_dump_rxf()
106 iwl_trans_write_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
112 fifo_data[i] = iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
127 fifo_hdr = (void *)(*dump_data)->data; in iwl_fwrt_dump_txf()
128 fifo_data = (void *)fifo_hdr->data; in iwl_fwrt_dump_txf()
136 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_TXF); in iwl_fwrt_dump_txf()
137 (*dump_data)->len = cpu_to_le32(fifo_len + sizeof(*fifo_hdr)); in iwl_fwrt_dump_txf()
139 fifo_hdr->fifo_num = cpu_to_le32(fifo_num); in iwl_fwrt_dump_txf()
140 fifo_hdr->available_bytes = in iwl_fwrt_dump_txf()
141 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
143 fifo_hdr->wr_ptr = in iwl_fwrt_dump_txf()
144 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
146 fifo_hdr->rd_ptr = in iwl_fwrt_dump_txf()
147 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
149 fifo_hdr->fence_ptr = in iwl_fwrt_dump_txf()
150 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
152 fifo_hdr->fence_mode = in iwl_fwrt_dump_txf()
153 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
157 iwl_trans_write_prph(fwrt->trans, TXF_READ_MODIFY_ADDR + offset, in iwl_fwrt_dump_txf()
160 /* Dummy-read to advance the read pointer to the head */ in iwl_fwrt_dump_txf()
161 iwl_trans_read_prph(fwrt->trans, TXF_READ_MODIFY_DATA + offset); in iwl_fwrt_dump_txf()
165 fifo_data[i] = iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
169 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_txf) in iwl_fwrt_dump_txf()
170 fwrt->sanitize_ops->frob_txf(fwrt->sanitize_ctx, in iwl_fwrt_dump_txf()
179 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_fw_dump_rxf()
183 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_fw_dump_rxf()
189 cfg->lmac[0].rxfifo1_size, 0, 0); in iwl_fw_dump_rxf()
191 iwl_fwrt_dump_rxf(fwrt, dump_data, cfg->rxfifo2_size, in iwl_fw_dump_rxf()
193 fwrt->trans->mac_cfg->umac_prph_offset, 1); in iwl_fw_dump_rxf()
195 if (fwrt->smem_cfg.num_lmacs > 1) in iwl_fw_dump_rxf()
197 cfg->lmac[1].rxfifo1_size, in iwl_fw_dump_rxf()
201 iwl_trans_release_nic_access(fwrt->trans); in iwl_fw_dump_rxf()
208 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_fw_dump_txf()
215 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_fw_dump_txf()
220 for (i = 0; i < fwrt->smem_cfg.num_txfifo_entries; i++) { in iwl_fw_dump_txf()
222 iwl_trans_write_prph(fwrt->trans, TXF_LARC_NUM, i); in iwl_fw_dump_txf()
224 cfg->lmac[0].txfifo_size[i], 0, i); in iwl_fw_dump_txf()
228 if (fwrt->smem_cfg.num_lmacs > 1) { in iwl_fw_dump_txf()
229 for (i = 0; i < fwrt->smem_cfg.num_txfifo_entries; in iwl_fw_dump_txf()
232 iwl_trans_write_prph(fwrt->trans, in iwl_fw_dump_txf()
236 cfg->lmac[1].txfifo_size[i], in iwl_fw_dump_txf()
238 i + cfg->num_txfifo_entries); in iwl_fw_dump_txf()
244 fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_dump_txf()
246 /* Pull UMAC internal TXF data from all TXFs */ in iwl_fw_dump_txf()
248 i < ARRAY_SIZE(fwrt->smem_cfg.internal_txfifo_size); in iwl_fw_dump_txf()
250 fifo_hdr = (void *)(*dump_data)->data; in iwl_fw_dump_txf()
251 fifo_data = (void *)fifo_hdr->data; in iwl_fw_dump_txf()
252 fifo_len = fwrt->smem_cfg.internal_txfifo_size[i]; in iwl_fw_dump_txf()
259 (*dump_data)->type = in iwl_fw_dump_txf()
261 (*dump_data)->len = in iwl_fw_dump_txf()
264 fifo_hdr->fifo_num = cpu_to_le32(i); in iwl_fw_dump_txf()
267 iwl_trans_write_prph(fwrt->trans, TXF_CPU2_NUM, i + in iwl_fw_dump_txf()
268 fwrt->smem_cfg.num_txfifo_entries); in iwl_fw_dump_txf()
270 fifo_hdr->available_bytes = in iwl_fw_dump_txf()
271 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
273 fifo_hdr->wr_ptr = in iwl_fw_dump_txf()
274 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
276 fifo_hdr->rd_ptr = in iwl_fw_dump_txf()
277 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
279 fifo_hdr->fence_ptr = in iwl_fw_dump_txf()
280 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
282 fifo_hdr->fence_mode = in iwl_fw_dump_txf()
283 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
287 iwl_trans_write_prph(fwrt->trans, in iwl_fw_dump_txf()
291 /* Dummy-read to advance the read pointer to head */ in iwl_fw_dump_txf()
292 iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
299 iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_txf()
305 iwl_trans_release_nic_access(fwrt->trans); in iwl_fw_dump_txf()
527 struct iwl_trans *trans = fwrt->trans; in iwl_dump_prph()
542 int num_bytes_in_chunk = iwl_prph_dump_addr[i].end - in iwl_dump_prph()
545 (*data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_PRPH); in iwl_dump_prph()
546 (*data)->len = cpu_to_le32(sizeof(*prph) + in iwl_dump_prph()
548 prph = (void *)(*data)->data; in iwl_dump_prph()
549 prph->prph_start = cpu_to_le32(iwl_prph_dump_addr[i].start); in iwl_dump_prph()
553 iwl_prph_dump_addr[i].end - in iwl_dump_prph()
555 (void *)prph->data); in iwl_dump_prph()
564 * alloc_sgtable - allocates (chained) scatterlist in the given size,
597 n_fill = n_alloc - 1; in alloc_sgtable()
598 nents -= n_fill; in alloc_sgtable()
644 iwl_prph_dump_addr[i].end - in iwl_fw_get_prph_len()
660 if (fwrt->trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) { in iwl_fw_prph_handler()
663 } else if (fwrt->trans->mac_cfg->device_family >= in iwl_fw_prph_handler()
671 if (fwrt->trans->mac_cfg->mq_rx_supported) { in iwl_fw_prph_handler()
687 (*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM); in iwl_fw_dump_mem()
688 (*dump_data)->len = cpu_to_le32(len + sizeof(*dump_mem)); in iwl_fw_dump_mem()
689 dump_mem = (void *)(*dump_data)->data; in iwl_fw_dump_mem()
690 dump_mem->type = cpu_to_le32(type); in iwl_fw_dump_mem()
691 dump_mem->offset = cpu_to_le32(ofs); in iwl_fw_dump_mem()
692 iwl_trans_read_mem_bytes(fwrt->trans, ofs, dump_mem->data, len); in iwl_fw_dump_mem()
695 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_fw_dump_mem()
696 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, ofs, in iwl_fw_dump_mem()
697 dump_mem->data, len); in iwl_fw_dump_mem()
699 IWL_DEBUG_INFO(fwrt, "WRT memory dump. Type=%u\n", dump_mem->type); in iwl_fw_dump_mem()
718 ADD_LEN(fifo_len, mem_cfg->rxfifo2_size, hdr_len); in iwl_fw_rxf_len()
721 if (WARN_ON(mem_cfg->num_lmacs > MAX_NUM_LMAC)) in iwl_fw_rxf_len()
722 mem_cfg->num_lmacs = MAX_NUM_LMAC; in iwl_fw_rxf_len()
724 for (i = 0; i < mem_cfg->num_lmacs; i++) in iwl_fw_rxf_len()
725 ADD_LEN(fifo_len, mem_cfg->lmac[i].rxfifo1_size, hdr_len); in iwl_fw_rxf_len()
742 if (WARN_ON(mem_cfg->num_lmacs > MAX_NUM_LMAC)) in iwl_fw_txf_len()
743 mem_cfg->num_lmacs = MAX_NUM_LMAC; in iwl_fw_txf_len()
745 for (i = 0; i < mem_cfg->num_lmacs; i++) { in iwl_fw_txf_len()
748 for (j = 0; j < mem_cfg->num_txfifo_entries; j++) in iwl_fw_txf_len()
749 ADD_LEN(fifo_len, mem_cfg->lmac[i].txfifo_size[j], in iwl_fw_txf_len()
755 fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_txf_len()
759 for (i = 0; i < ARRAY_SIZE(mem_cfg->internal_txfifo_size); i++) in iwl_fw_txf_len()
760 ADD_LEN(fifo_len, mem_cfg->internal_txfifo_size[i], hdr_len); in iwl_fw_txf_len()
772 for (i = 1; i < fwrt->num_of_paging_blk + 1; i++) { in iwl_dump_paging()
775 fwrt->fw_paging_db[i].fw_paging_block; in iwl_dump_paging()
776 dma_addr_t addr = fwrt->fw_paging_db[i].fw_paging_phys; in iwl_dump_paging()
778 (*data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_PAGING); in iwl_dump_paging()
779 (*data)->len = cpu_to_le32(sizeof(*paging) + in iwl_dump_paging()
781 paging = (void *)(*data)->data; in iwl_dump_paging()
782 paging->index = cpu_to_le32(i); in iwl_dump_paging()
783 dma_sync_single_for_cpu(fwrt->trans->dev, addr, in iwl_dump_paging()
786 memcpy(paging->data, page_address(pages), in iwl_dump_paging()
788 dma_sync_single_for_device(fwrt->trans->dev, addr, in iwl_dump_paging()
793 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_dump_paging()
794 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, in iwl_dump_paging()
795 fwrt->fw_paging_db[i].fw_offs, in iwl_dump_paging()
796 paging->data, in iwl_dump_paging()
812 const struct iwl_fw_dbg_mem_seg_tlv *fw_mem = fwrt->fw->dbg.mem_tlv; in iwl_fw_error_dump_file()
813 struct iwl_fwrt_shared_mem_cfg *mem_cfg = &fwrt->smem_cfg; in iwl_fw_error_dump_file()
815 u32 smem_len = fwrt->fw->dbg.n_mem_tlv ? 0 : fwrt->trans->mac_cfg->base->smem_len; in iwl_fw_error_dump_file()
816 u32 sram2_len = fwrt->fw->dbg.n_mem_tlv ? in iwl_fw_error_dump_file()
817 0 : fwrt->trans->cfg->dccm2_len; in iwl_fw_error_dump_file()
820 /* SRAM - include stack CCM if driver knows the values for it */ in iwl_fw_error_dump_file()
821 if (!fwrt->trans->cfg->dccm_offset || in iwl_fw_error_dump_file()
822 !fwrt->trans->cfg->dccm_len) { in iwl_fw_error_dump_file()
825 if (fwrt->cur_fw_img >= IWL_UCODE_TYPE_MAX) in iwl_fw_error_dump_file()
827 img = &fwrt->fw->img[fwrt->cur_fw_img]; in iwl_fw_error_dump_file()
828 sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset; in iwl_fw_error_dump_file()
829 sram_len = img->sec[IWL_UCODE_SECTION_DATA].len; in iwl_fw_error_dump_file()
831 sram_ofs = fwrt->trans->cfg->dccm_offset; in iwl_fw_error_dump_file()
832 sram_len = fwrt->trans->cfg->dccm_len; in iwl_fw_error_dump_file()
836 if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) { in iwl_fw_error_dump_file()
845 if (fwrt->trans->mac_cfg->device_family == in iwl_fw_error_dump_file()
863 if (!fwrt->fw->dbg.n_mem_tlv) in iwl_fw_error_dump_file()
870 for (i = 0; i < fwrt->fw->dbg.n_mem_tlv; i++) in iwl_fw_error_dump_file()
876 file_len += fwrt->num_of_paging_blk * in iwl_fw_error_dump_file()
881 if (iwl_fw_dbg_is_d3_debug_enabled(fwrt) && fwrt->dump.d3_debug_data) { in iwl_fw_error_dump_file()
883 fwrt->trans->mac_cfg->base->d3_debug_data_length * 2; in iwl_fw_error_dump_file()
886 /* If we only want a monitor dump, reset the file length */ in iwl_fw_error_dump_file()
887 if (data->monitor_only) { in iwl_fw_error_dump_file()
893 data->desc) in iwl_fw_error_dump_file()
895 data->desc->len; in iwl_fw_error_dump_file()
901 fw_error_dump->fwrt_ptr = dump_file; in iwl_fw_error_dump_file()
903 dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER); in iwl_fw_error_dump_file()
904 dump_data = (void *)dump_file->data; in iwl_fw_error_dump_file()
907 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO); in iwl_fw_error_dump_file()
908 dump_data->len = cpu_to_le32(sizeof(*dump_info)); in iwl_fw_error_dump_file()
909 dump_info = (void *)dump_data->data; in iwl_fw_error_dump_file()
910 dump_info->hw_type = in iwl_fw_error_dump_file()
911 cpu_to_le32(CSR_HW_REV_TYPE(fwrt->trans->info.hw_rev)); in iwl_fw_error_dump_file()
912 dump_info->hw_step = in iwl_fw_error_dump_file()
913 cpu_to_le32(fwrt->trans->info.hw_rev_step); in iwl_fw_error_dump_file()
914 memcpy(dump_info->fw_human_readable, fwrt->fw->human_readable, in iwl_fw_error_dump_file()
915 sizeof(dump_info->fw_human_readable)); in iwl_fw_error_dump_file()
916 strscpy_pad(dump_info->dev_human_readable, in iwl_fw_error_dump_file()
917 fwrt->trans->info.name, in iwl_fw_error_dump_file()
918 sizeof(dump_info->dev_human_readable)); in iwl_fw_error_dump_file()
920 strscpy_pad(dump_info->bus_human_readable, fwrt->dev->bus->name, in iwl_fw_error_dump_file()
921 sizeof(dump_info->bus_human_readable)); in iwl_fw_error_dump_file()
923 strscpy_pad(dump_info->bus_human_readable, "<bus>", in iwl_fw_error_dump_file()
924 sizeof(dump_info->bus_human_readable)); in iwl_fw_error_dump_file()
926 dump_info->num_of_lmacs = fwrt->smem_cfg.num_lmacs; in iwl_fw_error_dump_file()
927 dump_info->lmac_err_id[0] = in iwl_fw_error_dump_file()
928 cpu_to_le32(fwrt->dump.lmac_err_id[0]); in iwl_fw_error_dump_file()
929 if (fwrt->smem_cfg.num_lmacs > 1) in iwl_fw_error_dump_file()
930 dump_info->lmac_err_id[1] = in iwl_fw_error_dump_file()
931 cpu_to_le32(fwrt->dump.lmac_err_id[1]); in iwl_fw_error_dump_file()
932 dump_info->umac_err_id = cpu_to_le32(fwrt->dump.umac_err_id); in iwl_fw_error_dump_file()
939 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_CFG); in iwl_fw_error_dump_file()
940 dump_data->len = cpu_to_le32(sizeof(*dump_smem_cfg)); in iwl_fw_error_dump_file()
941 dump_smem_cfg = (void *)dump_data->data; in iwl_fw_error_dump_file()
942 dump_smem_cfg->num_lmacs = cpu_to_le32(mem_cfg->num_lmacs); in iwl_fw_error_dump_file()
943 dump_smem_cfg->num_txfifo_entries = in iwl_fw_error_dump_file()
944 cpu_to_le32(mem_cfg->num_txfifo_entries); in iwl_fw_error_dump_file()
947 u32 *txf_size = mem_cfg->lmac[i].txfifo_size; in iwl_fw_error_dump_file()
950 dump_smem_cfg->lmac[i].txfifo_size[j] = in iwl_fw_error_dump_file()
952 dump_smem_cfg->lmac[i].rxfifo1_size = in iwl_fw_error_dump_file()
953 cpu_to_le32(mem_cfg->lmac[i].rxfifo1_size); in iwl_fw_error_dump_file()
955 dump_smem_cfg->rxfifo2_size = in iwl_fw_error_dump_file()
956 cpu_to_le32(mem_cfg->rxfifo2_size); in iwl_fw_error_dump_file()
957 dump_smem_cfg->internal_txfifo_addr = in iwl_fw_error_dump_file()
958 cpu_to_le32(mem_cfg->internal_txfifo_addr); in iwl_fw_error_dump_file()
960 dump_smem_cfg->internal_txfifo_size[i] = in iwl_fw_error_dump_file()
961 cpu_to_le32(mem_cfg->internal_txfifo_size[i]); in iwl_fw_error_dump_file()
977 data->desc) { in iwl_fw_error_dump_file()
978 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_ERROR_INFO); in iwl_fw_error_dump_file()
979 dump_data->len = cpu_to_le32(sizeof(*dump_trig) + in iwl_fw_error_dump_file()
980 data->desc->len); in iwl_fw_error_dump_file()
981 dump_trig = (void *)dump_data->data; in iwl_fw_error_dump_file()
982 memcpy(dump_trig, &data->desc->trig_desc, in iwl_fw_error_dump_file()
983 sizeof(*dump_trig) + data->desc->len); in iwl_fw_error_dump_file()
989 if (data->monitor_only) in iwl_fw_error_dump_file()
994 fwrt->fw->dbg.mem_tlv; in iwl_fw_error_dump_file()
996 if (!fwrt->fw->dbg.n_mem_tlv) in iwl_fw_error_dump_file()
1000 for (i = 0; i < fwrt->fw->dbg.n_mem_tlv; i++) { in iwl_fw_error_dump_file()
1009 fwrt->trans->mac_cfg->base->smem_offset, in iwl_fw_error_dump_file()
1013 fwrt->trans->cfg->dccm2_offset, in iwl_fw_error_dump_file()
1017 if (iwl_fw_dbg_is_d3_debug_enabled(fwrt) && fwrt->dump.d3_debug_data) { in iwl_fw_error_dump_file()
1018 u32 addr = fwrt->trans->mac_cfg->base->d3_debug_data_base_addr; in iwl_fw_error_dump_file()
1019 size_t data_size = fwrt->trans->mac_cfg->base->d3_debug_data_length; in iwl_fw_error_dump_file()
1021 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_D3_DEBUG_DATA); in iwl_fw_error_dump_file()
1022 dump_data->len = cpu_to_le32(data_size * 2); in iwl_fw_error_dump_file()
1024 memcpy(dump_data->data, fwrt->dump.d3_debug_data, data_size); in iwl_fw_error_dump_file()
1026 kfree(fwrt->dump.d3_debug_data); in iwl_fw_error_dump_file()
1027 fwrt->dump.d3_debug_data = NULL; in iwl_fw_error_dump_file()
1029 iwl_trans_read_mem_bytes(fwrt->trans, addr, in iwl_fw_error_dump_file()
1030 dump_data->data + data_size, in iwl_fw_error_dump_file()
1033 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem) in iwl_fw_error_dump_file()
1034 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx, addr, in iwl_fw_error_dump_file()
1035 dump_data->data + data_size, in iwl_fw_error_dump_file()
1049 dump_file->file_len = cpu_to_le32(file_len); in iwl_fw_error_dump_file()
1054 * struct iwl_dump_ini_region_data - region data
1068 __le32 *val = range->data; in iwl_dump_ini_prph_mac_iter_common()
1071 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_prph_mac_iter_common()
1072 range->range_data_size = size; in iwl_dump_ini_prph_mac_iter_common()
1074 *val++ = cpu_to_le32(iwl_read_prph(fwrt->trans, addr + i)); in iwl_dump_ini_prph_mac_iter_common()
1076 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_prph_mac_iter_common()
1084 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_mac_iter()
1085 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_prph_mac_iter()
1086 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_prph_mac_iter()
1089 reg->dev_addr.size); in iwl_dump_ini_prph_mac_iter()
1097 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_mac_block_iter()
1098 struct iwl_fw_ini_addr_size *pairs = (void *)reg->addrs; in iwl_dump_ini_prph_mac_block_iter()
1099 u32 addr = le32_to_cpu(reg->dev_addr_range.offset) + in iwl_dump_ini_prph_mac_block_iter()
1111 __le32 *val = range->data; in iwl_dump_ini_prph_phy_iter_common()
1120 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_prph_phy_iter_common()
1121 range->range_data_size = size; in iwl_dump_ini_prph_phy_iter_common()
1123 if (fwrt->trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_AX210) in iwl_dump_ini_prph_phy_iter_common()
1129 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_prph_phy_iter_common()
1130 return -EBUSY; in iwl_dump_ini_prph_phy_iter_common()
1133 dphy_state = iwl_read_umac_prph_no_grab(fwrt->trans, dphy_addr); in iwl_dump_ini_prph_phy_iter_common()
1143 iwl_write_prph_no_grab(fwrt->trans, indirect_wr_addr, in iwl_dump_ini_prph_phy_iter_common()
1146 if (fwrt->trans->info.hw_rf_id != IWL_CFG_RF_TYPE_JF1 && in iwl_dump_ini_prph_phy_iter_common()
1147 fwrt->trans->info.hw_rf_id != IWL_CFG_RF_TYPE_JF2 && in iwl_dump_ini_prph_phy_iter_common()
1148 fwrt->trans->info.hw_rf_id != IWL_CFG_RF_TYPE_HR1 && in iwl_dump_ini_prph_phy_iter_common()
1149 fwrt->trans->info.hw_rf_id != IWL_CFG_RF_TYPE_HR2) { in iwl_dump_ini_prph_phy_iter_common()
1151 prph_stts = iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_prph_phy_iter_common()
1160 prph_val = iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_prph_phy_iter_common()
1165 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_prph_phy_iter_common()
1166 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_prph_phy_iter_common()
1174 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_phy_iter()
1175 u32 addr = le32_to_cpu(reg->addrs[idx]); in iwl_dump_ini_prph_phy_iter()
1178 reg->dev_addr.size, in iwl_dump_ini_prph_phy_iter()
1179 reg->dev_addr.offset); in iwl_dump_ini_prph_phy_iter()
1187 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_phy_block_iter()
1188 struct iwl_fw_ini_addr_size *pairs = (void *)reg->addrs; in iwl_dump_ini_prph_phy_block_iter()
1193 reg->dev_addr_range.offset); in iwl_dump_ini_prph_phy_block_iter()
1200 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_csr_iter()
1202 __le32 *val = range->data; in iwl_dump_ini_csr_iter()
1203 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_csr_iter()
1204 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_csr_iter()
1207 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_csr_iter()
1208 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_csr_iter()
1209 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) in iwl_dump_ini_csr_iter()
1210 *val++ = cpu_to_le32(iwl_trans_read32(fwrt->trans, addr + i)); in iwl_dump_ini_csr_iter()
1212 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_csr_iter()
1219 struct iwl_trans *trans = fwrt->trans; in iwl_dump_ini_config_iter()
1220 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_config_iter()
1222 __le32 *val = range->data; in iwl_dump_ini_config_iter()
1223 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_config_iter()
1224 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_config_iter()
1227 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_config_iter()
1228 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_config_iter()
1229 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) { in iwl_dump_ini_config_iter()
1240 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_config_iter()
1247 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_dev_mem_iter()
1249 u32 addr = le32_to_cpu(reg->addrs[idx]) + in iwl_dump_ini_dev_mem_iter()
1250 le32_to_cpu(reg->dev_addr.offset); in iwl_dump_ini_dev_mem_iter()
1252 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_dev_mem_iter()
1253 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_dev_mem_iter()
1254 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_dev_mem_iter()
1255 le32_to_cpu(reg->dev_addr.size)); in iwl_dump_ini_dev_mem_iter()
1257 if (reg->sub_type == IWL_FW_INI_REGION_DEVICE_MEMORY_SUBTYPE_HW_SMEM && in iwl_dump_ini_dev_mem_iter()
1258 fwrt->sanitize_ops && fwrt->sanitize_ops->frob_txf) in iwl_dump_ini_dev_mem_iter()
1259 fwrt->sanitize_ops->frob_txf(fwrt->sanitize_ctx, in iwl_dump_ini_dev_mem_iter()
1260 range->data, in iwl_dump_ini_dev_mem_iter()
1261 le32_to_cpu(reg->dev_addr.size)); in iwl_dump_ini_dev_mem_iter()
1263 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_dev_mem_iter()
1269 struct page *page = fwrt->fw_paging_db[idx].fw_paging_block; in _iwl_dump_ini_paging_iter()
1271 dma_addr_t addr = fwrt->fw_paging_db[idx].fw_paging_phys; in _iwl_dump_ini_paging_iter()
1272 u32 page_size = fwrt->fw_paging_db[idx].fw_paging_size; in _iwl_dump_ini_paging_iter()
1274 range->page_num = cpu_to_le32(idx); in _iwl_dump_ini_paging_iter()
1275 range->range_data_size = cpu_to_le32(page_size); in _iwl_dump_ini_paging_iter()
1276 dma_sync_single_for_cpu(fwrt->trans->dev, addr, page_size, in _iwl_dump_ini_paging_iter()
1278 memcpy(range->data, page_address(page), page_size); in _iwl_dump_ini_paging_iter()
1279 dma_sync_single_for_device(fwrt->trans->dev, addr, page_size, in _iwl_dump_ini_paging_iter()
1282 return sizeof(*range) + le32_to_cpu(range->range_data_size); in _iwl_dump_ini_paging_iter()
1295 if (!fwrt->trans->mac_cfg->gen2) in iwl_dump_ini_paging_iter()
1299 page_size = fwrt->trans->init_dram.paging[idx].size; in iwl_dump_ini_paging_iter()
1301 range->page_num = cpu_to_le32(idx); in iwl_dump_ini_paging_iter()
1302 range->range_data_size = cpu_to_le32(page_size); in iwl_dump_ini_paging_iter()
1303 memcpy(range->data, fwrt->trans->init_dram.paging[idx].block, in iwl_dump_ini_paging_iter()
1306 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_paging_iter()
1314 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_iter()
1317 u32 alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_iter()
1319 frag = &fwrt->trans->dbg.fw_mon_ini[alloc_id].frags[idx]; in iwl_dump_ini_mon_dram_iter()
1321 range->dram_base_addr = cpu_to_le64(frag->physical); in iwl_dump_ini_mon_dram_iter()
1322 range->range_data_size = cpu_to_le32(frag->size); in iwl_dump_ini_mon_dram_iter()
1324 memcpy(range->data, frag->block, frag->size); in iwl_dump_ini_mon_dram_iter()
1326 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_mon_dram_iter()
1333 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_smem_iter()
1335 u32 addr = le32_to_cpu(reg->internal_buffer.base_addr); in iwl_dump_ini_mon_smem_iter()
1337 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_mon_smem_iter()
1338 range->range_data_size = reg->internal_buffer.size; in iwl_dump_ini_mon_smem_iter()
1339 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_mon_smem_iter()
1340 le32_to_cpu(reg->internal_buffer.size)); in iwl_dump_ini_mon_smem_iter()
1342 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_mon_smem_iter()
1348 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_ini_txf_iter()
1349 struct iwl_txf_iter_data *iter = &fwrt->dump.txf_iter_data; in iwl_ini_txf_iter()
1350 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_ini_txf_iter()
1351 int txf_num = cfg->num_txfifo_entries; in iwl_ini_txf_iter()
1352 int int_txf_num = ARRAY_SIZE(cfg->internal_txfifo_size); in iwl_ini_txf_iter()
1353 u32 lmac_bitmap = le32_to_cpu(reg->fifos.fid[0]); in iwl_ini_txf_iter()
1356 if (le32_to_cpu(reg->fifos.offset) && cfg->num_lmacs == 1) { in iwl_ini_txf_iter()
1358 le32_to_cpu(reg->fifos.offset)); in iwl_ini_txf_iter()
1362 iter->internal_txf = 0; in iwl_ini_txf_iter()
1363 iter->fifo_size = 0; in iwl_ini_txf_iter()
1364 iter->fifo = -1; in iwl_ini_txf_iter()
1365 if (le32_to_cpu(reg->fifos.offset)) in iwl_ini_txf_iter()
1366 iter->lmac = 1; in iwl_ini_txf_iter()
1368 iter->lmac = 0; in iwl_ini_txf_iter()
1371 if (!iter->internal_txf) { in iwl_ini_txf_iter()
1372 for (iter->fifo++; iter->fifo < txf_num; iter->fifo++) { in iwl_ini_txf_iter()
1373 iter->fifo_size = in iwl_ini_txf_iter()
1374 cfg->lmac[iter->lmac].txfifo_size[iter->fifo]; in iwl_ini_txf_iter()
1375 if (iter->fifo_size && (lmac_bitmap & BIT(iter->fifo))) in iwl_ini_txf_iter()
1378 iter->fifo--; in iwl_ini_txf_iter()
1381 iter->internal_txf = 1; in iwl_ini_txf_iter()
1383 if (!fw_has_capa(&fwrt->fw->ucode_capa, in iwl_ini_txf_iter()
1387 for (iter->fifo++; iter->fifo < int_txf_num + txf_num; iter->fifo++) { in iwl_ini_txf_iter()
1388 iter->fifo_size = in iwl_ini_txf_iter()
1389 cfg->internal_txfifo_size[iter->fifo - txf_num]; in iwl_ini_txf_iter()
1390 if (iter->fifo_size && (lmac_bitmap & BIT(iter->fifo))) in iwl_ini_txf_iter()
1401 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_txf_iter()
1403 struct iwl_txf_iter_data *iter = &fwrt->dump.txf_iter_data; in iwl_dump_ini_txf_iter()
1404 struct iwl_fw_ini_error_dump_register *reg_dump = (void *)range->data; in iwl_dump_ini_txf_iter()
1405 u32 offs = le32_to_cpu(reg->fifos.offset), addr; in iwl_dump_ini_txf_iter()
1406 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_txf_iter()
1412 return -EIO; in iwl_dump_ini_txf_iter()
1414 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_txf_iter()
1415 return -EBUSY; in iwl_dump_ini_txf_iter()
1417 range->fifo_hdr.fifo_num = cpu_to_le32(iter->fifo); in iwl_dump_ini_txf_iter()
1418 range->fifo_hdr.num_of_registers = cpu_to_le32(registers_num); in iwl_dump_ini_txf_iter()
1419 range->range_data_size = cpu_to_le32(iter->fifo_size + registers_size); in iwl_dump_ini_txf_iter()
1421 iwl_write_prph_no_grab(fwrt->trans, TXF_LARC_NUM + offs, iter->fifo); in iwl_dump_ini_txf_iter()
1428 addr = le32_to_cpu(reg->addrs[i]) + offs; in iwl_dump_ini_txf_iter()
1430 reg_dump->addr = cpu_to_le32(addr); in iwl_dump_ini_txf_iter()
1431 reg_dump->data = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_txf_iter()
1437 if (reg->fifos.hdr_only) { in iwl_dump_ini_txf_iter()
1438 range->range_data_size = cpu_to_le32(registers_size); in iwl_dump_ini_txf_iter()
1443 iwl_write_prph_no_grab(fwrt->trans, TXF_READ_MODIFY_ADDR + offs, in iwl_dump_ini_txf_iter()
1446 /* Dummy-read to advance the read pointer to the head */ in iwl_dump_ini_txf_iter()
1447 iwl_read_prph_no_grab(fwrt->trans, TXF_READ_MODIFY_DATA + offs); in iwl_dump_ini_txf_iter()
1452 for (i = 0; i < iter->fifo_size; i += sizeof(*data)) in iwl_dump_ini_txf_iter()
1453 *data++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr)); in iwl_dump_ini_txf_iter()
1455 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_txf) in iwl_dump_ini_txf_iter()
1456 fwrt->sanitize_ops->frob_txf(fwrt->sanitize_ctx, in iwl_dump_ini_txf_iter()
1457 reg_dump, iter->fifo_size); in iwl_dump_ini_txf_iter()
1460 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_txf_iter()
1462 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_txf_iter()
1470 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_prph_snps_dphyip_iter()
1472 __le32 *val = range->data; in iwl_dump_ini_prph_snps_dphyip_iter()
1473 __le32 offset = reg->dev_addr.offset; in iwl_dump_ini_prph_snps_dphyip_iter()
1475 u32 addr = le32_to_cpu(reg->addrs[idx]); in iwl_dump_ini_prph_snps_dphyip_iter()
1479 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_prph_snps_dphyip_iter()
1480 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_prph_snps_dphyip_iter()
1482 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_prph_snps_dphyip_iter()
1483 return -EBUSY; in iwl_dump_ini_prph_snps_dphyip_iter()
1488 dphy_state = iwl_read_umac_prph_no_grab(fwrt->trans, dphy_addr); in iwl_dump_ini_prph_snps_dphyip_iter()
1490 for (i = 0; i < le32_to_cpu(reg->dev_addr.size); i += 4) { in iwl_dump_ini_prph_snps_dphyip_iter()
1498 iwl_write_prph_no_grab(fwrt->trans, indirect_rd_wr_addr, in iwl_dump_ini_prph_snps_dphyip_iter()
1502 prph_val = iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_prph_snps_dphyip_iter()
1508 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_prph_snps_dphyip_iter()
1509 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_prph_snps_dphyip_iter()
1522 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_ini_get_rxf_data()
1523 u32 fid1 = le32_to_cpu(reg->fifos.fid[0]); in iwl_ini_get_rxf_data()
1524 u32 fid2 = le32_to_cpu(reg->fifos.fid[1]); in iwl_ini_get_rxf_data()
1538 fifo_idx = ffs(fid1) - 1; in iwl_ini_get_rxf_data()
1543 data->size = fwrt->smem_cfg.lmac[fifo_idx].rxfifo1_size; in iwl_ini_get_rxf_data()
1544 data->fifo_num = fifo_idx; in iwl_ini_get_rxf_data()
1548 fifo_idx = ffs(fid2) - 1; in iwl_ini_get_rxf_data()
1549 if (iwl_fw_lookup_notif_ver(fwrt->fw, SYSTEM_GROUP, in iwl_ini_get_rxf_data()
1556 "invalid umac fifo idx %d", fifo_idx)) in iwl_ini_get_rxf_data()
1559 /* use bit 31 to distinguish between umac and lmac rxf while in iwl_ini_get_rxf_data()
1562 data->fifo_num = fifo_idx | IWL_RXF_UMAC_BIT; in iwl_ini_get_rxf_data()
1566 data->size = fwrt->smem_cfg.rxfifo2_size; in iwl_ini_get_rxf_data()
1567 data->offset = iwl_umac_prph(fwrt->trans, in iwl_ini_get_rxf_data()
1571 data->size = fwrt->smem_cfg.rxfifo2_control_size; in iwl_ini_get_rxf_data()
1572 data->offset = iwl_umac_prph(fwrt->trans, in iwl_ini_get_rxf_data()
1583 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_rxf_iter()
1586 struct iwl_fw_ini_error_dump_register *reg_dump = (void *)range->data; in iwl_dump_ini_rxf_iter()
1587 u32 offs = le32_to_cpu(reg->fifos.offset), addr; in iwl_dump_ini_rxf_iter()
1588 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_rxf_iter()
1598 return -EIO; in iwl_dump_ini_rxf_iter()
1600 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_rxf_iter()
1601 return -EBUSY; in iwl_dump_ini_rxf_iter()
1603 range->fifo_hdr.fifo_num = cpu_to_le32(rxf_data.fifo_num); in iwl_dump_ini_rxf_iter()
1604 range->fifo_hdr.num_of_registers = cpu_to_le32(registers_num); in iwl_dump_ini_rxf_iter()
1605 range->range_data_size = cpu_to_le32(rxf_data.size + registers_size); in iwl_dump_ini_rxf_iter()
1612 addr = le32_to_cpu(reg->addrs[i]) + offs; in iwl_dump_ini_rxf_iter()
1614 reg_dump->addr = cpu_to_le32(addr); in iwl_dump_ini_rxf_iter()
1615 reg_dump->data = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, in iwl_dump_ini_rxf_iter()
1621 if (reg->fifos.hdr_only) { in iwl_dump_ini_rxf_iter()
1622 range->range_data_size = cpu_to_le32(registers_size); in iwl_dump_ini_rxf_iter()
1629 iwl_write_prph_no_grab(fwrt->trans, RXF_SET_FENCE_MODE + offs, 0x1); in iwl_dump_ini_rxf_iter()
1631 iwl_write_prph_no_grab(fwrt->trans, RXF_LD_WR2FENCE + offs, 0x1); in iwl_dump_ini_rxf_iter()
1633 iwl_write_prph_no_grab(fwrt->trans, RXF_LD_FENCE_OFFSET_ADDR + offs, in iwl_dump_ini_rxf_iter()
1640 *data++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr)); in iwl_dump_ini_rxf_iter()
1643 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_rxf_iter()
1645 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_rxf_iter()
1653 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_err_table_iter()
1654 struct iwl_fw_ini_region_err_table *err_table = ®->err_table; in iwl_dump_ini_err_table_iter()
1656 u32 addr = le32_to_cpu(err_table->base_addr) + in iwl_dump_ini_err_table_iter()
1657 le32_to_cpu(err_table->offset); in iwl_dump_ini_err_table_iter()
1659 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_err_table_iter()
1660 range->range_data_size = err_table->size; in iwl_dump_ini_err_table_iter()
1661 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_err_table_iter()
1662 le32_to_cpu(err_table->size)); in iwl_dump_ini_err_table_iter()
1664 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_err_table_iter()
1672 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_special_mem_iter()
1674 ®->special_mem; in iwl_dump_ini_special_mem_iter()
1677 u32 addr = le32_to_cpu(special_mem->base_addr) + in iwl_dump_ini_special_mem_iter()
1678 le32_to_cpu(special_mem->offset); in iwl_dump_ini_special_mem_iter()
1680 range->internal_base_addr = cpu_to_le32(addr); in iwl_dump_ini_special_mem_iter()
1681 range->range_data_size = special_mem->size; in iwl_dump_ini_special_mem_iter()
1682 iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data, in iwl_dump_ini_special_mem_iter()
1683 le32_to_cpu(special_mem->size)); in iwl_dump_ini_special_mem_iter()
1685 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_special_mem_iter()
1693 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_dbgi_sram_iter()
1695 __le32 *val = range->data; in iwl_dump_ini_dbgi_sram_iter()
1699 if (!iwl_trans_grab_nic_access(fwrt->trans)) in iwl_dump_ini_dbgi_sram_iter()
1700 return -EBUSY; in iwl_dump_ini_dbgi_sram_iter()
1702 range->range_data_size = reg->dev_addr.size; in iwl_dump_ini_dbgi_sram_iter()
1703 for (i = 0; i < (le32_to_cpu(reg->dev_addr.size) / 4); i++) { in iwl_dump_ini_dbgi_sram_iter()
1704 prph_data = iwl_read_prph_no_grab(fwrt->trans, (i % 2) ? in iwl_dump_ini_dbgi_sram_iter()
1708 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_dbgi_sram_iter()
1709 return -EBUSY; in iwl_dump_ini_dbgi_sram_iter()
1713 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_dbgi_sram_iter()
1714 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_dbgi_sram_iter()
1722 struct iwl_rx_packet *pkt = reg_data->dump_data->fw_pkt; in iwl_dump_ini_fw_pkt_iter()
1726 return -EIO; in iwl_dump_ini_fw_pkt_iter()
1730 memcpy(&range->fw_pkt_hdr, &pkt->hdr, sizeof(range->fw_pkt_hdr)); in iwl_dump_ini_fw_pkt_iter()
1731 range->range_data_size = cpu_to_le32(pkt_len); in iwl_dump_ini_fw_pkt_iter()
1733 memcpy(range->data, pkt->data, pkt_len); in iwl_dump_ini_fw_pkt_iter()
1735 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_fw_pkt_iter()
1744 u64 imr_curr_addr = fwrt->trans->dbg.imr_data.imr_curr_addr; in iwl_dump_ini_imr_iter()
1745 u32 imr_rem_bytes = fwrt->trans->dbg.imr_data.imr2sram_remainbyte; in iwl_dump_ini_imr_iter()
1746 u32 sram_addr = fwrt->trans->dbg.imr_data.sram_addr; in iwl_dump_ini_imr_iter()
1747 u32 sram_size = fwrt->trans->dbg.imr_data.sram_size; in iwl_dump_ini_imr_iter()
1750 range->range_data_size = cpu_to_le32(size_to_dump); in iwl_dump_ini_imr_iter()
1751 if (iwl_trans_write_imr_mem(fwrt->trans, sram_addr, in iwl_dump_ini_imr_iter()
1754 return -1; in iwl_dump_ini_imr_iter()
1757 fwrt->trans->dbg.imr_data.imr_curr_addr = imr_curr_addr + size_to_dump; in iwl_dump_ini_imr_iter()
1758 fwrt->trans->dbg.imr_data.imr2sram_remainbyte -= size_to_dump; in iwl_dump_ini_imr_iter()
1760 iwl_trans_read_mem_bytes(fwrt->trans, sram_addr, range->data, in iwl_dump_ini_imr_iter()
1762 return sizeof(*range) + le32_to_cpu(range->range_data_size); in iwl_dump_ini_imr_iter()
1772 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_mem_fill_header()
1774 return dump->data; in iwl_dump_ini_mem_fill_header()
1778 * mask_apply_and_normalize - applies mask on val and normalize the result
1789 return (val & mask) >> (ffs(mask) - 1); in mask_apply_and_normalize()
1800 offs = (alloc_id - IWL_FW_INI_ALLOCATION_ID_DBGC1) * 0x100; in iwl_get_mon_reg()
1802 if (!reg_info || !reg_info->addr || !reg_info->mask) in iwl_get_mon_reg()
1805 val = iwl_read_prph_no_grab(fwrt->trans, reg_info->addr + offs); in iwl_get_mon_reg()
1807 return cpu_to_le32(mask_apply_and_normalize(val, reg_info->mask)); in iwl_get_mon_reg()
1815 if (!iwl_trans_grab_nic_access(fwrt->trans)) { in iwl_dump_ini_mon_fill_header()
1820 data->write_ptr = iwl_get_mon_reg(fwrt, alloc_id, in iwl_dump_ini_mon_fill_header()
1821 &addrs->write_ptr); in iwl_dump_ini_mon_fill_header()
1822 if (fwrt->trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) { in iwl_dump_ini_mon_fill_header()
1823 u32 wrt_ptr = le32_to_cpu(data->write_ptr); in iwl_dump_ini_mon_fill_header()
1825 data->write_ptr = cpu_to_le32(wrt_ptr >> 2); in iwl_dump_ini_mon_fill_header()
1827 data->cycle_cnt = iwl_get_mon_reg(fwrt, alloc_id, in iwl_dump_ini_mon_fill_header()
1828 &addrs->cycle_cnt); in iwl_dump_ini_mon_fill_header()
1829 data->cur_frag = iwl_get_mon_reg(fwrt, alloc_id, in iwl_dump_ini_mon_fill_header()
1830 &addrs->cur_frag); in iwl_dump_ini_mon_fill_header()
1832 iwl_trans_release_nic_access(fwrt->trans); in iwl_dump_ini_mon_fill_header()
1834 data->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_mon_fill_header()
1836 return data->data; in iwl_dump_ini_mon_fill_header()
1845 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_fill_header()
1846 u32 alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_fill_header()
1849 &fwrt->trans->mac_cfg->base->mon_dram_regs); in iwl_dump_ini_mon_dram_fill_header()
1858 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_smem_fill_header()
1859 u32 alloc_id = le32_to_cpu(reg->internal_buffer.alloc_id); in iwl_dump_ini_mon_smem_fill_header()
1862 &fwrt->trans->mac_cfg->base->mon_smem_regs); in iwl_dump_ini_mon_smem_fill_header()
1876 &fwrt->trans->mac_cfg->base->mon_dbgi_regs); in iwl_dump_ini_mon_dbgi_fill_header()
1884 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_err_table_fill_header()
1887 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_err_table_fill_header()
1888 dump->version = reg->err_table.version; in iwl_dump_ini_err_table_fill_header()
1890 return dump->data; in iwl_dump_ini_err_table_fill_header()
1898 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_special_mem_fill_header()
1901 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_special_mem_fill_header()
1902 dump->type = reg->special_mem.type; in iwl_dump_ini_special_mem_fill_header()
1903 dump->version = reg->special_mem.version; in iwl_dump_ini_special_mem_fill_header()
1905 return dump->data; in iwl_dump_ini_special_mem_fill_header()
1915 dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER); in iwl_dump_ini_imr_fill_header()
1917 return dump->data; in iwl_dump_ini_imr_fill_header()
1923 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem_ranges()
1925 return iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_mem_ranges()
1932 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem_block_ranges()
1935 return iwl_tlv_array_len_with_size(reg_data->reg_tlv, reg, size); in iwl_dump_ini_mem_block_ranges()
1941 if (fwrt->trans->mac_cfg->gen2) { in iwl_dump_ini_paging_ranges()
1942 if (fwrt->trans->init_dram.paging_cnt) in iwl_dump_ini_paging_ranges()
1943 return fwrt->trans->init_dram.paging_cnt - 1; in iwl_dump_ini_paging_ranges()
1948 return fwrt->num_of_paging_blk; in iwl_dump_ini_paging_ranges()
1955 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_ranges()
1957 u32 ranges = 0, alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_ranges()
1960 fw_mon = &fwrt->trans->dbg.fw_mon_ini[alloc_id]; in iwl_dump_ini_mon_dram_ranges()
1962 for (i = 0; i < fw_mon->num_frags; i++) { in iwl_dump_ini_mon_dram_ranges()
1963 if (!fw_mon->frags[i].size) in iwl_dump_ini_mon_dram_ranges()
1995 u32 imr_enable = fwrt->trans->dbg.imr_data.imr_enable; in iwl_dump_ini_imr_ranges()
1996 u32 imr_size = fwrt->trans->dbg.imr_data.imr_size; in iwl_dump_ini_imr_ranges()
1997 u32 sram_size = fwrt->trans->dbg.imr_data.sram_size; in iwl_dump_ini_imr_ranges()
2012 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem_get_size()
2013 u32 size = le32_to_cpu(reg->dev_addr.size); in iwl_dump_ini_mem_get_size()
2027 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mem_block_get_size()
2028 struct iwl_fw_ini_addr_size *pairs = (void *)reg->addrs; in iwl_dump_ini_mem_block_get_size()
2053 if (fwrt->trans->mac_cfg->gen2) in iwl_dump_ini_paging_get_size()
2054 size += fwrt->trans->init_dram.paging[i].size; in iwl_dump_ini_paging_get_size()
2056 size += fwrt->fw_paging_db[i].fw_paging_size; in iwl_dump_ini_paging_get_size()
2066 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dram_get_size()
2068 u32 size = 0, alloc_id = le32_to_cpu(reg->dram_alloc_id); in iwl_dump_ini_mon_dram_get_size()
2071 fw_mon = &fwrt->trans->dbg.fw_mon_ini[alloc_id]; in iwl_dump_ini_mon_dram_get_size()
2073 for (i = 0; i < fw_mon->num_frags; i++) { in iwl_dump_ini_mon_dram_get_size()
2074 struct iwl_dram_data *frag = &fw_mon->frags[i]; in iwl_dump_ini_mon_dram_get_size()
2076 if (!frag->size) in iwl_dump_ini_mon_dram_get_size()
2079 size += sizeof(struct iwl_fw_ini_error_dump_range) + frag->size; in iwl_dump_ini_mon_dram_get_size()
2092 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_smem_get_size()
2095 size = le32_to_cpu(reg->internal_buffer.size); in iwl_dump_ini_mon_smem_get_size()
2108 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_mon_dbgi_get_size()
2109 u32 size = le32_to_cpu(reg->dev_addr.size); in iwl_dump_ini_mon_dbgi_get_size()
2122 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_txf_get_size()
2123 struct iwl_txf_iter_data *iter = &fwrt->dump.txf_iter_data; in iwl_dump_ini_txf_get_size()
2124 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_txf_get_size()
2132 if (!reg->fifos.hdr_only) in iwl_dump_ini_txf_get_size()
2133 size += iter->fifo_size; in iwl_dump_ini_txf_get_size()
2145 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_rxf_get_size()
2147 u32 registers_num = iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs); in iwl_dump_ini_rxf_get_size()
2152 if (reg->fifos.hdr_only) in iwl_dump_ini_rxf_get_size()
2168 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_err_table_get_size()
2169 u32 size = le32_to_cpu(reg->err_table.size); in iwl_dump_ini_err_table_get_size()
2182 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data; in iwl_dump_ini_special_mem_get_size()
2183 u32 size = le32_to_cpu(reg->special_mem.size); in iwl_dump_ini_special_mem_get_size()
2198 if (!reg_data->dump_data->fw_pkt) in iwl_dump_ini_fw_pkt_get_size()
2201 size += iwl_rx_packet_payload_len(reg_data->dump_data->fw_pkt); in iwl_dump_ini_fw_pkt_get_size()
2214 u32 imr_enable = fwrt->trans->dbg.imr_data.imr_enable; in iwl_dump_ini_imr_get_size()
2215 u32 imr_size = fwrt->trans->dbg.imr_data.imr_size; in iwl_dump_ini_imr_get_size()
2216 u32 sram_size = fwrt->trans->dbg.imr_data.sram_size; in iwl_dump_ini_imr_get_size()
2235 * struct iwl_dump_ini_mem_ops - ini memory dump operations
2257 * iwl_dump_ini_mem - dump memory region
2272 struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
2276 u32 type = reg->type;
2277 u32 id = le32_get_bits(reg->id, IWL_FW_INI_REGION_ID_MASK);
2287 if (le32_to_cpu(reg->hdr.version) >= 2) {
2288 u32 dp = le32_get_bits(reg->id,
2294 "WRT: no dump - type %d and policy mismatch=%d\n",
2300 "WRT: no dump - type %d and policy mismatch=%d\n",
2306 "WRT: no dump - type %d and policy mismatch=%d\n",
2312 if (!ops->get_num_of_ranges || !ops->get_size || !ops->fill_mem_hdr ||
2313 !ops->fill_range) {
2318 size = ops->get_size(fwrt, reg_data);
2329 entry->size = sizeof(*tlv) + size;
2331 tlv = (void *)entry->data;
2332 tlv->type = reg->type;
2333 tlv->sub_type = reg->sub_type;
2334 tlv->sub_type_ver = reg->sub_type_ver;
2335 tlv->reserved = reg->reserved;
2336 tlv->len = cpu_to_le32(size);
2338 num_of_ranges = ops->get_num_of_ranges(fwrt, reg_data);
2340 header = (void *)tlv->data;
2341 header->region_id = cpu_to_le32(id);
2342 header->num_of_ranges = cpu_to_le32(num_of_ranges);
2343 header->name_len = cpu_to_le32(IWL_FW_INI_MAX_NAME);
2344 memcpy(header->name, reg->name, IWL_FW_INI_MAX_NAME);
2347 range = ops->fill_mem_hdr(fwrt, reg_data, header, free_size);
2355 header_size = range - (u8 *)header;
2370 free_size -= header_size;
2373 int range_size = ops->fill_range(fwrt, reg_data, range,
2390 free_size -= range_size;
2394 list_add_tail(&entry->list, list);
2396 return entry->size;
2417 list_for_each_entry(node, &fwrt->trans->dbg.debug_info_tlv_list, list) {
2426 entry->size = size;
2428 tlv = (void *)entry->data;
2429 tlv->type = cpu_to_le32(IWL_INI_DUMP_INFO_TYPE);
2430 tlv->len = cpu_to_le32(size - sizeof(*tlv));
2432 dump = (void *)tlv->data;
2434 dump->version = cpu_to_le32(IWL_INI_DUMP_VER);
2435 dump->time_point = trigger->time_point;
2436 dump->trigger_reason = trigger->trigger_reason;
2437 dump->external_cfg_state =
2438 cpu_to_le32(fwrt->trans->dbg.external_ini_cfg);
2440 dump->ver_type = cpu_to_le32(fwrt->dump.fw_ver.type);
2441 dump->ver_subtype = cpu_to_le32(fwrt->dump.fw_ver.subtype);
2443 dump->hw_step = cpu_to_le32(fwrt->trans->info.hw_rev_step);
2445 hw_type = CSR_HW_REV_TYPE(fwrt->trans->info.hw_rev);
2447 is_cdb = CSR_HW_RFID_IS_CDB(fwrt->trans->info.hw_rf_id);
2448 is_jacket = !!(iwl_read_umac_prph(fwrt->trans, WFPM_OTP_CFG1_ADDR) &
2454 dump->hw_type = cpu_to_le32(hw_type);
2456 dump->rf_id_flavor =
2457 cpu_to_le32(CSR_HW_RFID_FLAVOR(fwrt->trans->info.hw_rf_id));
2458 dump->rf_id_dash = cpu_to_le32(CSR_HW_RFID_DASH(fwrt->trans->info.hw_rf_id));
2459 dump->rf_id_step = cpu_to_le32(CSR_HW_RFID_STEP(fwrt->trans->info.hw_rf_id));
2460 dump->rf_id_type = cpu_to_le32(CSR_HW_RFID_TYPE(fwrt->trans->info.hw_rf_id));
2462 dump->lmac_major = cpu_to_le32(fwrt->dump.fw_ver.lmac_major);
2463 dump->lmac_minor = cpu_to_le32(fwrt->dump.fw_ver.lmac_minor);
2464 dump->umac_major = cpu_to_le32(fwrt->dump.fw_ver.umac_major);
2465 dump->umac_minor = cpu_to_le32(fwrt->dump.fw_ver.umac_minor);
2467 dump->fw_mon_mode = cpu_to_le32(fwrt->trans->dbg.ini_dest);
2468 dump->regions_mask = trigger->regions_mask &
2469 ~cpu_to_le64(fwrt->trans->dbg.unsupported_region_msk);
2471 dump->build_tag_len = cpu_to_le32(sizeof(dump->build_tag));
2472 memcpy(dump->build_tag, fwrt->fw->human_readable,
2473 sizeof(dump->build_tag));
2475 cfg_name = dump->cfg_names;
2476 dump->num_of_cfg_names = cpu_to_le32(num_of_cfg_names);
2477 list_for_each_entry(node, &fwrt->trans->dbg.debug_info_tlv_list, list) {
2479 (void *)node->tlv.data;
2481 BUILD_BUG_ON(sizeof(cfg_name->cfg_name) !=
2482 sizeof(debug_info->debug_cfg_name));
2484 cfg_name->image_type = debug_info->image_type;
2485 cfg_name->cfg_name_len =
2486 cpu_to_le32(sizeof(cfg_name->cfg_name));
2487 memcpy(cfg_name->cfg_name, debug_info->debug_cfg_name,
2488 sizeof(cfg_name->cfg_name));
2495 list_add(&entry->list, list);
2497 return entry->size;
2505 u32 len = strnlen(fwrt->trans->dbg.dump_file_name_ext,
2508 if (!fwrt->trans->dbg.dump_file_name_ext_valid)
2515 entry->size = sizeof(*tlv) + len;
2517 tlv = (void *)entry->data;
2518 tlv->type = cpu_to_le32(IWL_INI_DUMP_NAME_TYPE);
2519 tlv->len = cpu_to_le32(len);
2520 memcpy(tlv->data, fwrt->trans->dbg.dump_file_name_ext, len);
2523 list_add_tail(&entry->list, list);
2525 fwrt->trans->dbg.dump_file_name_ext_valid = false;
2527 return entry->size;
2672 for (int i = 0; i < ARRAY_SIZE(fwrt->trans->dbg.active_regions); i++) {
2682 reg_data.reg_tlv = fwrt->trans->dbg.active_regions[i];
2689 reg = (void *)reg_data.reg_tlv->data;
2690 reg_type = reg->type;
2694 dp = le32_get_bits(reg->id, IWL_FW_INI_REGION_DUMP_POLICY_MASK);
2727 imr_reg_data->reg_tlv =
2728 fwrt->trans->dbg.active_regions[i];
2749 struct iwl_fw_ini_trigger_tlv *trigger = dump_data->trig;
2750 enum iwl_fw_ini_time_point tp_id = le32_to_cpu(trigger->time_point);
2755 u64 regions_mask = le64_to_cpu(trigger->regions_mask) &
2756 ~(fwrt->trans->dbg.unsupported_region_msk);
2758 BUILD_BUG_ON(sizeof(trigger->regions_mask) != sizeof(regions_mask));
2759 BUILD_BUG_ON((sizeof(trigger->regions_mask) * BITS_PER_BYTE) <
2760 ARRAY_SIZE(fwrt->trans->dbg.active_regions));
2762 if (trigger->apply_policy &
2767 iwl_trans_pcie_fw_reset_handshake(fwrt->trans);
2772 if (fw_has_capa(&fwrt->fw->ucode_capa,
2775 iwl_trans_pcie_fw_reset_handshake(fwrt->trans);
2796 enum iwl_fw_ini_time_point tp_id = le32_to_cpu(trig->time_point);
2797 u32 usec = le32_to_cpu(trig->ignore_consec);
2799 if (!iwl_trans_dbg_ini_valid(fwrt->trans) ||
2812 struct iwl_fw_ini_trigger_tlv *trigger = dump_data->trig;
2818 !le64_to_cpu(trigger->regions_mask))
2825 entry->size = sizeof(*hdr);
2833 hdr = (void *)entry->data;
2834 hdr->barker = cpu_to_le32(IWL_FW_INI_ERROR_DUMP_BARKER);
2835 hdr->file_len = cpu_to_le32(size + entry->size);
2837 list_add(&entry->list, list);
2839 return le32_to_cpu(hdr->file_len);
2848 fwrt->dump.lmac_err_id[0] = 0;
2849 if (fwrt->smem_cfg.num_lmacs > 1)
2850 fwrt->dump.lmac_err_id[1] = 0;
2851 fwrt->dump.umac_err_id = 0;
2861 u32 dump_mask = fwrt->fw->dbg.dump_mask;
2867 if (dump_data->monitor_only)
2870 fw_error_dump.trans_ptr = iwl_trans_dump_data(fwrt->trans, dump_mask,
2871 fwrt->sanitize_ops,
2872 fwrt->sanitize_ctx);
2873 file_len = le32_to_cpu(dump_file->file_len);
2877 file_len += fw_error_dump.trans_ptr->len;
2878 dump_file->file_len = cpu_to_le32(file_len);
2890 fw_error_dump.trans_ptr->data,
2891 fw_error_dump.trans_ptr->len,
2893 dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len,
2904 list_entry(list->next, typeof(*entry), list);
2906 list_del(&entry->list);
2913 dump_data->trig = NULL;
2914 kfree(dump_data->fw_pkt);
2915 dump_data->fw_pkt = NULL;
2940 entry->data, entry->size, offs);
2941 offs += entry->size;
2943 dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len,
2964 if (iwl_trans_dbg_ini_valid(fwrt->trans)) {
2974 if (fwrt->dump.active_wks == ~0UL)
2975 return -EBUSY;
2977 idx = ffz(fwrt->dump.active_wks);
2980 test_and_set_bit(fwrt->dump.wks[idx].idx, &fwrt->dump.active_wks))
2981 return -EBUSY;
2983 wk_data = &fwrt->dump.wks[idx];
2985 if (WARN_ON(wk_data->dump_data.desc))
2986 iwl_fw_free_dump_desc(fwrt, wk_data->dump_data.desc);
2988 wk_data->dump_data.desc = desc;
2989 wk_data->dump_data.monitor_only = monitor_only;
2992 le32_to_cpu(desc->trig_desc.type));
2994 queue_delayed_work(system_unbound_wq, &wk_data->wk,
3004 if (!iwl_trans_device_enabled(fwrt->trans))
3005 return -EIO;
3007 if (iwl_trans_dbg_ini_valid(fwrt->trans)) {
3010 return -EIO;
3023 return -ENOMEM;
3025 iwl_dump_error_desc->trig_desc.type = cpu_to_le32(trig_type);
3026 iwl_dump_error_desc->len = 0;
3036 iwl_trans_sync_nmi(fwrt->trans);
3053 u16 occurrences = le16_to_cpu(trigger->occurrences) - 1;
3055 if (!le16_to_cpu(trigger->occurrences))
3058 if (trigger->flags & IWL_FW_DBG_FORCE_RESTART) {
3061 iwl_force_nmi(fwrt->trans);
3065 trigger->occurrences = cpu_to_le16(occurrences);
3066 monitor_only = trigger->mode & IWL_FW_DBG_TRIGGER_MONITOR_ONLY;
3069 delay = le32_to_cpu(trigger->stop_delay) * USEC_PER_MSEC;
3074 return -ENOMEM;
3077 desc->len = len;
3078 desc->trig_desc.type = cpu_to_le32(trig);
3079 memcpy(desc->trig_desc.data, str, len);
3096 if (iwl_trans_dbg_ini_valid(fwrt->trans))
3102 buf[sizeof(buf) - 1] = '\0';
3109 if (WARN_ON_ONCE(buf[sizeof(buf) - 1]))
3110 buf[sizeof(buf) - 1] = '\0';
3115 return iwl_fw_dbg_collect(fwrt, le32_to_cpu(trigger->id), buf, len,
3126 if (WARN_ONCE(conf_id >= ARRAY_SIZE(fwrt->fw->dbg.conf_tlv),
3128 return -EINVAL;
3130 /* EARLY START - firmware's configuration is hard coded */
3131 if ((!fwrt->fw->dbg.conf_tlv[conf_id] ||
3132 !fwrt->fw->dbg.conf_tlv[conf_id]->num_of_hcmds) &&
3136 if (!fwrt->fw->dbg.conf_tlv[conf_id])
3137 return -EINVAL;
3139 if (fwrt->dump.conf != FW_DBG_INVALID)
3140 IWL_INFO(fwrt, "FW already configured (%d) - re-configuring\n",
3141 fwrt->dump.conf);
3144 ptr = (void *)&fwrt->fw->dbg.conf_tlv[conf_id]->hcmd;
3145 for (i = 0; i < fwrt->fw->dbg.conf_tlv[conf_id]->num_of_hcmds; i++) {
3148 .id = cmd->id,
3149 .len = { le16_to_cpu(cmd->len), },
3150 .data = { cmd->data, },
3153 ret = iwl_trans_send_cmd(fwrt->trans, &hcmd);
3158 ptr += le16_to_cpu(cmd->len);
3161 fwrt->dump.conf = conf_id;
3177 if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status))
3180 if (fw_has_capa(&fwrt->fw->ucode_capa,
3184 iwl_trans_send_cmd(fwrt->trans, &hcmd);
3195 &fwrt->dump.wks[wk_idx].dump_data;
3197 if (!test_bit(wk_idx, &fwrt->dump.active_wks))
3200 /* also checks 'desc' for pre-ini mode, since that shadows in union */
3201 if (!dump_data->trig) {
3206 if (!iwl_trans_device_enabled(fwrt->trans)) {
3207 IWL_ERR(fwrt, "Device is not enabled - cannot dump error\n");
3212 if (iwl_trans_is_dead(fwrt->trans)) {
3220 if (iwl_trans_dbg_ini_valid(fwrt->trans))
3228 if (iwl_trans_dbg_ini_valid(fwrt->trans)) {
3229 u32 policy = le32_to_cpu(dump_data->trig->apply_policy);
3230 u32 time_point = le32_to_cpu(dump_data->trig->time_point);
3238 if (fwrt->trans->dbg.last_tp_resetfw == IWL_FW_INI_RESET_FW_MODE_STOP_FW_ONLY)
3239 iwl_force_nmi(fwrt->trans);
3241 if (iwl_trans_dbg_ini_valid(fwrt->trans)) {
3244 iwl_fw_free_dump_desc(fwrt, dump_data->desc);
3245 dump_data->desc = NULL;
3248 clear_bit(wk_idx, &fwrt->dump.active_wks);
3255 struct iwl_fw_ini_trigger_tlv *trig = dump_data->trig;
3256 enum iwl_fw_ini_time_point tp_id = le32_to_cpu(trig->time_point);
3263 return -EINVAL;
3266 delay = le32_to_cpu(trig->dump_delay);
3267 occur = le32_to_cpu(trig->occurrences);
3271 trig->occurrences = cpu_to_le32(--occur);
3277 if (fwrt->dump.active_wks == ~0UL)
3278 return -EBUSY;
3280 idx = ffz(fwrt->dump.active_wks);
3283 test_and_set_bit(fwrt->dump.wks[idx].idx, &fwrt->dump.active_wks))
3284 return -EBUSY;
3286 fwrt->dump.wks[idx].dump_data = *dump_data;
3299 &fwrt->dump.wks[idx].wk,
3310 container_of(wks, typeof(*fwrt), dump.wks[wks->idx]);
3315 if (fwrt->ops && fwrt->ops->dump_start)
3316 fwrt->ops->dump_start(fwrt->ops_ctx);
3318 iwl_fw_dbg_collect_sync(fwrt, wks->idx);
3320 if (fwrt->ops && fwrt->ops->dump_end)
3321 fwrt->ops->dump_end(fwrt->ops_ctx);
3326 const struct iwl_mac_cfg *mac_cfg = fwrt->trans->mac_cfg;
3331 if (!fwrt->dump.d3_debug_data) {
3332 fwrt->dump.d3_debug_data = kmalloc(mac_cfg->base->d3_debug_data_length,
3334 if (!fwrt->dump.d3_debug_data) {
3342 iwl_trans_read_mem_bytes(fwrt->trans, mac_cfg->base->d3_debug_data_base_addr,
3343 fwrt->dump.d3_debug_data,
3344 mac_cfg->base->d3_debug_data_length);
3346 if (fwrt->sanitize_ops && fwrt->sanitize_ops->frob_mem)
3347 fwrt->sanitize_ops->frob_mem(fwrt->sanitize_ctx,
3348 mac_cfg->base->d3_debug_data_base_addr,
3349 fwrt->dump.d3_debug_data,
3350 mac_cfg->base->d3_debug_data_length);
3358 iwl_dbg_tlv_del_timers(fwrt->trans);
3385 if (trans->mac_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
3391 params->in_sample = iwl_read_umac_prph(trans, DBGC_IN_SAMPLE);
3392 params->out_ctrl = iwl_read_umac_prph(trans, DBGC_OUT_CTRL);
3407 return -EIO;
3409 if (trans->mac_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
3414 iwl_write_umac_prph(trans, DBGC_IN_SAMPLE, params->in_sample);
3415 iwl_write_umac_prph(trans, DBGC_OUT_CTRL, params->out_ctrl);
3433 int cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw,
3442 marker.timestamp = cpu_to_le64(fwrt->timestamp.seq++);
3449 return -EINVAL;
3455 ret = iwl_trans_send_cmd(fwrt->trans, &hcmd);
3458 resp = (void *)hcmd.resp_pkt->data;
3460 le32_to_cpu(resp->gp2));
3472 if (!iwl_trans_fw_running(fwrt->trans))
3475 if (fw_has_capa(&fwrt->fw->ucode_capa,
3479 ret = iwl_fw_dbg_suspend_resume_hcmd(fwrt->trans, stop);
3481 iwl_fw_dbg_stop_recording(fwrt->trans, params);
3483 ret = iwl_fw_dbg_restart_recording(fwrt->trans, params);
3488 fwrt->trans->dbg.rec_on = false;
3507 u32 preset = u32_get_bits(fwrt->trans->dbg.domains_bitmap,
3511 if (fwrt->trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_9000)
3514 if (fwrt->trans->dbg.yoyo_bin_loaded || (preset && preset != 1))
3517 iwl_trans_send_cmd(fwrt->trans, &hcmd);
3527 if (fw_has_api(&fwrt->fw->ucode_capa,
3532 iwl_trans_send_cmd(fwrt->trans, &hcmd);