Commit 67b7702c authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: sl3516 - Use new crypto_engine_op interface



Use the new crypto_engine_op interface where the callback is stored
in the algorithm object.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 623814c0
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -8,13 +8,17 @@
 * ECB mode.
 */

#include <linux/crypto.h>
#include <crypto/engine.h>
#include <crypto/internal/skcipher.h>
#include <crypto/scatterwalk.h>
#include <linux/dma-mapping.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/pm_runtime.h>
#include <crypto/scatterwalk.h>
#include <crypto/internal/skcipher.h>
#include <linux/slab.h>
#include <linux/string.h>
#include "sl3516-ce.h"

/* sl3516_ce_need_fallback - check if a request can be handled by the CE */
@@ -105,7 +109,7 @@ static int sl3516_ce_cipher_fallback(struct skcipher_request *areq)
	struct sl3516_ce_alg_template *algt;
	int err;

	algt = container_of(alg, struct sl3516_ce_alg_template, alg.skcipher);
	algt = container_of(alg, struct sl3516_ce_alg_template, alg.skcipher.base);
	algt->stat_fb++;

	skcipher_request_set_tfm(&rctx->fallback_req, op->fallback_tfm);
@@ -136,7 +140,7 @@ static int sl3516_ce_cipher(struct skcipher_request *areq)
	int err = 0;
	int i;

	algt = container_of(alg, struct sl3516_ce_alg_template, alg.skcipher);
	algt = container_of(alg, struct sl3516_ce_alg_template, alg.skcipher.base);

	dev_dbg(ce->dev, "%s %s %u %x IV(%p %u) key=%u\n", __func__,
		crypto_tfm_alg_name(areq->base.tfm),
@@ -258,7 +262,7 @@ static int sl3516_ce_cipher(struct skcipher_request *areq)
	return err;
}

static int sl3516_ce_handle_cipher_request(struct crypto_engine *engine, void *areq)
int sl3516_ce_handle_cipher_request(struct crypto_engine *engine, void *areq)
{
	int err;
	struct skcipher_request *breq = container_of(areq, struct skcipher_request, base);
@@ -318,7 +322,7 @@ int sl3516_ce_cipher_init(struct crypto_tfm *tfm)

	memset(op, 0, sizeof(struct sl3516_ce_cipher_tfm_ctx));

	algt = container_of(alg, struct sl3516_ce_alg_template, alg.skcipher);
	algt = container_of(alg, struct sl3516_ce_alg_template, alg.skcipher.base);
	op->ce = algt->ce;

	op->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
@@ -335,8 +339,6 @@ int sl3516_ce_cipher_init(struct crypto_tfm *tfm)
		 crypto_tfm_alg_driver_name(&sktfm->base),
		 crypto_tfm_alg_driver_name(crypto_skcipher_tfm(op->fallback_tfm)));

	op->enginectx.op.do_one_request = sl3516_ce_handle_cipher_request;

	err = pm_runtime_get_sync(op->ce->dev);
	if (err < 0)
		goto error_pm;
+30 −19
Original line number Diff line number Diff line
@@ -6,22 +6,25 @@
 *
 * Core file which registers crypto algorithms supported by the CryptoEngine
 */

#include <crypto/engine.h>
#include <crypto/internal/rng.h>
#include <crypto/internal/skcipher.h>
#include <linux/clk.h>
#include <linux/crypto.h>
#include <linux/debugfs.h>
#include <linux/dev_printk.h>
#include <linux/dma-mapping.h>
#include <linux/err.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <crypto/internal/rng.h>
#include <crypto/internal/skcipher.h>

#include "sl3516-ce.h"

@@ -217,7 +220,7 @@ static struct sl3516_ce_alg_template ce_algs[] = {
{
	.type = CRYPTO_ALG_TYPE_SKCIPHER,
	.mode = ECB_AES,
	.alg.skcipher = {
	.alg.skcipher.base = {
		.base = {
			.cra_name = "ecb(aes)",
			.cra_driver_name = "ecb-aes-sl3516",
@@ -236,11 +239,13 @@ static struct sl3516_ce_alg_template ce_algs[] = {
		.setkey		= sl3516_ce_aes_setkey,
		.encrypt	= sl3516_ce_skencrypt,
		.decrypt	= sl3516_ce_skdecrypt,
	}
	},
	.alg.skcipher.op = {
		.do_one_request = sl3516_ce_handle_cipher_request,
	},
},
};

#ifdef CONFIG_CRYPTO_DEV_SL3516_DEBUG
static int sl3516_ce_debugfs_show(struct seq_file *seq, void *v)
{
	struct sl3516_ce_dev *ce = seq->private;
@@ -264,8 +269,8 @@ static int sl3516_ce_debugfs_show(struct seq_file *seq, void *v)
		switch (ce_algs[i].type) {
		case CRYPTO_ALG_TYPE_SKCIPHER:
			seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
				   ce_algs[i].alg.skcipher.base.cra_driver_name,
				   ce_algs[i].alg.skcipher.base.cra_name,
				   ce_algs[i].alg.skcipher.base.base.cra_driver_name,
				   ce_algs[i].alg.skcipher.base.base.cra_name,
				   ce_algs[i].stat_req, ce_algs[i].stat_fb);
			break;
		}
@@ -274,7 +279,6 @@ static int sl3516_ce_debugfs_show(struct seq_file *seq, void *v)
}

DEFINE_SHOW_ATTRIBUTE(sl3516_ce_debugfs);
#endif

static int sl3516_ce_register_algs(struct sl3516_ce_dev *ce)
{
@@ -286,11 +290,11 @@ static int sl3516_ce_register_algs(struct sl3516_ce_dev *ce)
		switch (ce_algs[i].type) {
		case CRYPTO_ALG_TYPE_SKCIPHER:
			dev_info(ce->dev, "DEBUG: Register %s\n",
				 ce_algs[i].alg.skcipher.base.cra_name);
			err = crypto_register_skcipher(&ce_algs[i].alg.skcipher);
				 ce_algs[i].alg.skcipher.base.base.cra_name);
			err = crypto_engine_register_skcipher(&ce_algs[i].alg.skcipher);
			if (err) {
				dev_err(ce->dev, "Fail to register %s\n",
					ce_algs[i].alg.skcipher.base.cra_name);
					ce_algs[i].alg.skcipher.base.base.cra_name);
				ce_algs[i].ce = NULL;
				return err;
			}
@@ -313,8 +317,8 @@ static void sl3516_ce_unregister_algs(struct sl3516_ce_dev *ce)
		switch (ce_algs[i].type) {
		case CRYPTO_ALG_TYPE_SKCIPHER:
			dev_info(ce->dev, "Unregister %d %s\n", i,
				 ce_algs[i].alg.skcipher.base.cra_name);
			crypto_unregister_skcipher(&ce_algs[i].alg.skcipher);
				 ce_algs[i].alg.skcipher.base.base.cra_name);
			crypto_engine_unregister_skcipher(&ce_algs[i].alg.skcipher);
			break;
		}
	}
@@ -473,13 +477,20 @@ static int sl3516_ce_probe(struct platform_device *pdev)

	pm_runtime_put_sync(ce->dev);

#ifdef CONFIG_CRYPTO_DEV_SL3516_DEBUG
	if (IS_ENABLED(CONFIG_CRYPTO_DEV_SL3516_DEBUG)) {
		struct dentry *dbgfs_dir __maybe_unused;
		struct dentry *dbgfs_stats __maybe_unused;

		/* Ignore error of debugfs */
	ce->dbgfs_dir = debugfs_create_dir("sl3516", NULL);
	ce->dbgfs_stats = debugfs_create_file("stats", 0444,
					      ce->dbgfs_dir, ce,
		dbgfs_dir = debugfs_create_dir("sl3516", NULL);
		dbgfs_stats = debugfs_create_file("stats", 0444,
						  dbgfs_dir, ce,
						  &sl3516_ce_debugfs_fops);
#ifdef CONFIG_CRYPTO_DEV_SL3516_DEBUG
		ce->dbgfs_dir = dbgfs_dir;
		ce->dbgfs_stats = dbgfs_stats;
#endif
	}

	return 0;
error_pmuse:
+2 −6
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
#include <crypto/engine.h>
#include <crypto/scatterwalk.h>
#include <crypto/skcipher.h>
#include <linux/crypto.h>
#include <linux/debugfs.h>
#include <linux/hw_random.h>

@@ -292,16 +291,12 @@ struct sl3516_ce_cipher_req_ctx {

/*
 * struct sl3516_ce_cipher_tfm_ctx - context for a skcipher TFM
 * @enginectx:		crypto_engine used by this TFM
 * @key:		pointer to key data
 * @keylen:		len of the key
 * @ce:			pointer to the private data of driver handling this TFM
 * @fallback_tfm:	pointer to the fallback TFM
 *
 * enginectx must be the first element
 */
struct sl3516_ce_cipher_tfm_ctx {
	struct crypto_engine_ctx enginectx;
	u32 *key;
	u32 keylen;
	struct sl3516_ce_dev *ce;
@@ -324,7 +319,7 @@ struct sl3516_ce_alg_template {
	u32 mode;
	struct sl3516_ce_dev *ce;
	union {
		struct skcipher_alg skcipher;
		struct skcipher_engine_alg skcipher;
	} alg;
	unsigned long stat_req;
	unsigned long stat_fb;
@@ -345,3 +340,4 @@ int sl3516_ce_run_task(struct sl3516_ce_dev *ce,

int sl3516_ce_rng_register(struct sl3516_ce_dev *ce);
void sl3516_ce_rng_unregister(struct sl3516_ce_dev *ce);
int sl3516_ce_handle_cipher_request(struct crypto_engine *engine, void *areq);