/* * For most TRNG circuits the clock frequency of under 500 kHz * is safe.
*/
val = sss_rate / (EXYNOS_TRNG_CLOCK_RATE * 2); if (val > 0x7fff) {
dev_err(trng->dev, "clock divider too large: %d\n", val); return -ERANGE;
}
val = val << 1;
writel_relaxed(val, trng->mem + EXYNOS_TRNG_CLKDIV);
/* Enable the generator. */
val = EXYNOS_TRNG_CTRL_RNGEN;
writel_relaxed(val, trng->mem + EXYNOS_TRNG_CTRL);
/* * Disable post-processing. /dev/hwrng is supposed to deliver * unprocessed data.
*/
writel_relaxed(0, trng->mem + EXYNOS_TRNG_POST_CTRL);
return 0;
}
staticint exynos_trng_init_smc(struct hwrng *rng)
{ struct exynos_trng_dev *trng = (struct exynos_trng_dev *)rng->priv; struct arm_smccc_res res; int ret = 0;
arm_smccc_smc(SMC_CMD_RANDOM, HWRNG_INIT, 0, 0, 0, 0, 0, 0, &res); if (res.a0 != HWRNG_RET_OK) {
dev_err(trng->dev, "SMC command for TRNG init failed (%d)\n",
(int)res.a0);
ret = -EIO;
} if ((int)res.a0 == -1)
dev_info(trng->dev, "Make sure LDFW is loaded by your BL\n");
return ret;
}
staticint exynos_trng_probe(struct platform_device *pdev)
{ struct exynos_trng_dev *trng; int ret = -ENOMEM;
trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL); if (!trng) return ret;
trng->mem = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(trng->mem)) return PTR_ERR(trng->mem);
}
pm_runtime_enable(&pdev->dev);
ret = pm_runtime_resume_and_get(&pdev->dev); if (ret < 0) {
dev_err(&pdev->dev, "Could not get runtime PM.\n"); goto err_pm_get;
}
trng->clk = devm_clk_get_enabled(&pdev->dev, "secss"); if (IS_ERR(trng->clk)) {
ret = dev_err_probe(&pdev->dev, PTR_ERR(trng->clk), "Could not get clock\n"); goto err_clock;
}
trng->pclk = devm_clk_get_optional_enabled(&pdev->dev, "pclk"); if (IS_ERR(trng->pclk)) {
ret = dev_err_probe(&pdev->dev, PTR_ERR(trng->pclk), "Could not get pclk\n"); goto err_clock;
}
ret = devm_hwrng_register(&pdev->dev, &trng->rng); if (ret) {
dev_err(&pdev->dev, "Could not register hwrng device.\n"); goto err_clock;
}
dev_info(&pdev->dev, "Exynos True Random Number Generator.\n");
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.