1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause-Clear
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/types.h>
7*4882a593Smuzhiyun #include <linux/bitops.h>
8*4882a593Smuzhiyun #include <linux/bitfield.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "hw.h"
11*4882a593Smuzhiyun #include "core.h"
12*4882a593Smuzhiyun #include "ce.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /* Map from pdev index to hw mac index */
ath11k_hw_ipq8074_mac_from_pdev_id(int pdev_idx)15*4882a593Smuzhiyun static u8 ath11k_hw_ipq8074_mac_from_pdev_id(int pdev_idx)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun switch (pdev_idx) {
18*4882a593Smuzhiyun case 0:
19*4882a593Smuzhiyun return 0;
20*4882a593Smuzhiyun case 1:
21*4882a593Smuzhiyun return 2;
22*4882a593Smuzhiyun case 2:
23*4882a593Smuzhiyun return 1;
24*4882a593Smuzhiyun default:
25*4882a593Smuzhiyun return ATH11K_INVALID_HW_MAC_ID;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun }
28*4882a593Smuzhiyun
ath11k_hw_ipq6018_mac_from_pdev_id(int pdev_idx)29*4882a593Smuzhiyun static u8 ath11k_hw_ipq6018_mac_from_pdev_id(int pdev_idx)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun return pdev_idx;
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
ath11k_init_wmi_config_qca6390(struct ath11k_base * ab,struct target_resource_config * config)34*4882a593Smuzhiyun static void ath11k_init_wmi_config_qca6390(struct ath11k_base *ab,
35*4882a593Smuzhiyun struct target_resource_config *config)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun config->num_vdevs = 4;
38*4882a593Smuzhiyun config->num_peers = 16;
39*4882a593Smuzhiyun config->num_tids = 32;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun config->num_offload_peers = 3;
42*4882a593Smuzhiyun config->num_offload_reorder_buffs = 3;
43*4882a593Smuzhiyun config->num_peer_keys = TARGET_NUM_PEER_KEYS;
44*4882a593Smuzhiyun config->ast_skid_limit = TARGET_AST_SKID_LIMIT;
45*4882a593Smuzhiyun config->tx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
46*4882a593Smuzhiyun config->rx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
47*4882a593Smuzhiyun config->rx_timeout_pri[0] = TARGET_RX_TIMEOUT_LO_PRI;
48*4882a593Smuzhiyun config->rx_timeout_pri[1] = TARGET_RX_TIMEOUT_LO_PRI;
49*4882a593Smuzhiyun config->rx_timeout_pri[2] = TARGET_RX_TIMEOUT_LO_PRI;
50*4882a593Smuzhiyun config->rx_timeout_pri[3] = TARGET_RX_TIMEOUT_HI_PRI;
51*4882a593Smuzhiyun config->rx_decap_mode = TARGET_DECAP_MODE_NATIVE_WIFI;
52*4882a593Smuzhiyun config->scan_max_pending_req = TARGET_SCAN_MAX_PENDING_REQS;
53*4882a593Smuzhiyun config->bmiss_offload_max_vdev = TARGET_BMISS_OFFLOAD_MAX_VDEV;
54*4882a593Smuzhiyun config->roam_offload_max_vdev = TARGET_ROAM_OFFLOAD_MAX_VDEV;
55*4882a593Smuzhiyun config->roam_offload_max_ap_profiles = TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES;
56*4882a593Smuzhiyun config->num_mcast_groups = 0;
57*4882a593Smuzhiyun config->num_mcast_table_elems = 0;
58*4882a593Smuzhiyun config->mcast2ucast_mode = 0;
59*4882a593Smuzhiyun config->tx_dbg_log_size = TARGET_TX_DBG_LOG_SIZE;
60*4882a593Smuzhiyun config->num_wds_entries = 0;
61*4882a593Smuzhiyun config->dma_burst_size = 0;
62*4882a593Smuzhiyun config->rx_skip_defrag_timeout_dup_detection_check = 0;
63*4882a593Smuzhiyun config->vow_config = TARGET_VOW_CONFIG;
64*4882a593Smuzhiyun config->gtk_offload_max_vdev = 2;
65*4882a593Smuzhiyun config->num_msdu_desc = 0x400;
66*4882a593Smuzhiyun config->beacon_tx_offload_max_vdev = 2;
67*4882a593Smuzhiyun config->rx_batchmode = TARGET_RX_BATCHMODE;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun config->peer_map_unmap_v2_support = 0;
70*4882a593Smuzhiyun config->use_pdev_id = 1;
71*4882a593Smuzhiyun config->max_frag_entries = 0xa;
72*4882a593Smuzhiyun config->num_tdls_vdevs = 0x1;
73*4882a593Smuzhiyun config->num_tdls_conn_table_entries = 8;
74*4882a593Smuzhiyun config->beacon_tx_offload_max_vdev = 0x2;
75*4882a593Smuzhiyun config->num_multicast_filter_entries = 0x20;
76*4882a593Smuzhiyun config->num_wow_filters = 0x16;
77*4882a593Smuzhiyun config->num_keep_alive_pattern = 0;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
ath11k_init_wmi_config_ipq8074(struct ath11k_base * ab,struct target_resource_config * config)80*4882a593Smuzhiyun static void ath11k_init_wmi_config_ipq8074(struct ath11k_base *ab,
81*4882a593Smuzhiyun struct target_resource_config *config)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun config->num_vdevs = ab->num_radios * TARGET_NUM_VDEVS;
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun if (ab->num_radios == 2) {
86*4882a593Smuzhiyun config->num_peers = TARGET_NUM_PEERS(DBS);
87*4882a593Smuzhiyun config->num_tids = TARGET_NUM_TIDS(DBS);
88*4882a593Smuzhiyun } else if (ab->num_radios == 3) {
89*4882a593Smuzhiyun config->num_peers = TARGET_NUM_PEERS(DBS_SBS);
90*4882a593Smuzhiyun config->num_tids = TARGET_NUM_TIDS(DBS_SBS);
91*4882a593Smuzhiyun } else {
92*4882a593Smuzhiyun /* Control should not reach here */
93*4882a593Smuzhiyun config->num_peers = TARGET_NUM_PEERS(SINGLE);
94*4882a593Smuzhiyun config->num_tids = TARGET_NUM_TIDS(SINGLE);
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun config->num_offload_peers = TARGET_NUM_OFFLD_PEERS;
97*4882a593Smuzhiyun config->num_offload_reorder_buffs = TARGET_NUM_OFFLD_REORDER_BUFFS;
98*4882a593Smuzhiyun config->num_peer_keys = TARGET_NUM_PEER_KEYS;
99*4882a593Smuzhiyun config->ast_skid_limit = TARGET_AST_SKID_LIMIT;
100*4882a593Smuzhiyun config->tx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
101*4882a593Smuzhiyun config->rx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
102*4882a593Smuzhiyun config->rx_timeout_pri[0] = TARGET_RX_TIMEOUT_LO_PRI;
103*4882a593Smuzhiyun config->rx_timeout_pri[1] = TARGET_RX_TIMEOUT_LO_PRI;
104*4882a593Smuzhiyun config->rx_timeout_pri[2] = TARGET_RX_TIMEOUT_LO_PRI;
105*4882a593Smuzhiyun config->rx_timeout_pri[3] = TARGET_RX_TIMEOUT_HI_PRI;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
108*4882a593Smuzhiyun config->rx_decap_mode = TARGET_DECAP_MODE_RAW;
109*4882a593Smuzhiyun else
110*4882a593Smuzhiyun config->rx_decap_mode = TARGET_DECAP_MODE_NATIVE_WIFI;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun config->scan_max_pending_req = TARGET_SCAN_MAX_PENDING_REQS;
113*4882a593Smuzhiyun config->bmiss_offload_max_vdev = TARGET_BMISS_OFFLOAD_MAX_VDEV;
114*4882a593Smuzhiyun config->roam_offload_max_vdev = TARGET_ROAM_OFFLOAD_MAX_VDEV;
115*4882a593Smuzhiyun config->roam_offload_max_ap_profiles = TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES;
116*4882a593Smuzhiyun config->num_mcast_groups = TARGET_NUM_MCAST_GROUPS;
117*4882a593Smuzhiyun config->num_mcast_table_elems = TARGET_NUM_MCAST_TABLE_ELEMS;
118*4882a593Smuzhiyun config->mcast2ucast_mode = TARGET_MCAST2UCAST_MODE;
119*4882a593Smuzhiyun config->tx_dbg_log_size = TARGET_TX_DBG_LOG_SIZE;
120*4882a593Smuzhiyun config->num_wds_entries = TARGET_NUM_WDS_ENTRIES;
121*4882a593Smuzhiyun config->dma_burst_size = TARGET_DMA_BURST_SIZE;
122*4882a593Smuzhiyun config->rx_skip_defrag_timeout_dup_detection_check =
123*4882a593Smuzhiyun TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
124*4882a593Smuzhiyun config->vow_config = TARGET_VOW_CONFIG;
125*4882a593Smuzhiyun config->gtk_offload_max_vdev = TARGET_GTK_OFFLOAD_MAX_VDEV;
126*4882a593Smuzhiyun config->num_msdu_desc = TARGET_NUM_MSDU_DESC;
127*4882a593Smuzhiyun config->beacon_tx_offload_max_vdev = ab->num_radios * TARGET_MAX_BCN_OFFLD;
128*4882a593Smuzhiyun config->rx_batchmode = TARGET_RX_BATCHMODE;
129*4882a593Smuzhiyun config->peer_map_unmap_v2_support = 1;
130*4882a593Smuzhiyun config->twt_ap_pdev_count = ab->num_radios;
131*4882a593Smuzhiyun config->twt_ap_sta_count = 1000;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params * hw,int mac_id)134*4882a593Smuzhiyun static int ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params *hw,
135*4882a593Smuzhiyun int mac_id)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun return mac_id;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
ath11k_hw_mac_id_to_srng_id_ipq8074(struct ath11k_hw_params * hw,int mac_id)140*4882a593Smuzhiyun static int ath11k_hw_mac_id_to_srng_id_ipq8074(struct ath11k_hw_params *hw,
141*4882a593Smuzhiyun int mac_id)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun return 0;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
ath11k_hw_mac_id_to_pdev_id_qca6390(struct ath11k_hw_params * hw,int mac_id)146*4882a593Smuzhiyun static int ath11k_hw_mac_id_to_pdev_id_qca6390(struct ath11k_hw_params *hw,
147*4882a593Smuzhiyun int mac_id)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun return 0;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
ath11k_hw_mac_id_to_srng_id_qca6390(struct ath11k_hw_params * hw,int mac_id)152*4882a593Smuzhiyun static int ath11k_hw_mac_id_to_srng_id_qca6390(struct ath11k_hw_params *hw,
153*4882a593Smuzhiyun int mac_id)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun return mac_id;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun const struct ath11k_hw_ops ipq8074_ops = {
159*4882a593Smuzhiyun .get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
160*4882a593Smuzhiyun .wmi_init_config = ath11k_init_wmi_config_ipq8074,
161*4882a593Smuzhiyun .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074,
162*4882a593Smuzhiyun .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074,
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun const struct ath11k_hw_ops ipq6018_ops = {
166*4882a593Smuzhiyun .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id,
167*4882a593Smuzhiyun .wmi_init_config = ath11k_init_wmi_config_ipq8074,
168*4882a593Smuzhiyun .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074,
169*4882a593Smuzhiyun .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074,
170*4882a593Smuzhiyun };
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun const struct ath11k_hw_ops qca6390_ops = {
173*4882a593Smuzhiyun .get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
174*4882a593Smuzhiyun .wmi_init_config = ath11k_init_wmi_config_qca6390,
175*4882a593Smuzhiyun .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_qca6390,
176*4882a593Smuzhiyun .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_qca6390,
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun #define ATH11K_TX_RING_MASK_0 0x1
180*4882a593Smuzhiyun #define ATH11K_TX_RING_MASK_1 0x2
181*4882a593Smuzhiyun #define ATH11K_TX_RING_MASK_2 0x4
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun #define ATH11K_RX_RING_MASK_0 0x1
184*4882a593Smuzhiyun #define ATH11K_RX_RING_MASK_1 0x2
185*4882a593Smuzhiyun #define ATH11K_RX_RING_MASK_2 0x4
186*4882a593Smuzhiyun #define ATH11K_RX_RING_MASK_3 0x8
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun #define ATH11K_RX_ERR_RING_MASK_0 0x1
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun #define ATH11K_RX_WBM_REL_RING_MASK_0 0x1
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun #define ATH11K_REO_STATUS_RING_MASK_0 0x1
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun #define ATH11K_RXDMA2HOST_RING_MASK_0 0x1
195*4882a593Smuzhiyun #define ATH11K_RXDMA2HOST_RING_MASK_1 0x2
196*4882a593Smuzhiyun #define ATH11K_RXDMA2HOST_RING_MASK_2 0x4
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun #define ATH11K_HOST2RXDMA_RING_MASK_0 0x1
199*4882a593Smuzhiyun #define ATH11K_HOST2RXDMA_RING_MASK_1 0x2
200*4882a593Smuzhiyun #define ATH11K_HOST2RXDMA_RING_MASK_2 0x4
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun #define ATH11K_RX_MON_STATUS_RING_MASK_0 0x1
203*4882a593Smuzhiyun #define ATH11K_RX_MON_STATUS_RING_MASK_1 0x2
204*4882a593Smuzhiyun #define ATH11K_RX_MON_STATUS_RING_MASK_2 0x4
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074 = {
207*4882a593Smuzhiyun .tx = {
208*4882a593Smuzhiyun ATH11K_TX_RING_MASK_0,
209*4882a593Smuzhiyun ATH11K_TX_RING_MASK_1,
210*4882a593Smuzhiyun ATH11K_TX_RING_MASK_2,
211*4882a593Smuzhiyun },
212*4882a593Smuzhiyun .rx_mon_status = {
213*4882a593Smuzhiyun 0, 0, 0, 0,
214*4882a593Smuzhiyun ATH11K_RX_MON_STATUS_RING_MASK_0,
215*4882a593Smuzhiyun ATH11K_RX_MON_STATUS_RING_MASK_1,
216*4882a593Smuzhiyun ATH11K_RX_MON_STATUS_RING_MASK_2,
217*4882a593Smuzhiyun },
218*4882a593Smuzhiyun .rx = {
219*4882a593Smuzhiyun 0, 0, 0, 0, 0, 0, 0,
220*4882a593Smuzhiyun ATH11K_RX_RING_MASK_0,
221*4882a593Smuzhiyun ATH11K_RX_RING_MASK_1,
222*4882a593Smuzhiyun ATH11K_RX_RING_MASK_2,
223*4882a593Smuzhiyun ATH11K_RX_RING_MASK_3,
224*4882a593Smuzhiyun },
225*4882a593Smuzhiyun .rx_err = {
226*4882a593Smuzhiyun ATH11K_RX_ERR_RING_MASK_0,
227*4882a593Smuzhiyun },
228*4882a593Smuzhiyun .rx_wbm_rel = {
229*4882a593Smuzhiyun ATH11K_RX_WBM_REL_RING_MASK_0,
230*4882a593Smuzhiyun },
231*4882a593Smuzhiyun .reo_status = {
232*4882a593Smuzhiyun ATH11K_REO_STATUS_RING_MASK_0,
233*4882a593Smuzhiyun },
234*4882a593Smuzhiyun .rxdma2host = {
235*4882a593Smuzhiyun ATH11K_RXDMA2HOST_RING_MASK_0,
236*4882a593Smuzhiyun ATH11K_RXDMA2HOST_RING_MASK_1,
237*4882a593Smuzhiyun ATH11K_RXDMA2HOST_RING_MASK_2,
238*4882a593Smuzhiyun },
239*4882a593Smuzhiyun .host2rxdma = {
240*4882a593Smuzhiyun ATH11K_HOST2RXDMA_RING_MASK_0,
241*4882a593Smuzhiyun ATH11K_HOST2RXDMA_RING_MASK_1,
242*4882a593Smuzhiyun ATH11K_HOST2RXDMA_RING_MASK_2,
243*4882a593Smuzhiyun },
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390 = {
247*4882a593Smuzhiyun .tx = {
248*4882a593Smuzhiyun ATH11K_TX_RING_MASK_0,
249*4882a593Smuzhiyun },
250*4882a593Smuzhiyun .rx_mon_status = {
251*4882a593Smuzhiyun 0, 0, 0, 0,
252*4882a593Smuzhiyun ATH11K_RX_MON_STATUS_RING_MASK_0,
253*4882a593Smuzhiyun ATH11K_RX_MON_STATUS_RING_MASK_1,
254*4882a593Smuzhiyun ATH11K_RX_MON_STATUS_RING_MASK_2,
255*4882a593Smuzhiyun },
256*4882a593Smuzhiyun .rx = {
257*4882a593Smuzhiyun 0, 0, 0, 0, 0, 0, 0,
258*4882a593Smuzhiyun ATH11K_RX_RING_MASK_0,
259*4882a593Smuzhiyun ATH11K_RX_RING_MASK_1,
260*4882a593Smuzhiyun ATH11K_RX_RING_MASK_2,
261*4882a593Smuzhiyun ATH11K_RX_RING_MASK_3,
262*4882a593Smuzhiyun },
263*4882a593Smuzhiyun .rx_err = {
264*4882a593Smuzhiyun ATH11K_RX_ERR_RING_MASK_0,
265*4882a593Smuzhiyun },
266*4882a593Smuzhiyun .rx_wbm_rel = {
267*4882a593Smuzhiyun ATH11K_RX_WBM_REL_RING_MASK_0,
268*4882a593Smuzhiyun },
269*4882a593Smuzhiyun .reo_status = {
270*4882a593Smuzhiyun ATH11K_REO_STATUS_RING_MASK_0,
271*4882a593Smuzhiyun },
272*4882a593Smuzhiyun .rxdma2host = {
273*4882a593Smuzhiyun ATH11K_RXDMA2HOST_RING_MASK_0,
274*4882a593Smuzhiyun ATH11K_RXDMA2HOST_RING_MASK_1,
275*4882a593Smuzhiyun ATH11K_RXDMA2HOST_RING_MASK_2,
276*4882a593Smuzhiyun },
277*4882a593Smuzhiyun .host2rxdma = {
278*4882a593Smuzhiyun },
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun /* Target firmware's Copy Engine configuration. */
282*4882a593Smuzhiyun const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq8074[] = {
283*4882a593Smuzhiyun /* CE0: host->target HTC control and raw streams */
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun .pipenum = __cpu_to_le32(0),
286*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
287*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
288*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
289*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
290*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
291*4882a593Smuzhiyun },
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun /* CE1: target->host HTT + HTC control */
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
296*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN),
297*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
298*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
299*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
300*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
301*4882a593Smuzhiyun },
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun /* CE2: target->host WMI */
304*4882a593Smuzhiyun {
305*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
306*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN),
307*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
308*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
309*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
310*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
311*4882a593Smuzhiyun },
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun /* CE3: host->target WMI */
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
316*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
317*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
318*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
319*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
320*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
321*4882a593Smuzhiyun },
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun /* CE4: host->target HTT */
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun .pipenum = __cpu_to_le32(4),
326*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
327*4882a593Smuzhiyun .nentries = __cpu_to_le32(256),
328*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(256),
329*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
330*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
331*4882a593Smuzhiyun },
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun /* CE5: target->host Pktlog */
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun .pipenum = __cpu_to_le32(5),
336*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN),
337*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
338*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
339*4882a593Smuzhiyun .flags = __cpu_to_le32(0),
340*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
341*4882a593Smuzhiyun },
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun /* CE6: Reserved for target autonomous hif_memcpy */
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun .pipenum = __cpu_to_le32(6),
346*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
347*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
348*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(65535),
349*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
350*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
351*4882a593Smuzhiyun },
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun /* CE7 used only by Host */
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun .pipenum = __cpu_to_le32(7),
356*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
357*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
358*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
359*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
360*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
361*4882a593Smuzhiyun },
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun /* CE8 target->host used only by IPA */
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun .pipenum = __cpu_to_le32(8),
366*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
367*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
368*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(65535),
369*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
370*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
371*4882a593Smuzhiyun },
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun /* CE9 host->target HTT */
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun .pipenum = __cpu_to_le32(9),
376*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
377*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
378*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
379*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
380*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
381*4882a593Smuzhiyun },
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun /* CE10 target->host HTT */
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun .pipenum = __cpu_to_le32(10),
386*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H),
387*4882a593Smuzhiyun .nentries = __cpu_to_le32(0),
388*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(0),
389*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
390*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
391*4882a593Smuzhiyun },
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun /* CE11 Not used */
394*4882a593Smuzhiyun };
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun /* Map from service/endpoint to Copy Engine.
397*4882a593Smuzhiyun * This table is derived from the CE_PCI TABLE, above.
398*4882a593Smuzhiyun * It is passed to the Target at startup for use by firmware.
399*4882a593Smuzhiyun */
400*4882a593Smuzhiyun const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq8074[] = {
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
403*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
404*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
405*4882a593Smuzhiyun },
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
408*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
409*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
410*4882a593Smuzhiyun },
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
413*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
414*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
415*4882a593Smuzhiyun },
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
418*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
419*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
420*4882a593Smuzhiyun },
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
423*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
424*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
425*4882a593Smuzhiyun },
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
428*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
429*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
430*4882a593Smuzhiyun },
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
433*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
434*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
435*4882a593Smuzhiyun },
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
438*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
439*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
440*4882a593Smuzhiyun },
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
443*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
444*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
445*4882a593Smuzhiyun },
446*4882a593Smuzhiyun {
447*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
448*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
449*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
450*4882a593Smuzhiyun },
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
453*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
454*4882a593Smuzhiyun .pipenum = __cpu_to_le32(7),
455*4882a593Smuzhiyun },
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
458*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
459*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
460*4882a593Smuzhiyun },
461*4882a593Smuzhiyun {
462*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC2),
463*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
464*4882a593Smuzhiyun .pipenum = __cpu_to_le32(9),
465*4882a593Smuzhiyun },
466*4882a593Smuzhiyun {
467*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC2),
468*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
469*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
470*4882a593Smuzhiyun },
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
473*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
474*4882a593Smuzhiyun .pipenum = __cpu_to_le32(0),
475*4882a593Smuzhiyun },
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
478*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
479*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
480*4882a593Smuzhiyun },
481*4882a593Smuzhiyun { /* not used */
482*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
483*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
484*4882a593Smuzhiyun .pipenum = __cpu_to_le32(0),
485*4882a593Smuzhiyun },
486*4882a593Smuzhiyun { /* not used */
487*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
488*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
489*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
490*4882a593Smuzhiyun },
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
493*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
494*4882a593Smuzhiyun .pipenum = __cpu_to_le32(4),
495*4882a593Smuzhiyun },
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
498*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
499*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
500*4882a593Smuzhiyun },
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
503*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
504*4882a593Smuzhiyun .pipenum = __cpu_to_le32(5),
505*4882a593Smuzhiyun },
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun /* (Additions here) */
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun { /* terminator entry */ }
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq6018[] = {
513*4882a593Smuzhiyun {
514*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
515*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
516*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
517*4882a593Smuzhiyun },
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
520*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
521*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
522*4882a593Smuzhiyun },
523*4882a593Smuzhiyun {
524*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
525*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
526*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
527*4882a593Smuzhiyun },
528*4882a593Smuzhiyun {
529*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
530*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
531*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
532*4882a593Smuzhiyun },
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
535*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
536*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
537*4882a593Smuzhiyun },
538*4882a593Smuzhiyun {
539*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
540*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
541*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
542*4882a593Smuzhiyun },
543*4882a593Smuzhiyun {
544*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
545*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
546*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
547*4882a593Smuzhiyun },
548*4882a593Smuzhiyun {
549*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
550*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
551*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
552*4882a593Smuzhiyun },
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
555*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
556*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
557*4882a593Smuzhiyun },
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
560*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
561*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
562*4882a593Smuzhiyun },
563*4882a593Smuzhiyun {
564*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
565*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
566*4882a593Smuzhiyun .pipenum = __cpu_to_le32(7),
567*4882a593Smuzhiyun },
568*4882a593Smuzhiyun {
569*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
570*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
571*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
572*4882a593Smuzhiyun },
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
575*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
576*4882a593Smuzhiyun .pipenum = __cpu_to_le32(0),
577*4882a593Smuzhiyun },
578*4882a593Smuzhiyun {
579*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
580*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
581*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
582*4882a593Smuzhiyun },
583*4882a593Smuzhiyun { /* not used */
584*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
585*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
586*4882a593Smuzhiyun .pipenum = __cpu_to_le32(0),
587*4882a593Smuzhiyun },
588*4882a593Smuzhiyun { /* not used */
589*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
590*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
591*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
592*4882a593Smuzhiyun },
593*4882a593Smuzhiyun {
594*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
595*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
596*4882a593Smuzhiyun .pipenum = __cpu_to_le32(4),
597*4882a593Smuzhiyun },
598*4882a593Smuzhiyun {
599*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
600*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
601*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
602*4882a593Smuzhiyun },
603*4882a593Smuzhiyun {
604*4882a593Smuzhiyun .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
605*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
606*4882a593Smuzhiyun .pipenum = __cpu_to_le32(5),
607*4882a593Smuzhiyun },
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun /* (Additions here) */
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun { /* terminator entry */ }
612*4882a593Smuzhiyun };
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun /* Target firmware's Copy Engine configuration. */
615*4882a593Smuzhiyun const struct ce_pipe_config ath11k_target_ce_config_wlan_qca6390[] = {
616*4882a593Smuzhiyun /* CE0: host->target HTC control and raw streams */
617*4882a593Smuzhiyun {
618*4882a593Smuzhiyun .pipenum = __cpu_to_le32(0),
619*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
620*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
621*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
622*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
623*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
624*4882a593Smuzhiyun },
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun /* CE1: target->host HTT + HTC control */
627*4882a593Smuzhiyun {
628*4882a593Smuzhiyun .pipenum = __cpu_to_le32(1),
629*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN),
630*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
631*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
632*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
633*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
634*4882a593Smuzhiyun },
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun /* CE2: target->host WMI */
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun .pipenum = __cpu_to_le32(2),
639*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN),
640*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
641*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
642*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
643*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
644*4882a593Smuzhiyun },
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun /* CE3: host->target WMI */
647*4882a593Smuzhiyun {
648*4882a593Smuzhiyun .pipenum = __cpu_to_le32(3),
649*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
650*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
651*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
652*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
653*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
654*4882a593Smuzhiyun },
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun /* CE4: host->target HTT */
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun .pipenum = __cpu_to_le32(4),
659*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_OUT),
660*4882a593Smuzhiyun .nentries = __cpu_to_le32(256),
661*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(256),
662*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
663*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
664*4882a593Smuzhiyun },
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun /* CE5: target->host Pktlog */
667*4882a593Smuzhiyun {
668*4882a593Smuzhiyun .pipenum = __cpu_to_le32(5),
669*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_IN),
670*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
671*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(2048),
672*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
673*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
674*4882a593Smuzhiyun },
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun /* CE6: Reserved for target autonomous hif_memcpy */
677*4882a593Smuzhiyun {
678*4882a593Smuzhiyun .pipenum = __cpu_to_le32(6),
679*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
680*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
681*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(16384),
682*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
683*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
684*4882a593Smuzhiyun },
685*4882a593Smuzhiyun
686*4882a593Smuzhiyun /* CE7 used only by Host */
687*4882a593Smuzhiyun {
688*4882a593Smuzhiyun .pipenum = __cpu_to_le32(7),
689*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H),
690*4882a593Smuzhiyun .nentries = __cpu_to_le32(0),
691*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(0),
692*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
693*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
694*4882a593Smuzhiyun },
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun /* CE8 target->host used only by IPA */
697*4882a593Smuzhiyun {
698*4882a593Smuzhiyun .pipenum = __cpu_to_le32(8),
699*4882a593Smuzhiyun .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
700*4882a593Smuzhiyun .nentries = __cpu_to_le32(32),
701*4882a593Smuzhiyun .nbytes_max = __cpu_to_le32(16384),
702*4882a593Smuzhiyun .flags = __cpu_to_le32(CE_ATTR_FLAGS),
703*4882a593Smuzhiyun .reserved = __cpu_to_le32(0),
704*4882a593Smuzhiyun },
705*4882a593Smuzhiyun /* CE 9, 10, 11 are used by MHI driver */
706*4882a593Smuzhiyun };
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun /* Map from service/endpoint to Copy Engine.
709*4882a593Smuzhiyun * This table is derived from the CE_PCI TABLE, above.
710*4882a593Smuzhiyun * It is passed to the Target at startup for use by firmware.
711*4882a593Smuzhiyun */
712*4882a593Smuzhiyun const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qca6390[] = {
713*4882a593Smuzhiyun {
714*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
715*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
716*4882a593Smuzhiyun __cpu_to_le32(3),
717*4882a593Smuzhiyun },
718*4882a593Smuzhiyun {
719*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
720*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
721*4882a593Smuzhiyun __cpu_to_le32(2),
722*4882a593Smuzhiyun },
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
725*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
726*4882a593Smuzhiyun __cpu_to_le32(3),
727*4882a593Smuzhiyun },
728*4882a593Smuzhiyun {
729*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
730*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
731*4882a593Smuzhiyun __cpu_to_le32(2),
732*4882a593Smuzhiyun },
733*4882a593Smuzhiyun {
734*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
735*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
736*4882a593Smuzhiyun __cpu_to_le32(3),
737*4882a593Smuzhiyun },
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
740*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
741*4882a593Smuzhiyun __cpu_to_le32(2),
742*4882a593Smuzhiyun },
743*4882a593Smuzhiyun {
744*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
745*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
746*4882a593Smuzhiyun __cpu_to_le32(3),
747*4882a593Smuzhiyun },
748*4882a593Smuzhiyun {
749*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
750*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
751*4882a593Smuzhiyun __cpu_to_le32(2),
752*4882a593Smuzhiyun },
753*4882a593Smuzhiyun {
754*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
755*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
756*4882a593Smuzhiyun __cpu_to_le32(3),
757*4882a593Smuzhiyun },
758*4882a593Smuzhiyun {
759*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
760*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
761*4882a593Smuzhiyun __cpu_to_le32(2),
762*4882a593Smuzhiyun },
763*4882a593Smuzhiyun {
764*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
765*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
766*4882a593Smuzhiyun __cpu_to_le32(0),
767*4882a593Smuzhiyun },
768*4882a593Smuzhiyun {
769*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
770*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
771*4882a593Smuzhiyun __cpu_to_le32(2),
772*4882a593Smuzhiyun },
773*4882a593Smuzhiyun {
774*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
775*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
776*4882a593Smuzhiyun __cpu_to_le32(4),
777*4882a593Smuzhiyun },
778*4882a593Smuzhiyun {
779*4882a593Smuzhiyun __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
780*4882a593Smuzhiyun __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
781*4882a593Smuzhiyun __cpu_to_le32(1),
782*4882a593Smuzhiyun },
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun /* (Additions here) */
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun { /* must be last */
787*4882a593Smuzhiyun __cpu_to_le32(0),
788*4882a593Smuzhiyun __cpu_to_le32(0),
789*4882a593Smuzhiyun __cpu_to_le32(0),
790*4882a593Smuzhiyun },
791*4882a593Smuzhiyun };
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun const struct ath11k_hw_regs ipq8074_regs = {
794*4882a593Smuzhiyun /* SW2TCL(x) R0 ring configuration address */
795*4882a593Smuzhiyun .hal_tcl1_ring_base_lsb = 0x00000510,
796*4882a593Smuzhiyun .hal_tcl1_ring_base_msb = 0x00000514,
797*4882a593Smuzhiyun .hal_tcl1_ring_id = 0x00000518,
798*4882a593Smuzhiyun .hal_tcl1_ring_misc = 0x00000520,
799*4882a593Smuzhiyun .hal_tcl1_ring_tp_addr_lsb = 0x0000052c,
800*4882a593Smuzhiyun .hal_tcl1_ring_tp_addr_msb = 0x00000530,
801*4882a593Smuzhiyun .hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000540,
802*4882a593Smuzhiyun .hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000544,
803*4882a593Smuzhiyun .hal_tcl1_ring_msi1_base_lsb = 0x00000558,
804*4882a593Smuzhiyun .hal_tcl1_ring_msi1_base_msb = 0x0000055c,
805*4882a593Smuzhiyun .hal_tcl1_ring_msi1_data = 0x00000560,
806*4882a593Smuzhiyun .hal_tcl2_ring_base_lsb = 0x00000568,
807*4882a593Smuzhiyun .hal_tcl_ring_base_lsb = 0x00000618,
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun /* TCL STATUS ring address */
810*4882a593Smuzhiyun .hal_tcl_status_ring_base_lsb = 0x00000720,
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun /* REO2SW(x) R0 ring configuration address */
813*4882a593Smuzhiyun .hal_reo1_ring_base_lsb = 0x0000029c,
814*4882a593Smuzhiyun .hal_reo1_ring_base_msb = 0x000002a0,
815*4882a593Smuzhiyun .hal_reo1_ring_id = 0x000002a4,
816*4882a593Smuzhiyun .hal_reo1_ring_misc = 0x000002ac,
817*4882a593Smuzhiyun .hal_reo1_ring_hp_addr_lsb = 0x000002b0,
818*4882a593Smuzhiyun .hal_reo1_ring_hp_addr_msb = 0x000002b4,
819*4882a593Smuzhiyun .hal_reo1_ring_producer_int_setup = 0x000002c0,
820*4882a593Smuzhiyun .hal_reo1_ring_msi1_base_lsb = 0x000002e4,
821*4882a593Smuzhiyun .hal_reo1_ring_msi1_base_msb = 0x000002e8,
822*4882a593Smuzhiyun .hal_reo1_ring_msi1_data = 0x000002ec,
823*4882a593Smuzhiyun .hal_reo2_ring_base_lsb = 0x000002f4,
824*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_0 = 0x00000564,
825*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_1 = 0x00000568,
826*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_2 = 0x0000056c,
827*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_3 = 0x00000570,
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun /* REO2SW(x) R2 ring pointers (head/tail) address */
830*4882a593Smuzhiyun .hal_reo1_ring_hp = 0x00003038,
831*4882a593Smuzhiyun .hal_reo1_ring_tp = 0x0000303c,
832*4882a593Smuzhiyun .hal_reo2_ring_hp = 0x00003040,
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun /* REO2TCL R0 ring configuration address */
835*4882a593Smuzhiyun .hal_reo_tcl_ring_base_lsb = 0x000003fc,
836*4882a593Smuzhiyun .hal_reo_tcl_ring_hp = 0x00003058,
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun /* REO status address */
839*4882a593Smuzhiyun .hal_reo_status_ring_base_lsb = 0x00000504,
840*4882a593Smuzhiyun .hal_reo_status_hp = 0x00003070,
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun };
843*4882a593Smuzhiyun
844*4882a593Smuzhiyun const struct ath11k_hw_regs qca6390_regs = {
845*4882a593Smuzhiyun /* SW2TCL(x) R0 ring configuration address */
846*4882a593Smuzhiyun .hal_tcl1_ring_base_lsb = 0x00000684,
847*4882a593Smuzhiyun .hal_tcl1_ring_base_msb = 0x00000688,
848*4882a593Smuzhiyun .hal_tcl1_ring_id = 0x0000068c,
849*4882a593Smuzhiyun .hal_tcl1_ring_misc = 0x00000694,
850*4882a593Smuzhiyun .hal_tcl1_ring_tp_addr_lsb = 0x000006a0,
851*4882a593Smuzhiyun .hal_tcl1_ring_tp_addr_msb = 0x000006a4,
852*4882a593Smuzhiyun .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006b4,
853*4882a593Smuzhiyun .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006b8,
854*4882a593Smuzhiyun .hal_tcl1_ring_msi1_base_lsb = 0x000006cc,
855*4882a593Smuzhiyun .hal_tcl1_ring_msi1_base_msb = 0x000006d0,
856*4882a593Smuzhiyun .hal_tcl1_ring_msi1_data = 0x000006d4,
857*4882a593Smuzhiyun .hal_tcl2_ring_base_lsb = 0x000006dc,
858*4882a593Smuzhiyun .hal_tcl_ring_base_lsb = 0x0000078c,
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun /* TCL STATUS ring address */
861*4882a593Smuzhiyun .hal_tcl_status_ring_base_lsb = 0x00000894,
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun /* REO2SW(x) R0 ring configuration address */
864*4882a593Smuzhiyun .hal_reo1_ring_base_lsb = 0x00000244,
865*4882a593Smuzhiyun .hal_reo1_ring_base_msb = 0x00000248,
866*4882a593Smuzhiyun .hal_reo1_ring_id = 0x0000024c,
867*4882a593Smuzhiyun .hal_reo1_ring_misc = 0x00000254,
868*4882a593Smuzhiyun .hal_reo1_ring_hp_addr_lsb = 0x00000258,
869*4882a593Smuzhiyun .hal_reo1_ring_hp_addr_msb = 0x0000025c,
870*4882a593Smuzhiyun .hal_reo1_ring_producer_int_setup = 0x00000268,
871*4882a593Smuzhiyun .hal_reo1_ring_msi1_base_lsb = 0x0000028c,
872*4882a593Smuzhiyun .hal_reo1_ring_msi1_base_msb = 0x00000290,
873*4882a593Smuzhiyun .hal_reo1_ring_msi1_data = 0x00000294,
874*4882a593Smuzhiyun .hal_reo2_ring_base_lsb = 0x0000029c,
875*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_0 = 0x0000050c,
876*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_1 = 0x00000510,
877*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_2 = 0x00000514,
878*4882a593Smuzhiyun .hal_reo1_aging_thresh_ix_3 = 0x00000518,
879*4882a593Smuzhiyun
880*4882a593Smuzhiyun /* REO2SW(x) R2 ring pointers (head/tail) address */
881*4882a593Smuzhiyun .hal_reo1_ring_hp = 0x00003030,
882*4882a593Smuzhiyun .hal_reo1_ring_tp = 0x00003034,
883*4882a593Smuzhiyun .hal_reo2_ring_hp = 0x00003038,
884*4882a593Smuzhiyun
885*4882a593Smuzhiyun /* REO2TCL R0 ring configuration address */
886*4882a593Smuzhiyun .hal_reo_tcl_ring_base_lsb = 0x000003a4,
887*4882a593Smuzhiyun .hal_reo_tcl_ring_hp = 0x00003050,
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun /* REO status address */
890*4882a593Smuzhiyun .hal_reo_status_ring_base_lsb = 0x000004ac,
891*4882a593Smuzhiyun .hal_reo_status_hp = 0x00003068,
892*4882a593Smuzhiyun };
893