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

source code of linux/drivers/net/wireless/ath/ath12k/hw.c