Commit | Line | Data |
---|---|---|
8e99ea8d JB |
1 | /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ |
2 | /* | |
3 | * Copyright (C) 2017 Intel Deutschland GmbH | |
74f4cd71 | 4 | * Copyright (C) 2018-2024 Intel Corporation |
8e99ea8d | 5 | */ |
235acb18 JB |
6 | #ifndef __iwl_fw_runtime_h__ |
7 | #define __iwl_fw_runtime_h__ | |
8 | ||
9 | #include "iwl-config.h" | |
10 | #include "iwl-trans.h" | |
11 | #include "img.h" | |
d172a5ef JB |
12 | #include "fw/api/debug.h" |
13 | #include "fw/api/paging.h" | |
39c1a972 | 14 | #include "fw/api/power.h" |
6584b9d0 | 15 | #include "iwl-nvm-utils.h" |
39c1a972 | 16 | #include "fw/acpi.h" |
2594e4d9 | 17 | #include "fw/regulatory.h" |
235acb18 | 18 | |
7174beb6 | 19 | struct iwl_fw_runtime_ops { |
f5cdcb86 | 20 | void (*dump_start)(void *ctx); |
7174beb6 | 21 | void (*dump_end)(void *ctx); |
d3f4b6de | 22 | int (*send_hcmd)(void *ctx, struct iwl_host_cmd *host_cmd); |
971377e6 | 23 | bool (*d3_debug_enable)(void *ctx); |
7174beb6 JB |
24 | }; |
25 | ||
d0b813fc | 26 | #define MAX_NUM_LMAC 2 |
834f920e MS |
27 | #define MAX_NUM_TCM 2 |
28 | #define MAX_NUM_RCM 2 | |
d0b813fc JB |
29 | struct iwl_fwrt_shared_mem_cfg { |
30 | int num_lmacs; | |
31 | int num_txfifo_entries; | |
32 | struct { | |
33 | u32 txfifo_size[TX_FIFO_MAX_NUM]; | |
34 | u32 rxfifo1_size; | |
35 | } lmac[MAX_NUM_LMAC]; | |
36 | u32 rxfifo2_size; | |
ebfa7f8a | 37 | u32 rxfifo2_control_size; |
d0b813fc JB |
38 | u32 internal_txfifo_addr; |
39 | u32 internal_txfifo_size[TX_FIFO_INTERNAL_MAX_NUM]; | |
40 | }; | |
41 | ||
c7ab138e | 42 | #define IWL_FW_RUNTIME_DUMP_WK_NUM 5 |
7174beb6 | 43 | |
3b589d56 SM |
44 | /** |
45 | * struct iwl_fwrt_dump_data - dump data | |
46 | * @trig: trigger the worker was scheduled upon | |
47 | * @fw_pkt: packet received from FW | |
6decbba7 JB |
48 | * |
49 | * Note that the decision which part of the union is used | |
50 | * is based on iwl_trans_dbg_ini_valid(): the 'trig' part | |
51 | * is used if it is %true, the 'desc' part otherwise. | |
3b589d56 SM |
52 | */ |
53 | struct iwl_fwrt_dump_data { | |
7a99c877 SM |
54 | union { |
55 | struct { | |
56 | struct iwl_fw_ini_trigger_tlv *trig; | |
57 | struct iwl_rx_packet *fw_pkt; | |
58 | }; | |
59 | struct { | |
6decbba7 | 60 | /* must be first to be same as 'trig' */ |
7a99c877 SM |
61 | const struct iwl_fw_dump_desc *desc; |
62 | bool monitor_only; | |
63 | }; | |
64 | }; | |
3b589d56 SM |
65 | }; |
66 | ||
67 | /** | |
68 | * struct iwl_fwrt_wk_data - dump worker data struct | |
69 | * @idx: index of the worker | |
70 | * @wk: worker | |
71 | */ | |
72 | struct iwl_fwrt_wk_data { | |
73 | u8 idx; | |
74 | struct delayed_work wk; | |
75 | struct iwl_fwrt_dump_data dump_data; | |
76 | }; | |
77 | ||
d4c444ef SM |
78 | /** |
79 | * struct iwl_txf_iter_data - Tx fifo iterator data struct | |
80 | * @fifo: fifo number | |
81 | * @lmac: lmac number | |
82 | * @fifo_size: fifo size | |
83 | * @internal_txf: non zero if fifo is internal Tx fifo | |
84 | */ | |
85 | struct iwl_txf_iter_data { | |
86 | int fifo; | |
87 | int lmac; | |
88 | u32 fifo_size; | |
89 | u8 internal_txf; | |
90 | }; | |
91 | ||
235acb18 JB |
92 | /** |
93 | * struct iwl_fw_runtime - runtime data for firmware | |
94 | * @fw: firmware image | |
95 | * @cfg: NIC configuration | |
96 | * @dev: device pointer | |
7174beb6 JB |
97 | * @ops: user ops |
98 | * @ops_ctx: user ops context | |
235acb18 JB |
99 | * @fw_paging_db: paging database |
100 | * @num_of_paging_blk: number of paging blocks | |
101 | * @num_of_pages_in_last_blk: number of pages in the last block | |
d0b813fc | 102 | * @smem_cfg: saved firmware SMEM configuration |
702e975d JB |
103 | * @cur_fw_img: current firmware image, must be maintained by |
104 | * the driver by calling &iwl_fw_set_current_image() | |
7174beb6 | 105 | * @dump: debug dump data |
4a9bb5b4 | 106 | * @uats_table: AP type table |
ebe8f413 MK |
107 | * @uefi_tables_lock_status: The status of the WIFI GUID UEFI variables lock: |
108 | * 0: Unlocked, 1 and 2: Locked. | |
109 | * Only read the UEFI variables if locked. | |
2594e4d9 MK |
110 | * @sar_profiles: sar profiles as read from WRDS/EWRD BIOS tables |
111 | * @geo_profiles: geographic profiles as read from WGDS BIOS table | |
235acb18 JB |
112 | */ |
113 | struct iwl_fw_runtime { | |
114 | struct iwl_trans *trans; | |
115 | const struct iwl_fw *fw; | |
116 | struct device *dev; | |
117 | ||
7174beb6 JB |
118 | const struct iwl_fw_runtime_ops *ops; |
119 | void *ops_ctx; | |
120 | ||
fdb70083 JB |
121 | const struct iwl_dump_sanitize_ops *sanitize_ops; |
122 | void *sanitize_ctx; | |
123 | ||
235acb18 JB |
124 | /* Paging */ |
125 | struct iwl_fw_paging fw_paging_db[NUM_OF_FW_PAGING_BLOCKS]; | |
126 | u16 num_of_paging_blk; | |
127 | u16 num_of_pages_in_last_blk; | |
d0b813fc | 128 | |
702e975d JB |
129 | enum iwl_ucode_type cur_fw_img; |
130 | ||
d0b813fc JB |
131 | /* memory configuration */ |
132 | struct iwl_fwrt_shared_mem_cfg smem_cfg; | |
7174beb6 JB |
133 | |
134 | /* debug */ | |
135 | struct { | |
3b589d56 | 136 | struct iwl_fwrt_wk_data wks[IWL_FW_RUNTIME_DUMP_WK_NUM]; |
c7ab138e | 137 | unsigned long active_wks; |
7174beb6 JB |
138 | |
139 | u8 conf; | |
140 | ||
141 | /* ts of the beginning of a non-collect fw dbg data period */ | |
3b589d56 | 142 | unsigned long non_collect_ts_start[IWL_FW_INI_TIME_POINT_NUM]; |
2d8c2615 | 143 | u32 *d3_debug_data; |
d3561e0e | 144 | u32 lmac_err_id[MAX_NUM_LMAC]; |
834f920e MS |
145 | u32 tcm_err_id[MAX_NUM_TCM]; |
146 | u32 rcm_err_id[MAX_NUM_RCM]; | |
d3561e0e | 147 | u32 umac_err_id; |
d4c444ef SM |
148 | |
149 | struct iwl_txf_iter_data txf_iter_data; | |
57d88b11 | 150 | |
0a3a3e9e SM |
151 | struct { |
152 | u8 type; | |
153 | u8 subtype; | |
154 | u32 lmac_major; | |
155 | u32 lmac_minor; | |
156 | u32 umac_major; | |
157 | u32 umac_minor; | |
158 | } fw_ver; | |
7174beb6 | 159 | } dump; |
93b167c1 | 160 | struct { |
eeef0168 | 161 | #ifdef CONFIG_IWLWIFI_DEBUGFS |
93b167c1 MG |
162 | struct delayed_work wk; |
163 | u32 delay; | |
eeef0168 | 164 | #endif |
93b167c1 MG |
165 | u64 seq; |
166 | } timestamp; | |
eeef0168 | 167 | #ifdef CONFIG_IWLWIFI_DEBUGFS |
39c1a972 | 168 | bool tpc_enabled; |
93b167c1 | 169 | #endif /* CONFIG_IWLWIFI_DEBUGFS */ |
2594e4d9 | 170 | struct iwl_sar_profile sar_profiles[BIOS_SAR_MAX_PROFILE_NUM]; |
39c1a972 IZ |
171 | u8 sar_chain_a_profile; |
172 | u8 sar_chain_b_profile; | |
427661e4 | 173 | u8 reduced_power_flags; |
2594e4d9 | 174 | struct iwl_geo_profile geo_profiles[BIOS_GEO_MAX_PROFILE_NUM]; |
39c1a972 | 175 | u32 geo_rev; |
c593d2fa AB |
176 | u32 geo_num_profiles; |
177 | bool geo_enabled; | |
8bdc52b9 MK |
178 | struct iwl_ppag_chain ppag_chains[IWL_NUM_CHAIN_LIMITS]; |
179 | u32 ppag_flags; | |
3d801a75 | 180 | u8 ppag_ver; |
c593d2fa AB |
181 | struct iwl_sar_offset_mapping_cmd sgom_table; |
182 | bool sgom_enabled; | |
2848df96 | 183 | struct iwl_mcc_allowed_ap_type_cmd uats_table; |
084e0452 | 184 | u8 uefi_tables_lock_status; |
235acb18 JB |
185 | }; |
186 | ||
7174beb6 | 187 | void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans, |
93b167c1 MG |
188 | const struct iwl_fw *fw, |
189 | const struct iwl_fw_runtime_ops *ops, void *ops_ctx, | |
fdb70083 JB |
190 | const struct iwl_dump_sanitize_ops *sanitize_ops, |
191 | void *sanitize_ctx, | |
93b167c1 MG |
192 | struct dentry *dbgfs_dir); |
193 | ||
54f3f994 SM |
194 | static inline void iwl_fw_runtime_free(struct iwl_fw_runtime *fwrt) |
195 | { | |
b61a6610 SM |
196 | int i; |
197 | ||
54f3f994 SM |
198 | kfree(fwrt->dump.d3_debug_data); |
199 | fwrt->dump.d3_debug_data = NULL; | |
b61a6610 | 200 | |
787350ef SM |
201 | iwl_dbg_tlv_del_timers(fwrt->trans); |
202 | for (i = 0; i < IWL_FW_RUNTIME_DUMP_WK_NUM; i++) | |
203 | cancel_delayed_work_sync(&fwrt->dump.wks[i].wk); | |
54f3f994 | 204 | } |
235acb18 | 205 | |
7f8ae00f HD |
206 | void iwl_fw_runtime_suspend(struct iwl_fw_runtime *fwrt); |
207 | ||
208 | void iwl_fw_runtime_resume(struct iwl_fw_runtime *fwrt); | |
209 | ||
702e975d JB |
210 | static inline void iwl_fw_set_current_image(struct iwl_fw_runtime *fwrt, |
211 | enum iwl_ucode_type cur_fw_img) | |
212 | { | |
213 | fwrt->cur_fw_img = cur_fw_img; | |
214 | } | |
215 | ||
235acb18 JB |
216 | int iwl_init_paging(struct iwl_fw_runtime *fwrt, enum iwl_ucode_type type); |
217 | void iwl_free_fw_paging(struct iwl_fw_runtime *fwrt); | |
218 | ||
d0b813fc | 219 | void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt); |
a8eb340f | 220 | int iwl_set_soc_latency(struct iwl_fw_runtime *fwrt); |
9cd243f2 | 221 | int iwl_configure_rxq(struct iwl_fw_runtime *fwrt); |
d0b813fc | 222 | |
235acb18 | 223 | #endif /* __iwl_fw_runtime_h__ */ |