1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell OcteonTX CPT driver
3 *
4 * Copyright (C) 2019 Marvell International Ltd.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11 #include <linux/interrupt.h>
12 #include <linux/module.h>
13 #include "otx_cptvf.h"
14 #include "otx_cptvf_algs.h"
15 #include "otx_cptvf_reqmgr.h"
16
17 #define DRV_NAME "octeontx-cptvf"
18 #define DRV_VERSION "1.0"
19
vq_work_handler(unsigned long data)20 static void vq_work_handler(unsigned long data)
21 {
22 struct otx_cptvf_wqe_info *cwqe_info =
23 (struct otx_cptvf_wqe_info *) data;
24
25 otx_cpt_post_process(&cwqe_info->vq_wqe[0]);
26 }
27
init_worker_threads(struct otx_cptvf * cptvf)28 static int init_worker_threads(struct otx_cptvf *cptvf)
29 {
30 struct pci_dev *pdev = cptvf->pdev;
31 struct otx_cptvf_wqe_info *cwqe_info;
32 int i;
33
34 cwqe_info = kzalloc(sizeof(*cwqe_info), GFP_KERNEL);
35 if (!cwqe_info)
36 return -ENOMEM;
37
38 if (cptvf->num_queues) {
39 dev_dbg(&pdev->dev, "Creating VQ worker threads (%d)\n",
40 cptvf->num_queues);
41 }
42
43 for (i = 0; i < cptvf->num_queues; i++) {
44 tasklet_init(&cwqe_info->vq_wqe[i].twork, vq_work_handler,
45 (u64)cwqe_info);
46 cwqe_info->vq_wqe[i].cptvf = cptvf;
47 }
48 cptvf->wqe_info = cwqe_info;
49
50 return 0;
51 }
52
cleanup_worker_threads(struct otx_cptvf * cptvf)53 static void cleanup_worker_threads(struct otx_cptvf *cptvf)
54 {
55 struct pci_dev *pdev = cptvf->pdev;
56 struct otx_cptvf_wqe_info *cwqe_info;
57 int i;
58
59 cwqe_info = (struct otx_cptvf_wqe_info *)cptvf->wqe_info;
60 if (!cwqe_info)
61 return;
62
63 if (cptvf->num_queues) {
64 dev_dbg(&pdev->dev, "Cleaning VQ worker threads (%u)\n",
65 cptvf->num_queues);
66 }
67
68 for (i = 0; i < cptvf->num_queues; i++)
69 tasklet_kill(&cwqe_info->vq_wqe[i].twork);
70
71 kfree_sensitive(cwqe_info);
72 cptvf->wqe_info = NULL;
73 }
74
free_pending_queues(struct otx_cpt_pending_qinfo * pqinfo)75 static void free_pending_queues(struct otx_cpt_pending_qinfo *pqinfo)
76 {
77 struct otx_cpt_pending_queue *queue;
78 int i;
79
80 for_each_pending_queue(pqinfo, queue, i) {
81 if (!queue->head)
82 continue;
83
84 /* free single queue */
85 kfree_sensitive((queue->head));
86 queue->front = 0;
87 queue->rear = 0;
88 queue->qlen = 0;
89 }
90 pqinfo->num_queues = 0;
91 }
92
alloc_pending_queues(struct otx_cpt_pending_qinfo * pqinfo,u32 qlen,u32 num_queues)93 static int alloc_pending_queues(struct otx_cpt_pending_qinfo *pqinfo, u32 qlen,
94 u32 num_queues)
95 {
96 struct otx_cpt_pending_queue *queue = NULL;
97 int ret;
98 u32 i;
99
100 pqinfo->num_queues = num_queues;
101
102 for_each_pending_queue(pqinfo, queue, i) {
103 queue->head = kcalloc(qlen, sizeof(*queue->head), GFP_KERNEL);
104 if (!queue->head) {
105 ret = -ENOMEM;
106 goto pending_qfail;
107 }
108
109 queue->pending_count = 0;
110 queue->front = 0;
111 queue->rear = 0;
112 queue->qlen = qlen;
113
114 /* init queue spin lock */
115 spin_lock_init(&queue->lock);
116 }
117 return 0;
118
119 pending_qfail:
120 free_pending_queues(pqinfo);
121
122 return ret;
123 }
124
init_pending_queues(struct otx_cptvf * cptvf,u32 qlen,u32 num_queues)125 static int init_pending_queues(struct otx_cptvf *cptvf, u32 qlen,
126 u32 num_queues)
127 {
128 struct pci_dev *pdev = cptvf->pdev;
129 int ret;
130
131 if (!num_queues)
132 return 0;
133
134 ret = alloc_pending_queues(&cptvf->pqinfo, qlen, num_queues);
135 if (ret) {
136 dev_err(&pdev->dev, "Failed to setup pending queues (%u)\n",
137 num_queues);
138 return ret;
139 }
140 return 0;
141 }
142
cleanup_pending_queues(struct otx_cptvf * cptvf)143 static void cleanup_pending_queues(struct otx_cptvf *cptvf)
144 {
145 struct pci_dev *pdev = cptvf->pdev;
146
147 if (!cptvf->num_queues)
148 return;
149
150 dev_dbg(&pdev->dev, "Cleaning VQ pending queue (%u)\n",
151 cptvf->num_queues);
152 free_pending_queues(&cptvf->pqinfo);
153 }
154
free_command_queues(struct otx_cptvf * cptvf,struct otx_cpt_cmd_qinfo * cqinfo)155 static void free_command_queues(struct otx_cptvf *cptvf,
156 struct otx_cpt_cmd_qinfo *cqinfo)
157 {
158 struct otx_cpt_cmd_queue *queue = NULL;
159 struct otx_cpt_cmd_chunk *chunk = NULL;
160 struct pci_dev *pdev = cptvf->pdev;
161 int i;
162
163 /* clean up for each queue */
164 for (i = 0; i < cptvf->num_queues; i++) {
165 queue = &cqinfo->queue[i];
166
167 while (!list_empty(&cqinfo->queue[i].chead)) {
168 chunk = list_first_entry(&cqinfo->queue[i].chead,
169 struct otx_cpt_cmd_chunk, nextchunk);
170
171 dma_free_coherent(&pdev->dev, chunk->size,
172 chunk->head,
173 chunk->dma_addr);
174 chunk->head = NULL;
175 chunk->dma_addr = 0;
176 list_del(&chunk->nextchunk);
177 kfree_sensitive(chunk);
178 }
179 queue->num_chunks = 0;
180 queue->idx = 0;
181
182 }
183 }
184
alloc_command_queues(struct otx_cptvf * cptvf,struct otx_cpt_cmd_qinfo * cqinfo,u32 qlen)185 static int alloc_command_queues(struct otx_cptvf *cptvf,
186 struct otx_cpt_cmd_qinfo *cqinfo,
187 u32 qlen)
188 {
189 struct otx_cpt_cmd_chunk *curr, *first, *last;
190 struct otx_cpt_cmd_queue *queue = NULL;
191 struct pci_dev *pdev = cptvf->pdev;
192 size_t q_size, c_size, rem_q_size;
193 u32 qcsize_bytes;
194 int i;
195
196
197 /* Qsize in dwords, needed for SADDR config, 1-next chunk pointer */
198 cptvf->qsize = min(qlen, cqinfo->qchunksize) *
199 OTX_CPT_NEXT_CHUNK_PTR_SIZE + 1;
200 /* Qsize in bytes to create space for alignment */
201 q_size = qlen * OTX_CPT_INST_SIZE;
202
203 qcsize_bytes = cqinfo->qchunksize * OTX_CPT_INST_SIZE;
204
205 /* per queue initialization */
206 for (i = 0; i < cptvf->num_queues; i++) {
207 rem_q_size = q_size;
208 first = NULL;
209 last = NULL;
210
211 queue = &cqinfo->queue[i];
212 INIT_LIST_HEAD(&queue->chead);
213 do {
214 curr = kzalloc(sizeof(*curr), GFP_KERNEL);
215 if (!curr)
216 goto cmd_qfail;
217
218 c_size = (rem_q_size > qcsize_bytes) ? qcsize_bytes :
219 rem_q_size;
220 curr->head = dma_alloc_coherent(&pdev->dev,
221 c_size + OTX_CPT_NEXT_CHUNK_PTR_SIZE,
222 &curr->dma_addr, GFP_KERNEL);
223 if (!curr->head) {
224 dev_err(&pdev->dev,
225 "Command Q (%d) chunk (%d) allocation failed\n",
226 i, queue->num_chunks);
227 goto free_curr;
228 }
229 curr->size = c_size;
230
231 if (queue->num_chunks == 0) {
232 first = curr;
233 queue->base = first;
234 }
235 list_add_tail(&curr->nextchunk,
236 &cqinfo->queue[i].chead);
237
238 queue->num_chunks++;
239 rem_q_size -= c_size;
240 if (last)
241 *((u64 *)(&last->head[last->size])) =
242 (u64)curr->dma_addr;
243
244 last = curr;
245 } while (rem_q_size);
246
247 /*
248 * Make the queue circular, tie back last chunk entry to head
249 */
250 curr = first;
251 *((u64 *)(&last->head[last->size])) = (u64)curr->dma_addr;
252 queue->qhead = curr;
253 }
254 return 0;
255 free_curr:
256 kfree(curr);
257 cmd_qfail:
258 free_command_queues(cptvf, cqinfo);
259 return -ENOMEM;
260 }
261
init_command_queues(struct otx_cptvf * cptvf,u32 qlen)262 static int init_command_queues(struct otx_cptvf *cptvf, u32 qlen)
263 {
264 struct pci_dev *pdev = cptvf->pdev;
265 int ret;
266
267 /* setup command queues */
268 ret = alloc_command_queues(cptvf, &cptvf->cqinfo, qlen);
269 if (ret) {
270 dev_err(&pdev->dev, "Failed to allocate command queues (%u)\n",
271 cptvf->num_queues);
272 return ret;
273 }
274 return ret;
275 }
276
cleanup_command_queues(struct otx_cptvf * cptvf)277 static void cleanup_command_queues(struct otx_cptvf *cptvf)
278 {
279 struct pci_dev *pdev = cptvf->pdev;
280
281 if (!cptvf->num_queues)
282 return;
283
284 dev_dbg(&pdev->dev, "Cleaning VQ command queue (%u)\n",
285 cptvf->num_queues);
286 free_command_queues(cptvf, &cptvf->cqinfo);
287 }
288
cptvf_sw_cleanup(struct otx_cptvf * cptvf)289 static void cptvf_sw_cleanup(struct otx_cptvf *cptvf)
290 {
291 cleanup_worker_threads(cptvf);
292 cleanup_pending_queues(cptvf);
293 cleanup_command_queues(cptvf);
294 }
295
cptvf_sw_init(struct otx_cptvf * cptvf,u32 qlen,u32 num_queues)296 static int cptvf_sw_init(struct otx_cptvf *cptvf, u32 qlen, u32 num_queues)
297 {
298 struct pci_dev *pdev = cptvf->pdev;
299 u32 max_dev_queues = 0;
300 int ret;
301
302 max_dev_queues = OTX_CPT_NUM_QS_PER_VF;
303 /* possible cpus */
304 num_queues = min_t(u32, num_queues, max_dev_queues);
305 cptvf->num_queues = num_queues;
306
307 ret = init_command_queues(cptvf, qlen);
308 if (ret) {
309 dev_err(&pdev->dev, "Failed to setup command queues (%u)\n",
310 num_queues);
311 return ret;
312 }
313
314 ret = init_pending_queues(cptvf, qlen, num_queues);
315 if (ret) {
316 dev_err(&pdev->dev, "Failed to setup pending queues (%u)\n",
317 num_queues);
318 goto setup_pqfail;
319 }
320
321 /* Create worker threads for BH processing */
322 ret = init_worker_threads(cptvf);
323 if (ret) {
324 dev_err(&pdev->dev, "Failed to setup worker threads\n");
325 goto init_work_fail;
326 }
327 return 0;
328
329 init_work_fail:
330 cleanup_worker_threads(cptvf);
331 cleanup_pending_queues(cptvf);
332
333 setup_pqfail:
334 cleanup_command_queues(cptvf);
335
336 return ret;
337 }
338
cptvf_free_irq_affinity(struct otx_cptvf * cptvf,int vec)339 static void cptvf_free_irq_affinity(struct otx_cptvf *cptvf, int vec)
340 {
341 irq_set_affinity_hint(pci_irq_vector(cptvf->pdev, vec), NULL);
342 free_cpumask_var(cptvf->affinity_mask[vec]);
343 }
344
cptvf_write_vq_ctl(struct otx_cptvf * cptvf,bool val)345 static void cptvf_write_vq_ctl(struct otx_cptvf *cptvf, bool val)
346 {
347 union otx_cptx_vqx_ctl vqx_ctl;
348
349 vqx_ctl.u = readq(cptvf->reg_base + OTX_CPT_VQX_CTL(0));
350 vqx_ctl.s.ena = val;
351 writeq(vqx_ctl.u, cptvf->reg_base + OTX_CPT_VQX_CTL(0));
352 }
353
otx_cptvf_write_vq_doorbell(struct otx_cptvf * cptvf,u32 val)354 void otx_cptvf_write_vq_doorbell(struct otx_cptvf *cptvf, u32 val)
355 {
356 union otx_cptx_vqx_doorbell vqx_dbell;
357
358 vqx_dbell.u = readq(cptvf->reg_base + OTX_CPT_VQX_DOORBELL(0));
359 vqx_dbell.s.dbell_cnt = val * 8; /* Num of Instructions * 8 words */
360 writeq(vqx_dbell.u, cptvf->reg_base + OTX_CPT_VQX_DOORBELL(0));
361 }
362
cptvf_write_vq_inprog(struct otx_cptvf * cptvf,u8 val)363 static void cptvf_write_vq_inprog(struct otx_cptvf *cptvf, u8 val)
364 {
365 union otx_cptx_vqx_inprog vqx_inprg;
366
367 vqx_inprg.u = readq(cptvf->reg_base + OTX_CPT_VQX_INPROG(0));
368 vqx_inprg.s.inflight = val;
369 writeq(vqx_inprg.u, cptvf->reg_base + OTX_CPT_VQX_INPROG(0));
370 }
371
cptvf_write_vq_done_numwait(struct otx_cptvf * cptvf,u32 val)372 static void cptvf_write_vq_done_numwait(struct otx_cptvf *cptvf, u32 val)
373 {
374 union otx_cptx_vqx_done_wait vqx_dwait;
375
376 vqx_dwait.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE_WAIT(0));
377 vqx_dwait.s.num_wait = val;
378 writeq(vqx_dwait.u, cptvf->reg_base + OTX_CPT_VQX_DONE_WAIT(0));
379 }
380
cptvf_read_vq_done_numwait(struct otx_cptvf * cptvf)381 static u32 cptvf_read_vq_done_numwait(struct otx_cptvf *cptvf)
382 {
383 union otx_cptx_vqx_done_wait vqx_dwait;
384
385 vqx_dwait.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE_WAIT(0));
386 return vqx_dwait.s.num_wait;
387 }
388
cptvf_write_vq_done_timewait(struct otx_cptvf * cptvf,u16 time)389 static void cptvf_write_vq_done_timewait(struct otx_cptvf *cptvf, u16 time)
390 {
391 union otx_cptx_vqx_done_wait vqx_dwait;
392
393 vqx_dwait.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE_WAIT(0));
394 vqx_dwait.s.time_wait = time;
395 writeq(vqx_dwait.u, cptvf->reg_base + OTX_CPT_VQX_DONE_WAIT(0));
396 }
397
398
cptvf_read_vq_done_timewait(struct otx_cptvf * cptvf)399 static u16 cptvf_read_vq_done_timewait(struct otx_cptvf *cptvf)
400 {
401 union otx_cptx_vqx_done_wait vqx_dwait;
402
403 vqx_dwait.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE_WAIT(0));
404 return vqx_dwait.s.time_wait;
405 }
406
cptvf_enable_swerr_interrupts(struct otx_cptvf * cptvf)407 static void cptvf_enable_swerr_interrupts(struct otx_cptvf *cptvf)
408 {
409 union otx_cptx_vqx_misc_ena_w1s vqx_misc_ena;
410
411 vqx_misc_ena.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_ENA_W1S(0));
412 /* Enable SWERR interrupts for the requested VF */
413 vqx_misc_ena.s.swerr = 1;
414 writeq(vqx_misc_ena.u, cptvf->reg_base + OTX_CPT_VQX_MISC_ENA_W1S(0));
415 }
416
cptvf_enable_mbox_interrupts(struct otx_cptvf * cptvf)417 static void cptvf_enable_mbox_interrupts(struct otx_cptvf *cptvf)
418 {
419 union otx_cptx_vqx_misc_ena_w1s vqx_misc_ena;
420
421 vqx_misc_ena.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_ENA_W1S(0));
422 /* Enable MBOX interrupt for the requested VF */
423 vqx_misc_ena.s.mbox = 1;
424 writeq(vqx_misc_ena.u, cptvf->reg_base + OTX_CPT_VQX_MISC_ENA_W1S(0));
425 }
426
cptvf_enable_done_interrupts(struct otx_cptvf * cptvf)427 static void cptvf_enable_done_interrupts(struct otx_cptvf *cptvf)
428 {
429 union otx_cptx_vqx_done_ena_w1s vqx_done_ena;
430
431 vqx_done_ena.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE_ENA_W1S(0));
432 /* Enable DONE interrupt for the requested VF */
433 vqx_done_ena.s.done = 1;
434 writeq(vqx_done_ena.u, cptvf->reg_base + OTX_CPT_VQX_DONE_ENA_W1S(0));
435 }
436
cptvf_clear_dovf_intr(struct otx_cptvf * cptvf)437 static void cptvf_clear_dovf_intr(struct otx_cptvf *cptvf)
438 {
439 union otx_cptx_vqx_misc_int vqx_misc_int;
440
441 vqx_misc_int.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
442 /* W1C for the VF */
443 vqx_misc_int.s.dovf = 1;
444 writeq(vqx_misc_int.u, cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
445 }
446
cptvf_clear_irde_intr(struct otx_cptvf * cptvf)447 static void cptvf_clear_irde_intr(struct otx_cptvf *cptvf)
448 {
449 union otx_cptx_vqx_misc_int vqx_misc_int;
450
451 vqx_misc_int.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
452 /* W1C for the VF */
453 vqx_misc_int.s.irde = 1;
454 writeq(vqx_misc_int.u, cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
455 }
456
cptvf_clear_nwrp_intr(struct otx_cptvf * cptvf)457 static void cptvf_clear_nwrp_intr(struct otx_cptvf *cptvf)
458 {
459 union otx_cptx_vqx_misc_int vqx_misc_int;
460
461 vqx_misc_int.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
462 /* W1C for the VF */
463 vqx_misc_int.s.nwrp = 1;
464 writeq(vqx_misc_int.u, cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
465 }
466
cptvf_clear_mbox_intr(struct otx_cptvf * cptvf)467 static void cptvf_clear_mbox_intr(struct otx_cptvf *cptvf)
468 {
469 union otx_cptx_vqx_misc_int vqx_misc_int;
470
471 vqx_misc_int.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
472 /* W1C for the VF */
473 vqx_misc_int.s.mbox = 1;
474 writeq(vqx_misc_int.u, cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
475 }
476
cptvf_clear_swerr_intr(struct otx_cptvf * cptvf)477 static void cptvf_clear_swerr_intr(struct otx_cptvf *cptvf)
478 {
479 union otx_cptx_vqx_misc_int vqx_misc_int;
480
481 vqx_misc_int.u = readq(cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
482 /* W1C for the VF */
483 vqx_misc_int.s.swerr = 1;
484 writeq(vqx_misc_int.u, cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
485 }
486
cptvf_read_vf_misc_intr_status(struct otx_cptvf * cptvf)487 static u64 cptvf_read_vf_misc_intr_status(struct otx_cptvf *cptvf)
488 {
489 return readq(cptvf->reg_base + OTX_CPT_VQX_MISC_INT(0));
490 }
491
cptvf_misc_intr_handler(int __always_unused irq,void * arg)492 static irqreturn_t cptvf_misc_intr_handler(int __always_unused irq,
493 void *arg)
494 {
495 struct otx_cptvf *cptvf = arg;
496 struct pci_dev *pdev = cptvf->pdev;
497 u64 intr;
498
499 intr = cptvf_read_vf_misc_intr_status(cptvf);
500 /* Check for MISC interrupt types */
501 if (likely(intr & OTX_CPT_VF_INTR_MBOX_MASK)) {
502 dev_dbg(&pdev->dev, "Mailbox interrupt 0x%llx on CPT VF %d\n",
503 intr, cptvf->vfid);
504 otx_cptvf_handle_mbox_intr(cptvf);
505 cptvf_clear_mbox_intr(cptvf);
506 } else if (unlikely(intr & OTX_CPT_VF_INTR_DOVF_MASK)) {
507 cptvf_clear_dovf_intr(cptvf);
508 /* Clear doorbell count */
509 otx_cptvf_write_vq_doorbell(cptvf, 0);
510 dev_err(&pdev->dev,
511 "Doorbell overflow error interrupt 0x%llx on CPT VF %d\n",
512 intr, cptvf->vfid);
513 } else if (unlikely(intr & OTX_CPT_VF_INTR_IRDE_MASK)) {
514 cptvf_clear_irde_intr(cptvf);
515 dev_err(&pdev->dev,
516 "Instruction NCB read error interrupt 0x%llx on CPT VF %d\n",
517 intr, cptvf->vfid);
518 } else if (unlikely(intr & OTX_CPT_VF_INTR_NWRP_MASK)) {
519 cptvf_clear_nwrp_intr(cptvf);
520 dev_err(&pdev->dev,
521 "NCB response write error interrupt 0x%llx on CPT VF %d\n",
522 intr, cptvf->vfid);
523 } else if (unlikely(intr & OTX_CPT_VF_INTR_SERR_MASK)) {
524 cptvf_clear_swerr_intr(cptvf);
525 dev_err(&pdev->dev,
526 "Software error interrupt 0x%llx on CPT VF %d\n",
527 intr, cptvf->vfid);
528 } else {
529 dev_err(&pdev->dev, "Unhandled interrupt in OTX_CPT VF %d\n",
530 cptvf->vfid);
531 }
532
533 return IRQ_HANDLED;
534 }
535
get_cptvf_vq_wqe(struct otx_cptvf * cptvf,int qno)536 static inline struct otx_cptvf_wqe *get_cptvf_vq_wqe(struct otx_cptvf *cptvf,
537 int qno)
538 {
539 struct otx_cptvf_wqe_info *nwqe_info;
540
541 if (unlikely(qno >= cptvf->num_queues))
542 return NULL;
543 nwqe_info = (struct otx_cptvf_wqe_info *)cptvf->wqe_info;
544
545 return &nwqe_info->vq_wqe[qno];
546 }
547
cptvf_read_vq_done_count(struct otx_cptvf * cptvf)548 static inline u32 cptvf_read_vq_done_count(struct otx_cptvf *cptvf)
549 {
550 union otx_cptx_vqx_done vqx_done;
551
552 vqx_done.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE(0));
553 return vqx_done.s.done;
554 }
555
cptvf_write_vq_done_ack(struct otx_cptvf * cptvf,u32 ackcnt)556 static inline void cptvf_write_vq_done_ack(struct otx_cptvf *cptvf,
557 u32 ackcnt)
558 {
559 union otx_cptx_vqx_done_ack vqx_dack_cnt;
560
561 vqx_dack_cnt.u = readq(cptvf->reg_base + OTX_CPT_VQX_DONE_ACK(0));
562 vqx_dack_cnt.s.done_ack = ackcnt;
563 writeq(vqx_dack_cnt.u, cptvf->reg_base + OTX_CPT_VQX_DONE_ACK(0));
564 }
565
cptvf_done_intr_handler(int __always_unused irq,void * cptvf_dev)566 static irqreturn_t cptvf_done_intr_handler(int __always_unused irq,
567 void *cptvf_dev)
568 {
569 struct otx_cptvf *cptvf = (struct otx_cptvf *)cptvf_dev;
570 struct pci_dev *pdev = cptvf->pdev;
571 /* Read the number of completions */
572 u32 intr = cptvf_read_vq_done_count(cptvf);
573
574 if (intr) {
575 struct otx_cptvf_wqe *wqe;
576
577 /*
578 * Acknowledge the number of scheduled completions for
579 * processing
580 */
581 cptvf_write_vq_done_ack(cptvf, intr);
582 wqe = get_cptvf_vq_wqe(cptvf, 0);
583 if (unlikely(!wqe)) {
584 dev_err(&pdev->dev, "No work to schedule for VF (%d)\n",
585 cptvf->vfid);
586 return IRQ_NONE;
587 }
588 tasklet_hi_schedule(&wqe->twork);
589 }
590
591 return IRQ_HANDLED;
592 }
593
cptvf_set_irq_affinity(struct otx_cptvf * cptvf,int vec)594 static void cptvf_set_irq_affinity(struct otx_cptvf *cptvf, int vec)
595 {
596 struct pci_dev *pdev = cptvf->pdev;
597 int cpu;
598
599 if (!zalloc_cpumask_var(&cptvf->affinity_mask[vec],
600 GFP_KERNEL)) {
601 dev_err(&pdev->dev,
602 "Allocation failed for affinity_mask for VF %d\n",
603 cptvf->vfid);
604 return;
605 }
606
607 cpu = cptvf->vfid % num_online_cpus();
608 cpumask_set_cpu(cpumask_local_spread(cpu, cptvf->node),
609 cptvf->affinity_mask[vec]);
610 irq_set_affinity_hint(pci_irq_vector(pdev, vec),
611 cptvf->affinity_mask[vec]);
612 }
613
cptvf_write_vq_saddr(struct otx_cptvf * cptvf,u64 val)614 static void cptvf_write_vq_saddr(struct otx_cptvf *cptvf, u64 val)
615 {
616 union otx_cptx_vqx_saddr vqx_saddr;
617
618 vqx_saddr.u = val;
619 writeq(vqx_saddr.u, cptvf->reg_base + OTX_CPT_VQX_SADDR(0));
620 }
621
cptvf_device_init(struct otx_cptvf * cptvf)622 static void cptvf_device_init(struct otx_cptvf *cptvf)
623 {
624 u64 base_addr = 0;
625
626 /* Disable the VQ */
627 cptvf_write_vq_ctl(cptvf, 0);
628 /* Reset the doorbell */
629 otx_cptvf_write_vq_doorbell(cptvf, 0);
630 /* Clear inflight */
631 cptvf_write_vq_inprog(cptvf, 0);
632 /* Write VQ SADDR */
633 base_addr = (u64)(cptvf->cqinfo.queue[0].qhead->dma_addr);
634 cptvf_write_vq_saddr(cptvf, base_addr);
635 /* Configure timerhold / coalescence */
636 cptvf_write_vq_done_timewait(cptvf, OTX_CPT_TIMER_HOLD);
637 cptvf_write_vq_done_numwait(cptvf, OTX_CPT_COUNT_HOLD);
638 /* Enable the VQ */
639 cptvf_write_vq_ctl(cptvf, 1);
640 /* Flag the VF ready */
641 cptvf->flags |= OTX_CPT_FLAG_DEVICE_READY;
642 }
643
vf_type_show(struct device * dev,struct device_attribute * attr,char * buf)644 static ssize_t vf_type_show(struct device *dev,
645 struct device_attribute *attr,
646 char *buf)
647 {
648 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
649 char *msg;
650
651 switch (cptvf->vftype) {
652 case OTX_CPT_AE_TYPES:
653 msg = "AE";
654 break;
655
656 case OTX_CPT_SE_TYPES:
657 msg = "SE";
658 break;
659
660 default:
661 msg = "Invalid";
662 }
663
664 return sysfs_emit(buf, "%s\n", msg);
665 }
666
vf_engine_group_show(struct device * dev,struct device_attribute * attr,char * buf)667 static ssize_t vf_engine_group_show(struct device *dev,
668 struct device_attribute *attr,
669 char *buf)
670 {
671 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
672
673 return sysfs_emit(buf, "%d\n", cptvf->vfgrp);
674 }
675
vf_engine_group_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)676 static ssize_t vf_engine_group_store(struct device *dev,
677 struct device_attribute *attr,
678 const char *buf, size_t count)
679 {
680 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
681 int val, ret;
682
683 ret = kstrtoint(buf, 10, &val);
684 if (ret)
685 return ret;
686
687 if (val < 0)
688 return -EINVAL;
689
690 if (val >= OTX_CPT_MAX_ENGINE_GROUPS) {
691 dev_err(dev, "Engine group >= than max available groups %d\n",
692 OTX_CPT_MAX_ENGINE_GROUPS);
693 return -EINVAL;
694 }
695
696 ret = otx_cptvf_send_vf_to_grp_msg(cptvf, val);
697 if (ret)
698 return ret;
699
700 return count;
701 }
702
vf_coalesc_time_wait_show(struct device * dev,struct device_attribute * attr,char * buf)703 static ssize_t vf_coalesc_time_wait_show(struct device *dev,
704 struct device_attribute *attr,
705 char *buf)
706 {
707 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
708
709 return sysfs_emit(buf, "%d\n",
710 cptvf_read_vq_done_timewait(cptvf));
711 }
712
vf_coalesc_num_wait_show(struct device * dev,struct device_attribute * attr,char * buf)713 static ssize_t vf_coalesc_num_wait_show(struct device *dev,
714 struct device_attribute *attr,
715 char *buf)
716 {
717 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
718
719 return sysfs_emit(buf, "%d\n",
720 cptvf_read_vq_done_numwait(cptvf));
721 }
722
vf_coalesc_time_wait_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)723 static ssize_t vf_coalesc_time_wait_store(struct device *dev,
724 struct device_attribute *attr,
725 const char *buf, size_t count)
726 {
727 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
728 long val;
729 int ret;
730
731 ret = kstrtol(buf, 10, &val);
732 if (ret != 0)
733 return ret;
734
735 if (val < OTX_CPT_COALESC_MIN_TIME_WAIT ||
736 val > OTX_CPT_COALESC_MAX_TIME_WAIT)
737 return -EINVAL;
738
739 cptvf_write_vq_done_timewait(cptvf, val);
740 return count;
741 }
742
vf_coalesc_num_wait_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)743 static ssize_t vf_coalesc_num_wait_store(struct device *dev,
744 struct device_attribute *attr,
745 const char *buf, size_t count)
746 {
747 struct otx_cptvf *cptvf = dev_get_drvdata(dev);
748 long val;
749 int ret;
750
751 ret = kstrtol(buf, 10, &val);
752 if (ret != 0)
753 return ret;
754
755 if (val < OTX_CPT_COALESC_MIN_NUM_WAIT ||
756 val > OTX_CPT_COALESC_MAX_NUM_WAIT)
757 return -EINVAL;
758
759 cptvf_write_vq_done_numwait(cptvf, val);
760 return count;
761 }
762
763 static DEVICE_ATTR_RO(vf_type);
764 static DEVICE_ATTR_RW(vf_engine_group);
765 static DEVICE_ATTR_RW(vf_coalesc_time_wait);
766 static DEVICE_ATTR_RW(vf_coalesc_num_wait);
767
768 static struct attribute *otx_cptvf_attrs[] = {
769 &dev_attr_vf_type.attr,
770 &dev_attr_vf_engine_group.attr,
771 &dev_attr_vf_coalesc_time_wait.attr,
772 &dev_attr_vf_coalesc_num_wait.attr,
773 NULL
774 };
775
776 static const struct attribute_group otx_cptvf_sysfs_group = {
777 .attrs = otx_cptvf_attrs,
778 };
779
otx_cptvf_probe(struct pci_dev * pdev,const struct pci_device_id * ent)780 static int otx_cptvf_probe(struct pci_dev *pdev,
781 const struct pci_device_id *ent)
782 {
783 struct device *dev = &pdev->dev;
784 struct otx_cptvf *cptvf;
785 int err;
786
787 cptvf = devm_kzalloc(dev, sizeof(*cptvf), GFP_KERNEL);
788 if (!cptvf)
789 return -ENOMEM;
790
791 pci_set_drvdata(pdev, cptvf);
792 cptvf->pdev = pdev;
793
794 err = pci_enable_device(pdev);
795 if (err) {
796 dev_err(dev, "Failed to enable PCI device\n");
797 goto clear_drvdata;
798 }
799 err = pci_request_regions(pdev, DRV_NAME);
800 if (err) {
801 dev_err(dev, "PCI request regions failed 0x%x\n", err);
802 goto disable_device;
803 }
804 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(48));
805 if (err) {
806 dev_err(dev, "Unable to get usable 48-bit DMA configuration\n");
807 goto release_regions;
808 }
809
810 /* MAP PF's configuration registers */
811 cptvf->reg_base = pci_iomap(pdev, OTX_CPT_VF_PCI_CFG_BAR, 0);
812 if (!cptvf->reg_base) {
813 dev_err(dev, "Cannot map config register space, aborting\n");
814 err = -ENOMEM;
815 goto release_regions;
816 }
817
818 cptvf->node = dev_to_node(&pdev->dev);
819 err = pci_alloc_irq_vectors(pdev, OTX_CPT_VF_MSIX_VECTORS,
820 OTX_CPT_VF_MSIX_VECTORS, PCI_IRQ_MSIX);
821 if (err < 0) {
822 dev_err(dev, "Request for #%d msix vectors failed\n",
823 OTX_CPT_VF_MSIX_VECTORS);
824 goto unmap_region;
825 }
826
827 err = request_irq(pci_irq_vector(pdev, CPT_VF_INT_VEC_E_MISC),
828 cptvf_misc_intr_handler, 0, "CPT VF misc intr",
829 cptvf);
830 if (err) {
831 dev_err(dev, "Failed to request misc irq\n");
832 goto free_vectors;
833 }
834
835 /* Enable mailbox interrupt */
836 cptvf_enable_mbox_interrupts(cptvf);
837 cptvf_enable_swerr_interrupts(cptvf);
838
839 /* Check cpt pf status, gets chip ID / device Id from PF if ready */
840 err = otx_cptvf_check_pf_ready(cptvf);
841 if (err)
842 goto free_misc_irq;
843
844 /* CPT VF software resources initialization */
845 cptvf->cqinfo.qchunksize = OTX_CPT_CMD_QCHUNK_SIZE;
846 err = cptvf_sw_init(cptvf, OTX_CPT_CMD_QLEN, OTX_CPT_NUM_QS_PER_VF);
847 if (err) {
848 dev_err(dev, "cptvf_sw_init() failed\n");
849 goto free_misc_irq;
850 }
851 /* Convey VQ LEN to PF */
852 err = otx_cptvf_send_vq_size_msg(cptvf);
853 if (err)
854 goto sw_cleanup;
855
856 /* CPT VF device initialization */
857 cptvf_device_init(cptvf);
858 /* Send msg to PF to assign currnet Q to required group */
859 err = otx_cptvf_send_vf_to_grp_msg(cptvf, cptvf->vfgrp);
860 if (err)
861 goto sw_cleanup;
862
863 cptvf->priority = 1;
864 err = otx_cptvf_send_vf_priority_msg(cptvf);
865 if (err)
866 goto sw_cleanup;
867
868 err = request_irq(pci_irq_vector(pdev, CPT_VF_INT_VEC_E_DONE),
869 cptvf_done_intr_handler, 0, "CPT VF done intr",
870 cptvf);
871 if (err) {
872 dev_err(dev, "Failed to request done irq\n");
873 goto free_done_irq;
874 }
875
876 /* Enable done interrupt */
877 cptvf_enable_done_interrupts(cptvf);
878
879 /* Set irq affinity masks */
880 cptvf_set_irq_affinity(cptvf, CPT_VF_INT_VEC_E_MISC);
881 cptvf_set_irq_affinity(cptvf, CPT_VF_INT_VEC_E_DONE);
882
883 err = otx_cptvf_send_vf_up(cptvf);
884 if (err)
885 goto free_irq_affinity;
886
887 /* Initialize algorithms and set ops */
888 err = otx_cpt_crypto_init(pdev, THIS_MODULE,
889 cptvf->vftype == OTX_CPT_SE_TYPES ? OTX_CPT_SE : OTX_CPT_AE,
890 cptvf->vftype, 1, cptvf->num_vfs);
891 if (err) {
892 dev_err(dev, "Failed to register crypto algs\n");
893 goto free_irq_affinity;
894 }
895
896 err = sysfs_create_group(&dev->kobj, &otx_cptvf_sysfs_group);
897 if (err) {
898 dev_err(dev, "Creating sysfs entries failed\n");
899 goto crypto_exit;
900 }
901
902 return 0;
903
904 crypto_exit:
905 otx_cpt_crypto_exit(pdev, THIS_MODULE, cptvf->vftype);
906 free_irq_affinity:
907 cptvf_free_irq_affinity(cptvf, CPT_VF_INT_VEC_E_DONE);
908 cptvf_free_irq_affinity(cptvf, CPT_VF_INT_VEC_E_MISC);
909 free_done_irq:
910 free_irq(pci_irq_vector(pdev, CPT_VF_INT_VEC_E_DONE), cptvf);
911 sw_cleanup:
912 cptvf_sw_cleanup(cptvf);
913 free_misc_irq:
914 free_irq(pci_irq_vector(pdev, CPT_VF_INT_VEC_E_MISC), cptvf);
915 free_vectors:
916 pci_free_irq_vectors(cptvf->pdev);
917 unmap_region:
918 pci_iounmap(pdev, cptvf->reg_base);
919 release_regions:
920 pci_release_regions(pdev);
921 disable_device:
922 pci_disable_device(pdev);
923 clear_drvdata:
924 pci_set_drvdata(pdev, NULL);
925
926 return err;
927 }
928
otx_cptvf_remove(struct pci_dev * pdev)929 static void otx_cptvf_remove(struct pci_dev *pdev)
930 {
931 struct otx_cptvf *cptvf = pci_get_drvdata(pdev);
932
933 if (!cptvf) {
934 dev_err(&pdev->dev, "Invalid CPT-VF device\n");
935 return;
936 }
937
938 /* Convey DOWN to PF */
939 if (otx_cptvf_send_vf_down(cptvf)) {
940 dev_err(&pdev->dev, "PF not responding to DOWN msg\n");
941 } else {
942 sysfs_remove_group(&pdev->dev.kobj, &otx_cptvf_sysfs_group);
943 otx_cpt_crypto_exit(pdev, THIS_MODULE, cptvf->vftype);
944 cptvf_free_irq_affinity(cptvf, CPT_VF_INT_VEC_E_DONE);
945 cptvf_free_irq_affinity(cptvf, CPT_VF_INT_VEC_E_MISC);
946 free_irq(pci_irq_vector(pdev, CPT_VF_INT_VEC_E_DONE), cptvf);
947 free_irq(pci_irq_vector(pdev, CPT_VF_INT_VEC_E_MISC), cptvf);
948 cptvf_sw_cleanup(cptvf);
949 pci_free_irq_vectors(cptvf->pdev);
950 pci_iounmap(pdev, cptvf->reg_base);
951 pci_release_regions(pdev);
952 pci_disable_device(pdev);
953 pci_set_drvdata(pdev, NULL);
954 }
955 }
956
957 /* Supported devices */
958 static const struct pci_device_id otx_cptvf_id_table[] = {
959 {PCI_VDEVICE(CAVIUM, OTX_CPT_PCI_VF_DEVICE_ID), 0},
960 { 0, } /* end of table */
961 };
962
963 static struct pci_driver otx_cptvf_pci_driver = {
964 .name = DRV_NAME,
965 .id_table = otx_cptvf_id_table,
966 .probe = otx_cptvf_probe,
967 .remove = otx_cptvf_remove,
968 };
969
970 module_pci_driver(otx_cptvf_pci_driver);
971
972 MODULE_AUTHOR("Marvell International Ltd.");
973 MODULE_DESCRIPTION("Marvell OcteonTX CPT Virtual Function Driver");
974 MODULE_LICENSE("GPL v2");
975 MODULE_VERSION(DRV_VERSION);
976 MODULE_DEVICE_TABLE(pci, otx_cptvf_id_table);
977