xref: /openbmc/linux/drivers/net/wireless/ath/ath12k/hw.c (revision bc3bfb63)
1d8899132SKalle Valo // SPDX-License-Identifier: BSD-3-Clause-Clear
2d8899132SKalle Valo /*
3d8899132SKalle Valo  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4*bc3bfb63SJeff Johnson  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
5d8899132SKalle Valo  */
6d8899132SKalle Valo 
7d8899132SKalle Valo #include <linux/types.h>
8d8899132SKalle Valo #include <linux/bitops.h>
9d8899132SKalle Valo #include <linux/bitfield.h>
10d8899132SKalle Valo 
11d8899132SKalle Valo #include "debug.h"
12d8899132SKalle Valo #include "core.h"
13d8899132SKalle Valo #include "ce.h"
14d8899132SKalle Valo #include "hw.h"
15d8899132SKalle Valo #include "mhi.h"
16d8899132SKalle Valo #include "dp_rx.h"
17d8899132SKalle Valo 
ath12k_hw_qcn9274_mac_from_pdev_id(int pdev_idx)18d8899132SKalle Valo static u8 ath12k_hw_qcn9274_mac_from_pdev_id(int pdev_idx)
19d8899132SKalle Valo {
20d8899132SKalle Valo 	return pdev_idx;
21d8899132SKalle Valo }
22d8899132SKalle Valo 
ath12k_hw_mac_id_to_pdev_id_qcn9274(const struct ath12k_hw_params * hw,int mac_id)23d8899132SKalle Valo static int ath12k_hw_mac_id_to_pdev_id_qcn9274(const struct ath12k_hw_params *hw,
24d8899132SKalle Valo 					       int mac_id)
25d8899132SKalle Valo {
26d8899132SKalle Valo 	return mac_id;
27d8899132SKalle Valo }
28d8899132SKalle Valo 
ath12k_hw_mac_id_to_srng_id_qcn9274(const struct ath12k_hw_params * hw,int mac_id)29d8899132SKalle Valo static int ath12k_hw_mac_id_to_srng_id_qcn9274(const struct ath12k_hw_params *hw,
30d8899132SKalle Valo 					       int mac_id)
31d8899132SKalle Valo {
32d8899132SKalle Valo 	return 0;
33d8899132SKalle Valo }
34d8899132SKalle Valo 
ath12k_hw_get_ring_selector_qcn9274(struct sk_buff * skb)35d8899132SKalle Valo static u8 ath12k_hw_get_ring_selector_qcn9274(struct sk_buff *skb)
36d8899132SKalle Valo {
37d8899132SKalle Valo 	return smp_processor_id();
38d8899132SKalle Valo }
39d8899132SKalle Valo 
ath12k_dp_srng_is_comp_ring_qcn9274(int ring_num)40d8899132SKalle Valo static bool ath12k_dp_srng_is_comp_ring_qcn9274(int ring_num)
41d8899132SKalle Valo {
42d8899132SKalle Valo 	if (ring_num < 3 || ring_num == 4)
43d8899132SKalle Valo 		return true;
44d8899132SKalle Valo 
45d8899132SKalle Valo 	return false;
46d8899132SKalle Valo }
47d8899132SKalle Valo 
ath12k_hw_mac_id_to_pdev_id_wcn7850(const struct ath12k_hw_params * hw,int mac_id)48d8899132SKalle Valo static int ath12k_hw_mac_id_to_pdev_id_wcn7850(const struct ath12k_hw_params *hw,
49d8899132SKalle Valo 					       int mac_id)
50d8899132SKalle Valo {
51d8899132SKalle Valo 	return 0;
52d8899132SKalle Valo }
53d8899132SKalle Valo 
ath12k_hw_mac_id_to_srng_id_wcn7850(const struct ath12k_hw_params * hw,int mac_id)54d8899132SKalle Valo static int ath12k_hw_mac_id_to_srng_id_wcn7850(const struct ath12k_hw_params *hw,
55d8899132SKalle Valo 					       int mac_id)
56d8899132SKalle Valo {
57d8899132SKalle Valo 	return mac_id;
58d8899132SKalle Valo }
59d8899132SKalle Valo 
ath12k_hw_get_ring_selector_wcn7850(struct sk_buff * skb)60d8899132SKalle Valo static u8 ath12k_hw_get_ring_selector_wcn7850(struct sk_buff *skb)
61d8899132SKalle Valo {
62d8899132SKalle Valo 	return skb_get_queue_mapping(skb);
63d8899132SKalle Valo }
64d8899132SKalle Valo 
ath12k_dp_srng_is_comp_ring_wcn7850(int ring_num)65d8899132SKalle Valo static bool ath12k_dp_srng_is_comp_ring_wcn7850(int ring_num)
66d8899132SKalle Valo {
67d8899132SKalle Valo 	if (ring_num == 0 || ring_num == 2 || ring_num == 4)
68d8899132SKalle Valo 		return true;
69d8899132SKalle Valo 
70d8899132SKalle Valo 	return false;
71d8899132SKalle Valo }
72d8899132SKalle Valo 
73d8899132SKalle Valo static const struct ath12k_hw_ops qcn9274_ops = {
74d8899132SKalle Valo 	.get_hw_mac_from_pdev_id = ath12k_hw_qcn9274_mac_from_pdev_id,
75d8899132SKalle Valo 	.mac_id_to_pdev_id = ath12k_hw_mac_id_to_pdev_id_qcn9274,
76d8899132SKalle Valo 	.mac_id_to_srng_id = ath12k_hw_mac_id_to_srng_id_qcn9274,
77d8899132SKalle Valo 	.rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_qcn9274,
78d8899132SKalle Valo 	.get_ring_selector = ath12k_hw_get_ring_selector_qcn9274,
79d8899132SKalle Valo 	.dp_srng_is_tx_comp_ring = ath12k_dp_srng_is_comp_ring_qcn9274,
80d8899132SKalle Valo };
81d8899132SKalle Valo 
82d8899132SKalle Valo static const struct ath12k_hw_ops wcn7850_ops = {
83d8899132SKalle Valo 	.get_hw_mac_from_pdev_id = ath12k_hw_qcn9274_mac_from_pdev_id,
84d8899132SKalle Valo 	.mac_id_to_pdev_id = ath12k_hw_mac_id_to_pdev_id_wcn7850,
85d8899132SKalle Valo 	.mac_id_to_srng_id = ath12k_hw_mac_id_to_srng_id_wcn7850,
86d8899132SKalle Valo 	.rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_wcn7850,
87d8899132SKalle Valo 	.get_ring_selector = ath12k_hw_get_ring_selector_wcn7850,
88d8899132SKalle Valo 	.dp_srng_is_tx_comp_ring = ath12k_dp_srng_is_comp_ring_wcn7850,
89d8899132SKalle Valo };
90d8899132SKalle Valo 
91d8899132SKalle Valo #define ATH12K_TX_RING_MASK_0 0x1
92d8899132SKalle Valo #define ATH12K_TX_RING_MASK_1 0x2
93d8899132SKalle Valo #define ATH12K_TX_RING_MASK_2 0x4
94d8899132SKalle Valo #define ATH12K_TX_RING_MASK_3 0x8
95d8899132SKalle Valo #define ATH12K_TX_RING_MASK_4 0x10
96d8899132SKalle Valo 
97d8899132SKalle Valo #define ATH12K_RX_RING_MASK_0 0x1
98d8899132SKalle Valo #define ATH12K_RX_RING_MASK_1 0x2
99d8899132SKalle Valo #define ATH12K_RX_RING_MASK_2 0x4
100d8899132SKalle Valo #define ATH12K_RX_RING_MASK_3 0x8
101d8899132SKalle Valo 
102d8899132SKalle Valo #define ATH12K_RX_ERR_RING_MASK_0 0x1
103d8899132SKalle Valo 
104d8899132SKalle Valo #define ATH12K_RX_WBM_REL_RING_MASK_0 0x1
105d8899132SKalle Valo 
106d8899132SKalle Valo #define ATH12K_REO_STATUS_RING_MASK_0 0x1
107d8899132SKalle Valo 
108d8899132SKalle Valo #define ATH12K_HOST2RXDMA_RING_MASK_0 0x1
109d8899132SKalle Valo 
110d8899132SKalle Valo #define ATH12K_RX_MON_RING_MASK_0 0x1
111d8899132SKalle Valo #define ATH12K_RX_MON_RING_MASK_1 0x2
112d8899132SKalle Valo #define ATH12K_RX_MON_RING_MASK_2 0x4
113d8899132SKalle Valo 
114d8899132SKalle Valo #define ATH12K_TX_MON_RING_MASK_0 0x1
115d8899132SKalle Valo #define ATH12K_TX_MON_RING_MASK_1 0x2
116d8899132SKalle Valo 
117d8899132SKalle Valo /* Target firmware's Copy Engine configuration. */
118d8899132SKalle Valo static const struct ce_pipe_config ath12k_target_ce_config_wlan_qcn9274[] = {
119d8899132SKalle Valo 	/* CE0: host->target HTC control and raw streams */
120d8899132SKalle Valo 	{
121d8899132SKalle Valo 		.pipenum = __cpu_to_le32(0),
122d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
123d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
124d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
125d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
126d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
127d8899132SKalle Valo 	},
128d8899132SKalle Valo 
129d8899132SKalle Valo 	/* CE1: target->host HTT + HTC control */
130d8899132SKalle Valo 	{
131d8899132SKalle Valo 		.pipenum = __cpu_to_le32(1),
132d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
133d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
134d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
135d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
136d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
137d8899132SKalle Valo 	},
138d8899132SKalle Valo 
139d8899132SKalle Valo 	/* CE2: target->host WMI */
140d8899132SKalle Valo 	{
141d8899132SKalle Valo 		.pipenum = __cpu_to_le32(2),
142d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
143d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
144d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
145d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
146d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
147d8899132SKalle Valo 	},
148d8899132SKalle Valo 
149d8899132SKalle Valo 	/* CE3: host->target WMI (mac0) */
150d8899132SKalle Valo 	{
151d8899132SKalle Valo 		.pipenum = __cpu_to_le32(3),
152d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
153d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
154d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
155d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
156d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
157d8899132SKalle Valo 	},
158d8899132SKalle Valo 
159d8899132SKalle Valo 	/* CE4: host->target HTT */
160d8899132SKalle Valo 	{
161d8899132SKalle Valo 		.pipenum = __cpu_to_le32(4),
162d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
163d8899132SKalle Valo 		.nentries = __cpu_to_le32(256),
164d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(256),
165d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
166d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
167d8899132SKalle Valo 	},
168d8899132SKalle Valo 
169d8899132SKalle Valo 	/* CE5: target->host Pktlog */
170d8899132SKalle Valo 	{
171d8899132SKalle Valo 		.pipenum = __cpu_to_le32(5),
172d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
173d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
174d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
175d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
176d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
177d8899132SKalle Valo 	},
178d8899132SKalle Valo 
179d8899132SKalle Valo 	/* CE6: Reserved for target autonomous hif_memcpy */
180d8899132SKalle Valo 	{
181d8899132SKalle Valo 		.pipenum = __cpu_to_le32(6),
182d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_INOUT),
183d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
184d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(16384),
185d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
186d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
187d8899132SKalle Valo 	},
188d8899132SKalle Valo 
189d8899132SKalle Valo 	/* CE7: host->target WMI (mac1) */
190d8899132SKalle Valo 	{
191d8899132SKalle Valo 		.pipenum = __cpu_to_le32(7),
192d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
193d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
194d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
195d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
196d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
197d8899132SKalle Valo 	},
198d8899132SKalle Valo 
199d8899132SKalle Valo 	/* CE8: Reserved for target autonomous hif_memcpy */
200d8899132SKalle Valo 	{
201d8899132SKalle Valo 		.pipenum = __cpu_to_le32(8),
202d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_INOUT),
203d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
204d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(16384),
205d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
206d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
207d8899132SKalle Valo 	},
208d8899132SKalle Valo 
209d8899132SKalle Valo 	/* CE9, 10 and 11: Reserved for MHI */
210d8899132SKalle Valo 
211d8899132SKalle Valo 	/* CE12: Target CV prefetch */
212d8899132SKalle Valo 	{
213d8899132SKalle Valo 		.pipenum = __cpu_to_le32(12),
214d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
215d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
216d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
217d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
218d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
219d8899132SKalle Valo 	},
220d8899132SKalle Valo 
221d8899132SKalle Valo 	/* CE13: Target CV prefetch */
222d8899132SKalle Valo 	{
223d8899132SKalle Valo 		.pipenum = __cpu_to_le32(13),
224d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
225d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
226d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
227d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
228d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
229d8899132SKalle Valo 	},
230d8899132SKalle Valo 
231d8899132SKalle Valo 	/* CE14: WMI logging/CFR/Spectral/Radar */
232d8899132SKalle Valo 	{
233d8899132SKalle Valo 		.pipenum = __cpu_to_le32(14),
234d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
235d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
236d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
237d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
238d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
239d8899132SKalle Valo 	},
240d8899132SKalle Valo 
241d8899132SKalle Valo 	/* CE15: Reserved */
242d8899132SKalle Valo };
243d8899132SKalle Valo 
244d8899132SKalle Valo /* Target firmware's Copy Engine configuration. */
245d8899132SKalle Valo static const struct ce_pipe_config ath12k_target_ce_config_wlan_wcn7850[] = {
246d8899132SKalle Valo 	/* CE0: host->target HTC control and raw streams */
247d8899132SKalle Valo 	{
248d8899132SKalle Valo 		.pipenum = __cpu_to_le32(0),
249d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
250d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
251d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
252d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
253d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
254d8899132SKalle Valo 	},
255d8899132SKalle Valo 
256d8899132SKalle Valo 	/* CE1: target->host HTT + HTC control */
257d8899132SKalle Valo 	{
258d8899132SKalle Valo 		.pipenum = __cpu_to_le32(1),
259d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
260d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
261d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
262d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
263d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
264d8899132SKalle Valo 	},
265d8899132SKalle Valo 
266d8899132SKalle Valo 	/* CE2: target->host WMI */
267d8899132SKalle Valo 	{
268d8899132SKalle Valo 		.pipenum = __cpu_to_le32(2),
269d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
270d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
271d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
272d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
273d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
274d8899132SKalle Valo 	},
275d8899132SKalle Valo 
276d8899132SKalle Valo 	/* CE3: host->target WMI */
277d8899132SKalle Valo 	{
278d8899132SKalle Valo 		.pipenum = __cpu_to_le32(3),
279d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
280d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
281d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
282d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
283d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
284d8899132SKalle Valo 	},
285d8899132SKalle Valo 
286d8899132SKalle Valo 	/* CE4: host->target HTT */
287d8899132SKalle Valo 	{
288d8899132SKalle Valo 		.pipenum = __cpu_to_le32(4),
289d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_OUT),
290d8899132SKalle Valo 		.nentries = __cpu_to_le32(256),
291d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(256),
292d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
293d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
294d8899132SKalle Valo 	},
295d8899132SKalle Valo 
296d8899132SKalle Valo 	/* CE5: target->host Pktlog */
297d8899132SKalle Valo 	{
298d8899132SKalle Valo 		.pipenum = __cpu_to_le32(5),
299d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_IN),
300d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
301d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(2048),
302d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
303d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
304d8899132SKalle Valo 	},
305d8899132SKalle Valo 
306d8899132SKalle Valo 	/* CE6: Reserved for target autonomous hif_memcpy */
307d8899132SKalle Valo 	{
308d8899132SKalle Valo 		.pipenum = __cpu_to_le32(6),
309d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_INOUT),
310d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
311d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(16384),
312d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
313d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
314d8899132SKalle Valo 	},
315d8899132SKalle Valo 
316d8899132SKalle Valo 	/* CE7 used only by Host */
317d8899132SKalle Valo 	{
318d8899132SKalle Valo 		.pipenum = __cpu_to_le32(7),
319d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H),
320d8899132SKalle Valo 		.nentries = __cpu_to_le32(0),
321d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(0),
322d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
323d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
324d8899132SKalle Valo 	},
325d8899132SKalle Valo 
326d8899132SKalle Valo 	/* CE8 target->host used only by IPA */
327d8899132SKalle Valo 	{
328d8899132SKalle Valo 		.pipenum = __cpu_to_le32(8),
329d8899132SKalle Valo 		.pipedir = __cpu_to_le32(PIPEDIR_INOUT),
330d8899132SKalle Valo 		.nentries = __cpu_to_le32(32),
331d8899132SKalle Valo 		.nbytes_max = __cpu_to_le32(16384),
332d8899132SKalle Valo 		.flags = __cpu_to_le32(CE_ATTR_FLAGS),
333d8899132SKalle Valo 		.reserved = __cpu_to_le32(0),
334d8899132SKalle Valo 	},
335d8899132SKalle Valo 	/* CE 9, 10, 11 are used by MHI driver */
336d8899132SKalle Valo };
337d8899132SKalle Valo 
338d8899132SKalle Valo /* Map from service/endpoint to Copy Engine.
339d8899132SKalle Valo  * This table is derived from the CE_PCI TABLE, above.
340d8899132SKalle Valo  * It is passed to the Target at startup for use by firmware.
341d8899132SKalle Valo  */
342d8899132SKalle Valo static const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_qcn9274[] = {
343d8899132SKalle Valo 	{
344d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO),
345d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
346d8899132SKalle Valo 		__cpu_to_le32(3),
347d8899132SKalle Valo 	},
348d8899132SKalle Valo 	{
349d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO),
350d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
351d8899132SKalle Valo 		__cpu_to_le32(2),
352d8899132SKalle Valo 	},
353d8899132SKalle Valo 	{
354d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK),
355d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
356d8899132SKalle Valo 		__cpu_to_le32(3),
357d8899132SKalle Valo 	},
358d8899132SKalle Valo 	{
359d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK),
360d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
361d8899132SKalle Valo 		__cpu_to_le32(2),
362d8899132SKalle Valo 	},
363d8899132SKalle Valo 	{
364d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE),
365d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
366d8899132SKalle Valo 		__cpu_to_le32(3),
367d8899132SKalle Valo 	},
368d8899132SKalle Valo 	{
369d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE),
370d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
371d8899132SKalle Valo 		__cpu_to_le32(2),
372d8899132SKalle Valo 	},
373d8899132SKalle Valo 	{
374d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI),
375d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
376d8899132SKalle Valo 		__cpu_to_le32(3),
377d8899132SKalle Valo 	},
378d8899132SKalle Valo 	{
379d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI),
380d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
381d8899132SKalle Valo 		__cpu_to_le32(2),
382d8899132SKalle Valo 	},
383d8899132SKalle Valo 	{
384d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL),
385d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
386d8899132SKalle Valo 		__cpu_to_le32(3),
387d8899132SKalle Valo 	},
388d8899132SKalle Valo 	{
389d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL),
390d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
391d8899132SKalle Valo 		__cpu_to_le32(2),
392d8899132SKalle Valo 	},
393d8899132SKalle Valo 	{
394d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL),
395d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
396d8899132SKalle Valo 		__cpu_to_le32(0),
397d8899132SKalle Valo 	},
398d8899132SKalle Valo 	{
399d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL),
400d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
401d8899132SKalle Valo 		__cpu_to_le32(1),
402d8899132SKalle Valo 	},
403d8899132SKalle Valo 	{
404d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS),
405d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
406d8899132SKalle Valo 		__cpu_to_le32(0),
407d8899132SKalle Valo 	},
408d8899132SKalle Valo 	{
409d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS),
410d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
411d8899132SKalle Valo 		__cpu_to_le32(1),
412d8899132SKalle Valo 	},
413d8899132SKalle Valo 	{
414d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG),
415d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
416d8899132SKalle Valo 		__cpu_to_le32(4),
417d8899132SKalle Valo 	},
418d8899132SKalle Valo 	{
419d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG),
420d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
421d8899132SKalle Valo 		__cpu_to_le32(1),
422d8899132SKalle Valo 	},
423d8899132SKalle Valo 	{
424d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1),
425d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
426d8899132SKalle Valo 		__cpu_to_le32(7),
427d8899132SKalle Valo 	},
428d8899132SKalle Valo 	{
429d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1),
430d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
431d8899132SKalle Valo 		__cpu_to_le32(2),
432d8899132SKalle Valo 	},
433d8899132SKalle Valo 	{
434d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_PKT_LOG),
435d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
436d8899132SKalle Valo 		__cpu_to_le32(5),
437d8899132SKalle Valo 	},
438d8899132SKalle Valo 	{
439d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL_DIAG),
440d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
441d8899132SKalle Valo 		__cpu_to_le32(14),
442d8899132SKalle Valo 	},
443d8899132SKalle Valo 
444d8899132SKalle Valo 	/* (Additions here) */
445d8899132SKalle Valo 
446d8899132SKalle Valo 	{ /* must be last */
447d8899132SKalle Valo 		__cpu_to_le32(0),
448d8899132SKalle Valo 		__cpu_to_le32(0),
449d8899132SKalle Valo 		__cpu_to_le32(0),
450d8899132SKalle Valo 	},
451d8899132SKalle Valo };
452d8899132SKalle Valo 
453d8899132SKalle Valo static const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_wcn7850[] = {
454d8899132SKalle Valo 	{
455d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO),
456d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
457d8899132SKalle Valo 		__cpu_to_le32(3),
458d8899132SKalle Valo 	},
459d8899132SKalle Valo 	{
460d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO),
461d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
462d8899132SKalle Valo 		__cpu_to_le32(2),
463d8899132SKalle Valo 	},
464d8899132SKalle Valo 	{
465d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK),
466d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
467d8899132SKalle Valo 		__cpu_to_le32(3),
468d8899132SKalle Valo 	},
469d8899132SKalle Valo 	{
470d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK),
471d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
472d8899132SKalle Valo 		__cpu_to_le32(2),
473d8899132SKalle Valo 	},
474d8899132SKalle Valo 	{
475d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE),
476d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
477d8899132SKalle Valo 		__cpu_to_le32(3),
478d8899132SKalle Valo 	},
479d8899132SKalle Valo 	{
480d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE),
481d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
482d8899132SKalle Valo 		__cpu_to_le32(2),
483d8899132SKalle Valo 	},
484d8899132SKalle Valo 	{
485d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI),
486d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
487d8899132SKalle Valo 		__cpu_to_le32(3),
488d8899132SKalle Valo 	},
489d8899132SKalle Valo 	{
490d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI),
491d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
492d8899132SKalle Valo 		__cpu_to_le32(2),
493d8899132SKalle Valo 	},
494d8899132SKalle Valo 	{
495d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL),
496d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
497d8899132SKalle Valo 		__cpu_to_le32(3),
498d8899132SKalle Valo 	},
499d8899132SKalle Valo 	{
500d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL),
501d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
502d8899132SKalle Valo 		__cpu_to_le32(2),
503d8899132SKalle Valo 	},
504d8899132SKalle Valo 	{
505d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL),
506d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
507d8899132SKalle Valo 		__cpu_to_le32(0),
508d8899132SKalle Valo 	},
509d8899132SKalle Valo 	{
510d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL),
511d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
512d8899132SKalle Valo 		__cpu_to_le32(2),
513d8899132SKalle Valo 	},
514d8899132SKalle Valo 	{
515d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG),
516d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_OUT),	/* out = UL = host -> target */
517d8899132SKalle Valo 		__cpu_to_le32(4),
518d8899132SKalle Valo 	},
519d8899132SKalle Valo 	{
520d8899132SKalle Valo 		__cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG),
521d8899132SKalle Valo 		__cpu_to_le32(PIPEDIR_IN),	/* in = DL = target -> host */
522d8899132SKalle Valo 		__cpu_to_le32(1),
523d8899132SKalle Valo 	},
524d8899132SKalle Valo 
525d8899132SKalle Valo 	/* (Additions here) */
526d8899132SKalle Valo 
527d8899132SKalle Valo 	{ /* must be last */
528d8899132SKalle Valo 		__cpu_to_le32(0),
529d8899132SKalle Valo 		__cpu_to_le32(0),
530d8899132SKalle Valo 		__cpu_to_le32(0),
531d8899132SKalle Valo 	},
532d8899132SKalle Valo };
533d8899132SKalle Valo 
534d8899132SKalle Valo static const struct ath12k_hw_ring_mask ath12k_hw_ring_mask_qcn9274 = {
535d8899132SKalle Valo 	.tx  = {
536d8899132SKalle Valo 		ATH12K_TX_RING_MASK_0,
537d8899132SKalle Valo 		ATH12K_TX_RING_MASK_1,
538d8899132SKalle Valo 		ATH12K_TX_RING_MASK_2,
539d8899132SKalle Valo 		ATH12K_TX_RING_MASK_3,
540d8899132SKalle Valo 	},
541d8899132SKalle Valo 	.rx_mon_dest = {
542d8899132SKalle Valo 		0, 0, 0,
543d8899132SKalle Valo 		ATH12K_RX_MON_RING_MASK_0,
544d8899132SKalle Valo 		ATH12K_RX_MON_RING_MASK_1,
545d8899132SKalle Valo 		ATH12K_RX_MON_RING_MASK_2,
546d8899132SKalle Valo 	},
547d8899132SKalle Valo 	.rx = {
548d8899132SKalle Valo 		0, 0, 0, 0,
549d8899132SKalle Valo 		ATH12K_RX_RING_MASK_0,
550d8899132SKalle Valo 		ATH12K_RX_RING_MASK_1,
551d8899132SKalle Valo 		ATH12K_RX_RING_MASK_2,
552d8899132SKalle Valo 		ATH12K_RX_RING_MASK_3,
553d8899132SKalle Valo 	},
554d8899132SKalle Valo 	.rx_err = {
555d8899132SKalle Valo 		0, 0, 0,
556d8899132SKalle Valo 		ATH12K_RX_ERR_RING_MASK_0,
557d8899132SKalle Valo 	},
558d8899132SKalle Valo 	.rx_wbm_rel = {
559d8899132SKalle Valo 		0, 0, 0,
560d8899132SKalle Valo 		ATH12K_RX_WBM_REL_RING_MASK_0,
561d8899132SKalle Valo 	},
562d8899132SKalle Valo 	.reo_status = {
563d8899132SKalle Valo 		0, 0, 0,
564d8899132SKalle Valo 		ATH12K_REO_STATUS_RING_MASK_0,
565d8899132SKalle Valo 	},
566d8899132SKalle Valo 	.host2rxdma = {
567d8899132SKalle Valo 		0, 0, 0,
568d8899132SKalle Valo 		ATH12K_HOST2RXDMA_RING_MASK_0,
569d8899132SKalle Valo 	},
570d8899132SKalle Valo 	.tx_mon_dest = {
571d8899132SKalle Valo 		ATH12K_TX_MON_RING_MASK_0,
572d8899132SKalle Valo 		ATH12K_TX_MON_RING_MASK_1,
573d8899132SKalle Valo 	},
574d8899132SKalle Valo };
575d8899132SKalle Valo 
576d8899132SKalle Valo static const struct ath12k_hw_ring_mask ath12k_hw_ring_mask_wcn7850 = {
577d8899132SKalle Valo 	.tx  = {
578d8899132SKalle Valo 		ATH12K_TX_RING_MASK_0,
579d8899132SKalle Valo 		ATH12K_TX_RING_MASK_2,
580d8899132SKalle Valo 		ATH12K_TX_RING_MASK_4,
581d8899132SKalle Valo 	},
582d8899132SKalle Valo 	.rx_mon_dest = {
583d8899132SKalle Valo 	},
584d8899132SKalle Valo 	.rx = {
585d8899132SKalle Valo 		0, 0, 0,
586d8899132SKalle Valo 		ATH12K_RX_RING_MASK_0,
587d8899132SKalle Valo 		ATH12K_RX_RING_MASK_1,
588d8899132SKalle Valo 		ATH12K_RX_RING_MASK_2,
589d8899132SKalle Valo 		ATH12K_RX_RING_MASK_3,
590d8899132SKalle Valo 	},
591d8899132SKalle Valo 	.rx_err = {
592d8899132SKalle Valo 		ATH12K_RX_ERR_RING_MASK_0,
593d8899132SKalle Valo 	},
594d8899132SKalle Valo 	.rx_wbm_rel = {
595d8899132SKalle Valo 		ATH12K_RX_WBM_REL_RING_MASK_0,
596d8899132SKalle Valo 	},
597d8899132SKalle Valo 	.reo_status = {
598d8899132SKalle Valo 		ATH12K_REO_STATUS_RING_MASK_0,
599d8899132SKalle Valo 	},
600d8899132SKalle Valo 	.host2rxdma = {
601d8899132SKalle Valo 	},
602d8899132SKalle Valo 	.tx_mon_dest = {
603d8899132SKalle Valo 	},
604d8899132SKalle Valo };
605d8899132SKalle Valo 
606d8899132SKalle Valo static const struct ath12k_hw_regs qcn9274_v1_regs = {
607d8899132SKalle Valo 	/* SW2TCL(x) R0 ring configuration address */
608d8899132SKalle Valo 	.hal_tcl1_ring_id = 0x00000908,
609d8899132SKalle Valo 	.hal_tcl1_ring_misc = 0x00000910,
610d8899132SKalle Valo 	.hal_tcl1_ring_tp_addr_lsb = 0x0000091c,
611d8899132SKalle Valo 	.hal_tcl1_ring_tp_addr_msb = 0x00000920,
612d8899132SKalle Valo 	.hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000930,
613d8899132SKalle Valo 	.hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000934,
614d8899132SKalle Valo 	.hal_tcl1_ring_msi1_base_lsb = 0x00000948,
615d8899132SKalle Valo 	.hal_tcl1_ring_msi1_base_msb = 0x0000094c,
616d8899132SKalle Valo 	.hal_tcl1_ring_msi1_data = 0x00000950,
617d8899132SKalle Valo 	.hal_tcl_ring_base_lsb = 0x00000b58,
618d8899132SKalle Valo 
619d8899132SKalle Valo 	/* TCL STATUS ring address */
620d8899132SKalle Valo 	.hal_tcl_status_ring_base_lsb = 0x00000d38,
621d8899132SKalle Valo 
622d8899132SKalle Valo 	.hal_wbm_idle_ring_base_lsb = 0x00000d0c,
623d8899132SKalle Valo 	.hal_wbm_idle_ring_misc_addr = 0x00000d1c,
624d8899132SKalle Valo 	.hal_wbm_r0_idle_list_cntl_addr = 0x00000210,
625d8899132SKalle Valo 	.hal_wbm_r0_idle_list_size_addr = 0x00000214,
626d8899132SKalle Valo 	.hal_wbm_scattered_ring_base_lsb = 0x00000220,
627d8899132SKalle Valo 	.hal_wbm_scattered_ring_base_msb = 0x00000224,
628d8899132SKalle Valo 	.hal_wbm_scattered_desc_head_info_ix0 = 0x00000230,
629d8899132SKalle Valo 	.hal_wbm_scattered_desc_head_info_ix1 = 0x00000234,
630d8899132SKalle Valo 	.hal_wbm_scattered_desc_tail_info_ix0 = 0x00000240,
631d8899132SKalle Valo 	.hal_wbm_scattered_desc_tail_info_ix1 = 0x00000244,
632d8899132SKalle Valo 	.hal_wbm_scattered_desc_ptr_hp_addr = 0x0000024c,
633d8899132SKalle Valo 
634d8899132SKalle Valo 	.hal_wbm_sw_release_ring_base_lsb = 0x0000034c,
635d8899132SKalle Valo 	.hal_wbm_sw1_release_ring_base_lsb = 0x000003c4,
636d8899132SKalle Valo 	.hal_wbm0_release_ring_base_lsb = 0x00000dd8,
637d8899132SKalle Valo 	.hal_wbm1_release_ring_base_lsb = 0x00000e50,
638d8899132SKalle Valo 
639d8899132SKalle Valo 	/* PCIe base address */
640d8899132SKalle Valo 	.pcie_qserdes_sysclk_en_sel = 0x01e0c0a8,
641d8899132SKalle Valo 	.pcie_pcs_osc_dtct_config_base = 0x01e0d45c,
642d8899132SKalle Valo 
643d8899132SKalle Valo 	/* PPE release ring address */
644d8899132SKalle Valo 	.hal_ppe_rel_ring_base = 0x0000043c,
645d8899132SKalle Valo 
646d8899132SKalle Valo 	/* REO DEST ring address */
647d8899132SKalle Valo 	.hal_reo2_ring_base = 0x0000055c,
648d8899132SKalle Valo 	.hal_reo1_misc_ctrl_addr = 0x00000b7c,
649d8899132SKalle Valo 	.hal_reo1_sw_cookie_cfg0 = 0x00000050,
650d8899132SKalle Valo 	.hal_reo1_sw_cookie_cfg1 = 0x00000054,
651d8899132SKalle Valo 	.hal_reo1_qdesc_lut_base0 = 0x00000058,
652d8899132SKalle Valo 	.hal_reo1_qdesc_lut_base1 = 0x0000005c,
653d8899132SKalle Valo 	.hal_reo1_ring_base_lsb = 0x000004e4,
654d8899132SKalle Valo 	.hal_reo1_ring_base_msb = 0x000004e8,
655d8899132SKalle Valo 	.hal_reo1_ring_id = 0x000004ec,
656d8899132SKalle Valo 	.hal_reo1_ring_misc = 0x000004f4,
657d8899132SKalle Valo 	.hal_reo1_ring_hp_addr_lsb = 0x000004f8,
658d8899132SKalle Valo 	.hal_reo1_ring_hp_addr_msb = 0x000004fc,
659d8899132SKalle Valo 	.hal_reo1_ring_producer_int_setup = 0x00000508,
660d8899132SKalle Valo 	.hal_reo1_ring_msi1_base_lsb = 0x0000052C,
661d8899132SKalle Valo 	.hal_reo1_ring_msi1_base_msb = 0x00000530,
662d8899132SKalle Valo 	.hal_reo1_ring_msi1_data = 0x00000534,
663d8899132SKalle Valo 	.hal_reo1_aging_thres_ix0 = 0x00000b08,
664d8899132SKalle Valo 	.hal_reo1_aging_thres_ix1 = 0x00000b0c,
665d8899132SKalle Valo 	.hal_reo1_aging_thres_ix2 = 0x00000b10,
666d8899132SKalle Valo 	.hal_reo1_aging_thres_ix3 = 0x00000b14,
667d8899132SKalle Valo 
668d8899132SKalle Valo 	/* REO Exception ring address */
669d8899132SKalle Valo 	.hal_reo2_sw0_ring_base = 0x000008a4,
670d8899132SKalle Valo 
671d8899132SKalle Valo 	/* REO Reinject ring address */
672d8899132SKalle Valo 	.hal_sw2reo_ring_base = 0x00000304,
673d8899132SKalle Valo 	.hal_sw2reo1_ring_base = 0x0000037c,
674d8899132SKalle Valo 
675d8899132SKalle Valo 	/* REO cmd ring address */
676d8899132SKalle Valo 	.hal_reo_cmd_ring_base = 0x0000028c,
677d8899132SKalle Valo 
678d8899132SKalle Valo 	/* REO status ring address */
679d8899132SKalle Valo 	.hal_reo_status_ring_base = 0x00000a84,
680d8899132SKalle Valo };
681d8899132SKalle Valo 
682d8899132SKalle Valo static const struct ath12k_hw_regs qcn9274_v2_regs = {
683d8899132SKalle Valo 	/* SW2TCL(x) R0 ring configuration address */
684d8899132SKalle Valo 	.hal_tcl1_ring_id = 0x00000908,
685d8899132SKalle Valo 	.hal_tcl1_ring_misc = 0x00000910,
686d8899132SKalle Valo 	.hal_tcl1_ring_tp_addr_lsb = 0x0000091c,
687d8899132SKalle Valo 	.hal_tcl1_ring_tp_addr_msb = 0x00000920,
688d8899132SKalle Valo 	.hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000930,
689d8899132SKalle Valo 	.hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000934,
690d8899132SKalle Valo 	.hal_tcl1_ring_msi1_base_lsb = 0x00000948,
691d8899132SKalle Valo 	.hal_tcl1_ring_msi1_base_msb = 0x0000094c,
692d8899132SKalle Valo 	.hal_tcl1_ring_msi1_data = 0x00000950,
693d8899132SKalle Valo 	.hal_tcl_ring_base_lsb = 0x00000b58,
694d8899132SKalle Valo 
695d8899132SKalle Valo 	/* TCL STATUS ring address */
696d8899132SKalle Valo 	.hal_tcl_status_ring_base_lsb = 0x00000d38,
697d8899132SKalle Valo 
698d8899132SKalle Valo 	/* WBM idle link ring address */
699d8899132SKalle Valo 	.hal_wbm_idle_ring_base_lsb = 0x00000d3c,
700d8899132SKalle Valo 	.hal_wbm_idle_ring_misc_addr = 0x00000d4c,
701d8899132SKalle Valo 	.hal_wbm_r0_idle_list_cntl_addr = 0x00000240,
702d8899132SKalle Valo 	.hal_wbm_r0_idle_list_size_addr = 0x00000244,
703d8899132SKalle Valo 	.hal_wbm_scattered_ring_base_lsb = 0x00000250,
704d8899132SKalle Valo 	.hal_wbm_scattered_ring_base_msb = 0x00000254,
705d8899132SKalle Valo 	.hal_wbm_scattered_desc_head_info_ix0 = 0x00000260,
706d8899132SKalle Valo 	.hal_wbm_scattered_desc_head_info_ix1 = 0x00000264,
707d8899132SKalle Valo 	.hal_wbm_scattered_desc_tail_info_ix0 = 0x00000270,
708d8899132SKalle Valo 	.hal_wbm_scattered_desc_tail_info_ix1 = 0x00000274,
709d8899132SKalle Valo 	.hal_wbm_scattered_desc_ptr_hp_addr = 0x0000027c,
710d8899132SKalle Valo 
711d8899132SKalle Valo 	/* SW2WBM release ring address */
712d8899132SKalle Valo 	.hal_wbm_sw_release_ring_base_lsb = 0x0000037c,
713d8899132SKalle Valo 	.hal_wbm_sw1_release_ring_base_lsb = 0x000003f4,
714d8899132SKalle Valo 
715d8899132SKalle Valo 	/* WBM2SW release ring address */
716d8899132SKalle Valo 	.hal_wbm0_release_ring_base_lsb = 0x00000e08,
717d8899132SKalle Valo 	.hal_wbm1_release_ring_base_lsb = 0x00000e80,
718d8899132SKalle Valo 
719d8899132SKalle Valo 	/* PCIe base address */
720d8899132SKalle Valo 	.pcie_qserdes_sysclk_en_sel = 0x01e0c0a8,
721d8899132SKalle Valo 	.pcie_pcs_osc_dtct_config_base = 0x01e0d45c,
722d8899132SKalle Valo 
723d8899132SKalle Valo 	/* PPE release ring address */
724d8899132SKalle Valo 	.hal_ppe_rel_ring_base = 0x0000046c,
725d8899132SKalle Valo 
726d8899132SKalle Valo 	/* REO DEST ring address */
727d8899132SKalle Valo 	.hal_reo2_ring_base = 0x00000578,
728d8899132SKalle Valo 	.hal_reo1_misc_ctrl_addr = 0x00000b9c,
729d8899132SKalle Valo 	.hal_reo1_sw_cookie_cfg0 = 0x0000006c,
730d8899132SKalle Valo 	.hal_reo1_sw_cookie_cfg1 = 0x00000070,
731d8899132SKalle Valo 	.hal_reo1_qdesc_lut_base0 = 0x00000074,
732d8899132SKalle Valo 	.hal_reo1_qdesc_lut_base1 = 0x00000078,
733d8899132SKalle Valo 	.hal_reo1_ring_base_lsb = 0x00000500,
734d8899132SKalle Valo 	.hal_reo1_ring_base_msb = 0x00000504,
735d8899132SKalle Valo 	.hal_reo1_ring_id = 0x00000508,
736d8899132SKalle Valo 	.hal_reo1_ring_misc = 0x00000510,
737d8899132SKalle Valo 	.hal_reo1_ring_hp_addr_lsb = 0x00000514,
738d8899132SKalle Valo 	.hal_reo1_ring_hp_addr_msb = 0x00000518,
739d8899132SKalle Valo 	.hal_reo1_ring_producer_int_setup = 0x00000524,
740d8899132SKalle Valo 	.hal_reo1_ring_msi1_base_lsb = 0x00000548,
741d8899132SKalle Valo 	.hal_reo1_ring_msi1_base_msb = 0x0000054C,
742d8899132SKalle Valo 	.hal_reo1_ring_msi1_data = 0x00000550,
743d8899132SKalle Valo 	.hal_reo1_aging_thres_ix0 = 0x00000B28,
744d8899132SKalle Valo 	.hal_reo1_aging_thres_ix1 = 0x00000B2C,
745d8899132SKalle Valo 	.hal_reo1_aging_thres_ix2 = 0x00000B30,
746d8899132SKalle Valo 	.hal_reo1_aging_thres_ix3 = 0x00000B34,
747d8899132SKalle Valo 
748d8899132SKalle Valo 	/* REO Exception ring address */
749d8899132SKalle Valo 	.hal_reo2_sw0_ring_base = 0x000008c0,
750d8899132SKalle Valo 
751d8899132SKalle Valo 	/* REO Reinject ring address */
752d8899132SKalle Valo 	.hal_sw2reo_ring_base = 0x00000320,
753d8899132SKalle Valo 	.hal_sw2reo1_ring_base = 0x00000398,
754d8899132SKalle Valo 
755d8899132SKalle Valo 	/* REO cmd ring address */
756d8899132SKalle Valo 	.hal_reo_cmd_ring_base = 0x000002A8,
757d8899132SKalle Valo 
758d8899132SKalle Valo 	/* REO status ring address */
759d8899132SKalle Valo 	.hal_reo_status_ring_base = 0x00000aa0,
760d8899132SKalle Valo };
761d8899132SKalle Valo 
762d8899132SKalle Valo static const struct ath12k_hw_regs wcn7850_regs = {
763d8899132SKalle Valo 	/* SW2TCL(x) R0 ring configuration address */
764d8899132SKalle Valo 	.hal_tcl1_ring_id = 0x00000908,
765d8899132SKalle Valo 	.hal_tcl1_ring_misc = 0x00000910,
766d8899132SKalle Valo 	.hal_tcl1_ring_tp_addr_lsb = 0x0000091c,
767d8899132SKalle Valo 	.hal_tcl1_ring_tp_addr_msb = 0x00000920,
768d8899132SKalle Valo 	.hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000930,
769d8899132SKalle Valo 	.hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000934,
770d8899132SKalle Valo 	.hal_tcl1_ring_msi1_base_lsb = 0x00000948,
771d8899132SKalle Valo 	.hal_tcl1_ring_msi1_base_msb = 0x0000094c,
772d8899132SKalle Valo 	.hal_tcl1_ring_msi1_data = 0x00000950,
773d8899132SKalle Valo 	.hal_tcl_ring_base_lsb = 0x00000b58,
774d8899132SKalle Valo 
775d8899132SKalle Valo 	/* TCL STATUS ring address */
776d8899132SKalle Valo 	.hal_tcl_status_ring_base_lsb = 0x00000d38,
777d8899132SKalle Valo 
778d8899132SKalle Valo 	.hal_wbm_idle_ring_base_lsb = 0x00000d3c,
779d8899132SKalle Valo 	.hal_wbm_idle_ring_misc_addr = 0x00000d4c,
780d8899132SKalle Valo 	.hal_wbm_r0_idle_list_cntl_addr = 0x00000240,
781d8899132SKalle Valo 	.hal_wbm_r0_idle_list_size_addr = 0x00000244,
782d8899132SKalle Valo 	.hal_wbm_scattered_ring_base_lsb = 0x00000250,
783d8899132SKalle Valo 	.hal_wbm_scattered_ring_base_msb = 0x00000254,
784d8899132SKalle Valo 	.hal_wbm_scattered_desc_head_info_ix0 = 0x00000260,
785d8899132SKalle Valo 	.hal_wbm_scattered_desc_head_info_ix1 = 0x00000264,
786d8899132SKalle Valo 	.hal_wbm_scattered_desc_tail_info_ix0 = 0x00000270,
787d8899132SKalle Valo 	.hal_wbm_scattered_desc_tail_info_ix1 = 0x00000274,
788d8899132SKalle Valo 	.hal_wbm_scattered_desc_ptr_hp_addr = 0x00000027c,
789d8899132SKalle Valo 
790d8899132SKalle Valo 	.hal_wbm_sw_release_ring_base_lsb = 0x0000037c,
791d8899132SKalle Valo 	.hal_wbm_sw1_release_ring_base_lsb = 0x00000284,
792d8899132SKalle Valo 	.hal_wbm0_release_ring_base_lsb = 0x00000e08,
793d8899132SKalle Valo 	.hal_wbm1_release_ring_base_lsb = 0x00000e80,
794d8899132SKalle Valo 
795d8899132SKalle Valo 	/* PCIe base address */
796d8899132SKalle Valo 	.pcie_qserdes_sysclk_en_sel = 0x01e0e0a8,
797d8899132SKalle Valo 	.pcie_pcs_osc_dtct_config_base = 0x01e0f45c,
798d8899132SKalle Valo 
799d8899132SKalle Valo 	/* PPE release ring address */
800d8899132SKalle Valo 	.hal_ppe_rel_ring_base = 0x0000043c,
801d8899132SKalle Valo 
802d8899132SKalle Valo 	/* REO DEST ring address */
803d8899132SKalle Valo 	.hal_reo2_ring_base = 0x0000055c,
804d8899132SKalle Valo 	.hal_reo1_misc_ctrl_addr = 0x00000b7c,
805d8899132SKalle Valo 	.hal_reo1_sw_cookie_cfg0 = 0x00000050,
806d8899132SKalle Valo 	.hal_reo1_sw_cookie_cfg1 = 0x00000054,
807d8899132SKalle Valo 	.hal_reo1_qdesc_lut_base0 = 0x00000058,
808d8899132SKalle Valo 	.hal_reo1_qdesc_lut_base1 = 0x0000005c,
809d8899132SKalle Valo 	.hal_reo1_ring_base_lsb = 0x000004e4,
810d8899132SKalle Valo 	.hal_reo1_ring_base_msb = 0x000004e8,
811d8899132SKalle Valo 	.hal_reo1_ring_id = 0x000004ec,
812d8899132SKalle Valo 	.hal_reo1_ring_misc = 0x000004f4,
813d8899132SKalle Valo 	.hal_reo1_ring_hp_addr_lsb = 0x000004f8,
814d8899132SKalle Valo 	.hal_reo1_ring_hp_addr_msb = 0x000004fc,
815d8899132SKalle Valo 	.hal_reo1_ring_producer_int_setup = 0x00000508,
816d8899132SKalle Valo 	.hal_reo1_ring_msi1_base_lsb = 0x0000052C,
817d8899132SKalle Valo 	.hal_reo1_ring_msi1_base_msb = 0x00000530,
818d8899132SKalle Valo 	.hal_reo1_ring_msi1_data = 0x00000534,
819d8899132SKalle Valo 	.hal_reo1_aging_thres_ix0 = 0x00000b08,
820d8899132SKalle Valo 	.hal_reo1_aging_thres_ix1 = 0x00000b0c,
821d8899132SKalle Valo 	.hal_reo1_aging_thres_ix2 = 0x00000b10,
822d8899132SKalle Valo 	.hal_reo1_aging_thres_ix3 = 0x00000b14,
823d8899132SKalle Valo 
824d8899132SKalle Valo 	/* REO Exception ring address */
825d8899132SKalle Valo 	.hal_reo2_sw0_ring_base = 0x000008a4,
826d8899132SKalle Valo 
827d8899132SKalle Valo 	/* REO Reinject ring address */
828d8899132SKalle Valo 	.hal_sw2reo_ring_base = 0x00000304,
829d8899132SKalle Valo 	.hal_sw2reo1_ring_base = 0x0000037c,
830d8899132SKalle Valo 
831d8899132SKalle Valo 	/* REO cmd ring address */
832d8899132SKalle Valo 	.hal_reo_cmd_ring_base = 0x0000028c,
833d8899132SKalle Valo 
834d8899132SKalle Valo 	/* REO status ring address */
835d8899132SKalle Valo 	.hal_reo_status_ring_base = 0x00000a84,
836d8899132SKalle Valo };
837d8899132SKalle Valo 
838d8899132SKalle Valo static const struct ath12k_hw_hal_params ath12k_hw_hal_params_qcn9274 = {
839d8899132SKalle Valo 	.rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM,
840d8899132SKalle Valo 	.wbm2sw_cc_enable = HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW0_EN |
841d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW1_EN |
842d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW2_EN |
843d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW3_EN |
844d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW4_EN,
845d8899132SKalle Valo };
846d8899132SKalle Valo 
847d8899132SKalle Valo static const struct ath12k_hw_hal_params ath12k_hw_hal_params_wcn7850 = {
848d8899132SKalle Valo 	.rx_buf_rbm = HAL_RX_BUF_RBM_SW1_BM,
849d8899132SKalle Valo 	.wbm2sw_cc_enable = HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW0_EN |
850d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW2_EN |
851d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW3_EN |
852d8899132SKalle Valo 			    HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW4_EN,
853d8899132SKalle Valo };
854d8899132SKalle Valo 
855d8899132SKalle Valo static const struct ath12k_hw_params ath12k_hw_params[] = {
856d8899132SKalle Valo 	{
857d8899132SKalle Valo 		.name = "qcn9274 hw1.0",
858d8899132SKalle Valo 		.hw_rev = ATH12K_HW_QCN9274_HW10,
859d8899132SKalle Valo 		.fw = {
860d8899132SKalle Valo 			.dir = "QCN9274/hw1.0",
861d8899132SKalle Valo 			.board_size = 256 * 1024,
862d8899132SKalle Valo 			.cal_offset = 128 * 1024,
863d8899132SKalle Valo 		},
864d8899132SKalle Valo 		.max_radios = 1,
865d8899132SKalle Valo 		.single_pdev_only = false,
866d8899132SKalle Valo 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274,
867d8899132SKalle Valo 		.internal_sleep_clock = false,
868d8899132SKalle Valo 
869d8899132SKalle Valo 		.hw_ops = &qcn9274_ops,
870d8899132SKalle Valo 		.ring_mask = &ath12k_hw_ring_mask_qcn9274,
871d8899132SKalle Valo 		.regs = &qcn9274_v1_regs,
872d8899132SKalle Valo 
873d8899132SKalle Valo 		.host_ce_config = ath12k_host_ce_config_qcn9274,
874d8899132SKalle Valo 		.ce_count = 16,
875d8899132SKalle Valo 		.target_ce_config = ath12k_target_ce_config_wlan_qcn9274,
876d8899132SKalle Valo 		.target_ce_count = 12,
877d8899132SKalle Valo 		.svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_qcn9274,
878d8899132SKalle Valo 		.svc_to_ce_map_len = 18,
879d8899132SKalle Valo 
880d8899132SKalle Valo 		.hal_params = &ath12k_hw_hal_params_qcn9274,
881d8899132SKalle Valo 
882d8899132SKalle Valo 		.rxdma1_enable = false,
883d8899132SKalle Valo 		.num_rxmda_per_pdev = 1,
884d8899132SKalle Valo 		.num_rxdma_dst_ring = 0,
885d8899132SKalle Valo 		.rx_mac_buf_ring = false,
886d8899132SKalle Valo 		.vdev_start_delay = false,
887d8899132SKalle Valo 
888d8899132SKalle Valo 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
889d8899132SKalle Valo 					BIT(NL80211_IFTYPE_AP),
890d8899132SKalle Valo 		.supports_monitor = false,
891d8899132SKalle Valo 
892d8899132SKalle Valo 		.idle_ps = false,
893d8899132SKalle Valo 		.download_calib = true,
894d8899132SKalle Valo 		.supports_suspend = false,
895d8899132SKalle Valo 		.tcl_ring_retry = true,
896d8899132SKalle Valo 		.reoq_lut_support = false,
897d8899132SKalle Valo 		.supports_shadow_regs = false,
898d8899132SKalle Valo 
899d8899132SKalle Valo 		.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9274),
900d8899132SKalle Valo 		.num_tcl_banks = 48,
901d8899132SKalle Valo 		.max_tx_ring = 4,
902d8899132SKalle Valo 
903d8899132SKalle Valo 		.mhi_config = &ath12k_mhi_config_qcn9274,
904d8899132SKalle Valo 
905d8899132SKalle Valo 		.wmi_init = ath12k_wmi_init_qcn9274,
906d8899132SKalle Valo 
907d8899132SKalle Valo 		.hal_ops = &hal_qcn9274_ops,
908d8899132SKalle Valo 
9099981a3acSCarl Huang 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01),
910d8899132SKalle Valo 	},
911d8899132SKalle Valo 	{
912d8899132SKalle Valo 		.name = "wcn7850 hw2.0",
913d8899132SKalle Valo 		.hw_rev = ATH12K_HW_WCN7850_HW20,
914d8899132SKalle Valo 
915d8899132SKalle Valo 		.fw = {
916d8899132SKalle Valo 			.dir = "WCN7850/hw2.0",
917d8899132SKalle Valo 			.board_size = 256 * 1024,
918d8899132SKalle Valo 			.cal_offset = 256 * 1024,
919d8899132SKalle Valo 		},
920d8899132SKalle Valo 
921d8899132SKalle Valo 		.max_radios = 1,
922d8899132SKalle Valo 		.single_pdev_only = true,
923d8899132SKalle Valo 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_WCN7850,
924d8899132SKalle Valo 		.internal_sleep_clock = true,
925d8899132SKalle Valo 
926d8899132SKalle Valo 		.hw_ops = &wcn7850_ops,
927d8899132SKalle Valo 		.ring_mask = &ath12k_hw_ring_mask_wcn7850,
928d8899132SKalle Valo 		.regs = &wcn7850_regs,
929d8899132SKalle Valo 
930d8899132SKalle Valo 		.host_ce_config = ath12k_host_ce_config_wcn7850,
931d8899132SKalle Valo 		.ce_count = 9,
932d8899132SKalle Valo 		.target_ce_config = ath12k_target_ce_config_wlan_wcn7850,
933d8899132SKalle Valo 		.target_ce_count = 9,
934d8899132SKalle Valo 		.svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_wcn7850,
935d8899132SKalle Valo 		.svc_to_ce_map_len = 14,
936d8899132SKalle Valo 
937d8899132SKalle Valo 		.hal_params = &ath12k_hw_hal_params_wcn7850,
938d8899132SKalle Valo 
939d8899132SKalle Valo 		.rxdma1_enable = false,
940d8899132SKalle Valo 		.num_rxmda_per_pdev = 2,
941d8899132SKalle Valo 		.num_rxdma_dst_ring = 1,
942d8899132SKalle Valo 		.rx_mac_buf_ring = true,
943d8899132SKalle Valo 		.vdev_start_delay = true,
944d8899132SKalle Valo 
9451f4fd12dSKang Yang 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
9461f4fd12dSKang Yang 				   BIT(NL80211_IFTYPE_AP),
947d8899132SKalle Valo 		.supports_monitor = false,
948d8899132SKalle Valo 
94972d17c3eSBaochen Qiang 		.idle_ps = true,
950d8899132SKalle Valo 		.download_calib = false,
951d8899132SKalle Valo 		.supports_suspend = false,
952d8899132SKalle Valo 		.tcl_ring_retry = false,
953d8899132SKalle Valo 		.reoq_lut_support = false,
954d8899132SKalle Valo 		.supports_shadow_regs = true,
955d8899132SKalle Valo 
956d8899132SKalle Valo 		.hal_desc_sz = sizeof(struct hal_rx_desc_wcn7850),
957d8899132SKalle Valo 		.num_tcl_banks = 7,
958d8899132SKalle Valo 		.max_tx_ring = 3,
959d8899132SKalle Valo 
960d8899132SKalle Valo 		.mhi_config = &ath12k_mhi_config_wcn7850,
961d8899132SKalle Valo 
962d8899132SKalle Valo 		.wmi_init = ath12k_wmi_init_wcn7850,
963d8899132SKalle Valo 
964d8899132SKalle Valo 		.hal_ops = &hal_wcn7850_ops,
9659981a3acSCarl Huang 
96634c5625aSCarl Huang 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01) |
96734c5625aSCarl Huang 					   BIT(CNSS_PCIE_PERST_NO_PULL_V01),
968d8899132SKalle Valo 	},
969d8899132SKalle Valo 	{
970d8899132SKalle Valo 		.name = "qcn9274 hw2.0",
971d8899132SKalle Valo 		.hw_rev = ATH12K_HW_QCN9274_HW20,
972d8899132SKalle Valo 		.fw = {
973d8899132SKalle Valo 			.dir = "QCN9274/hw2.0",
974d8899132SKalle Valo 			.board_size = 256 * 1024,
975d8899132SKalle Valo 			.cal_offset = 128 * 1024,
976d8899132SKalle Valo 		},
977d8899132SKalle Valo 		.max_radios = 1,
978d8899132SKalle Valo 		.single_pdev_only = false,
979d8899132SKalle Valo 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274,
980d8899132SKalle Valo 		.internal_sleep_clock = false,
981d8899132SKalle Valo 
982d8899132SKalle Valo 		.hw_ops = &qcn9274_ops,
983d8899132SKalle Valo 		.ring_mask = &ath12k_hw_ring_mask_qcn9274,
984d8899132SKalle Valo 		.regs = &qcn9274_v2_regs,
985d8899132SKalle Valo 
986d8899132SKalle Valo 		.host_ce_config = ath12k_host_ce_config_qcn9274,
987d8899132SKalle Valo 		.ce_count = 16,
988d8899132SKalle Valo 		.target_ce_config = ath12k_target_ce_config_wlan_qcn9274,
989d8899132SKalle Valo 		.target_ce_count = 12,
990d8899132SKalle Valo 		.svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_qcn9274,
991d8899132SKalle Valo 		.svc_to_ce_map_len = 18,
992d8899132SKalle Valo 
993d8899132SKalle Valo 		.hal_params = &ath12k_hw_hal_params_qcn9274,
994d8899132SKalle Valo 
995d8899132SKalle Valo 		.rxdma1_enable = false,
996d8899132SKalle Valo 		.num_rxmda_per_pdev = 1,
997d8899132SKalle Valo 		.num_rxdma_dst_ring = 0,
998d8899132SKalle Valo 		.rx_mac_buf_ring = false,
999d8899132SKalle Valo 		.vdev_start_delay = false,
1000d8899132SKalle Valo 
1001d8899132SKalle Valo 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
1002d8899132SKalle Valo 					BIT(NL80211_IFTYPE_AP),
1003d8899132SKalle Valo 		.supports_monitor = false,
1004d8899132SKalle Valo 
1005d8899132SKalle Valo 		.idle_ps = false,
1006d8899132SKalle Valo 		.download_calib = true,
1007d8899132SKalle Valo 		.supports_suspend = false,
1008d8899132SKalle Valo 		.tcl_ring_retry = true,
1009d8899132SKalle Valo 		.reoq_lut_support = false,
1010d8899132SKalle Valo 		.supports_shadow_regs = false,
1011d8899132SKalle Valo 
1012d8899132SKalle Valo 		.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9274),
1013d8899132SKalle Valo 		.num_tcl_banks = 48,
1014d8899132SKalle Valo 		.max_tx_ring = 4,
1015d8899132SKalle Valo 
1016d8899132SKalle Valo 		.mhi_config = &ath12k_mhi_config_qcn9274,
1017d8899132SKalle Valo 
1018d8899132SKalle Valo 		.wmi_init = ath12k_wmi_init_qcn9274,
1019d8899132SKalle Valo 
1020d8899132SKalle Valo 		.hal_ops = &hal_qcn9274_ops,
10219981a3acSCarl Huang 
10229981a3acSCarl Huang 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01),
1023d8899132SKalle Valo 	},
1024d8899132SKalle Valo };
1025d8899132SKalle Valo 
ath12k_hw_init(struct ath12k_base * ab)1026d8899132SKalle Valo int ath12k_hw_init(struct ath12k_base *ab)
1027d8899132SKalle Valo {
1028d8899132SKalle Valo 	const struct ath12k_hw_params *hw_params = NULL;
1029d8899132SKalle Valo 	int i;
1030d8899132SKalle Valo 
1031d8899132SKalle Valo 	for (i = 0; i < ARRAY_SIZE(ath12k_hw_params); i++) {
1032d8899132SKalle Valo 		hw_params = &ath12k_hw_params[i];
1033d8899132SKalle Valo 
1034d8899132SKalle Valo 		if (hw_params->hw_rev == ab->hw_rev)
1035d8899132SKalle Valo 			break;
1036d8899132SKalle Valo 	}
1037d8899132SKalle Valo 
1038d8899132SKalle Valo 	if (i == ARRAY_SIZE(ath12k_hw_params)) {
1039d8899132SKalle Valo 		ath12k_err(ab, "Unsupported hardware version: 0x%x\n", ab->hw_rev);
1040d8899132SKalle Valo 		return -EINVAL;
1041d8899132SKalle Valo 	}
1042d8899132SKalle Valo 
1043d8899132SKalle Valo 	ab->hw_params = hw_params;
1044d8899132SKalle Valo 
1045d8899132SKalle Valo 	ath12k_info(ab, "Hardware name: %s\n", ab->hw_params->name);
1046d8899132SKalle Valo 
1047d8899132SKalle Valo 	return 0;
1048d8899132SKalle Valo }
1049