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)",
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",
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",
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");
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");
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");
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);
986