summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJi Luo <ji.luo@nxp.com>2018-08-19 19:16:43 +0800
committerJi Luo <ji.luo@nxp.com>2018-08-22 17:36:43 +0800
commitb0e849fb2dfd483e039571c4fe0aab7f65273bb3 (patch)
treedad2851c9abd9beaaed736de1b3931ee5ffec836 /drivers
parentd6b9992db082920b55c08d33df1cb03942939e7f (diff)
MA-12421 Fix CAAM not work on Android Things
Blob buffer size is 48 bytes larger than the plain text buffer, set correct range when flush the dcache. Also use cache aligned buffer for the blob/plain_text to avoid failure in CAAM. Change-Id: I3b377cfeb8f5bd9c76233827b2c9c7bd0d788c9b Signed-off-by: Ji Luo <ji.luo@nxp.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/crypto/fsl_caam.c20
-rw-r--r--drivers/crypto/fsl_caam_internal.h2
-rw-r--r--drivers/usb/gadget/fastboot_lock_unlock.c14
3 files changed, 21 insertions, 15 deletions
diff --git a/drivers/crypto/fsl_caam.c b/drivers/crypto/fsl_caam.c
index c176294774..52c8797c2b 100644
--- a/drivers/crypto/fsl_caam.c
+++ b/drivers/crypto/fsl_caam.c
@@ -141,16 +141,16 @@ u32 caam_decap_blob(u32 plain_text, u32 blob_addr, u32 size)
init_job_desc(decap_desc, 0);
append_load(decap_desc, PTR2CAAMDMA(skeymod), key_sz,
LDST_CLASS_2_CCB | LDST_SRCDST_BYTE_KEY);
- append_seq_in_ptr_intlen(decap_desc, blob_addr, size + 48, 0);
+ append_seq_in_ptr_intlen(decap_desc, blob_addr, size + CAAM_PAD_LEN, 0);
append_seq_out_ptr_intlen(decap_desc, plain_text, size, 0);
append_operation(decap_desc, OP_TYPE_DECAP_PROTOCOL | OP_PCLID_BLOB);
flush_dcache_range((uintptr_t)blob_addr & ALIGN_MASK,
((uintptr_t)blob_addr & ALIGN_MASK)
- + ROUND(2 * size, ARCH_DMA_MINALIGN));
+ + ROUND(size + CAAM_PAD_LEN, ARCH_DMA_MINALIGN));
flush_dcache_range((uintptr_t)plain_text & ALIGN_MASK,
(plain_text & ALIGN_MASK)
- + ROUND(2 * size, ARCH_DMA_MINALIGN));
+ + ROUND(size, ARCH_DMA_MINALIGN));
/* Run descriptor with result written to blob buffer */
ret = do_job(decap_desc);
@@ -186,15 +186,15 @@ u32 caam_gen_blob(u32 plain_data_addr, u32 blob_addr, u32 size)
append_load(encap_desc, PTR2CAAMDMA(skeymod), key_sz,
LDST_CLASS_2_CCB | LDST_SRCDST_BYTE_KEY);
append_seq_in_ptr_intlen(encap_desc, plain_data_addr, size, 0);
- append_seq_out_ptr_intlen(encap_desc, PTR2CAAMDMA(blob), size + 48, 0);
+ append_seq_out_ptr_intlen(encap_desc, PTR2CAAMDMA(blob), size + CAAM_PAD_LEN, 0);
append_operation(encap_desc, OP_TYPE_ENCAP_PROTOCOL | OP_PCLID_BLOB);
flush_dcache_range((uintptr_t)plain_data_addr & ALIGN_MASK,
(plain_data_addr & ALIGN_MASK)
- + ROUND(2 * size, ARCH_DMA_MINALIGN));
+ + ROUND(size, ARCH_DMA_MINALIGN));
flush_dcache_range((uintptr_t)blob & ALIGN_MASK,
((uintptr_t)blob & ALIGN_MASK)
- + ROUND(2 * size, ARCH_DMA_MINALIGN));
+ + ROUND(size + CAAM_PAD_LEN, ARCH_DMA_MINALIGN));
ret = do_job(encap_desc);
@@ -544,15 +544,15 @@ static int do_job(u32 *desc)
((uintptr_t)desc & ALIGN_MASK)
+ ROUND(DESC_MAX_SIZE, ARCH_DMA_MINALIGN));
+ flush_dcache_range((uintptr_t)g_jrdata.outrings & ALIGN_MASK,
+ ((uintptr_t)g_jrdata.outrings & ALIGN_MASK)
+ + ROUND(DESC_MAX_SIZE, ARCH_DMA_MINALIGN));
+
/* Inform HW that a new JR is available */
__raw_writel(1, CAAM_IRJAR0);
while (__raw_readl(CAAM_ORSFR0) == 0)
;
- flush_dcache_range((uintptr_t)g_jrdata.outrings & ALIGN_MASK,
- ((uintptr_t)g_jrdata.outrings & ALIGN_MASK)
- + ROUND(DESC_MAX_SIZE, ARCH_DMA_MINALIGN));
-
if (PTR2CAAMDMA(desc) == g_jrdata.outrings[0].desc) {
ret = g_jrdata.outrings[0].status;
} else {
diff --git a/drivers/crypto/fsl_caam_internal.h b/drivers/crypto/fsl_caam_internal.h
index 852672d1cb..dca8ba7169 100644
--- a/drivers/crypto/fsl_caam_internal.h
+++ b/drivers/crypto/fsl_caam_internal.h
@@ -252,4 +252,6 @@ typedef enum {
RNG_DESC_SH1_SIZE + \
RNG_DESC_KEYS_SIZE)
+#define CAAM_PAD_LEN 48
+
#endif /* __CAAM_INTERNAL_H__ */
diff --git a/drivers/usb/gadget/fastboot_lock_unlock.c b/drivers/usb/gadget/fastboot_lock_unlock.c
index 8fe534541c..18d479697c 100644
--- a/drivers/usb/gadget/fastboot_lock_unlock.c
+++ b/drivers/usb/gadget/fastboot_lock_unlock.c
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include "fastboot_lock_unlock.h"
#include <fsl_fastboot.h>
+#include <memalign.h>
#ifdef CONFIG_IMX_TRUSTY_OS
#include <trusty/libtipc.h>
#include <asm/mach-imx/hab.h>
@@ -164,12 +165,13 @@ static int generate_salt(unsigned char* salt) {
}
static FbLockState decrypt_lock_store(unsigned char *bdata) {
- unsigned char plain_data[ENDATA_LEN];
int p = 0, ret;
+ ALLOC_CACHE_ALIGN_BUFFER(uint8_t, plain_data, ENDATA_LEN);
caam_open();
ret = caam_decap_blob((uint32_t)(ulong)plain_data,
- (uint32_t)(ulong)bdata + ENDATA_LEN, ENDATA_LEN);
+ (uint32_t)(ulong)bdata + ROUND(ENDATA_LEN, ARCH_DMA_MINALIGN),
+ ENDATA_LEN);
if (ret != 0) {
printf("Error during blob decap operation: 0x%x\n",ret);
return FASTBOOT_LOCK_ERROR;
@@ -227,7 +229,9 @@ static int encrypt_lock_store(FbLockState lock, unsigned char* bdata) {
*(bdata + p) = lock;
caam_open();
- ret = caam_gen_blob((uint32_t)(ulong)bdata, (uint32_t)(ulong)(bdata + ENDATA_LEN), ENDATA_LEN);
+ ret = caam_gen_blob((uint32_t)(ulong)bdata,
+ (uint32_t)(ulong)bdata + ROUND(ENDATA_LEN, ARCH_DMA_MINALIGN),
+ ENDATA_LEN);
if (ret != 0) {
printf("error in caam_gen_blob:0x%x\n", ret);
return -1;
@@ -330,7 +334,7 @@ int fastboot_set_lock_stat(FbLockState lock) {
int mmc_id;
int status, ret;
- bdata = (unsigned char *)memalign(ALIGN_BYTES, SECTOR_SIZE);
+ bdata = (unsigned char *)memalign(ARCH_DMA_MINALIGN, SECTOR_SIZE);
if (bdata == NULL)
goto fail2;
memset(bdata, 0, SECTOR_SIZE);
@@ -377,7 +381,7 @@ FbLockState fastboot_get_lock_stat(void) {
int mmc_id;
FbLockState ret;
- bdata = (unsigned char *)memalign(ALIGN_BYTES, SECTOR_SIZE);
+ bdata = (unsigned char *)memalign(ARCH_DMA_MINALIGN, SECTOR_SIZE);
if (bdata == NULL)
return g_lockstat;