/* * By default, the TRNG runs for 200 clocks per sample; * 1200 clocks per sample generates better entropy. */ static void kick_trng(int ent_delay) { ccsr_sec_t __iomem *sec = (ccsr_sec_t __iomem *)CONFIG_SYS_FSL_SEC_ADDR; struct rng4tst __iomem *rng = (struct rng4tst __iomem *)&sec->rng; u32 val; /* put RNG4 into program mode */ sec_setbits32(&rng->rtmctl, RTMCTL_PRGM); /* rtsdctl bits 0-15 contain "Entropy Delay, which defines the * length (in system clocks) of each Entropy sample taken * */ val = sec_in32(&rng->rtsdctl); val = (val & ~RTSDCTL_ENT_DLY_MASK) | (ent_delay << RTSDCTL_ENT_DLY_SHIFT); sec_out32(&rng->rtsdctl, val); /* min. freq. count, equal to 1/4 of the entropy sample length */ sec_out32(&rng->rtfreqmin, ent_delay >> 2); /* disable maximum frequency count */ sec_out32(&rng->rtfreqmax, RTFRQMAX_DISABLE); /* * select raw sampling in both entropy shifter * and statistical checker */ sec_setbits32(&rng->rtmctl, RTMCTL_SAMP_MODE_RAW_ES_SC); /* put RNG4 into run mode */ sec_clrbits32(&rng->rtmctl, RTMCTL_PRGM); }
static int rng_init(void) { int ret, ent_delay = RTSDCTL_ENT_DLY_MIN; ccsr_sec_t __iomem *sec = (ccsr_sec_t __iomem *)CONFIG_SYS_FSL_SEC_ADDR; struct rng4tst __iomem *rng = (struct rng4tst __iomem *)&sec->rng; u32 rdsta = sec_in32(&rng->rdsta); /* Check if RNG state 0 handler is already instantiated */ if (rdsta & RNG_STATE0_HANDLE_INSTANTIATED) return 0; do { /* * If either of the SH's were instantiated by somebody else * then it is assumed that the entropy * parameters are properly set and thus the function * setting these (kick_trng(...)) is skipped. * Also, if a handle was instantiated, do not change * the TRNG parameters. */ kick_trng(ent_delay); ent_delay += 400; /* * if instantiate_rng(...) fails, the loop will rerun * and the kick_trng(...) function will modfiy the * upper and lower limits of the entropy sampling * interval, leading to a sucessful initialization of * the RNG. */ ret = instantiate_rng(); } while ((ret == -1) && (ent_delay < RTSDCTL_ENT_DLY_MAX)); if (ret) { printf("RNG: Failed to instantiate RNG\n"); return ret; } /* Enable RDB bit so that RNG works faster */ sec_setbits32(&sec->scfgr, SEC_SCFGR_RDBENABLE); return ret; }
/* * By default, the TRNG runs for 200 clocks per sample; * 1200 clocks per sample generates better entropy. */ static void kick_trng(int ent_delay) { ccsr_sec_t __iomem *sec = (ccsr_sec_t __iomem *)CONFIG_SYS_FSL_SEC_ADDR; struct rng4tst __iomem *rng = (struct rng4tst __iomem *)&sec->rng; u32 val; /* put RNG4 into program mode */ sec_setbits32(&rng->rtmctl, RTMCTL_PRGM); /* rtsdctl bits 0-15 contain "Entropy Delay, which defines the * length (in system clocks) of each Entropy sample taken * */ val = sec_in32(&rng->rtsdctl); val = (val & ~RTSDCTL_ENT_DLY_MASK) | (ent_delay << RTSDCTL_ENT_DLY_SHIFT); sec_out32(&rng->rtsdctl, val); /* min. freq. count, equal to 1/4 of the entropy sample length */ sec_out32(&rng->rtfreqmin, ent_delay >> 2); /* max. freq. count, equal to 8 times the entropy sample length */ sec_out32(&rng->rtfreqmax, ent_delay << 3); /* put RNG4 into run mode */ sec_clrbits32(&rng->rtmctl, RTMCTL_PRGM); }