Lines Matching +full:rng +full:-

1 // SPDX-License-Identifier: GPL-2.0+
3 * caam - Freescale FSL CAAM support for hw_random
6 * Copyright 2018-2019, 2023 NXP
15 #include <linux/dma-mapping.h>
36 /* rng per-device context */
38 struct hwrng rng; member
54 return (struct caam_rng_ctx *)r->priv; in to_caam_rng_ctx()
63 *jctx->err = caam_jr_strstatus(jrdev, err); in caam_rng_done()
65 complete(jctx->done); in caam_rng_done()
78 print_hex_dump_debug("rng job desc@: ", DUMP_PREFIX_ADDRESS, in caam_init_desc()
101 return -ENOMEM; in caam_rng_read_one()
108 if (err == -EINPROGRESS) { in caam_rng_read_one()
125 nents = kfifo_dma_in_prepare(&ctx->fifo, sg, ARRAY_SIZE(sg), in caam_rng_fill_async()
130 len = caam_rng_read_one(ctx->jrdev, sg_virt(&sg[0]), in caam_rng_fill_async()
132 ctx->desc_async, in caam_rng_fill_async()
137 kfifo_dma_in_finish(&ctx->fifo, len); in caam_rng_fill_async()
147 static int caam_read(struct hwrng *rng, void *dst, size_t max, bool wait) in caam_read() argument
149 struct caam_rng_ctx *ctx = to_caam_rng_ctx(rng); in caam_read()
155 return caam_rng_read_one(ctx->jrdev, dst, max, in caam_read()
156 ctx->desc_sync, &done); in caam_read()
159 out = kfifo_out(&ctx->fifo, dst, max); in caam_read()
160 if (kfifo_is_empty(&ctx->fifo)) in caam_read()
161 schedule_work(&ctx->worker); in caam_read()
166 static void caam_cleanup(struct hwrng *rng) in caam_cleanup() argument
168 struct caam_rng_ctx *ctx = to_caam_rng_ctx(rng); in caam_cleanup()
170 flush_work(&ctx->worker); in caam_cleanup()
171 caam_jr_free(ctx->jrdev); in caam_cleanup()
172 kfifo_free(&ctx->fifo); in caam_cleanup()
176 static inline void test_len(struct hwrng *rng, size_t len, bool wait) in test_len() argument
180 struct caam_rng_ctx *ctx = to_caam_rng_ctx(rng); in test_len()
181 struct device *dev = ctx->ctrldev; in test_len()
186 read_len = rng->read(rng, buf, len, wait); in test_len()
189 dev_err(dev, "RNG Read FAILED received %d bytes\n", in test_len()
199 len = len - read_len; in test_len()
205 static inline void test_mode_once(struct hwrng *rng, bool wait) in test_mode_once() argument
207 test_len(rng, 32, wait); in test_mode_once()
208 test_len(rng, 64, wait); in test_mode_once()
209 test_len(rng, 128, wait); in test_mode_once()
212 static void self_test(struct hwrng *rng) in self_test() argument
214 pr_info("Executing RNG SELF-TEST with wait\n"); in self_test()
215 test_mode_once(rng, true); in self_test()
219 static int caam_init(struct hwrng *rng) in caam_init() argument
221 struct caam_rng_ctx *ctx = to_caam_rng_ctx(rng); in caam_init()
224 ctx->desc_sync = devm_kzalloc(ctx->ctrldev, CAAM_RNG_DESC_LEN, in caam_init()
226 if (!ctx->desc_sync) in caam_init()
227 return -ENOMEM; in caam_init()
229 ctx->desc_async = devm_kzalloc(ctx->ctrldev, CAAM_RNG_DESC_LEN, in caam_init()
231 if (!ctx->desc_async) in caam_init()
232 return -ENOMEM; in caam_init()
234 if (kfifo_alloc(&ctx->fifo, ALIGN(CAAM_RNG_MAX_FIFO_STORE_SIZE, in caam_init()
237 return -ENOMEM; in caam_init()
239 INIT_WORK(&ctx->worker, caam_rng_worker); in caam_init()
241 ctx->jrdev = caam_jr_alloc(); in caam_init()
242 err = PTR_ERR_OR_ZERO(ctx->jrdev); in caam_init()
244 kfifo_free(&ctx->fifo); in caam_init()
272 /* Check for an instantiated RNG before registration */ in caam_rng_init()
273 if (priv->era < 10) in caam_rng_init()
274 rng_inst = (rd_reg32(&priv->jr[0]->perfmon.cha_num_ls) & in caam_rng_init()
277 rng_inst = rd_reg32(&priv->jr[0]->vreg.rng) & CHA_VER_NUM_MASK; in caam_rng_init()
283 return -ENOMEM; in caam_rng_init()
287 return -ENOMEM; in caam_rng_init()
289 ctx->ctrldev = ctrldev; in caam_rng_init()
291 ctx->rng.name = "rng-caam"; in caam_rng_init()
292 ctx->rng.init = caam_init; in caam_rng_init()
293 ctx->rng.cleanup = caam_cleanup; in caam_rng_init()
294 ctx->rng.read = caam_read; in caam_rng_init()
295 ctx->rng.priv = (unsigned long)ctx; in caam_rng_init()
297 dev_info(ctrldev, "registering rng-caam\n"); in caam_rng_init()
299 ret = devm_hwrng_register(ctrldev, &ctx->rng); in caam_rng_init()
306 self_test(&ctx->rng); in caam_rng_init()