xref: /linux/drivers/net/wireless/ath/ath11k/hw.h (revision 4f6b838c378a52ea3ae0b15f12ca8a20849072fa)
1d5c65159SKalle Valo /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2d5c65159SKalle Valo /*
3d5c65159SKalle Valo  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4d5c65159SKalle Valo  */
5d5c65159SKalle Valo 
6d5c65159SKalle Valo #ifndef ATH11K_HW_H
7d5c65159SKalle Valo #define ATH11K_HW_H
8d5c65159SKalle Valo 
92d4bcbedSCarl Huang #include "wmi.h"
102d4bcbedSCarl Huang 
11d5c65159SKalle Valo /* Target configuration defines */
12d5c65159SKalle Valo 
13d5c65159SKalle Valo /* Num VDEVS per radio */
14d5c65159SKalle Valo #define TARGET_NUM_VDEVS	(16 + 1)
15d5c65159SKalle Valo 
16d5c65159SKalle Valo #define TARGET_NUM_PEERS_PDEV	(512 + TARGET_NUM_VDEVS)
17d5c65159SKalle Valo 
18d5c65159SKalle Valo /* Num of peers for Single Radio mode */
19d5c65159SKalle Valo #define TARGET_NUM_PEERS_SINGLE		(TARGET_NUM_PEERS_PDEV)
20d5c65159SKalle Valo 
21d5c65159SKalle Valo /* Num of peers for DBS */
22d5c65159SKalle Valo #define TARGET_NUM_PEERS_DBS		(2 * TARGET_NUM_PEERS_PDEV)
23d5c65159SKalle Valo 
24d5c65159SKalle Valo /* Num of peers for DBS_SBS */
25d5c65159SKalle Valo #define TARGET_NUM_PEERS_DBS_SBS	(3 * TARGET_NUM_PEERS_PDEV)
26d5c65159SKalle Valo 
27d5c65159SKalle Valo /* Max num of stations (per radio) */
28d5c65159SKalle Valo #define TARGET_NUM_STATIONS	512
29d5c65159SKalle Valo 
30d5c65159SKalle Valo #define TARGET_NUM_PEERS(x)	TARGET_NUM_PEERS_##x
31d5c65159SKalle Valo #define TARGET_NUM_PEER_KEYS	2
32d5c65159SKalle Valo #define TARGET_NUM_TIDS(x)	(2 * TARGET_NUM_PEERS(x) + \
33d5c65159SKalle Valo 				 4 * TARGET_NUM_VDEVS + 8)
34d5c65159SKalle Valo 
35d5c65159SKalle Valo #define TARGET_AST_SKID_LIMIT	16
36d5c65159SKalle Valo #define TARGET_NUM_OFFLD_PEERS	4
37d5c65159SKalle Valo #define TARGET_NUM_OFFLD_REORDER_BUFFS 4
38d5c65159SKalle Valo 
39d5c65159SKalle Valo #define TARGET_TX_CHAIN_MASK	(BIT(0) | BIT(1) | BIT(2) | BIT(4))
40d5c65159SKalle Valo #define TARGET_RX_CHAIN_MASK	(BIT(0) | BIT(1) | BIT(2) | BIT(4))
41d5c65159SKalle Valo #define TARGET_RX_TIMEOUT_LO_PRI	100
42d5c65159SKalle Valo #define TARGET_RX_TIMEOUT_HI_PRI	40
43d5c65159SKalle Valo 
44d5c65159SKalle Valo #define TARGET_DECAP_MODE_RAW		0
45d5c65159SKalle Valo #define TARGET_DECAP_MODE_NATIVE_WIFI	1
46d5c65159SKalle Valo #define TARGET_DECAP_MODE_ETH		2
47d5c65159SKalle Valo 
48d5c65159SKalle Valo #define TARGET_SCAN_MAX_PENDING_REQS	4
49d5c65159SKalle Valo #define TARGET_BMISS_OFFLOAD_MAX_VDEV	3
50d5c65159SKalle Valo #define TARGET_ROAM_OFFLOAD_MAX_VDEV	3
51d5c65159SKalle Valo #define TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES	8
52d5c65159SKalle Valo #define TARGET_GTK_OFFLOAD_MAX_VDEV	3
53d5c65159SKalle Valo #define TARGET_NUM_MCAST_GROUPS		12
54d5c65159SKalle Valo #define TARGET_NUM_MCAST_TABLE_ELEMS	64
55d5c65159SKalle Valo #define TARGET_MCAST2UCAST_MODE		2
56d5c65159SKalle Valo #define TARGET_TX_DBG_LOG_SIZE		1024
57d5c65159SKalle Valo #define TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1
58d5c65159SKalle Valo #define TARGET_VOW_CONFIG		0
59d5c65159SKalle Valo #define TARGET_NUM_MSDU_DESC		(2500)
60d5c65159SKalle Valo #define TARGET_MAX_FRAG_ENTRIES		6
61d5c65159SKalle Valo #define TARGET_MAX_BCN_OFFLD		16
62d5c65159SKalle Valo #define TARGET_NUM_WDS_ENTRIES		32
63d5c65159SKalle Valo #define TARGET_DMA_BURST_SIZE		1
64d5c65159SKalle Valo #define TARGET_RX_BATCHMODE		1
65d5c65159SKalle Valo 
66d5c65159SKalle Valo #define ATH11K_HW_MAX_QUEUES		4
67107560d8SJohn Crispin #define ATH11K_QUEUE_LEN		4096
68d5c65159SKalle Valo 
69d5c65159SKalle Valo #define ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK  0x4
70d5c65159SKalle Valo 
71d5c65159SKalle Valo #define ATH11K_FW_DIR			"ath11k"
72d5c65159SKalle Valo 
73d5c65159SKalle Valo #define ATH11K_BOARD_MAGIC		"QCA-ATH11K-BOARD"
74d5c65159SKalle Valo #define ATH11K_BOARD_API2_FILE		"board-2.bin"
7593a5b668SAnilkumar Kolli #define ATH11K_DEFAULT_BOARD_FILE	"board.bin"
76d5c65159SKalle Valo #define ATH11K_DEFAULT_CAL_FILE		"caldata.bin"
771399fb87SGovind Singh #define ATH11K_AMSS_FILE		"amss.bin"
7856970454SGovind Singh #define ATH11K_M3_FILE			"m3.bin"
79d5c65159SKalle Valo 
80d5c65159SKalle Valo enum ath11k_hw_rate_cck {
81d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_LP_11M = 0,
82d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_LP_5_5M,
83d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_LP_2M,
84d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_LP_1M,
85d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_SP_11M,
86d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_SP_5_5M,
87d5c65159SKalle Valo 	ATH11K_HW_RATE_CCK_SP_2M,
88d5c65159SKalle Valo };
89d5c65159SKalle Valo 
90d5c65159SKalle Valo enum ath11k_hw_rate_ofdm {
91d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_48M = 0,
92d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_24M,
93d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_12M,
94d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_6M,
95d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_54M,
96d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_36M,
97d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_18M,
98d5c65159SKalle Valo 	ATH11K_HW_RATE_OFDM_9M,
99d5c65159SKalle Valo };
100d5c65159SKalle Valo 
101630ad41cSGovind Singh enum ath11k_bus {
102630ad41cSGovind Singh 	ATH11K_BUS_AHB,
103630ad41cSGovind Singh 	ATH11K_BUS_PCI,
104630ad41cSGovind Singh };
105630ad41cSGovind Singh 
10634d5a3a8SKalle Valo #define ATH11K_EXT_IRQ_GRP_NUM_MAX 11
10734d5a3a8SKalle Valo 
10834d5a3a8SKalle Valo struct ath11k_hw_ring_mask {
10934d5a3a8SKalle Valo 	u8 tx[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11034d5a3a8SKalle Valo 	u8 rx_mon_status[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11134d5a3a8SKalle Valo 	u8 rx[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11234d5a3a8SKalle Valo 	u8 rx_err[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11334d5a3a8SKalle Valo 	u8 rx_wbm_rel[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11434d5a3a8SKalle Valo 	u8 reo_status[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11534d5a3a8SKalle Valo 	u8 rxdma2host[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11634d5a3a8SKalle Valo 	u8 host2rxdma[ATH11K_EXT_IRQ_GRP_NUM_MAX];
11734d5a3a8SKalle Valo };
11834d5a3a8SKalle Valo 
119d5c65159SKalle Valo struct ath11k_hw_params {
120d5c65159SKalle Valo 	const char *name;
121d3318abfSAnilkumar Kolli 	u16 hw_rev;
122b1cc29e9SAnilkumar Kolli 	u8 max_radios;
1233b94ae4cSAnilkumar Kolli 	u32 bdf_addr;
1243b94ae4cSAnilkumar Kolli 
125d5c65159SKalle Valo 	struct {
126d5c65159SKalle Valo 		const char *dir;
127d5c65159SKalle Valo 		size_t board_size;
128d5c65159SKalle Valo 		size_t cal_size;
129d5c65159SKalle Valo 	} fw;
130d547ca4cSAnilkumar Kolli 
131d547ca4cSAnilkumar Kolli 	const struct ath11k_hw_ops *hw_ops;
13234d5a3a8SKalle Valo 	const struct ath11k_hw_ring_mask *ring_mask;
133727fae14SCarl Huang 
134727fae14SCarl Huang 	bool internal_sleep_clock;
1356976433cSCarl Huang 
1366976433cSCarl Huang 	const struct ath11k_hw_regs *regs;
137e3396b8bSCarl Huang 	const struct ce_attr *host_ce_config;
138e3396b8bSCarl Huang 	u32 ce_count;
139967c1d11SAnilkumar Kolli 	const struct ce_pipe_config *target_ce_config;
140967c1d11SAnilkumar Kolli 	u32 target_ce_count;
141967c1d11SAnilkumar Kolli 	const struct service_to_pipe *svc_to_ce_map;
142967c1d11SAnilkumar Kolli 	u32 svc_to_ce_map_len;
1435f859bc0SCarl Huang 
1445f859bc0SCarl Huang 	bool single_pdev_only;
145ed0192f7SCarl Huang 
146ed0192f7SCarl Huang 	/* For example on QCA6390 struct
147ed0192f7SCarl Huang 	 * wmi_init_cmd_param::band_to_mac_config needs to be false as the
148ed0192f7SCarl Huang 	 * firmware creates the mapping.
149ed0192f7SCarl Huang 	 */
150ed0192f7SCarl Huang 	bool needs_band_to_mac;
1517f6fc1ebSCarl Huang 
1527f6fc1ebSCarl Huang 	bool rxdma1_enable;
1534152e420SCarl Huang 	int num_rxmda_per_pdev;
1544152e420SCarl Huang 	bool rx_mac_buf_ring;
155e7495035SCarl Huang 	bool vdev_start_delay;
156a6275302SCarl Huang 	bool htt_peer_map_v2;
157065f5f68SCarl Huang 	bool tcl_0_only;
1585cca5fa1SKarthikeyan Periyasamy 	u8 spectral_fft_sz;
1592626c269SKalle Valo 
1602626c269SKalle Valo 	u16 interface_modes;
1613f6e6c32SKalle Valo 	bool supports_monitor;
162e838c14aSCarl Huang 	bool supports_shadow_regs;
163*c83c500bSCarl Huang 	bool idle_ps;
1644152e420SCarl Huang };
1654152e420SCarl Huang 
1664152e420SCarl Huang struct ath11k_hw_ops {
1674152e420SCarl Huang 	u8 (*get_hw_mac_from_pdev_id)(int pdev_id);
1684152e420SCarl Huang 	void (*wmi_init_config)(struct ath11k_base *ab,
1694152e420SCarl Huang 				struct target_resource_config *config);
1704152e420SCarl Huang 	int (*mac_id_to_pdev_id)(struct ath11k_hw_params *hw, int mac_id);
1714152e420SCarl Huang 	int (*mac_id_to_srng_id)(struct ath11k_hw_params *hw, int mac_id);
172d5c65159SKalle Valo };
173d5c65159SKalle Valo 
174d547ca4cSAnilkumar Kolli extern const struct ath11k_hw_ops ipq8074_ops;
175d547ca4cSAnilkumar Kolli extern const struct ath11k_hw_ops ipq6018_ops;
1769de2ad43SCarl Huang extern const struct ath11k_hw_ops qca6390_ops;
177d547ca4cSAnilkumar Kolli 
17834d5a3a8SKalle Valo extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074;
179d4ecb90bSCarl Huang extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390;
18034d5a3a8SKalle Valo 
181d547ca4cSAnilkumar Kolli static inline
182d547ca4cSAnilkumar Kolli int ath11k_hw_get_mac_from_pdev_id(struct ath11k_hw_params *hw,
183d547ca4cSAnilkumar Kolli 				   int pdev_idx)
184d547ca4cSAnilkumar Kolli {
185d547ca4cSAnilkumar Kolli 	if (hw->hw_ops->get_hw_mac_from_pdev_id)
186d547ca4cSAnilkumar Kolli 		return hw->hw_ops->get_hw_mac_from_pdev_id(pdev_idx);
187d547ca4cSAnilkumar Kolli 
188d547ca4cSAnilkumar Kolli 	return 0;
189d547ca4cSAnilkumar Kolli }
190d547ca4cSAnilkumar Kolli 
1914152e420SCarl Huang static inline int ath11k_hw_mac_id_to_pdev_id(struct ath11k_hw_params *hw,
1924152e420SCarl Huang 					      int mac_id)
1934152e420SCarl Huang {
1944152e420SCarl Huang 	if (hw->hw_ops->mac_id_to_pdev_id)
1954152e420SCarl Huang 		return hw->hw_ops->mac_id_to_pdev_id(hw, mac_id);
1964152e420SCarl Huang 
1974152e420SCarl Huang 	return 0;
1984152e420SCarl Huang }
1994152e420SCarl Huang 
2004152e420SCarl Huang static inline int ath11k_hw_mac_id_to_srng_id(struct ath11k_hw_params *hw,
2014152e420SCarl Huang 					      int mac_id)
2024152e420SCarl Huang {
2034152e420SCarl Huang 	if (hw->hw_ops->mac_id_to_srng_id)
2044152e420SCarl Huang 		return hw->hw_ops->mac_id_to_srng_id(hw, mac_id);
2054152e420SCarl Huang 
2064152e420SCarl Huang 	return 0;
2074152e420SCarl Huang }
2084152e420SCarl Huang 
209d5c65159SKalle Valo struct ath11k_fw_ie {
210d5c65159SKalle Valo 	__le32 id;
211d5c65159SKalle Valo 	__le32 len;
21214dd3a71SGustavo A. R. Silva 	u8 data[];
213d5c65159SKalle Valo };
214d5c65159SKalle Valo 
215d5c65159SKalle Valo enum ath11k_bd_ie_board_type {
216d5c65159SKalle Valo 	ATH11K_BD_IE_BOARD_NAME = 0,
217d5c65159SKalle Valo 	ATH11K_BD_IE_BOARD_DATA = 1,
218d5c65159SKalle Valo };
219d5c65159SKalle Valo 
220d5c65159SKalle Valo enum ath11k_bd_ie_type {
221d5c65159SKalle Valo 	/* contains sub IEs of enum ath11k_bd_ie_board_type */
222d5c65159SKalle Valo 	ATH11K_BD_IE_BOARD = 0,
223d5c65159SKalle Valo 	ATH11K_BD_IE_BOARD_EXT = 1,
224d5c65159SKalle Valo };
225d5c65159SKalle Valo 
2266976433cSCarl Huang struct ath11k_hw_regs {
2276976433cSCarl Huang 	u32 hal_tcl1_ring_base_lsb;
2286976433cSCarl Huang 	u32 hal_tcl1_ring_base_msb;
2296976433cSCarl Huang 	u32 hal_tcl1_ring_id;
2306976433cSCarl Huang 	u32 hal_tcl1_ring_misc;
2316976433cSCarl Huang 	u32 hal_tcl1_ring_tp_addr_lsb;
2326976433cSCarl Huang 	u32 hal_tcl1_ring_tp_addr_msb;
2336976433cSCarl Huang 	u32 hal_tcl1_ring_consumer_int_setup_ix0;
2346976433cSCarl Huang 	u32 hal_tcl1_ring_consumer_int_setup_ix1;
2356976433cSCarl Huang 	u32 hal_tcl1_ring_msi1_base_lsb;
2366976433cSCarl Huang 	u32 hal_tcl1_ring_msi1_base_msb;
2376976433cSCarl Huang 	u32 hal_tcl1_ring_msi1_data;
2386976433cSCarl Huang 	u32 hal_tcl2_ring_base_lsb;
2396976433cSCarl Huang 	u32 hal_tcl_ring_base_lsb;
2406976433cSCarl Huang 
2416976433cSCarl Huang 	u32 hal_tcl_status_ring_base_lsb;
2426976433cSCarl Huang 
2436976433cSCarl Huang 	u32 hal_reo1_ring_base_lsb;
2446976433cSCarl Huang 	u32 hal_reo1_ring_base_msb;
2456976433cSCarl Huang 	u32 hal_reo1_ring_id;
2466976433cSCarl Huang 	u32 hal_reo1_ring_misc;
2476976433cSCarl Huang 	u32 hal_reo1_ring_hp_addr_lsb;
2486976433cSCarl Huang 	u32 hal_reo1_ring_hp_addr_msb;
2496976433cSCarl Huang 	u32 hal_reo1_ring_producer_int_setup;
2506976433cSCarl Huang 	u32 hal_reo1_ring_msi1_base_lsb;
2516976433cSCarl Huang 	u32 hal_reo1_ring_msi1_base_msb;
2526976433cSCarl Huang 	u32 hal_reo1_ring_msi1_data;
2536976433cSCarl Huang 	u32 hal_reo2_ring_base_lsb;
2546976433cSCarl Huang 	u32 hal_reo1_aging_thresh_ix_0;
2556976433cSCarl Huang 	u32 hal_reo1_aging_thresh_ix_1;
2566976433cSCarl Huang 	u32 hal_reo1_aging_thresh_ix_2;
2576976433cSCarl Huang 	u32 hal_reo1_aging_thresh_ix_3;
2586976433cSCarl Huang 
2596976433cSCarl Huang 	u32 hal_reo1_ring_hp;
2606976433cSCarl Huang 	u32 hal_reo1_ring_tp;
2616976433cSCarl Huang 	u32 hal_reo2_ring_hp;
2626976433cSCarl Huang 
2636976433cSCarl Huang 	u32 hal_reo_tcl_ring_base_lsb;
2646976433cSCarl Huang 	u32 hal_reo_tcl_ring_hp;
2656976433cSCarl Huang 
2666976433cSCarl Huang 	u32 hal_reo_status_ring_base_lsb;
2676976433cSCarl Huang 	u32 hal_reo_status_hp;
2686976433cSCarl Huang };
2696976433cSCarl Huang 
2706976433cSCarl Huang extern const struct ath11k_hw_regs ipq8074_regs;
2716976433cSCarl Huang extern const struct ath11k_hw_regs qca6390_regs;
2726976433cSCarl Huang 
273d5c65159SKalle Valo #endif
274