Path: blob/master/drivers/crypto/gemini/sl3516-ce-rng.c
26282 views
// SPDX-License-Identifier: GPL-2.01/*2* sl3516-ce-rng.c - hardware cryptographic offloader for SL3516 SoC.3*4* Copyright (C) 2021 Corentin Labbe <[email protected]>5*6* This file handle the RNG found in the SL3516 crypto engine7*/8#include "sl3516-ce.h"9#include <linux/pm_runtime.h>10#include <linux/hw_random.h>1112static int sl3516_ce_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)13{14struct sl3516_ce_dev *ce;15u32 *data = buf;16size_t read = 0;17int err;1819ce = container_of(rng, struct sl3516_ce_dev, trng);2021#ifdef CONFIG_CRYPTO_DEV_SL3516_DEBUG22ce->hwrng_stat_req++;23ce->hwrng_stat_bytes += max;24#endif2526err = pm_runtime_get_sync(ce->dev);27if (err < 0) {28pm_runtime_put_noidle(ce->dev);29return err;30}3132while (read < max) {33*data = readl(ce->base + IPSEC_RAND_NUM_REG);34data++;35read += 4;36}3738pm_runtime_put(ce->dev);3940return read;41}4243int sl3516_ce_rng_register(struct sl3516_ce_dev *ce)44{45int ret;4647ce->trng.name = "SL3516 Crypto Engine RNG";48ce->trng.read = sl3516_ce_rng_read;49ce->trng.quality = 700;5051ret = hwrng_register(&ce->trng);52if (ret)53dev_err(ce->dev, "Fail to register the RNG\n");54return ret;55}5657void sl3516_ce_rng_unregister(struct sl3516_ce_dev *ce)58{59hwrng_unregister(&ce->trng);60}616263