From 89ff2dcb74806fb19d43d5f2c06fb4335cba1231 Mon Sep 17 00:00:00 2001 From: Ji Luo Date: Fri, 11 Jan 2019 09:01:37 +0800 Subject: [PATCH] MA-13936 Add CAAM self test Add CAAM RNG generating and BLOB encap/decap self test cases. Test: Test cases pass on imx8qm_mek/imx6qp_sabresd. Change-Id: I538f7b1581b36df83a3006ac133ca9e7b57ab4f0 Signed-off-by: Ji Luo --- drivers/crypto/Kconfig | 3 +++ drivers/crypto/fsl_caam.c | 52 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index 1ea116be75..02f05c04ab 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig @@ -1,5 +1,8 @@ menu "Hardware crypto devices" +config CAAM_KB_SELF_TEST + bool "Freescale CAAM SELF TEST" + source drivers/crypto/fsl/Kconfig endmenu diff --git a/drivers/crypto/fsl_caam.c b/drivers/crypto/fsl_caam.c index 547b41a885..2267a002b8 100644 --- a/drivers/crypto/fsl_caam.c +++ b/drivers/crypto/fsl_caam.c @@ -49,6 +49,7 @@ static void caam_clock_enable(void); static int do_cfg_jrqueue(void); static int do_job(u32 *desc); static int jr_reset(void); +static void caam_test(void); /* * Structures @@ -230,12 +231,12 @@ u32 caam_hwrng(u8 *output_ptr, u32 output_len) ((uintptr_t)hwrng_desc & ALIGN_MASK) + ROUND(DESC_MAX_SIZE, ARCH_DMA_MINALIGN)); - ret = do_job(hwrng_desc); - flush_dcache_range((uintptr_t)output & ALIGN_MASK, ((uintptr_t)output & ALIGN_MASK) + ROUND(2 * output_len, ARCH_DMA_MINALIGN)); + ret = do_job(hwrng_desc); + if (ret != SUCCESS) { printf("Error: RNG generate failed 0x%x\n", ret); } @@ -280,6 +281,10 @@ void caam_open(void) } rng_init(); + +#ifdef CONFIG_CAAM_KB_SELF_TEST + caam_test(); +#endif } static void caam_clock_enable(void) @@ -746,3 +751,46 @@ static void rng_init(void) return; } +static void caam_hwrng_test(void) +{ + ALLOC_CACHE_ALIGN_BUFFER(uint8_t, out1, 32); + ALLOC_CACHE_ALIGN_BUFFER(uint8_t, out2, 32); + + memset(out1, 0x00, sizeof(out1)); + memset(out2, 0x00, sizeof(out2)); + + caam_hwrng(out1, sizeof(out1)); + caam_hwrng(out2, sizeof(out2)); + + if (memcmp(out1, out2, sizeof(out1))) + printf("caam hwrng test pass!\n"); + else + printf("caam hwrng test fail!\n"); +} + +static void caam_blob_test(void) +{ + ALLOC_CACHE_ALIGN_BUFFER(uint8_t, plain, 32); + ALLOC_CACHE_ALIGN_BUFFER(uint8_t, blob, 128); + ALLOC_CACHE_ALIGN_BUFFER(uint8_t, plain_bak, 32); + + memset(plain, 0x00, sizeof(plain)); + memset(plain_bak, 0xff, sizeof(plain_bak)); + + /* encapsulate blob */ + caam_gen_blob((ulong)plain, (ulong)blob, sizeof(plain)); + + /* decapsulate blob */ + caam_decap_blob((ulong)plain_bak, (ulong)blob, sizeof(plain_bak)); + + if (memcmp(plain, plain_bak, sizeof(plain))) + printf("caam blob test fail!\n"); + else + printf("caam blob test pass!\n"); +} + +static void caam_test(void) +{ + caam_hwrng_test(); + caam_blob_test(); +} -- 2.17.1