1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * CAAM/SEC 4.x transport/backend driver
4 * JobR backend functionality
5 *
6 * Copyright 2008-2012 Freescale Semiconductor, Inc.
7 * Copyright 2019, 2023 NXP
8 */
9
10 #include <linux/of_irq.h>
11 #include <linux/of_address.h>
12 #include <linux/platform_device.h>
13
14 #include "compat.h"
15 #include "ctrl.h"
16 #include "regs.h"
17 #include "jr.h"
18 #include "desc.h"
19 #include "intern.h"
20
21 struct jr_driver_data {
22 /* List of Physical JobR's with the Driver */
23 struct list_head jr_list;
24 spinlock_t jr_alloc_lock; /* jr_list lock */
25 } ____cacheline_aligned;
26
27 static struct jr_driver_data driver_data;
28 static DEFINE_MUTEX(algs_lock);
29 static unsigned int active_devs;
30
register_algs(struct caam_drv_private_jr * jrpriv,struct device * dev)31 static void register_algs(struct caam_drv_private_jr *jrpriv,
32 struct device *dev)
33 {
34 mutex_lock(&algs_lock);
35
36 if (++active_devs != 1)
37 goto algs_unlock;
38
39 caam_algapi_init(dev);
40 caam_algapi_hash_init(dev);
41 caam_pkc_init(dev);
42 jrpriv->hwrng = !caam_rng_init(dev);
43 caam_prng_register(dev);
44 caam_qi_algapi_init(dev);
45
46 algs_unlock:
47 mutex_unlock(&algs_lock);
48 }
49
unregister_algs(void)50 static void unregister_algs(void)
51 {
52 mutex_lock(&algs_lock);
53
54 if (--active_devs != 0)
55 goto algs_unlock;
56
57 caam_qi_algapi_exit();
58 caam_prng_unregister(NULL);
59 caam_pkc_exit();
60 caam_algapi_hash_exit();
61 caam_algapi_exit();
62
63 algs_unlock:
64 mutex_unlock(&algs_lock);
65 }
66
caam_jr_crypto_engine_exit(void * data)67 static void caam_jr_crypto_engine_exit(void *data)
68 {
69 struct device *jrdev = data;
70 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
71
72 /* Free the resources of crypto-engine */
73 crypto_engine_exit(jrpriv->engine);
74 }
75
76 /*
77 * Put the CAAM in quiesce, ie stop
78 *
79 * Must be called with itr disabled
80 */
caam_jr_stop_processing(struct device * dev,u32 jrcr_bits)81 static int caam_jr_stop_processing(struct device *dev, u32 jrcr_bits)
82 {
83 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
84 unsigned int timeout = 100000;
85
86 /* Check the current status */
87 if (rd_reg32(&jrp->rregs->jrintstatus) & JRINT_ERR_HALT_INPROGRESS)
88 goto wait_quiesce_completion;
89
90 /* Reset the field */
91 clrsetbits_32(&jrp->rregs->jrintstatus, JRINT_ERR_HALT_MASK, 0);
92
93 /* initiate flush / park (required prior to reset) */
94 wr_reg32(&jrp->rregs->jrcommand, jrcr_bits);
95
96 wait_quiesce_completion:
97 while (((rd_reg32(&jrp->rregs->jrintstatus) & JRINT_ERR_HALT_MASK) ==
98 JRINT_ERR_HALT_INPROGRESS) && --timeout)
99 cpu_relax();
100
101 if ((rd_reg32(&jrp->rregs->jrintstatus) & JRINT_ERR_HALT_MASK) !=
102 JRINT_ERR_HALT_COMPLETE || timeout == 0) {
103 dev_err(dev, "failed to flush job ring %d\n", jrp->ridx);
104 return -EIO;
105 }
106
107 return 0;
108 }
109
110 /*
111 * Flush the job ring, so the jobs running will be stopped, jobs queued will be
112 * invalidated and the CAAM will no longer fetch fron input ring.
113 *
114 * Must be called with itr disabled
115 */
caam_jr_flush(struct device * dev)116 static int caam_jr_flush(struct device *dev)
117 {
118 return caam_jr_stop_processing(dev, JRCR_RESET);
119 }
120
121 /* The resume can be used after a park or a flush if CAAM has not been reset */
caam_jr_restart_processing(struct device * dev)122 static int caam_jr_restart_processing(struct device *dev)
123 {
124 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
125 u32 halt_status = rd_reg32(&jrp->rregs->jrintstatus) &
126 JRINT_ERR_HALT_MASK;
127
128 /* Check that the flush/park is completed */
129 if (halt_status != JRINT_ERR_HALT_COMPLETE)
130 return -1;
131
132 /* Resume processing of jobs */
133 clrsetbits_32(&jrp->rregs->jrintstatus, 0, JRINT_ERR_HALT_COMPLETE);
134
135 return 0;
136 }
137
caam_reset_hw_jr(struct device * dev)138 static int caam_reset_hw_jr(struct device *dev)
139 {
140 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
141 unsigned int timeout = 100000;
142 int err;
143 /*
144 * mask interrupts since we are going to poll
145 * for reset completion status
146 */
147 clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JRCFG_IMSK);
148 err = caam_jr_flush(dev);
149 if (err)
150 return err;
151
152 /* initiate reset */
153 wr_reg32(&jrp->rregs->jrcommand, JRCR_RESET);
154 while ((rd_reg32(&jrp->rregs->jrcommand) & JRCR_RESET) && --timeout)
155 cpu_relax();
156
157 if (timeout == 0) {
158 dev_err(dev, "failed to reset job ring %d\n", jrp->ridx);
159 return -EIO;
160 }
161
162 /* unmask interrupts */
163 clrsetbits_32(&jrp->rregs->rconfig_lo, JRCFG_IMSK, 0);
164
165 return 0;
166 }
167
168 /*
169 * Shutdown JobR independent of platform property code
170 */
caam_jr_shutdown(struct device * dev)171 static int caam_jr_shutdown(struct device *dev)
172 {
173 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
174 int ret;
175
176 ret = caam_reset_hw_jr(dev);
177
178 tasklet_kill(&jrp->irqtask);
179
180 return ret;
181 }
182
caam_jr_remove(struct platform_device * pdev)183 static int caam_jr_remove(struct platform_device *pdev)
184 {
185 int ret;
186 struct device *jrdev;
187 struct caam_drv_private_jr *jrpriv;
188
189 jrdev = &pdev->dev;
190 jrpriv = dev_get_drvdata(jrdev);
191
192 if (jrpriv->hwrng)
193 caam_rng_exit(jrdev->parent);
194
195 /*
196 * Return EBUSY if job ring already allocated.
197 */
198 if (atomic_read(&jrpriv->tfm_count)) {
199 dev_err(jrdev, "Device is busy\n");
200 return -EBUSY;
201 }
202
203 /* Unregister JR-based RNG & crypto algorithms */
204 unregister_algs();
205
206 /* Remove the node from Physical JobR list maintained by driver */
207 spin_lock(&driver_data.jr_alloc_lock);
208 list_del(&jrpriv->list_node);
209 spin_unlock(&driver_data.jr_alloc_lock);
210
211 /* Release ring */
212 ret = caam_jr_shutdown(jrdev);
213 if (ret)
214 dev_err(jrdev, "Failed to shut down job ring\n");
215
216 return ret;
217 }
218
caam_jr_platform_shutdown(struct platform_device * pdev)219 static void caam_jr_platform_shutdown(struct platform_device *pdev)
220 {
221 caam_jr_remove(pdev);
222 }
223
224 /* Main per-ring interrupt handler */
caam_jr_interrupt(int irq,void * st_dev)225 static irqreturn_t caam_jr_interrupt(int irq, void *st_dev)
226 {
227 struct device *dev = st_dev;
228 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
229 u32 irqstate;
230
231 /*
232 * Check the output ring for ready responses, kick
233 * tasklet if jobs done.
234 */
235 irqstate = rd_reg32(&jrp->rregs->jrintstatus);
236 if (!(irqstate & JRINT_JR_INT))
237 return IRQ_NONE;
238
239 /*
240 * If JobR error, we got more development work to do
241 * Flag a bug now, but we really need to shut down and
242 * restart the queue (and fix code).
243 */
244 if (irqstate & JRINT_JR_ERROR) {
245 dev_err(dev, "job ring error: irqstate: %08x\n", irqstate);
246 BUG();
247 }
248
249 /* mask valid interrupts */
250 clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JRCFG_IMSK);
251
252 /* Have valid interrupt at this point, just ACK and trigger */
253 wr_reg32(&jrp->rregs->jrintstatus, irqstate);
254
255 preempt_disable();
256 tasklet_schedule(&jrp->irqtask);
257 preempt_enable();
258
259 return IRQ_HANDLED;
260 }
261
262 /* Deferred service handler, run as interrupt-fired tasklet */
caam_jr_dequeue(unsigned long devarg)263 static void caam_jr_dequeue(unsigned long devarg)
264 {
265 int hw_idx, sw_idx, i, head, tail;
266 struct caam_jr_dequeue_params *params = (void *)devarg;
267 struct device *dev = params->dev;
268 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
269 void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg);
270 u32 *userdesc, userstatus;
271 void *userarg;
272 u32 outring_used = 0;
273
274 while (outring_used ||
275 (outring_used = rd_reg32(&jrp->rregs->outring_used))) {
276
277 head = READ_ONCE(jrp->head);
278
279 sw_idx = tail = jrp->tail;
280 hw_idx = jrp->out_ring_read_index;
281
282 for (i = 0; CIRC_CNT(head, tail + i, JOBR_DEPTH) >= 1; i++) {
283 sw_idx = (tail + i) & (JOBR_DEPTH - 1);
284
285 if (jr_outentry_desc(jrp->outring, hw_idx) ==
286 caam_dma_to_cpu(jrp->entinfo[sw_idx].desc_addr_dma))
287 break; /* found */
288 }
289 /* we should never fail to find a matching descriptor */
290 BUG_ON(CIRC_CNT(head, tail + i, JOBR_DEPTH) <= 0);
291
292 /* Unmap just-run descriptor so we can post-process */
293 dma_unmap_single(dev,
294 caam_dma_to_cpu(jr_outentry_desc(jrp->outring,
295 hw_idx)),
296 jrp->entinfo[sw_idx].desc_size,
297 DMA_TO_DEVICE);
298
299 /* mark completed, avoid matching on a recycled desc addr */
300 jrp->entinfo[sw_idx].desc_addr_dma = 0;
301
302 /* Stash callback params */
303 usercall = jrp->entinfo[sw_idx].callbk;
304 userarg = jrp->entinfo[sw_idx].cbkarg;
305 userdesc = jrp->entinfo[sw_idx].desc_addr_virt;
306 userstatus = caam32_to_cpu(jr_outentry_jrstatus(jrp->outring,
307 hw_idx));
308
309 /*
310 * Make sure all information from the job has been obtained
311 * before telling CAAM that the job has been removed from the
312 * output ring.
313 */
314 mb();
315
316 /* set done */
317 wr_reg32(&jrp->rregs->outring_rmvd, 1);
318
319 jrp->out_ring_read_index = (jrp->out_ring_read_index + 1) &
320 (JOBR_DEPTH - 1);
321
322 /*
323 * if this job completed out-of-order, do not increment
324 * the tail. Otherwise, increment tail by 1 plus the
325 * number of subsequent jobs already completed out-of-order
326 */
327 if (sw_idx == tail) {
328 do {
329 tail = (tail + 1) & (JOBR_DEPTH - 1);
330 } while (CIRC_CNT(head, tail, JOBR_DEPTH) >= 1 &&
331 jrp->entinfo[tail].desc_addr_dma == 0);
332
333 jrp->tail = tail;
334 }
335
336 /* Finally, execute user's callback */
337 usercall(dev, userdesc, userstatus, userarg);
338 outring_used--;
339 }
340
341 if (params->enable_itr)
342 /* reenable / unmask IRQs */
343 clrsetbits_32(&jrp->rregs->rconfig_lo, JRCFG_IMSK, 0);
344 }
345
346 /**
347 * caam_jr_alloc() - Alloc a job ring for someone to use as needed.
348 *
349 * returns : pointer to the newly allocated physical
350 * JobR dev can be written to if successful.
351 **/
caam_jr_alloc(void)352 struct device *caam_jr_alloc(void)
353 {
354 struct caam_drv_private_jr *jrpriv, *min_jrpriv = NULL;
355 struct device *dev = ERR_PTR(-ENODEV);
356 int min_tfm_cnt = INT_MAX;
357 int tfm_cnt;
358
359 spin_lock(&driver_data.jr_alloc_lock);
360
361 if (list_empty(&driver_data.jr_list)) {
362 spin_unlock(&driver_data.jr_alloc_lock);
363 return ERR_PTR(-ENODEV);
364 }
365
366 list_for_each_entry(jrpriv, &driver_data.jr_list, list_node) {
367 tfm_cnt = atomic_read(&jrpriv->tfm_count);
368 if (tfm_cnt < min_tfm_cnt) {
369 min_tfm_cnt = tfm_cnt;
370 min_jrpriv = jrpriv;
371 }
372 if (!min_tfm_cnt)
373 break;
374 }
375
376 if (min_jrpriv) {
377 atomic_inc(&min_jrpriv->tfm_count);
378 dev = min_jrpriv->dev;
379 }
380 spin_unlock(&driver_data.jr_alloc_lock);
381
382 return dev;
383 }
384 EXPORT_SYMBOL(caam_jr_alloc);
385
386 /**
387 * caam_jr_free() - Free the Job Ring
388 * @rdev: points to the dev that identifies the Job ring to
389 * be released.
390 **/
caam_jr_free(struct device * rdev)391 void caam_jr_free(struct device *rdev)
392 {
393 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(rdev);
394
395 atomic_dec(&jrpriv->tfm_count);
396 }
397 EXPORT_SYMBOL(caam_jr_free);
398
399 /**
400 * caam_jr_enqueue() - Enqueue a job descriptor head. Returns -EINPROGRESS
401 * if OK, -ENOSPC if the queue is full, -EIO if it cannot map the caller's
402 * descriptor.
403 * @dev: struct device of the job ring to be used
404 * @desc: points to a job descriptor that execute our request. All
405 * descriptors (and all referenced data) must be in a DMAable
406 * region, and all data references must be physical addresses
407 * accessible to CAAM (i.e. within a PAMU window granted
408 * to it).
409 * @cbk: pointer to a callback function to be invoked upon completion
410 * of this request. This has the form:
411 * callback(struct device *dev, u32 *desc, u32 stat, void *arg)
412 * where:
413 * dev: contains the job ring device that processed this
414 * response.
415 * desc: descriptor that initiated the request, same as
416 * "desc" being argued to caam_jr_enqueue().
417 * status: untranslated status received from CAAM. See the
418 * reference manual for a detailed description of
419 * error meaning, or see the JRSTA definitions in the
420 * register header file
421 * areq: optional pointer to an argument passed with the
422 * original request
423 * @areq: optional pointer to a user argument for use at callback
424 * time.
425 **/
caam_jr_enqueue(struct device * dev,u32 * desc,void (* cbk)(struct device * dev,u32 * desc,u32 status,void * areq),void * areq)426 int caam_jr_enqueue(struct device *dev, u32 *desc,
427 void (*cbk)(struct device *dev, u32 *desc,
428 u32 status, void *areq),
429 void *areq)
430 {
431 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
432 struct caam_jrentry_info *head_entry;
433 int head, tail, desc_size;
434 dma_addr_t desc_dma;
435
436 desc_size = (caam32_to_cpu(*desc) & HDR_JD_LENGTH_MASK) * sizeof(u32);
437 desc_dma = dma_map_single(dev, desc, desc_size, DMA_TO_DEVICE);
438 if (dma_mapping_error(dev, desc_dma)) {
439 dev_err(dev, "caam_jr_enqueue(): can't map jobdesc\n");
440 return -EIO;
441 }
442
443 spin_lock_bh(&jrp->inplock);
444
445 head = jrp->head;
446 tail = READ_ONCE(jrp->tail);
447
448 if (!jrp->inpring_avail ||
449 CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) {
450 spin_unlock_bh(&jrp->inplock);
451 dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE);
452 return -ENOSPC;
453 }
454
455 head_entry = &jrp->entinfo[head];
456 head_entry->desc_addr_virt = desc;
457 head_entry->desc_size = desc_size;
458 head_entry->callbk = (void *)cbk;
459 head_entry->cbkarg = areq;
460 head_entry->desc_addr_dma = desc_dma;
461
462 jr_inpentry_set(jrp->inpring, head, cpu_to_caam_dma(desc_dma));
463
464 /*
465 * Guarantee that the descriptor's DMA address has been written to
466 * the next slot in the ring before the write index is updated, since
467 * other cores may update this index independently.
468 *
469 * Under heavy DDR load, smp_wmb() or dma_wmb() fail to make the input
470 * ring be updated before the CAAM starts reading it. So, CAAM will
471 * process, again, an old descriptor address and will put it in the
472 * output ring. This will make caam_jr_dequeue() to fail, since this
473 * old descriptor is not in the software ring.
474 * To fix this, use wmb() which works on the full system instead of
475 * inner/outer shareable domains.
476 */
477 wmb();
478
479 jrp->head = (head + 1) & (JOBR_DEPTH - 1);
480
481 /*
482 * Ensure that all job information has been written before
483 * notifying CAAM that a new job was added to the input ring
484 * using a memory barrier. The wr_reg32() uses api iowrite32()
485 * to do the register write. iowrite32() issues a memory barrier
486 * before the write operation.
487 */
488
489 wr_reg32(&jrp->rregs->inpring_jobadd, 1);
490
491 jrp->inpring_avail--;
492 if (!jrp->inpring_avail)
493 jrp->inpring_avail = rd_reg32(&jrp->rregs->inpring_avail);
494
495 spin_unlock_bh(&jrp->inplock);
496
497 return -EINPROGRESS;
498 }
499 EXPORT_SYMBOL(caam_jr_enqueue);
500
caam_jr_init_hw(struct device * dev,dma_addr_t inpbusaddr,dma_addr_t outbusaddr)501 static void caam_jr_init_hw(struct device *dev, dma_addr_t inpbusaddr,
502 dma_addr_t outbusaddr)
503 {
504 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
505
506 wr_reg64(&jrp->rregs->inpring_base, inpbusaddr);
507 wr_reg64(&jrp->rregs->outring_base, outbusaddr);
508 wr_reg32(&jrp->rregs->inpring_size, JOBR_DEPTH);
509 wr_reg32(&jrp->rregs->outring_size, JOBR_DEPTH);
510
511 /* Select interrupt coalescing parameters */
512 clrsetbits_32(&jrp->rregs->rconfig_lo, 0, JOBR_INTC |
513 (JOBR_INTC_COUNT_THLD << JRCFG_ICDCT_SHIFT) |
514 (JOBR_INTC_TIME_THLD << JRCFG_ICTT_SHIFT));
515 }
516
caam_jr_reset_index(struct caam_drv_private_jr * jrp)517 static void caam_jr_reset_index(struct caam_drv_private_jr *jrp)
518 {
519 jrp->out_ring_read_index = 0;
520 jrp->head = 0;
521 jrp->tail = 0;
522 }
523
524 /*
525 * Init JobR independent of platform property detection
526 */
caam_jr_init(struct device * dev)527 static int caam_jr_init(struct device *dev)
528 {
529 struct caam_drv_private_jr *jrp;
530 dma_addr_t inpbusaddr, outbusaddr;
531 int i, error;
532
533 jrp = dev_get_drvdata(dev);
534
535 error = caam_reset_hw_jr(dev);
536 if (error)
537 return error;
538
539 jrp->inpring = dmam_alloc_coherent(dev, SIZEOF_JR_INPENTRY *
540 JOBR_DEPTH, &inpbusaddr,
541 GFP_KERNEL);
542 if (!jrp->inpring)
543 return -ENOMEM;
544
545 jrp->outring = dmam_alloc_coherent(dev, SIZEOF_JR_OUTENTRY *
546 JOBR_DEPTH, &outbusaddr,
547 GFP_KERNEL);
548 if (!jrp->outring)
549 return -ENOMEM;
550
551 jrp->entinfo = devm_kcalloc(dev, JOBR_DEPTH, sizeof(*jrp->entinfo),
552 GFP_KERNEL);
553 if (!jrp->entinfo)
554 return -ENOMEM;
555
556 for (i = 0; i < JOBR_DEPTH; i++)
557 jrp->entinfo[i].desc_addr_dma = !0;
558
559 /* Setup rings */
560 caam_jr_reset_index(jrp);
561 jrp->inpring_avail = JOBR_DEPTH;
562 caam_jr_init_hw(dev, inpbusaddr, outbusaddr);
563
564 spin_lock_init(&jrp->inplock);
565
566 jrp->tasklet_params.dev = dev;
567 jrp->tasklet_params.enable_itr = 1;
568 tasklet_init(&jrp->irqtask, caam_jr_dequeue,
569 (unsigned long)&jrp->tasklet_params);
570
571 /* Connect job ring interrupt handler. */
572 error = devm_request_irq(dev, jrp->irq, caam_jr_interrupt, IRQF_SHARED,
573 dev_name(dev), dev);
574 if (error) {
575 dev_err(dev, "can't connect JobR %d interrupt (%d)\n",
576 jrp->ridx, jrp->irq);
577 tasklet_kill(&jrp->irqtask);
578 }
579
580 return error;
581 }
582
caam_jr_irq_dispose_mapping(void * data)583 static void caam_jr_irq_dispose_mapping(void *data)
584 {
585 irq_dispose_mapping((unsigned long)data);
586 }
587
588 /*
589 * Probe routine for each detected JobR subsystem.
590 */
caam_jr_probe(struct platform_device * pdev)591 static int caam_jr_probe(struct platform_device *pdev)
592 {
593 struct device *jrdev;
594 struct device_node *nprop;
595 struct caam_job_ring __iomem *ctrl;
596 struct caam_drv_private_jr *jrpriv;
597 static int total_jobrs;
598 struct resource *r;
599 int error;
600
601 jrdev = &pdev->dev;
602 jrpriv = devm_kzalloc(jrdev, sizeof(*jrpriv), GFP_KERNEL);
603 if (!jrpriv)
604 return -ENOMEM;
605
606 dev_set_drvdata(jrdev, jrpriv);
607
608 /* save ring identity relative to detection */
609 jrpriv->ridx = total_jobrs++;
610
611 nprop = pdev->dev.of_node;
612 /* Get configuration properties from device tree */
613 /* First, get register page */
614 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
615 if (!r) {
616 dev_err(jrdev, "platform_get_resource() failed\n");
617 return -ENOMEM;
618 }
619
620 ctrl = devm_ioremap(jrdev, r->start, resource_size(r));
621 if (!ctrl) {
622 dev_err(jrdev, "devm_ioremap() failed\n");
623 return -ENOMEM;
624 }
625
626 jrpriv->rregs = (struct caam_job_ring __iomem __force *)ctrl;
627
628 error = dma_set_mask_and_coherent(jrdev, caam_get_dma_mask(jrdev));
629 if (error) {
630 dev_err(jrdev, "dma_set_mask_and_coherent failed (%d)\n",
631 error);
632 return error;
633 }
634
635 /* Initialize crypto engine */
636 jrpriv->engine = crypto_engine_alloc_init_and_set(jrdev, true, NULL,
637 false,
638 CRYPTO_ENGINE_MAX_QLEN);
639 if (!jrpriv->engine) {
640 dev_err(jrdev, "Could not init crypto-engine\n");
641 return -ENOMEM;
642 }
643
644 error = devm_add_action_or_reset(jrdev, caam_jr_crypto_engine_exit,
645 jrdev);
646 if (error)
647 return error;
648
649 /* Start crypto engine */
650 error = crypto_engine_start(jrpriv->engine);
651 if (error) {
652 dev_err(jrdev, "Could not start crypto-engine\n");
653 return error;
654 }
655
656 /* Identify the interrupt */
657 jrpriv->irq = irq_of_parse_and_map(nprop, 0);
658 if (!jrpriv->irq) {
659 dev_err(jrdev, "irq_of_parse_and_map failed\n");
660 return -EINVAL;
661 }
662
663 error = devm_add_action_or_reset(jrdev, caam_jr_irq_dispose_mapping,
664 (void *)(unsigned long)jrpriv->irq);
665 if (error)
666 return error;
667
668 /* Now do the platform independent part */
669 error = caam_jr_init(jrdev); /* now turn on hardware */
670 if (error)
671 return error;
672
673 jrpriv->dev = jrdev;
674 spin_lock(&driver_data.jr_alloc_lock);
675 list_add_tail(&jrpriv->list_node, &driver_data.jr_list);
676 spin_unlock(&driver_data.jr_alloc_lock);
677
678 atomic_set(&jrpriv->tfm_count, 0);
679
680 device_init_wakeup(&pdev->dev, 1);
681 device_set_wakeup_enable(&pdev->dev, false);
682
683 register_algs(jrpriv, jrdev->parent);
684
685 return 0;
686 }
687
caam_jr_get_hw_state(struct device * dev)688 static void caam_jr_get_hw_state(struct device *dev)
689 {
690 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
691
692 jrp->state.inpbusaddr = rd_reg64(&jrp->rregs->inpring_base);
693 jrp->state.outbusaddr = rd_reg64(&jrp->rregs->outring_base);
694 }
695
caam_jr_suspend(struct device * dev)696 static int caam_jr_suspend(struct device *dev)
697 {
698 struct platform_device *pdev = to_platform_device(dev);
699 struct caam_drv_private_jr *jrpriv = platform_get_drvdata(pdev);
700 struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev->parent);
701 struct caam_jr_dequeue_params suspend_params = {
702 .dev = dev,
703 .enable_itr = 0,
704 };
705
706 /* Remove the node from Physical JobR list maintained by driver */
707 spin_lock(&driver_data.jr_alloc_lock);
708 list_del(&jrpriv->list_node);
709 spin_unlock(&driver_data.jr_alloc_lock);
710
711 if (jrpriv->hwrng)
712 caam_rng_exit(dev->parent);
713
714 if (ctrlpriv->caam_off_during_pm) {
715 int err;
716
717 tasklet_disable(&jrpriv->irqtask);
718
719 /* mask itr to call flush */
720 clrsetbits_32(&jrpriv->rregs->rconfig_lo, 0, JRCFG_IMSK);
721
722 /* Invalid job in process */
723 err = caam_jr_flush(dev);
724 if (err) {
725 dev_err(dev, "Failed to flush\n");
726 return err;
727 }
728
729 /* Dequeing jobs flushed */
730 caam_jr_dequeue((unsigned long)&suspend_params);
731
732 /* Save state */
733 caam_jr_get_hw_state(dev);
734 } else if (device_may_wakeup(&pdev->dev)) {
735 enable_irq_wake(jrpriv->irq);
736 }
737
738 return 0;
739 }
740
caam_jr_resume(struct device * dev)741 static int caam_jr_resume(struct device *dev)
742 {
743 struct platform_device *pdev = to_platform_device(dev);
744 struct caam_drv_private_jr *jrpriv = platform_get_drvdata(pdev);
745 struct caam_drv_private *ctrlpriv = dev_get_drvdata(dev->parent);
746
747 if (ctrlpriv->caam_off_during_pm) {
748 u64 inp_addr;
749 int err;
750
751 /*
752 * Check if the CAAM has been resetted checking the address of
753 * the input ring
754 */
755 inp_addr = rd_reg64(&jrpriv->rregs->inpring_base);
756 if (inp_addr != 0) {
757 /* JR still has some configuration */
758 if (inp_addr == jrpriv->state.inpbusaddr) {
759 /* JR has not been resetted */
760 err = caam_jr_restart_processing(dev);
761 if (err) {
762 dev_err(dev,
763 "Restart processing failed\n");
764 return err;
765 }
766
767 tasklet_enable(&jrpriv->irqtask);
768
769 clrsetbits_32(&jrpriv->rregs->rconfig_lo,
770 JRCFG_IMSK, 0);
771
772 goto add_jr;
773 } else if (ctrlpriv->optee_en) {
774 /* JR has been used by OPTEE, reset it */
775 err = caam_reset_hw_jr(dev);
776 if (err) {
777 dev_err(dev, "Failed to reset JR\n");
778 return err;
779 }
780 } else {
781 /* No explanation, return error */
782 return -EIO;
783 }
784 }
785
786 caam_jr_reset_index(jrpriv);
787 caam_jr_init_hw(dev, jrpriv->state.inpbusaddr,
788 jrpriv->state.outbusaddr);
789
790 tasklet_enable(&jrpriv->irqtask);
791 } else if (device_may_wakeup(&pdev->dev)) {
792 disable_irq_wake(jrpriv->irq);
793 }
794
795 add_jr:
796 spin_lock(&driver_data.jr_alloc_lock);
797 list_add_tail(&jrpriv->list_node, &driver_data.jr_list);
798 spin_unlock(&driver_data.jr_alloc_lock);
799
800 if (jrpriv->hwrng)
801 jrpriv->hwrng = !caam_rng_init(dev->parent);
802
803 return 0;
804 }
805
806 static DEFINE_SIMPLE_DEV_PM_OPS(caam_jr_pm_ops, caam_jr_suspend, caam_jr_resume);
807
808 static const struct of_device_id caam_jr_match[] = {
809 {
810 .compatible = "fsl,sec-v4.0-job-ring",
811 },
812 {
813 .compatible = "fsl,sec4.0-job-ring",
814 },
815 {},
816 };
817 MODULE_DEVICE_TABLE(of, caam_jr_match);
818
819 static struct platform_driver caam_jr_driver = {
820 .driver = {
821 .name = "caam_jr",
822 .of_match_table = caam_jr_match,
823 .pm = pm_ptr(&caam_jr_pm_ops),
824 },
825 .probe = caam_jr_probe,
826 .remove = caam_jr_remove,
827 .shutdown = caam_jr_platform_shutdown,
828 };
829
jr_driver_init(void)830 static int __init jr_driver_init(void)
831 {
832 spin_lock_init(&driver_data.jr_alloc_lock);
833 INIT_LIST_HEAD(&driver_data.jr_list);
834 return platform_driver_register(&caam_jr_driver);
835 }
836
jr_driver_exit(void)837 static void __exit jr_driver_exit(void)
838 {
839 platform_driver_unregister(&caam_jr_driver);
840 }
841
842 module_init(jr_driver_init);
843 module_exit(jr_driver_exit);
844
845 MODULE_LICENSE("GPL");
846 MODULE_DESCRIPTION("FSL CAAM JR request backend");
847 MODULE_AUTHOR("Freescale Semiconductor - NMG/STC");
848