1 /*
2 * Copyright (c) 2012-2015,2017 Qualcomm Atheros, Inc.
3 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 #include <linux/types.h>
19 #include <linux/errno.h>
20 #include <linux/fs.h>
21 #include <linux/seq_file.h>
22 #include "wmi.h"
23 #include "wil6210.h"
24 #include "txrx.h"
25 #include "pmc.h"
26
27 struct desc_alloc_info {
28 dma_addr_t pa;
29 void *va;
30 };
31
wil_is_pmc_allocated(struct pmc_ctx * pmc)32 static int wil_is_pmc_allocated(struct pmc_ctx *pmc)
33 {
34 return !!pmc->pring_va;
35 }
36
wil_pmc_init(struct wil6210_priv * wil)37 void wil_pmc_init(struct wil6210_priv *wil)
38 {
39 memset(&wil->pmc, 0, sizeof(struct pmc_ctx));
40 mutex_init(&wil->pmc.lock);
41 }
42
43 /**
44 * Allocate the physical ring (p-ring) and the required
45 * number of descriptors of required size.
46 * Initialize the descriptors as required by pmc dma.
47 * The descriptors' buffers dwords are initialized to hold
48 * dword's serial number in the lsw and reserved value
49 * PCM_DATA_INVALID_DW_VAL in the msw.
50 */
wil_pmc_alloc(struct wil6210_priv * wil,int num_descriptors,int descriptor_size)51 void wil_pmc_alloc(struct wil6210_priv *wil,
52 int num_descriptors,
53 int descriptor_size)
54 {
55 u32 i;
56 struct pmc_ctx *pmc = &wil->pmc;
57 struct device *dev = wil_to_dev(wil);
58 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev);
59 struct wmi_pmc_cmd pmc_cmd = {0};
60 int last_cmd_err = -ENOMEM;
61
62 mutex_lock(&pmc->lock);
63
64 if (wil_is_pmc_allocated(pmc)) {
65 /* sanity check */
66 wil_err(wil, "ERROR pmc is already allocated\n");
67 goto no_release_err;
68 }
69 if ((num_descriptors <= 0) || (descriptor_size <= 0)) {
70 wil_err(wil,
71 "Invalid params num_descriptors(%d), descriptor_size(%d)\n",
72 num_descriptors, descriptor_size);
73 last_cmd_err = -EINVAL;
74 goto no_release_err;
75 }
76
77 if (num_descriptors > (1 << WIL_RING_SIZE_ORDER_MAX)) {
78 wil_err(wil,
79 "num_descriptors(%d) exceeds max ring size %d\n",
80 num_descriptors, 1 << WIL_RING_SIZE_ORDER_MAX);
81 last_cmd_err = -EINVAL;
82 goto no_release_err;
83 }
84
85 if (num_descriptors > INT_MAX / descriptor_size) {
86 wil_err(wil,
87 "Overflow in num_descriptors(%d)*descriptor_size(%d)\n",
88 num_descriptors, descriptor_size);
89 last_cmd_err = -EINVAL;
90 goto no_release_err;
91 }
92
93 pmc->num_descriptors = num_descriptors;
94 pmc->descriptor_size = descriptor_size;
95
96 wil_dbg_misc(wil, "pmc_alloc: %d descriptors x %d bytes each\n",
97 num_descriptors, descriptor_size);
98
99 /* allocate descriptors info list in pmc context*/
100 pmc->descriptors = kcalloc(num_descriptors,
101 sizeof(struct desc_alloc_info),
102 GFP_KERNEL);
103 if (!pmc->descriptors) {
104 wil_err(wil, "ERROR allocating pmc skb list\n");
105 goto no_release_err;
106 }
107
108 wil_dbg_misc(wil, "pmc_alloc: allocated descriptors info list %p\n",
109 pmc->descriptors);
110
111 /* Allocate pring buffer and descriptors.
112 * vring->va should be aligned on its size rounded up to power of 2
113 * This is granted by the dma_alloc_coherent.
114 *
115 * HW has limitation that all vrings addresses must share the same
116 * upper 16 msb bits part of 48 bits address. To workaround that,
117 * if we are using more than 32 bit addresses switch to 32 bit
118 * allocation before allocating vring memory.
119 *
120 * There's no check for the return value of dma_set_mask_and_coherent,
121 * since we assume if we were able to set the mask during
122 * initialization in this system it will not fail if we set it again
123 */
124 if (wil->dma_addr_size > 32)
125 dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
126
127 pmc->pring_va = dma_alloc_coherent(dev,
128 sizeof(struct vring_tx_desc) * num_descriptors,
129 &pmc->pring_pa,
130 GFP_KERNEL);
131
132 if (wil->dma_addr_size > 32)
133 dma_set_mask_and_coherent(dev,
134 DMA_BIT_MASK(wil->dma_addr_size));
135
136 wil_dbg_misc(wil,
137 "pmc_alloc: allocated pring %p => %pad. %zd x %d = total %zd bytes\n",
138 pmc->pring_va, &pmc->pring_pa,
139 sizeof(struct vring_tx_desc),
140 num_descriptors,
141 sizeof(struct vring_tx_desc) * num_descriptors);
142
143 if (!pmc->pring_va) {
144 wil_err(wil, "ERROR allocating pmc pring\n");
145 goto release_pmc_skb_list;
146 }
147
148 /* initially, all descriptors are SW owned
149 * For Tx, Rx, and PMC, ownership bit is at the same location, thus
150 * we can use any
151 */
152 for (i = 0; i < num_descriptors; i++) {
153 struct vring_tx_desc *_d = &pmc->pring_va[i];
154 struct vring_tx_desc dd = {}, *d = ⅆ
155 int j = 0;
156
157 pmc->descriptors[i].va = dma_alloc_coherent(dev,
158 descriptor_size,
159 &pmc->descriptors[i].pa,
160 GFP_KERNEL);
161
162 if (unlikely(!pmc->descriptors[i].va)) {
163 wil_err(wil, "ERROR allocating pmc descriptor %d", i);
164 goto release_pmc_skbs;
165 }
166
167 for (j = 0; j < descriptor_size / sizeof(u32); j++) {
168 u32 *p = (u32 *)pmc->descriptors[i].va + j;
169 *p = PCM_DATA_INVALID_DW_VAL | j;
170 }
171
172 /* configure dma descriptor */
173 d->dma.addr.addr_low =
174 cpu_to_le32(lower_32_bits(pmc->descriptors[i].pa));
175 d->dma.addr.addr_high =
176 cpu_to_le16((u16)upper_32_bits(pmc->descriptors[i].pa));
177 d->dma.status = 0; /* 0 = HW_OWNED */
178 d->dma.length = cpu_to_le16(descriptor_size);
179 d->dma.d0 = BIT(9) | RX_DMA_D0_CMD_DMA_IT;
180 *_d = *d;
181 }
182
183 wil_dbg_misc(wil, "pmc_alloc: allocated successfully\n");
184
185 pmc_cmd.op = WMI_PMC_ALLOCATE;
186 pmc_cmd.ring_size = cpu_to_le16(pmc->num_descriptors);
187 pmc_cmd.mem_base = cpu_to_le64(pmc->pring_pa);
188
189 wil_dbg_misc(wil, "pmc_alloc: send WMI_PMC_CMD with ALLOCATE op\n");
190 pmc->last_cmd_status = wmi_send(wil,
191 WMI_PMC_CMDID,
192 vif->mid,
193 &pmc_cmd,
194 sizeof(pmc_cmd));
195 if (pmc->last_cmd_status) {
196 wil_err(wil,
197 "WMI_PMC_CMD with ALLOCATE op failed with status %d",
198 pmc->last_cmd_status);
199 goto release_pmc_skbs;
200 }
201
202 mutex_unlock(&pmc->lock);
203
204 return;
205
206 release_pmc_skbs:
207 wil_err(wil, "exit on error: Releasing skbs...\n");
208 for (i = 0; i < num_descriptors && pmc->descriptors[i].va; i++) {
209 dma_free_coherent(dev,
210 descriptor_size,
211 pmc->descriptors[i].va,
212 pmc->descriptors[i].pa);
213
214 pmc->descriptors[i].va = NULL;
215 }
216 wil_err(wil, "exit on error: Releasing pring...\n");
217
218 dma_free_coherent(dev,
219 sizeof(struct vring_tx_desc) * num_descriptors,
220 pmc->pring_va,
221 pmc->pring_pa);
222
223 pmc->pring_va = NULL;
224
225 release_pmc_skb_list:
226 wil_err(wil, "exit on error: Releasing descriptors info list...\n");
227 kfree(pmc->descriptors);
228 pmc->descriptors = NULL;
229
230 no_release_err:
231 pmc->last_cmd_status = last_cmd_err;
232 mutex_unlock(&pmc->lock);
233 }
234
235 /**
236 * Traverse the p-ring and release all buffers.
237 * At the end release the p-ring memory
238 */
wil_pmc_free(struct wil6210_priv * wil,int send_pmc_cmd)239 void wil_pmc_free(struct wil6210_priv *wil, int send_pmc_cmd)
240 {
241 struct pmc_ctx *pmc = &wil->pmc;
242 struct device *dev = wil_to_dev(wil);
243 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev);
244 struct wmi_pmc_cmd pmc_cmd = {0};
245
246 mutex_lock(&pmc->lock);
247
248 pmc->last_cmd_status = 0;
249
250 if (!wil_is_pmc_allocated(pmc)) {
251 wil_dbg_misc(wil,
252 "pmc_free: Error, can't free - not allocated\n");
253 pmc->last_cmd_status = -EPERM;
254 mutex_unlock(&pmc->lock);
255 return;
256 }
257
258 if (send_pmc_cmd) {
259 wil_dbg_misc(wil, "send WMI_PMC_CMD with RELEASE op\n");
260 pmc_cmd.op = WMI_PMC_RELEASE;
261 pmc->last_cmd_status =
262 wmi_send(wil, WMI_PMC_CMDID, vif->mid,
263 &pmc_cmd, sizeof(pmc_cmd));
264 if (pmc->last_cmd_status) {
265 wil_err(wil,
266 "WMI_PMC_CMD with RELEASE op failed, status %d",
267 pmc->last_cmd_status);
268 /* There's nothing we can do with this error.
269 * Normally, it should never occur.
270 * Continue to freeing all memory allocated for pmc.
271 */
272 }
273 }
274
275 if (pmc->pring_va) {
276 size_t buf_size = sizeof(struct vring_tx_desc) *
277 pmc->num_descriptors;
278
279 wil_dbg_misc(wil, "pmc_free: free pring va %p\n",
280 pmc->pring_va);
281 dma_free_coherent(dev, buf_size, pmc->pring_va, pmc->pring_pa);
282
283 pmc->pring_va = NULL;
284 } else {
285 pmc->last_cmd_status = -ENOENT;
286 }
287
288 if (pmc->descriptors) {
289 int i;
290
291 for (i = 0;
292 i < pmc->num_descriptors && pmc->descriptors[i].va; i++) {
293 dma_free_coherent(dev,
294 pmc->descriptor_size,
295 pmc->descriptors[i].va,
296 pmc->descriptors[i].pa);
297 pmc->descriptors[i].va = NULL;
298 }
299 wil_dbg_misc(wil, "pmc_free: free descriptor info %d/%d\n", i,
300 pmc->num_descriptors);
301 wil_dbg_misc(wil,
302 "pmc_free: free pmc descriptors info list %p\n",
303 pmc->descriptors);
304 kfree(pmc->descriptors);
305 pmc->descriptors = NULL;
306 } else {
307 pmc->last_cmd_status = -ENOENT;
308 }
309
310 mutex_unlock(&pmc->lock);
311 }
312
313 /**
314 * Status of the last operation requested via debugfs: alloc/free/read.
315 * 0 - success or negative errno
316 */
wil_pmc_last_cmd_status(struct wil6210_priv * wil)317 int wil_pmc_last_cmd_status(struct wil6210_priv *wil)
318 {
319 wil_dbg_misc(wil, "pmc_last_cmd_status: status %d\n",
320 wil->pmc.last_cmd_status);
321
322 return wil->pmc.last_cmd_status;
323 }
324
325 /**
326 * Read from required position up to the end of current descriptor,
327 * depends on descriptor size configured during alloc request.
328 */
wil_pmc_read(struct file * filp,char __user * buf,size_t count,loff_t * f_pos)329 ssize_t wil_pmc_read(struct file *filp, char __user *buf, size_t count,
330 loff_t *f_pos)
331 {
332 struct wil6210_priv *wil = filp->private_data;
333 struct pmc_ctx *pmc = &wil->pmc;
334 size_t retval = 0;
335 unsigned long long idx;
336 loff_t offset;
337 size_t pmc_size;
338
339 mutex_lock(&pmc->lock);
340
341 if (!wil_is_pmc_allocated(pmc)) {
342 wil_err(wil, "error, pmc is not allocated!\n");
343 pmc->last_cmd_status = -EPERM;
344 mutex_unlock(&pmc->lock);
345 return -EPERM;
346 }
347
348 pmc_size = pmc->descriptor_size * pmc->num_descriptors;
349
350 wil_dbg_misc(wil,
351 "pmc_read: size %u, pos %lld\n",
352 (u32)count, *f_pos);
353
354 pmc->last_cmd_status = 0;
355
356 idx = *f_pos;
357 do_div(idx, pmc->descriptor_size);
358 offset = *f_pos - (idx * pmc->descriptor_size);
359
360 if (*f_pos >= pmc_size) {
361 wil_dbg_misc(wil,
362 "pmc_read: reached end of pmc buf: %lld >= %u\n",
363 *f_pos, (u32)pmc_size);
364 pmc->last_cmd_status = -ERANGE;
365 goto out;
366 }
367
368 wil_dbg_misc(wil,
369 "pmc_read: read from pos %lld (descriptor %llu, offset %llu) %zu bytes\n",
370 *f_pos, idx, offset, count);
371
372 /* if no errors, return the copied byte count */
373 retval = simple_read_from_buffer(buf,
374 count,
375 &offset,
376 pmc->descriptors[idx].va,
377 pmc->descriptor_size);
378 *f_pos += retval;
379 out:
380 mutex_unlock(&pmc->lock);
381
382 return retval;
383 }
384
wil_pmc_llseek(struct file * filp,loff_t off,int whence)385 loff_t wil_pmc_llseek(struct file *filp, loff_t off, int whence)
386 {
387 loff_t newpos;
388 struct wil6210_priv *wil = filp->private_data;
389 struct pmc_ctx *pmc = &wil->pmc;
390 size_t pmc_size;
391
392 mutex_lock(&pmc->lock);
393
394 if (!wil_is_pmc_allocated(pmc)) {
395 wil_err(wil, "error, pmc is not allocated!\n");
396 pmc->last_cmd_status = -EPERM;
397 mutex_unlock(&pmc->lock);
398 return -EPERM;
399 }
400
401 pmc_size = pmc->descriptor_size * pmc->num_descriptors;
402
403 switch (whence) {
404 case 0: /* SEEK_SET */
405 newpos = off;
406 break;
407
408 case 1: /* SEEK_CUR */
409 newpos = filp->f_pos + off;
410 break;
411
412 case 2: /* SEEK_END */
413 newpos = pmc_size;
414 break;
415
416 default: /* can't happen */
417 newpos = -EINVAL;
418 goto out;
419 }
420
421 if (newpos < 0) {
422 newpos = -EINVAL;
423 goto out;
424 }
425 if (newpos > pmc_size)
426 newpos = pmc_size;
427
428 filp->f_pos = newpos;
429
430 out:
431 mutex_unlock(&pmc->lock);
432
433 return newpos;
434 }
435
wil_pmcring_read(struct seq_file * s,void * data)436 int wil_pmcring_read(struct seq_file *s, void *data)
437 {
438 struct wil6210_priv *wil = s->private;
439 struct pmc_ctx *pmc = &wil->pmc;
440 size_t pmc_ring_size =
441 sizeof(struct vring_rx_desc) * pmc->num_descriptors;
442
443 mutex_lock(&pmc->lock);
444
445 if (!wil_is_pmc_allocated(pmc)) {
446 wil_err(wil, "error, pmc is not allocated!\n");
447 pmc->last_cmd_status = -EPERM;
448 mutex_unlock(&pmc->lock);
449 return -EPERM;
450 }
451
452 wil_dbg_misc(wil, "pmcring_read: size %zu\n", pmc_ring_size);
453
454 seq_write(s, pmc->pring_va, pmc_ring_size);
455
456 mutex_unlock(&pmc->lock);
457
458 return 0;
459 }
460