Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/iwlwifi/fw/runtime.h
48287 views
1
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2
/*
3
* Copyright (C) 2017 Intel Deutschland GmbH
4
* Copyright (C) 2018-2025 Intel Corporation
5
*/
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"
12
#include "fw/api/debug.h"
13
#include "fw/api/paging.h"
14
#include "fw/api/power.h"
15
#include "iwl-nvm-utils.h"
16
#include "fw/acpi.h"
17
#include "fw/regulatory.h"
18
19
struct iwl_fw_runtime_ops {
20
void (*dump_start)(void *ctx);
21
void (*dump_end)(void *ctx);
22
int (*send_hcmd)(void *ctx, struct iwl_host_cmd *host_cmd);
23
bool (*d3_debug_enable)(void *ctx);
24
};
25
26
#define MAX_NUM_LMAC 2
27
#define MAX_NUM_TCM 2
28
#define MAX_NUM_RCM 2
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;
37
u32 rxfifo2_control_size;
38
u32 internal_txfifo_addr;
39
u32 internal_txfifo_size[TX_FIFO_INTERNAL_MAX_NUM];
40
};
41
42
#define IWL_FW_RUNTIME_DUMP_WK_NUM 5
43
44
/**
45
* struct iwl_fwrt_dump_data - dump data
46
* @trig: trigger the worker was scheduled upon
47
* @fw_pkt: packet received from FW
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.
52
*/
53
struct iwl_fwrt_dump_data {
54
union {
55
struct {
56
struct iwl_fw_ini_trigger_tlv *trig;
57
struct iwl_rx_packet *fw_pkt;
58
};
59
struct {
60
/* must be first to be same as 'trig' */
61
const struct iwl_fw_dump_desc *desc;
62
bool monitor_only;
63
};
64
};
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
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
92
/**
93
* struct iwl_fw_runtime - runtime data for firmware
94
* @fw: firmware image
95
* @cfg: NIC configuration
96
* @dev: device pointer
97
* @ops: user ops
98
* @ops_ctx: user ops context
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
102
* @smem_cfg: saved firmware SMEM configuration
103
* @cur_fw_img: current firmware image, must be maintained by
104
* the driver by calling &iwl_fw_set_current_image()
105
* @dump: debug dump data
106
* @uats_table: AP type table
107
* @uats_valid: is AP type table valid
108
* @uefi_tables_lock_status: The status of the WIFI GUID UEFI variables lock:
109
* 0: Unlocked, 1 and 2: Locked.
110
* Only read the UEFI variables if locked.
111
* @sar_profiles: sar profiles as read from WRDS/EWRD BIOS tables
112
* @geo_profiles: geographic profiles as read from WGDS BIOS table
113
* @phy_filters: specific phy filters as read from WPFC BIOS table
114
* @ppag_bios_rev: PPAG BIOS revision
115
* @ppag_bios_source: see &enum bios_source
116
* @acpi_dsm_funcs_valid: bitmap indicating which DSM values are valid,
117
* zero (default initialization) means it hasn't been read yet,
118
* and BIT(0) is set when it has since function 0 also has this
119
* bitmap and is always supported
120
*/
121
struct iwl_fw_runtime {
122
struct iwl_trans *trans;
123
const struct iwl_fw *fw;
124
struct device *dev;
125
126
const struct iwl_fw_runtime_ops *ops;
127
void *ops_ctx;
128
129
const struct iwl_dump_sanitize_ops *sanitize_ops;
130
void *sanitize_ctx;
131
132
/* Paging */
133
struct iwl_fw_paging fw_paging_db[NUM_OF_FW_PAGING_BLOCKS];
134
u16 num_of_paging_blk;
135
u16 num_of_pages_in_last_blk;
136
137
enum iwl_ucode_type cur_fw_img;
138
139
/* memory configuration */
140
struct iwl_fwrt_shared_mem_cfg smem_cfg;
141
142
/* debug */
143
struct {
144
struct iwl_fwrt_wk_data wks[IWL_FW_RUNTIME_DUMP_WK_NUM];
145
unsigned long active_wks;
146
147
u8 conf;
148
149
/* ts of the beginning of a non-collect fw dbg data period */
150
unsigned long non_collect_ts_start[IWL_FW_INI_TIME_POINT_NUM];
151
u32 *d3_debug_data;
152
u32 lmac_err_id[MAX_NUM_LMAC];
153
u32 tcm_err_id[MAX_NUM_TCM];
154
u32 rcm_err_id[MAX_NUM_RCM];
155
u32 umac_err_id;
156
157
struct iwl_txf_iter_data txf_iter_data;
158
159
struct {
160
u8 type;
161
u8 subtype;
162
u32 lmac_major;
163
u32 lmac_minor;
164
u32 umac_major;
165
u32 umac_minor;
166
} fw_ver;
167
} dump;
168
struct {
169
#ifdef CONFIG_IWLWIFI_DEBUGFS
170
struct delayed_work wk;
171
u32 delay;
172
#endif
173
u64 seq;
174
} timestamp;
175
#ifdef CONFIG_IWLWIFI_DEBUGFS
176
bool tpc_enabled;
177
#endif /* CONFIG_IWLWIFI_DEBUGFS */
178
struct iwl_sar_profile sar_profiles[BIOS_SAR_MAX_PROFILE_NUM];
179
u8 sar_chain_a_profile;
180
u8 sar_chain_b_profile;
181
u8 reduced_power_flags;
182
struct iwl_geo_profile geo_profiles[BIOS_GEO_MAX_PROFILE_NUM];
183
u32 geo_rev;
184
u32 geo_num_profiles;
185
bool geo_enabled;
186
struct iwl_ppag_chain ppag_chains[IWL_NUM_CHAIN_LIMITS];
187
u32 ppag_flags;
188
u8 ppag_bios_rev;
189
u8 ppag_bios_source;
190
struct iwl_sar_offset_mapping_cmd sgom_table;
191
bool sgom_enabled;
192
struct iwl_mcc_allowed_ap_type_cmd uats_table;
193
bool uats_valid;
194
u8 uefi_tables_lock_status;
195
struct iwl_phy_specific_cfg phy_filters;
196
197
#ifdef CONFIG_ACPI
198
u32 acpi_dsm_funcs_valid;
199
#endif
200
};
201
202
void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans,
203
const struct iwl_fw *fw,
204
const struct iwl_fw_runtime_ops *ops, void *ops_ctx,
205
const struct iwl_dump_sanitize_ops *sanitize_ops,
206
void *sanitize_ctx,
207
struct dentry *dbgfs_dir);
208
209
static inline void iwl_fw_runtime_free(struct iwl_fw_runtime *fwrt)
210
{
211
int i;
212
213
kfree(fwrt->dump.d3_debug_data);
214
fwrt->dump.d3_debug_data = NULL;
215
216
iwl_dbg_tlv_del_timers(fwrt->trans);
217
for (i = 0; i < IWL_FW_RUNTIME_DUMP_WK_NUM; i++)
218
cancel_delayed_work_sync(&fwrt->dump.wks[i].wk);
219
}
220
221
void iwl_fw_runtime_suspend(struct iwl_fw_runtime *fwrt);
222
223
void iwl_fw_runtime_resume(struct iwl_fw_runtime *fwrt);
224
225
static inline void iwl_fw_set_current_image(struct iwl_fw_runtime *fwrt,
226
enum iwl_ucode_type cur_fw_img)
227
{
228
fwrt->cur_fw_img = cur_fw_img;
229
}
230
231
int iwl_init_paging(struct iwl_fw_runtime *fwrt, enum iwl_ucode_type type);
232
void iwl_free_fw_paging(struct iwl_fw_runtime *fwrt);
233
234
void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt);
235
int iwl_set_soc_latency(struct iwl_fw_runtime *fwrt);
236
int iwl_configure_rxq(struct iwl_fw_runtime *fwrt);
237
238
#endif /* __iwl_fw_runtime_h__ */
239
240