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