ctrl.c revision 54e198d4c162b36ba864ecc658c829454074523f
18e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips/* 28e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * CAAM control-plane driver backend 38e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * Controller-level driver, kernel property detection, initialization 48e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * 58e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * Copyright 2008-2011 Freescale Semiconductor, Inc. 68e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips */ 78e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 88e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#include "compat.h" 98e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#include "regs.h" 108e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#include "intern.h" 118e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#include "jr.h" 128e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 138e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsstatic int caam_remove(struct platform_device *pdev) 148e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips{ 158e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct device *ctrldev; 168e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_drv_private *ctrlpriv; 178e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_drv_private_jr *jrpriv; 188e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_full __iomem *topregs; 198e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips int ring, ret = 0; 208e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 218e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrldev = &pdev->dev; 228e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv = dev_get_drvdata(ctrldev); 238e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips topregs = (struct caam_full __iomem *)ctrlpriv->ctrl; 248e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 258e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* shut down JobRs */ 268e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips for (ring = 0; ring < ctrlpriv->total_jobrs; ring++) { 278e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ret |= caam_jr_shutdown(ctrlpriv->jrdev[ring]); 288e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips jrpriv = dev_get_drvdata(ctrlpriv->jrdev[ring]); 298e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips irq_dispose_mapping(jrpriv->irq); 308e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips } 318e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 328e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Shut down debug views */ 338e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#ifdef CONFIG_DEBUG_FS 348e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_remove_recursive(ctrlpriv->dfs_root); 358e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#endif 368e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 378e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Unmap controller region */ 388e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips iounmap(&topregs->ctrl); 398e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 408e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips kfree(ctrlpriv->jrdev); 418e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips kfree(ctrlpriv); 428e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 438e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return ret; 448e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips} 458e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 468e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips/* Probe routine for CAAM top (controller) level */ 478e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsstatic int caam_probe(struct platform_device *pdev, 488e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips const struct of_device_id *devmatch) 498e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips{ 508e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips int d, ring, rspec; 518e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct device *dev; 528e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct device_node *nprop, *np; 538e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_ctrl __iomem *ctrl; 548e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_full __iomem *topregs; 558e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_drv_private *ctrlpriv; 568e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_perfmon *perfmon; 578e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips struct caam_deco **deco; 588e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips u32 deconum; 598e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 608e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv = kzalloc(sizeof(struct caam_drv_private), GFP_KERNEL); 618e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips if (!ctrlpriv) 628e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return -ENOMEM; 638e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 648e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dev = &pdev->dev; 658e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dev_set_drvdata(dev, ctrlpriv); 668e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->pdev = pdev; 678e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips nprop = pdev->dev.of_node; 688e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 698e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Get configuration properties from device tree */ 708e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* First, get register page */ 718e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrl = of_iomap(nprop, 0); 728e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips if (ctrl == NULL) { 738e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dev_err(dev, "caam: of_iomap() failed\n"); 748e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return -ENOMEM; 758e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips } 768e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctrl = (struct caam_ctrl __force *)ctrl; 778e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 788e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* topregs used to derive pointers to CAAM sub-blocks only */ 798e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips topregs = (struct caam_full __iomem *)ctrl; 808e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 818e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Get the IRQ of the controller (for security violations only) */ 828e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->secvio_irq = of_irq_to_resource(nprop, 0, NULL); 838e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 848e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* 858e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel, 868e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * 36-bit pointers in master configuration register 878e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips */ 888e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips setbits32(&topregs->ctrl.mcr, MCFGR_WDENABLE | 898e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0)); 908e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 918e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips if (sizeof(dma_addr_t) == sizeof(u64)) 928e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dma_set_mask(dev, DMA_BIT_MASK(36)); 938e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 948e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Find out how many DECOs are present */ 958e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips deconum = (rd_reg64(&topregs->ctrl.perfmon.cha_num) & 968e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips CHA_NUM_DECONUM_MASK) >> CHA_NUM_DECONUM_SHIFT; 978e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 988e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->deco = kmalloc(deconum * sizeof(struct caam_deco *), 998e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips GFP_KERNEL); 1008e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1018e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips deco = (struct caam_deco __force **)&topregs->deco; 1028e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips for (d = 0; d < deconum; d++) 1038e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->deco[d] = deco[d]; 1048e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1058e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* 1068e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * Detect and enable JobRs 1078e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * First, find out how many ring spec'ed, allocate references 1088e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * for all, then go probe each one. 1098e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips */ 1108e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips rspec = 0; 11154e198d4c162b36ba864ecc658c829454074523fKim Phillips for_each_compatible_node(np, NULL, "fsl,sec-v4.0-job-ring") 1128e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips rspec++; 1138e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->jrdev = kzalloc(sizeof(struct device *) * rspec, GFP_KERNEL); 1148e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips if (ctrlpriv->jrdev == NULL) { 1158e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips iounmap(&topregs->ctrl); 1168e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return -ENOMEM; 1178e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips } 1188e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1198e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ring = 0; 1208e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->total_jobrs = 0; 12154e198d4c162b36ba864ecc658c829454074523fKim Phillips for_each_compatible_node(np, NULL, "fsl,sec-v4.0-job-ring") { 1228e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips caam_jr_probe(pdev, np, ring); 1238e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->total_jobrs++; 1248e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ring++; 1258e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips } 1268e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1278e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Check to see if QI present. If so, enable */ 1288e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->qi_present = !!(rd_reg64(&topregs->ctrl.perfmon.comp_parms) & 1298e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips CTPR_QI_MASK); 1308e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips if (ctrlpriv->qi_present) { 1318e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->qi = (struct caam_queue_if __force *)&topregs->qi; 1328e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* This is all that's required to physically enable QI */ 1338e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips wr_reg32(&topregs->qi.qi_control_lo, QICTL_DQEN); 1348e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips } 1358e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1368e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* If no QI and no rings specified, quit and go home */ 1378e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips if ((!ctrlpriv->qi_present) && (!ctrlpriv->total_jobrs)) { 1388e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dev_err(dev, "no queues configured, terminating\n"); 1398e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips caam_remove(pdev); 1408e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return -ENOMEM; 1418e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips } 1428e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1438e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* NOTE: RTIC detection ought to go here, around Si time */ 1448e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1458e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Initialize queue allocator lock */ 1468e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips spin_lock_init(&ctrlpriv->jr_alloc_lock); 1478e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1488e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Report "alive" for developer to see */ 1498e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dev_info(dev, "device ID = 0x%016llx\n", 1508e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips rd_reg64(&topregs->ctrl.perfmon.caam_id)); 1518e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips dev_info(dev, "job rings = %d, qi = %d\n", 1528e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->total_jobrs, ctrlpriv->qi_present); 1538e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1548e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#ifdef CONFIG_DEBUG_FS 1558e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* 1568e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * FIXME: needs better naming distinction, as some amalgamation of 1578e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * "caam" and nprop->full_name. The OF name isn't distinctive, 1588e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips * but does separate instances 1598e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips */ 1608e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips perfmon = (struct caam_perfmon __force *)&ctrl->perfmon; 1618e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1628e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->dfs_root = debugfs_create_dir("caam", NULL); 1638e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl = debugfs_create_dir("ctl", ctrlpriv->dfs_root); 1648e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1658e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Controller-level - performance monitor counters */ 1668e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_rq_dequeued = 1678e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("rq_dequeued", 1688e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1698e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->req_dequeued); 1708e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_ob_enc_req = 1718e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("ob_rq_encrypted", 1728e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1738e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->ob_enc_req); 1748e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_ib_dec_req = 1758e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("ib_rq_decrypted", 1768e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1778e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->ib_dec_req); 1788e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_ob_enc_bytes = 1798e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("ob_bytes_encrypted", 1808e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1818e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->ob_enc_bytes); 1828e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_ob_prot_bytes = 1838e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("ob_bytes_protected", 1848e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1858e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->ob_prot_bytes); 1868e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_ib_dec_bytes = 1878e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("ib_bytes_decrypted", 1888e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1898e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->ib_dec_bytes); 1908e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_ib_valid_bytes = 1918e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("ib_bytes_validated", 1928e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1938e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->ib_valid_bytes); 1948e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 1958e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Controller level - global status values */ 1968e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_faultaddr = 1978e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u64("fault_addr", 1988e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 1998e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->faultaddr); 2008e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_faultdetail = 2018e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u32("fault_detail", 2028e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 2038e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->faultdetail); 2048e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_faultstatus = 2058e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips debugfs_create_u32("fault_status", 2068e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | S_IRGRP | S_IROTH, 2078e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, &perfmon->status); 2088e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2098e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips /* Internal covering keys (useful in non-secure mode only) */ 2108e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_kek_wrap.data = &ctrlpriv->ctrl->kek[0]; 2118e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_kek_wrap.size = KEK_KEY_SIZE * sizeof(u32); 2128e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_kek = debugfs_create_blob("kek", 2138e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | 2148e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IRGRP | S_IROTH, 2158e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, 2168e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips &ctrlpriv->ctl_kek_wrap); 2178e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2188e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_tkek_wrap.data = &ctrlpriv->ctrl->tkek[0]; 2198e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_tkek_wrap.size = KEK_KEY_SIZE * sizeof(u32); 2208e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_tkek = debugfs_create_blob("tkek", 2218e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | 2228e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IRGRP | S_IROTH, 2238e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, 2248e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips &ctrlpriv->ctl_tkek_wrap); 2258e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2268e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_tdsk_wrap.data = &ctrlpriv->ctrl->tdsk[0]; 2278e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_tdsk_wrap.size = KEK_KEY_SIZE * sizeof(u32); 2288e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl_tdsk = debugfs_create_blob("tdsk", 2298e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IFCHR | S_IRUSR | 2308e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips S_IRGRP | S_IROTH, 2318e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips ctrlpriv->ctl, 2328e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips &ctrlpriv->ctl_tdsk_wrap); 2338e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips#endif 2348e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return 0; 2358e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips} 2368e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2378e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsstatic struct of_device_id caam_match[] = { 2388e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips { 23954e198d4c162b36ba864ecc658c829454074523fKim Phillips .compatible = "fsl,sec-v4.0", 2408e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips }, 2418e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips {}, 2428e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips}; 2438e8ec596e6c0144e2dd500a57ee23dde9684df46Kim PhillipsMODULE_DEVICE_TABLE(of, caam_match); 2448e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2458e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsstatic struct of_platform_driver caam_driver = { 2468e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips .driver = { 2478e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips .name = "caam", 2488e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips .owner = THIS_MODULE, 2498e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips .of_match_table = caam_match, 2508e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips }, 2518e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips .probe = caam_probe, 2528e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips .remove = __devexit_p(caam_remove), 2538e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips}; 2548e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2558e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsstatic int __init caam_base_init(void) 2568e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips{ 2578e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return of_register_platform_driver(&caam_driver); 2588e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips} 2598e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2608e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsstatic void __exit caam_base_exit(void) 2618e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips{ 2628e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips return of_unregister_platform_driver(&caam_driver); 2638e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips} 2648e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2658e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsmodule_init(caam_base_init); 2668e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillipsmodule_exit(caam_base_exit); 2678e8ec596e6c0144e2dd500a57ee23dde9684df46Kim Phillips 2688e8ec596e6c0144e2dd500a57ee23dde9684df46Kim PhillipsMODULE_LICENSE("GPL"); 2698e8ec596e6c0144e2dd500a57ee23dde9684df46Kim PhillipsMODULE_DESCRIPTION("FSL CAAM request backend"); 2708e8ec596e6c0144e2dd500a57ee23dde9684df46Kim PhillipsMODULE_AUTHOR("Freescale Semiconductor - NMG/STC"); 271