diff options
author | ulises <ulises.cardenas@freescale.com> | 2015-11-18 08:10:26 -0600 |
---|---|---|
committer | Dan Douglass <dan.douglass@freescale.com> | 2016-03-18 14:28:58 -0500 |
commit | b51b2dab78c43e6483c4d2028253880b36fcfdff (patch) | |
tree | 95c3aea88dab6724573bd79287706b8e0b094f11 | |
parent | 52c42162b059bda9461378ca2942766fee7b572f (diff) |
MLK-11922 i.mx6: Linux 3.14.28 CAAM & SNVS enabled by default.
JTAG, DS-5 attachment causes exceptions
Added properties to device tree, in order to enable and disable
alarms. The following are the available alarms:
-JTAG active
-WatchDOG 2 reset
-Internal Boot
-External Tamper Detection pad
-rw-r--r-- | arch/arm/boot/dts/imx6qdl.dtsi | 4 | ||||
-rw-r--r-- | arch/arm/boot/dts/imx6sx.dtsi | 4 | ||||
-rw-r--r-- | arch/arm/boot/dts/imx6ul.dtsi | 12 | ||||
-rw-r--r-- | arch/arm/boot/dts/imx7d.dtsi | 8 | ||||
-rw-r--r-- | drivers/crypto/caam/secvio.c | 45 |
5 files changed, 57 insertions, 16 deletions
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index 777504753370..c712087a97db 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi @@ -109,6 +109,10 @@ compatible = "fsl,imx6q-caam-secvio"; interrupts = <0 20 0x04>; secvio_src = <0x8000001d>; + jtag-tamper = "disabled"; + watchdog-tamper = "enabled"; + internal-boot-tamper = "enabled"; + external-pin-tamper = "disabled"; }; gpmi: gpmi-nand@00112000 { diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi index 521113d65592..5b4dbd09f134 100644 --- a/arch/arm/boot/dts/imx6sx.dtsi +++ b/arch/arm/boot/dts/imx6sx.dtsi @@ -239,6 +239,10 @@ compatible = "fsl,imx6q-caam-secvio"; interrupts = <0 20 0x04>; secvio_src = <0x8000001d>; + jtag-tamper = "disabled"; + watchdog-tamper = "enabled"; + internal-boot-tamper = "enabled"; + external-pin-tamper = "disabled"; }; gpu: gpu@01800000 { diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi index af8bcf3cc5a5..618fd476b1de 100644 --- a/arch/arm/boot/dts/imx6ul.dtsi +++ b/arch/arm/boot/dts/imx6ul.dtsi @@ -159,13 +159,17 @@ }; caam_sm: caam-sm@00100000 { - compatible = "fsl,imx7d-caam-sm", "fsl,imx6q-caam-sm"; - reg = <0x00100000 0x3fff>; + compatible = "fsl,imx7d-caam-sm", "fsl,imx6q-caam-sm"; + reg = <0x00100000 0x3fff>; }; irq_sec_vio: caam_secvio { - compatible = "fsl,imx7d-caam-secvio", "fsl,imx6q-caam-secvio"; - interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; + compatible = "fsl,imx7d-caam-secvio", "fsl,imx6q-caam-secvio"; + interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; + jtag-tamper = "disabled"; + watchdog-tamper = "enabled"; + internal-boot-tamper = "enabled"; + external-pin-tamper = "disabled"; }; ocrams: sram@00900000 { diff --git a/arch/arm/boot/dts/imx7d.dtsi b/arch/arm/boot/dts/imx7d.dtsi index a6fc3f0bcabe..e947783ae4c3 100644 --- a/arch/arm/boot/dts/imx7d.dtsi +++ b/arch/arm/boot/dts/imx7d.dtsi @@ -343,8 +343,12 @@ }; irq_sec_vio: caam_secvio { - compatible = "fsl,imx7d-caam-secvio", "fsl,imx6q-caam-secvio"; - interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; + compatible = "fsl,imx7d-caam-secvio", "fsl,imx6q-caam-secvio"; + interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; + jtag-tamper = "disabled"; + watchdog-tamper = "enabled"; + internal-boot-tamper = "enabled"; + external-pin-tamper = "disabled"; }; pmu { diff --git a/drivers/crypto/caam/secvio.c b/drivers/crypto/caam/secvio.c index e798bdbd482e..79c06b07812b 100644 --- a/drivers/crypto/caam/secvio.c +++ b/drivers/crypto/caam/secvio.c @@ -1,7 +1,7 @@ /* * SNVS Security Violation Handler - * Copyright (C) 2012-2015 Freescale Semiconductor, Inc., All Rights Reserved + * Copyright (C) 2012-2016 Freescale Semiconductor, Inc., All Rights Reserved */ #include "compat.h" @@ -205,6 +205,8 @@ static int snvs_secvio_probe(struct platform_device *pdev) struct snvs_full __iomem *snvsregs; int i, error; u32 hpstate; + const void *jtd, *wtd, *itd, *etd; + u32 td_en; svpriv = kzalloc(sizeof(struct snvs_secvio_drv_private), GFP_KERNEL); if (!svpriv) @@ -227,6 +229,34 @@ static int snvs_secvio_probe(struct platform_device *pdev) return -EINVAL; } + jtd = of_get_property(npirq, "jtag-tamper", NULL); + wtd = of_get_property(npirq, "watchdog-tamper", NULL); + itd = of_get_property(npirq, "internal-boot-tamper", NULL); + etd = of_get_property(npirq, "external-pin-tamper", NULL); + if (!jtd | !wtd | !itd | !etd ) { + dev_err(svdev, "can't identify tamper alarm configuration\n"); + kfree(svpriv); + return -EINVAL; + } + + /* + * Configure all sources according to device tree property. + * If the property is enabled then the source is ser as + * fatal violations except LP section, + * source #5 (typically used as an external tamper detect), and + * source #3 (typically unused). Whenever the transition to + * secure mode has occurred, these will now be "fatal" violations + */ + td_en = HP_SECVIO_INTEN_SRC0; + if (!strcmp(jtd, "enabled")) + td_en |= HP_SECVIO_INTEN_SRC1; + if (!strcmp(wtd, "enabled")) + td_en |= HP_SECVIO_INTEN_SRC2; + if (!strcmp(itd, "enabled")) + td_en |= HP_SECVIO_INTEN_SRC4; + if (!strcmp(etd, "enabled")) + td_en |= HP_SECVIO_INTEN_SRC5; + snvsregs = of_iomap(np, 0); if (!snvsregs) { dev_err(svdev, "register mapping failed\n"); @@ -240,6 +270,10 @@ static int snvs_secvio_probe(struct platform_device *pdev) svpriv->clk = NULL; } + /* Write the Secvio Enable Config the SVCR */ + wr_reg32(&svpriv->svregs->hp.secvio_ctl, td_en); + wr_reg32(&svpriv->svregs->hp.secvio_intcfg, td_en); + /* Device data set up. Now init interrupt source descriptions */ for (i = 0; i < MAX_SECVIO_SOURCES; i++) { svpriv->intsrc[i].intname = violation_src_name[i]; @@ -262,15 +296,6 @@ static int snvs_secvio_probe(struct platform_device *pdev) } clk_prepare_enable(svpriv->clk); - /* - * Configure all sources as fatal violations except LP section, - * source #5 (typically used as an external tamper detect), and - * source #3 (typically unused). Whenever the transition to - * secure mode has occurred, these will now be "fatal" violations - */ - wr_reg32(&svpriv->svregs->hp.secvio_intcfg, - HP_SECVIO_INTEN_SRC4 | HP_SECVIO_INTEN_SRC2 | - HP_SECVIO_INTEN_SRC1 | HP_SECVIO_INTEN_SRC0); hpstate = (rd_reg32(&svpriv->svregs->hp.status) & HP_STATUS_SSM_ST_MASK) >> HP_STATUS_SSM_ST_SHIFT; |