RE: [EXT] Re: [PATCH 01/15] crypto/fsl: Add support for CAAM Job ring driver model

2021-08-18 Thread Gaurav Jain
Hi Simon

> -Original Message-
> From: Simon Glass 
> Sent: Tuesday, August 17, 2021 9:39 PM
> To: Gaurav Jain 
> Cc: U-Boot Mailing List ; Franck Lenormand
> ; Stefano Babic ; Fabio
> Estevam ; Peng Fan ; Priyanka
> Jain ; Ye Li ; Horia Geanta
> ; Ji Luo ; Silvano Di Ninno
> ; Sahil Malhotra ; Pankaj
> Gupta ; Varun Sethi ; dl-uboot-imx
> ; Shengzhou Liu ; Mingkai Hu
> ; Rajesh Bhagat ; Meenakshi
> Aggarwal ; Wasim Khan
> ; Alison Wang ; Pramod
> Kumar ; Andy Tang ;
> Adrian Alonso ; Vladimir Oltean 
> Subject: [EXT] Re: [PATCH 01/15] crypto/fsl: Add support for CAAM Job ring
> driver model
> 
> Caution: EXT Email
> 
> Hi,
> 
> On Mon, 16 Aug 2021 at 02:42, Gaurav Jain  wrote:
> >
> > added device tree support for job ring driver.
> > sec is initialized based on job ring information processed from device
> > tree.
> >
> > Signed-off-by: Gaurav Jain 
> > ---
> >  cmd/Kconfig |   1 +
> >  drivers/crypto/fsl/Kconfig  |   7 +
> >  drivers/crypto/fsl/Makefile |   2 +
> >  drivers/crypto/fsl/jr.c | 314 +++-
> >  drivers/crypto/fsl/jr.h |  14 ++
> >  5 files changed, 229 insertions(+), 109 deletions(-)
> 
> I can't see the cover letter so will reply here.
> 
> This is UCLASS_MISC but it seems to be some sort of crypto accelerator. What
> does it do? How is this modelled in Linux?
> 
> Regards,
> Simon

Yes this is a driver for CAAM crypto accelerator and has been developed using 
the MISC class.

Regards
Gaurav Jain


Re: [PATCH 01/15] crypto/fsl: Add support for CAAM Job ring driver model

2021-08-17 Thread Simon Glass
Hi,

On Mon, 16 Aug 2021 at 02:42, Gaurav Jain  wrote:
>
> added device tree support for job ring driver.
> sec is initialized based on job ring information processed
> from device tree.
>
> Signed-off-by: Gaurav Jain 
> ---
>  cmd/Kconfig |   1 +
>  drivers/crypto/fsl/Kconfig  |   7 +
>  drivers/crypto/fsl/Makefile |   2 +
>  drivers/crypto/fsl/jr.c | 314 +++-
>  drivers/crypto/fsl/jr.h |  14 ++
>  5 files changed, 229 insertions(+), 109 deletions(-)

I can't see the cover letter so will reply here.

This is UCLASS_MISC but it seems to be some sort of crypto
accelerator. What does it do? How is this modelled in Linux?

Regards,
Simon


[PATCH 01/15] crypto/fsl: Add support for CAAM Job ring driver model

2021-08-16 Thread Gaurav Jain
added device tree support for job ring driver.
sec is initialized based on job ring information processed
from device tree.

Signed-off-by: Gaurav Jain 
---
 cmd/Kconfig |   1 +
 drivers/crypto/fsl/Kconfig  |   7 +
 drivers/crypto/fsl/Makefile |   2 +
 drivers/crypto/fsl/jr.c | 314 +++-
 drivers/crypto/fsl/jr.h |  14 ++
 5 files changed, 229 insertions(+), 109 deletions(-)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index ffef3cc76c..7e92e9df7d 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1985,6 +1985,7 @@ config CMD_AES
 
 config CMD_BLOB
bool "Enable the 'blob' command"
+   select FSL_BLOB
depends on !MX6ULL && !MX6SLL && !MX6SL
select IMX_HAB if ARCH_MX6 || ARCH_MX7 || ARCH_MX7ULP || ARCH_IMX8M
help
diff --git a/drivers/crypto/fsl/Kconfig b/drivers/crypto/fsl/Kconfig
index 1f5dfb94bb..6d6c3f8d39 100644
--- a/drivers/crypto/fsl/Kconfig
+++ b/drivers/crypto/fsl/Kconfig
@@ -64,4 +64,11 @@ config FSL_CAAM_RNG
  using the prediction resistance flag which means the DRGB is
  reseeded from the TRNG every time random data is generated.
 
+config FSL_BLOB
+bool "Enable Blob Encap/Decap, Blob KEK support"
+   help
+ Enable support for the hardware based crytographic blob encap/decap
+ module of the CAAM. blobs can be safely placed into non-volatile
+ storage. blobs can only be decapsulated by the SoC that created it.
+ Enable support for blob key encryption key generation.
 endif
diff --git a/drivers/crypto/fsl/Makefile b/drivers/crypto/fsl/Makefile
index f9c3ccecfc..567ab6a821 100644
--- a/drivers/crypto/fsl/Makefile
+++ b/drivers/crypto/fsl/Makefile
@@ -1,10 +1,12 @@
 # SPDX-License-Identifier: GPL-2.0+
 #
 # Copyright 2014 Freescale Semiconductor, Inc.
+# Copyright 2021 NXP
 
 obj-y += sec.o
 obj-$(CONFIG_FSL_CAAM) += jr.o fsl_hash.o jobdesc.o error.o
 obj-$(CONFIG_CMD_BLOB)$(CONFIG_IMX_CAAM_DEK_ENCAP) += fsl_blob.o
+obj-$(CONFIG_FSL_BLOB) += fsl_blob.o
 obj-$(CONFIG_RSA_FREESCALE_EXP) += fsl_rsa.o
 obj-$(CONFIG_FSL_CAAM_RNG) += rng.o
 obj-$(CONFIG_FSL_MFGPROT) += fsl_mfgprot.o
diff --git a/drivers/crypto/fsl/jr.c b/drivers/crypto/fsl/jr.c
index 22b649219e..c5a8b0459e 100644
--- a/drivers/crypto/fsl/jr.c
+++ b/drivers/crypto/fsl/jr.c
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright 2008-2014 Freescale Semiconductor, Inc.
- * Copyright 2018 NXP
+ * Copyright 2018, 2021 NXP
  *
  * Based on CAAM driver in drivers/crypto/caam in Linux
  */
@@ -11,7 +11,6 @@
 #include 
 #include 
 #include 
-#include "fsl_sec.h"
 #include "jr.h"
 #include "jobdesc.h"
 #include "desc_constr.h"
@@ -21,8 +20,11 @@
 #include 
 #include 
 #endif
+#include 
 #include 
 #include 
+#include 
+#include 
 
 #define CIRC_CNT(head, tail, size) (((head) - (tail)) & (size - 1))
 #define CIRC_SPACE(head, tail, size)   CIRC_CNT((tail), (head) + 1, (size))
@@ -35,20 +37,30 @@ uint32_t sec_offset[CONFIG_SYS_FSL_MAX_NUM_OF_SEC] = {
 #endif
 };
 
+#if CONFIG_IS_ENABLED(DM)
+struct udevice *caam_dev;
+#else
 #define SEC_ADDR(idx)  \
(ulong)((CONFIG_SYS_FSL_SEC_ADDR + sec_offset[idx]))
 
 #define SEC_JR0_ADDR(idx)  \
(ulong)(SEC_ADDR(idx) + \
 (CONFIG_SYS_FSL_JR0_OFFSET - CONFIG_SYS_FSL_SEC_OFFSET))
+struct caam_regs caam_st;
+#endif
 
-struct jobring jr0[CONFIG_SYS_FSL_MAX_NUM_OF_SEC];
+static inline u32 jr_start_reg(u8 jrid)
+{
+   return (1 << jrid);
+}
 
-static inline void start_jr0(uint8_t sec_idx)
+#ifndef CONFIG_ARCH_IMX8
+static inline void start_jr(struct caam_regs *caam)
 {
-   ccsr_sec_t *sec = (void *)SEC_ADDR(sec_idx);
+   ccsr_sec_t *sec = caam->sec;
u32 ctpr_ms = sec_in32(>ctpr_ms);
u32 scfgr = sec_in32(>scfgr);
+   u32 jrstart = jr_start_reg(caam->jrid);
 
if (ctpr_ms & SEC_CTPR_MS_VIRT_EN_INCL) {
/* VIRT_EN_INCL = 1 & VIRT_EN_POR = 1 or
@@ -56,23 +68,17 @@ static inline void start_jr0(uint8_t sec_idx)
 */
if ((ctpr_ms & SEC_CTPR_MS_VIRT_EN_POR) ||
(scfgr & SEC_SCFGR_VIRT_EN))
-   sec_out32(>jrstartr, CONFIG_JRSTARTR_JR0);
+   sec_out32(>jrstartr, jrstart);
} else {
/* VIRT_EN_INCL = 0 && VIRT_EN_POR_VALUE = 1 */
if (ctpr_ms & SEC_CTPR_MS_VIRT_EN_POR)
-   sec_out32(>jrstartr, CONFIG_JRSTARTR_JR0);
+   sec_out32(>jrstartr, jrstart);
}
 }
+#endif
 
-static inline void jr_reset_liodn(uint8_t sec_idx)
-{
-   ccsr_sec_t *sec = (void *)SEC_ADDR(sec_idx);
-   sec_out32(>jrliodnr[0].ls, 0);
-}
-
-static inline void jr_disable_irq(uint8_t sec_idx)
+static inline void jr_disable_irq(struct jr_regs *regs)
 {
-   struct jr_regs *regs = (struct jr_regs *)SEC_JR0_ADDR(sec_idx);
uint32_t jrcfg = sec_in32(>jrcfg1);
 
jrcfg = jrcfg | JR_INTMASK;
@@ -80,10 +86,10 @@ static inline void