diff --git a/drivers/crypto/caam/Kconfig b/drivers/crypto/caam/Kconfig index 05210a0edb8a..ec57bf6aaf6c 100644 --- a/drivers/crypto/caam/Kconfig +++ b/drivers/crypto/caam/Kconfig @@ -145,20 +145,11 @@ config CRYPTO_DEV_FSL_CAAM_PKC_API config CRYPTO_DEV_FSL_CAAM_RNG_API bool "Register caam device for hwrng API" default y - select CRYPTO_RNG select HW_RANDOM help Selecting this will register the SEC4 hardware rng to the hw_random API for supplying the kernel entropy pool. -config CRYPTO_DEV_FSL_CAAM_PRNG_API - bool "Register Pseudo random number generation implementation with Crypto API" - default y - select CRYPTO_RNG - help - Selecting this will register the SEC hardware prng to - the Crypto API. - config CRYPTO_DEV_FSL_CAAM_BLOB_GEN bool diff --git a/drivers/crypto/caam/Makefile b/drivers/crypto/caam/Makefile index d2eaf5205b1c..a17e3cf14c61 100644 --- a/drivers/crypto/caam/Makefile +++ b/drivers/crypto/caam/Makefile @@ -20,7 +20,6 @@ caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API) += caamalg.o caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI) += caamalg_qi.o caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API) += caamhash.o caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API) += caamrng.o -caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_PRNG_API) += caamprng.o caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API) += caampkc.o pkc_desc.o caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_BLOB_GEN) += blob_gen.o diff --git a/drivers/crypto/caam/caamprng.c b/drivers/crypto/caam/caamprng.c deleted file mode 100644 index 6e4c1191cb28..000000000000 --- a/drivers/crypto/caam/caamprng.c +++ /dev/null @@ -1,241 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Driver to expose SEC4 PRNG via crypto RNG API - * - * Copyright 2022 NXP - * - */ - -#include -#include -#include -#include -#include "compat.h" -#include "regs.h" -#include "intern.h" -#include "desc_constr.h" -#include "jr.h" -#include "error.h" - -/* - * Length of used descriptors, see caam_init_desc() - */ -#define CAAM_PRNG_MAX_DESC_LEN (CAAM_CMD_SZ + \ - CAAM_CMD_SZ + \ - CAAM_CMD_SZ + CAAM_PTR_SZ_MAX) - -/* prng per-device context */ -struct caam_prng_ctx { - int err; - struct completion done; -}; - -struct caam_prng_alg { - struct rng_alg rng; - bool registered; -}; - -static void caam_prng_done(struct device *jrdev, u32 *desc, u32 err, - void *context) -{ - struct caam_prng_ctx *jctx = context; - - jctx->err = err ? caam_jr_strstatus(jrdev, err) : 0; - - complete(&jctx->done); -} - -static u32 *caam_init_reseed_desc(u32 *desc) -{ - init_job_desc(desc, 0); /* + 1 cmd_sz */ - /* Generate random bytes: + 1 cmd_sz */ - append_operation(desc, OP_TYPE_CLASS1_ALG | OP_ALG_ALGSEL_RNG | - OP_ALG_AS_FINALIZE); - - print_hex_dump_debug("prng reseed desc@: ", DUMP_PREFIX_ADDRESS, - 16, 4, desc, desc_bytes(desc), 1); - - return desc; -} - -static u32 *caam_init_prng_desc(u32 *desc, dma_addr_t dst_dma, u32 len) -{ - init_job_desc(desc, 0); /* + 1 cmd_sz */ - /* Generate random bytes: + 1 cmd_sz */ - append_operation(desc, OP_ALG_ALGSEL_RNG | OP_TYPE_CLASS1_ALG); - /* Store bytes: + 1 cmd_sz + caam_ptr_sz */ - append_fifo_store(desc, dst_dma, - len, FIFOST_TYPE_RNGSTORE); - - print_hex_dump_debug("prng job desc@: ", DUMP_PREFIX_ADDRESS, - 16, 4, desc, desc_bytes(desc), 1); - - return desc; -} - -static int caam_prng_generate(struct crypto_rng *tfm, - const u8 *src, unsigned int slen, - u8 *dst, unsigned int dlen) -{ - unsigned int aligned_dlen = ALIGN(dlen, dma_get_cache_alignment()); - struct caam_prng_ctx ctx; - struct device *jrdev; - dma_addr_t dst_dma; - u32 *desc; - u8 *buf; - int ret; - - if (aligned_dlen < dlen) - return -EOVERFLOW; - - buf = kzalloc(aligned_dlen, GFP_KERNEL); - if (!buf) - return -ENOMEM; - - jrdev = caam_jr_alloc(); - ret = PTR_ERR_OR_ZERO(jrdev); - if (ret) { - pr_err("Job Ring Device allocation failed\n"); - kfree(buf); - return ret; - } - - desc = kzalloc(CAAM_PRNG_MAX_DESC_LEN, GFP_KERNEL); - if (!desc) { - ret = -ENOMEM; - goto out1; - } - - dst_dma = dma_map_single(jrdev, buf, dlen, DMA_FROM_DEVICE); - if (dma_mapping_error(jrdev, dst_dma)) { - dev_err(jrdev, "Failed to map destination buffer memory\n"); - ret = -ENOMEM; - goto out; - } - - init_completion(&ctx.done); - ret = caam_jr_enqueue(jrdev, - caam_init_prng_desc(desc, dst_dma, dlen), - caam_prng_done, &ctx); - - if (ret == -EINPROGRESS) { - wait_for_completion(&ctx.done); - ret = ctx.err; - } - - dma_unmap_single(jrdev, dst_dma, dlen, DMA_FROM_DEVICE); - - if (!ret) - memcpy(dst, buf, dlen); -out: - kfree(desc); -out1: - caam_jr_free(jrdev); - kfree(buf); - return ret; -} - -static void caam_prng_exit(struct crypto_tfm *tfm) {} - -static int caam_prng_init(struct crypto_tfm *tfm) -{ - return 0; -} - -static int caam_prng_seed(struct crypto_rng *tfm, - const u8 *seed, unsigned int slen) -{ - struct caam_prng_ctx ctx; - struct device *jrdev; - u32 *desc; - int ret; - - if (slen) { - pr_err("Seed length should be zero\n"); - return -EINVAL; - } - - jrdev = caam_jr_alloc(); - ret = PTR_ERR_OR_ZERO(jrdev); - if (ret) { - pr_err("Job Ring Device allocation failed\n"); - return ret; - } - - desc = kzalloc(CAAM_PRNG_MAX_DESC_LEN, GFP_KERNEL); - if (!desc) { - caam_jr_free(jrdev); - return -ENOMEM; - } - - init_completion(&ctx.done); - ret = caam_jr_enqueue(jrdev, - caam_init_reseed_desc(desc), - caam_prng_done, &ctx); - - if (ret == -EINPROGRESS) { - wait_for_completion(&ctx.done); - ret = ctx.err; - } - - kfree(desc); - caam_jr_free(jrdev); - return ret; -} - -static struct caam_prng_alg caam_prng_alg = { - .rng = { - .generate = caam_prng_generate, - .seed = caam_prng_seed, - .seedsize = 0, - .base = { - .cra_name = "stdrng", - .cra_driver_name = "prng-caam", - .cra_priority = 500, - .cra_ctxsize = sizeof(struct caam_prng_ctx), - .cra_module = THIS_MODULE, - .cra_init = caam_prng_init, - .cra_exit = caam_prng_exit, - }, - } -}; - -void caam_prng_unregister(void *data) -{ - if (caam_prng_alg.registered) - crypto_unregister_rng(&caam_prng_alg.rng); -} - -int caam_prng_register(struct device *ctrldev) -{ - struct caam_drv_private *priv = dev_get_drvdata(ctrldev); - u32 rng_inst; - int ret = 0; - - /* Check for available RNG blocks before registration */ - if (priv->era < 10) - rng_inst = (rd_reg32(&priv->jr[0]->perfmon.cha_num_ls) & - CHA_ID_LS_RNG_MASK) >> CHA_ID_LS_RNG_SHIFT; - else - rng_inst = rd_reg32(&priv->jr[0]->vreg.rng) & CHA_VER_NUM_MASK; - - if (!rng_inst) { - dev_dbg(ctrldev, "RNG block is not available... skipping registering algorithm\n"); - return ret; - } - - ret = crypto_register_rng(&caam_prng_alg.rng); - if (ret) { - dev_err(ctrldev, - "couldn't register rng crypto alg: %d\n", - ret); - return ret; - } - - caam_prng_alg.registered = true; - - dev_info(ctrldev, - "rng crypto API alg registered %s\n", caam_prng_alg.rng.base.cra_driver_name); - - return 0; -} diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h index a88da0d31b23..6e48bf7d6054 100644 --- a/drivers/crypto/caam/intern.h +++ b/drivers/crypto/caam/intern.h @@ -212,21 +212,6 @@ static inline void caam_rng_exit(struct device *dev) {} #endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API */ -#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_PRNG_API - -int caam_prng_register(struct device *dev); -void caam_prng_unregister(void *data); - -#else - -static inline int caam_prng_register(struct device *dev) -{ - return 0; -} - -static inline void caam_prng_unregister(void *data) {} -#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_PRNG_API */ - #ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI int caam_qi_algapi_init(struct device *dev); diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c index 0ef00df9730e..bddeaaaca487 100644 --- a/drivers/crypto/caam/jr.c +++ b/drivers/crypto/caam/jr.c @@ -40,7 +40,6 @@ static void register_algs(struct caam_drv_private_jr *jrpriv, caam_algapi_hash_init(dev); caam_pkc_init(dev); jrpriv->hwrng = !caam_rng_init(dev); - caam_prng_register(dev); caam_qi_algapi_init(dev); algs_unlock: @@ -55,7 +54,6 @@ static void unregister_algs(void) goto algs_unlock; caam_qi_algapi_exit(); - caam_prng_unregister(NULL); caam_pkc_exit(); caam_algapi_hash_exit(); caam_algapi_exit();