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 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 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 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 */ 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 */ 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 */ 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 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 */ 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 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 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 */ 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 */ 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 **/ 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 **/ 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 **/ 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 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 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 */ 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 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 */ 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 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 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 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 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 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