/* Skip checking health */ if (!rng->reg_base) return -ENODEV;
status = readq(rng->reg_base + RNM_PF_EBG_HEALTH); if (status & BIT_ULL(20)) {
err = reset_rng_health_state(rng); if (err) {
dev_err(&rng->pdev->dev, "HWRNG: Health test failed (status=%llx)\n",
status);
dev_err(&rng->pdev->dev, "HWRNG: error during reset (error=%lx)\n",
err); return -EIO;
}
} return 0;
}
/* Returns true when valid data available otherwise return false */ staticbool cn10k_read_trng(struct cn10k_rng *rng, u64 *value)
{
u16 retry_count = 0;
u64 upper, lower;
u64 status;
if (rng->extended_trng_regs) { do {
*value = readq(rng->reg_base + RNM_PF_TRNG_DAT); if (*value) returntrue;
status = readq(rng->reg_base + RNM_PF_TRNG_RES); if (!status && (retry_count++ > 0x1000)) returnfalse;
} while (!status);
}
*value = readq(rng->reg_base + RNM_PF_RANDOM);
/* HW can run out of entropy if large amount random data is read in * quick succession. Zeros may not be real random data from HW.
*/ if (!*value) {
upper = readq(rng->reg_base + RNM_PF_RANDOM);
lower = readq(rng->reg_base + RNM_PF_RANDOM); while (!(upper & 0x00000000FFFFFFFFULL))
upper = readq(rng->reg_base + RNM_PF_RANDOM); while (!(lower & 0xFFFFFFFF00000000ULL))
lower = readq(rng->reg_base + RNM_PF_RANDOM);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.