1 /****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2017 Intel Deutschland GmbH 9 * Copyright (C) 2018-2020 Intel Corporation 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of version 2 of the GNU General Public License as 13 * published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * The full GNU General Public License is included in this distribution 21 * in the file called COPYING. 22 * 23 * Contact Information: 24 * Intel Linux Wireless <linuxwifi@intel.com> 25 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 26 * 27 * BSD LICENSE 28 * 29 * Copyright(c) 2017 Intel Deutschland GmbH 30 * Copyright (C) 2018-2020 Intel Corporation 31 * All rights reserved. 32 * 33 * Redistribution and use in source and binary forms, with or without 34 * modification, are permitted provided that the following conditions 35 * are met: 36 * 37 * * Redistributions of source code must retain the above copyright 38 * notice, this list of conditions and the following disclaimer. 39 * * Redistributions in binary form must reproduce the above copyright 40 * notice, this list of conditions and the following disclaimer in 41 * the documentation and/or other materials provided with the 42 * distribution. 43 * * Neither the name Intel Corporation nor the names of its 44 * contributors may be used to endorse or promote products derived 45 * from this software without specific prior written permission. 46 * 47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 48 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 49 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 50 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 51 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 52 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 53 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 54 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 55 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 56 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 57 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 58 * 59 *****************************************************************************/ 60 #ifndef __iwl_fw_runtime_h__ 61 #define __iwl_fw_runtime_h__ 62 63 #include "iwl-config.h" 64 #include "iwl-trans.h" 65 #include "img.h" 66 #include "fw/api/debug.h" 67 #include "fw/api/paging.h" 68 #include "fw/api/power.h" 69 #include "iwl-eeprom-parse.h" 70 #include "fw/acpi.h" 71 72 struct iwl_fw_runtime_ops { 73 int (*dump_start)(void *ctx); 74 void (*dump_end)(void *ctx); 75 bool (*fw_running)(void *ctx); 76 int (*send_hcmd)(void *ctx, struct iwl_host_cmd *host_cmd); 77 bool (*d3_debug_enable)(void *ctx); 78 }; 79 80 #define MAX_NUM_LMAC 2 81 struct iwl_fwrt_shared_mem_cfg { 82 int num_lmacs; 83 int num_txfifo_entries; 84 struct { 85 u32 txfifo_size[TX_FIFO_MAX_NUM]; 86 u32 rxfifo1_size; 87 } lmac[MAX_NUM_LMAC]; 88 u32 rxfifo2_size; 89 u32 rxfifo2_control_size; 90 u32 internal_txfifo_addr; 91 u32 internal_txfifo_size[TX_FIFO_INTERNAL_MAX_NUM]; 92 }; 93 94 #define IWL_FW_RUNTIME_DUMP_WK_NUM 5 95 96 /** 97 * struct iwl_fwrt_dump_data - dump data 98 * @trig: trigger the worker was scheduled upon 99 * @fw_pkt: packet received from FW 100 */ 101 struct iwl_fwrt_dump_data { 102 union { 103 struct { 104 struct iwl_fw_ini_trigger_tlv *trig; 105 struct iwl_rx_packet *fw_pkt; 106 }; 107 struct { 108 const struct iwl_fw_dump_desc *desc; 109 bool monitor_only; 110 }; 111 }; 112 }; 113 114 /** 115 * struct iwl_fwrt_wk_data - dump worker data struct 116 * @idx: index of the worker 117 * @wk: worker 118 */ 119 struct iwl_fwrt_wk_data { 120 u8 idx; 121 struct delayed_work wk; 122 struct iwl_fwrt_dump_data dump_data; 123 }; 124 125 /** 126 * struct iwl_txf_iter_data - Tx fifo iterator data struct 127 * @fifo: fifo number 128 * @lmac: lmac number 129 * @fifo_size: fifo size 130 * @internal_txf: non zero if fifo is internal Tx fifo 131 */ 132 struct iwl_txf_iter_data { 133 int fifo; 134 int lmac; 135 u32 fifo_size; 136 u8 internal_txf; 137 }; 138 139 /** 140 * struct iwl_fw_runtime - runtime data for firmware 141 * @fw: firmware image 142 * @cfg: NIC configuration 143 * @dev: device pointer 144 * @ops: user ops 145 * @ops_ctx: user ops context 146 * @fw_paging_db: paging database 147 * @num_of_paging_blk: number of paging blocks 148 * @num_of_pages_in_last_blk: number of pages in the last block 149 * @smem_cfg: saved firmware SMEM configuration 150 * @cur_fw_img: current firmware image, must be maintained by 151 * the driver by calling &iwl_fw_set_current_image() 152 * @dump: debug dump data 153 */ 154 struct iwl_fw_runtime { 155 struct iwl_trans *trans; 156 const struct iwl_fw *fw; 157 struct device *dev; 158 159 const struct iwl_fw_runtime_ops *ops; 160 void *ops_ctx; 161 162 /* Paging */ 163 struct iwl_fw_paging fw_paging_db[NUM_OF_FW_PAGING_BLOCKS]; 164 u16 num_of_paging_blk; 165 u16 num_of_pages_in_last_blk; 166 167 enum iwl_ucode_type cur_fw_img; 168 169 /* memory configuration */ 170 struct iwl_fwrt_shared_mem_cfg smem_cfg; 171 172 /* debug */ 173 struct { 174 struct iwl_fwrt_wk_data wks[IWL_FW_RUNTIME_DUMP_WK_NUM]; 175 unsigned long active_wks; 176 177 u8 conf; 178 179 /* ts of the beginning of a non-collect fw dbg data period */ 180 unsigned long non_collect_ts_start[IWL_FW_INI_TIME_POINT_NUM]; 181 u32 *d3_debug_data; 182 u32 lmac_err_id[MAX_NUM_LMAC]; 183 u32 umac_err_id; 184 185 struct iwl_txf_iter_data txf_iter_data; 186 187 struct { 188 u8 type; 189 u8 subtype; 190 u32 lmac_major; 191 u32 lmac_minor; 192 u32 umac_major; 193 u32 umac_minor; 194 } fw_ver; 195 } dump; 196 #ifdef CONFIG_IWLWIFI_DEBUGFS 197 struct { 198 struct delayed_work wk; 199 u32 delay; 200 u64 seq; 201 } timestamp; 202 bool tpc_enabled; 203 #endif /* CONFIG_IWLWIFI_DEBUGFS */ 204 #ifdef CONFIG_ACPI 205 struct iwl_sar_profile sar_profiles[ACPI_SAR_PROFILE_NUM]; 206 u8 sar_chain_a_profile; 207 u8 sar_chain_b_profile; 208 struct iwl_geo_profile geo_profiles[ACPI_NUM_GEO_PROFILES]; 209 u32 geo_rev; 210 struct iwl_ppag_table_cmd ppag_table; 211 #endif 212 }; 213 214 void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans, 215 const struct iwl_fw *fw, 216 const struct iwl_fw_runtime_ops *ops, void *ops_ctx, 217 struct dentry *dbgfs_dir); 218 219 static inline void iwl_fw_runtime_free(struct iwl_fw_runtime *fwrt) 220 { 221 int i; 222 223 kfree(fwrt->dump.d3_debug_data); 224 fwrt->dump.d3_debug_data = NULL; 225 226 iwl_dbg_tlv_del_timers(fwrt->trans); 227 for (i = 0; i < IWL_FW_RUNTIME_DUMP_WK_NUM; i++) 228 cancel_delayed_work_sync(&fwrt->dump.wks[i].wk); 229 } 230 231 void iwl_fw_runtime_suspend(struct iwl_fw_runtime *fwrt); 232 233 void iwl_fw_runtime_resume(struct iwl_fw_runtime *fwrt); 234 235 static inline void iwl_fw_set_current_image(struct iwl_fw_runtime *fwrt, 236 enum iwl_ucode_type cur_fw_img) 237 { 238 fwrt->cur_fw_img = cur_fw_img; 239 } 240 241 int iwl_init_paging(struct iwl_fw_runtime *fwrt, enum iwl_ucode_type type); 242 void iwl_free_fw_paging(struct iwl_fw_runtime *fwrt); 243 244 void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt); 245 int iwl_set_soc_latency(struct iwl_fw_runtime *fwrt); 246 247 #endif /* __iwl_fw_runtime_h__ */ 248