update code for continued support with i.MX6

This commit is contained in:
Jacob Barthelmeh
2022-05-13 13:21:45 -06:00
parent f12fd6ab8b
commit 3a4feddf75
2 changed files with 42 additions and 25 deletions

View File

@ -242,12 +242,12 @@ Error caamFreePart(unsigned int part)
#if defined(WOLFSSL_CAAM_DEBUG) || defined(WOLFSSL_CAAM_PRINT)
printf("freeing partition %d\n", part);
#endif
CAAM_WRITE(CAAM_SM_CMD, (part << 8U) | 0x3U);
CAAM_WRITE(caam.ring.BaseAddr + CAAM_SM_CMD, (part << 8U) | 0x3U);
status = CAAM_READ(CAAM_SM_STATUS);
status = CAAM_READ(caam.ring.BaseAddr + CAAM_SM_STATUS);
while (((status & 0x00004000U) > 0U) && ((status & 0x00003000U) == 0U)) {
CAAM_CPU_CHILL();
status = CAAM_READ(CAAM_SM_STATUS);
status = CAAM_READ(caam.ring.BaseAddr + CAAM_SM_STATUS);
}
if (((status & 0x00003000U) > 0U) || ((status & 0x0000C000U) > 0U)) {
@ -489,18 +489,23 @@ int caamInitRng(struct CAAM_DEVICE* dev)
/* Set up use of the TRNG for seeding wolfSSL HASH-DRBG */
/* check out the status and see if already setup */
CAAM_WRITE(CAAM_RTMCTL, CAAM_PRGM);
CAAM_WRITE(CAAM_RTMCTL, CAAM_READ(CAAM_RTMCTL) | CAAM_RTMCTL_RESET);
CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, CAAM_PRGM);
CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL,
CAAM_READ(caam.baseAddr + CAAM_RTMCTL) | CAAM_RTMCTL_RESET);
/* Set up reading from TRNG */
CAAM_WRITE(CAAM_RTMCTL, CAAM_READ(CAAM_RTMCTL) | CAAM_TRNG);
CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL,
CAAM_READ(caam.baseAddr + CAAM_RTMCTL) | CAAM_TRNG);
/* Set up delay for TRNG
* Shift left with RTSDCTL because 0-15 is for sample number
* Also setting the max and min frequencies */
CAAM_WRITE(CAAM_RTSDCTL, (entropy_delay << 16) | CAAM_ENT_SAMPLE);
CAAM_WRITE(CAAM_RTFRQMIN, entropy_delay >> CAAM_ENT_MINSHIFT);
CAAM_WRITE(CAAM_RTFRQMAX, entropy_delay << CAAM_ENT_MAXSHIFT);
CAAM_WRITE(caam.baseAddr + CAAM_RTSDCTL,
(entropy_delay << 16) | CAAM_ENT_SAMPLE);
CAAM_WRITE(caam.baseAddr + CAAM_RTFRQMIN,
entropy_delay >> CAAM_ENT_MINSHIFT);
CAAM_WRITE(caam.baseAddr + CAAM_RTFRQMAX,
entropy_delay << CAAM_ENT_MAXSHIFT);
#ifdef WOLFSSL_CAAM_PRINT
printf("Attempt with entropy delay set to %d\n", entropy_delay);
@ -510,14 +515,14 @@ int caamInitRng(struct CAAM_DEVICE* dev)
#endif
/* Set back to run mode and clear RTMCL error bit */
reg = CAAM_READ(CAAM_RTMCTL) & (~CAAM_PRGM);
CAAM_WRITE(CAAM_RTMCTL, reg);
reg = CAAM_READ(CAAM_RTMCTL);
reg = CAAM_READ(caam.baseAddr + CAAM_RTMCTL) & (~CAAM_PRGM);
CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, reg);
reg = CAAM_READ(caam.baseAddr + CAAM_RTMCTL);
reg |= CAAM_CTLERR;
CAAM_WRITE(CAAM_RTMCTL, reg);
CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, reg);
/* check out the status and see if already setup */
reg = CAAM_READ(CAAM_RDSTA);
reg = CAAM_READ(caam.baseAddr + CAAM_RDSTA);
if (((reg >> 16) & 0xF) > 0) {
WOLFSSL_MSG("RNG is in error state, resetting");
caamReset();
@ -1571,21 +1576,22 @@ static int caamTRNG(unsigned char *out, int outSz)
int ofst = sizeof(unsigned int);
/* Check ENT_VAL bit to make sure entropy is ready */
if ((CAAM_READ(CAAM_RTMCTL) & CAAM_ENTVAL) != CAAM_ENTVAL) {
if ((CAAM_READ(caam.baseAddr + CAAM_RTMCTL) & CAAM_ENTVAL) != CAAM_ENTVAL) {
return CAAM_WAITING;
}
/* check state of TRNG */
if ((CAAM_READ(CAAM_RTSTATUS) & 0x0000FFFF) > 0) {
if ((CAAM_READ(caam.baseAddr + CAAM_RTSTATUS) & 0x0000FFFF) > 0) {
WOLFSSL_MSG("RNG in a bad state");
return Failure;
}
/* read entropy from RTENT registers */
reg = CAAM_RTENT0;
reg = caam.baseAddr + CAAM_RTENT0;
sz = outSz;
local = out;
while (sz > 3 && reg <= CAAM_RTENT_MAX) {
while (sz > 3 && reg <= caam.baseAddr + CAAM_RTENT_MAX) {
unsigned int data = CAAM_READ(reg);
*((unsigned int*)local) = data;
reg += ofst;
@ -1605,7 +1611,7 @@ static int caamTRNG(unsigned char *out, int outSz)
/* read the max RTENT to trigger new entropy generation */
if (reg != CAAM_RTENT_MAX) {
CAAM_READ(CAAM_RTENT_MAX);
CAAM_READ(caam.baseAddr + CAAM_RTENT_MAX);
}
return Success;
@ -1838,11 +1844,11 @@ int InitCAAM(void)
int CleanupCAAM()
{
caamFreeAllPart();
CAAM_UNSET_JOBRING_ADDR(caam.ring.BaseAddr, caam.ring.JobIn,
caam.ring.VirtualIn);
CAAM_FREE_MUTEX(&caam.ring.jr_lock);
CAAM_UNSET_BASEADDR(caam.baseAddr);
caamFreeAllPart();
return 0;
}

View File

@ -1710,12 +1710,23 @@ int main(int argc, char *argv[])
ctp = dispatch_context_alloc(dpp);
while (1) {
ctp = dispatch_block(ctp);
if (ctp == NULL) {
CleanupCAAM();
exit (1);
dispatch_context_t *current_ctp;
current_ctp = dispatch_block(ctp);
if (current_ctp == NULL) {
/* test if was just an interrupt, if so retry */
if (errno == EINTR)
continue;
/* other errors are EFAULT, EINVAL, ENOMEM
* close down in these cases */
perror("Error from dispatch_block ");
break;
}
else {
ctp = current_ctp;
dispatch_handler(ctp);
}
dispatch_handler(ctp);
}
pthread_mutex_destroy(&sm_mutex);