blob: b493d55502cd346251af6810dc1c7510e5e6f444 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
2 * Copyright (c) 2014 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/*
29 * Implementation of the Host-side Host InterFace (HIF) API
30 * for a Host/Target interconnect using Copy Engines over PCIe.
31 */
32
33#ifndef __HIF_PCI_INTERNAL_H__
34#define __HIF_PCI_INTERNAL_H__
35
36#define HIF_PCI_DEBUG ATH_DEBUG_MAKE_MODULE_MASK(0)
37#define HIF_PCI_IPA_UC_ASSIGNED_CE 5
38
39#if defined(DEBUG)
40static ATH_DEBUG_MASK_DESCRIPTION g_hif_debug_description[] = {
41 {HIF_PCI_DEBUG, "hif_pci"},
42};
43
44ATH_DEBUG_INSTANTIATE_MODULE_VAR(hif, "hif", "PCIe Host Interface",
45 ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_INFO,
46 ATH_DEBUG_DESCRIPTION_COUNT
47 (g_hif_debug_description),
48 g_hif_debug_description);
49#endif
50
51#ifdef CONFIG_ATH_PCIE_ACCESS_DEBUG
52spinlock_t pcie_access_log_lock;
53unsigned int pcie_access_log_seqnum = 0;
54HIF_ACCESS_LOG pcie_access_log[PCIE_ACCESS_LOG_NUM];
55static void hif_target_dump_access_log(void);
56#endif
57
58/*
59 * Host software's Copy Engine configuration.
60 * This table is derived from the CE_PCI TABLE, above.
61 */
62#ifdef BIG_ENDIAN_HOST
63#define CE_ATTR_FLAGS CE_ATTR_BYTE_SWAP_DATA
64#else
65#define CE_ATTR_FLAGS 0
66#endif
67
68/* Maximum number of Copy Engine's supported */
69#define CE_HTT_H2T_MSG_SRC_NENTRIES 2048
70
71#define DIAG_CE_ID 7
72#define EPPING_CE_FLAGS_POLL \
73 (CE_ATTR_DISABLE_INTR|CE_ATTR_ENABLE_POLL|CE_ATTR_FLAGS)
74#ifdef QCA_WIFI_3_0
75static struct CE_attr host_ce_config_wlan[] = {
76 /* host->target HTC control and raw streams */
77 { /* CE0 */ CE_ATTR_FLAGS, 0, 16, 2048, 0, NULL,},
78 /* target->host HTT + HTC control */
79 { /* CE1 */ CE_ATTR_FLAGS, 0, 0, 2048, 512, NULL,},
80 /* target->host WMI */
81 { /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 32, NULL,},
82 /* host->target WMI */
83 { /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL,},
84 /* host->target HTT */
85 { /* CE4 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
86 CE_HTT_H2T_MSG_SRC_NENTRIES, 256, 0, NULL,},
87 /* ipa_uc->target HTC control */
88 { /* CE5 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
89 1024, 512, 0, NULL,},
90 /* Target autonomous HIF_memcpy */
91 { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
92 /* ce_diag, the Diagnostic Window */
93 { /* CE7 */ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,
94 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
95};
96
97static struct CE_pipe_config target_ce_config_wlan[] = {
98 /* host->target HTC control and raw streams */
99 { /* CE0 */ 0, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0,},
100 /* target->host HTT */
101 { /* CE1 */ 1, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,},
102 /* target->host WMI + HTC control */
103 { /* CE2 */ 2, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,},
104 /* host->target WMI */
105 { /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0,},
106 /* host->target HTT */
107 { /* CE4 */ 4, PIPEDIR_OUT, 256, 256,
108 (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,},
109 /* NB: 50% of src nentries, since tx has 2 frags */
110 /* ipa_uc->target */
111 { /* CE5 */ 5, PIPEDIR_OUT, 1024, 64,
112 (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,},
113 /* Reserved for target autonomous HIF_memcpy */
114 { /* CE6 */ 6, PIPEDIR_INOUT, 32, 4096, CE_ATTR_FLAGS, 0,},
115 /* CE7 used only by Host */
116 { /* CE7 */ 7, PIPEDIR_INOUT_H2H, 0, 0,
117 (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,},
118 /* CE8 used only by IPA */
119 { /* CE8 */ 8, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}
120};
121
122static struct CE_attr host_ce_config_wlan_epping_poll[] = {
123 /* host->target HTC control and raw streams */
124 { /* CE0 */ CE_ATTR_FLAGS, 0, 16, 2048, 0, NULL,},
125 /* target->host EP-ping */
126 { /* CE1 */ EPPING_CE_FLAGS_POLL, 0, 0, 2048, 128, NULL,},
127 /* target->host EP-ping */
128 { /* CE2 */ EPPING_CE_FLAGS_POLL, 0, 0, 2048, 128, NULL,},
129 /* host->target EP-ping */
130 { /* CE3 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
131 /* host->target EP-ping */
132 { /* CE4 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
133 /* EP-ping heartbeat */
134 { /* CE5 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
135 /* unused */
136 { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
137 /* ce_diag, the Diagnostic Window */
138 { /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
139};
140
141static struct CE_attr host_ce_config_wlan_epping_irq[] = {
142 /* host->target HTC control and raw streams */
143 { /* CE0 */ CE_ATTR_FLAGS, 0, 16, 2048, 0, NULL,},
144 /* target->host EP-ping */
145 { /* CE1 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
146 /* target->host EP-ping */
147 { /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
148 /* host->target EP-ping */
149 { /* CE3 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
150 /* host->target EP-ping */
151 { /* CE4 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
152 /* EP-ping heartbeat */
153 { /* CE5 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
154 /* unused */
155 { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
156 /* ce_diag, the Diagnostic Window */
157 { /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
158};
159/*
160 * EP-ping firmware's CE configuration
161 */
162static struct CE_pipe_config target_ce_config_wlan_epping[] = {
163 /* host->target HTC control and raw streams */
164 { /* CE0 */ 0, PIPEDIR_OUT, 16, 2048, CE_ATTR_FLAGS, 0,},
165 /* target->host EP-ping */
166 { /* CE1 */ 1, PIPEDIR_IN, 128, 2048, CE_ATTR_FLAGS, 0,},
167 /* target->host EP-ping */
168 { /* CE2 */ 2, PIPEDIR_IN, 128, 2048, CE_ATTR_FLAGS, 0,},
169 /* host->target EP-ping */
170 { /* CE3 */ 3, PIPEDIR_OUT, 128, 2048, CE_ATTR_FLAGS, 0,},
171 /* host->target EP-ping */
172 { /* CE4 */ 4, PIPEDIR_OUT, 128, 2048, CE_ATTR_FLAGS, 0,},
173 /* EP-ping heartbeat */
174 { /* CE5 */ 5, PIPEDIR_IN, 128, 2048, CE_ATTR_FLAGS, 0,},
175 /* unused */
176 { /* CE6 */ 6, PIPEDIR_INOUT, 0, 0, CE_ATTR_FLAGS, 0,},
177 /* CE7 used only by Host */
178 { /* CE7 */ 7, PIPEDIR_INOUT_H2H, 0, 0, 0, 0,},
179 /* CE8 used only by IPA */
180 { /* CE8 */ 8, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}
181};
182#else
183static struct CE_attr host_ce_config_wlan[] = {
184 /* host->target HTC control and raw streams */
185 { /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL,},
186 /* target->host HTT + HTC control */
187 { /* CE1 */ CE_ATTR_FLAGS, 0, 0, 2048, 512, NULL,},
188 /* target->host WMI */
189 { /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 32, NULL,},
190 /* host->target WMI */
191 { /* CE3 */ CE_ATTR_FLAGS, 0, 32, 2048, 0, NULL,},
192 /* host->target HTT */
193 { /* CE4 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
194 CE_HTT_H2T_MSG_SRC_NENTRIES, 256, 0, NULL,},
195 /* ipa_uc->target HTC control */
196 { /* CE5 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR, 0,
197 1024, 512, 0, NULL,},
198 /* Target autonomous HIF_memcpy */
199 { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
200 /* ce_diag, the Diagnostic Window */
201 { /* CE7 */ CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR,
202 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
203};
204
205static struct CE_pipe_config target_ce_config_wlan[] = {
206 /* host->target HTC control and raw streams */
207 { /* CE0 */ 0, PIPEDIR_OUT, 32, 256, CE_ATTR_FLAGS, 0,},
208 /* target->host HTT + HTC control */
209 { /* CE1 */ 1, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,},
210 /* target->host WMI */
211 { /* CE2 */ 2, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,},
212 /* host->target WMI */
213 { /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0,},
214 /* host->target HTT */
215 { /* CE4 */ 4, PIPEDIR_OUT, 256, 256, CE_ATTR_FLAGS, 0,},
216 /* NB: 50% of src nentries, since tx has 2 frags */
217 /* ipa_uc->target HTC control */
218 { /* CE5 */ 5, PIPEDIR_OUT, 1024, 64, CE_ATTR_FLAGS, 0,},
219 /* Reserved for target autonomous HIF_memcpy */
220 { /* CE6 */ 6, PIPEDIR_INOUT, 32, 4096, CE_ATTR_FLAGS, 0,},
221 /* CE7 used only by Host */
222 { /* CE7 */ 7, PIPEDIR_INOUT_H2H, 0, 0, 0, 0,},
223 /* CE8 used only by IPA */
224 { /* CE8 */ 8, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}
225};
226
227static struct CE_attr host_ce_config_wlan_epping_poll[] = {
228 /* host->target HTC control and raw streams */
229 { /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL,},
230 /* target->host EP-ping */
231 { /* CE1 */ EPPING_CE_FLAGS_POLL, 0, 0, 2048, 128, NULL,},
232 /* target->host EP-ping */
233 { /* CE2 */ EPPING_CE_FLAGS_POLL, 0, 0, 2048, 128, NULL,},
234 /* host->target EP-ping */
235 { /* CE3 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
236 /* host->target EP-ping */
237 { /* CE4 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
238 /* EP-ping heartbeat */
239 { /* CE5 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
240 /* unused */
241 { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
242 /* ce_diag, the Diagnostic Window */
243 { /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
244};
245static struct CE_attr host_ce_config_wlan_epping_irq[] = {
246 /* host->target HTC control and raw streams */
247 { /* CE0 */ CE_ATTR_FLAGS, 0, 16, 256, 0, NULL,},
248 /* target->host EP-ping */
249 { /* CE1 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
250 /* target->host EP-ping */
251 { /* CE2 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
252 /* host->target EP-ping */
253 { /* CE3 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
254 /* host->target EP-ping */
255 { /* CE4 */ CE_ATTR_FLAGS, 0, 128, 2048, 0, NULL,},
256 /* EP-ping heartbeat */
257 { /* CE5 */ CE_ATTR_FLAGS, 0, 0, 2048, 128, NULL,},
258 /* unused */
259 { /* CE6 */ CE_ATTR_FLAGS, 0, 0, 0, 0, NULL,},
260 /* ce_diag, the Diagnostic Window */
261 { /* CE7 */ CE_ATTR_FLAGS, 0, 2, DIAG_TRANSFER_LIMIT, 2, NULL,},
262};
263/*
264 * EP-ping firmware's CE configuration
265 */
266static struct CE_pipe_config target_ce_config_wlan_epping[] = {
267 /* host->target HTC control and raw streams */
268 { /* CE0 */ 0, PIPEDIR_OUT, 16, 256, CE_ATTR_FLAGS, 0,},
269 /* target->host EP-ping */
270 { /* CE1 */ 1, PIPEDIR_IN, 128, 2048, CE_ATTR_FLAGS, 0,},
271 /* target->host EP-ping */
272 { /* CE2 */ 2, PIPEDIR_IN, 128, 2048, CE_ATTR_FLAGS, 0,},
273 /* host->target EP-ping */
274 { /* CE3 */ 3, PIPEDIR_OUT, 128, 2048, CE_ATTR_FLAGS, 0,},
275 /* host->target EP-ping */
276 { /* CE4 */ 4, PIPEDIR_OUT, 128, 2048, CE_ATTR_FLAGS, 0,},
277 /* EP-ping heartbeat */
278 { /* CE5 */ 5, PIPEDIR_IN, 128, 2048, CE_ATTR_FLAGS, 0,},
279 /* unused */
280 { /* CE6 */ 6, PIPEDIR_INOUT, 0, 0, CE_ATTR_FLAGS, 0,},
281 /* CE7 used only by Host */
282 { /* CE7 */ 7, PIPEDIR_INOUT_H2H, 0, 0, 0, 0,},
283 /* CE8 used only by IPA */
284 { /* CE8 */ 8, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}
285};
286#endif
287
288static struct CE_attr *host_ce_config = host_ce_config_wlan;
289static struct CE_pipe_config *target_ce_config = target_ce_config_wlan;
290static int target_ce_config_sz = sizeof(target_ce_config_wlan);
291#endif /* __HIF_PCI_INTERNAL_H__ */