Path: blob/master/drivers/crypto/aspeed/aspeed-hace-crypto.c
26282 views
// SPDX-License-Identifier: GPL-2.0+1/*2* Copyright (c) 2021 Aspeed Technology Inc.3*/45#include "aspeed-hace.h"6#include <crypto/des.h>7#include <crypto/engine.h>8#include <crypto/internal/des.h>9#include <crypto/internal/skcipher.h>10#include <linux/dma-mapping.h>11#include <linux/err.h>12#include <linux/io.h>13#include <linux/kernel.h>14#include <linux/module.h>15#include <linux/scatterlist.h>16#include <linux/string.h>1718#ifdef CONFIG_CRYPTO_DEV_ASPEED_HACE_CRYPTO_DEBUG19#define CIPHER_DBG(h, fmt, ...) \20dev_info((h)->dev, "%s() " fmt, __func__, ##__VA_ARGS__)21#else22#define CIPHER_DBG(h, fmt, ...) \23dev_dbg((h)->dev, "%s() " fmt, __func__, ##__VA_ARGS__)24#endif2526static int aspeed_crypto_do_fallback(struct skcipher_request *areq)27{28struct aspeed_cipher_reqctx *rctx = skcipher_request_ctx(areq);29struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);30struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);31int err;3233skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);34skcipher_request_set_callback(&rctx->fallback_req, areq->base.flags,35areq->base.complete, areq->base.data);36skcipher_request_set_crypt(&rctx->fallback_req, areq->src, areq->dst,37areq->cryptlen, areq->iv);3839if (rctx->enc_cmd & HACE_CMD_ENCRYPT)40err = crypto_skcipher_encrypt(&rctx->fallback_req);41else42err = crypto_skcipher_decrypt(&rctx->fallback_req);4344return err;45}4647static bool aspeed_crypto_need_fallback(struct skcipher_request *areq)48{49struct aspeed_cipher_reqctx *rctx = skcipher_request_ctx(areq);5051if (areq->cryptlen == 0)52return true;5354if ((rctx->enc_cmd & HACE_CMD_DES_SELECT) &&55!IS_ALIGNED(areq->cryptlen, DES_BLOCK_SIZE))56return true;5758if ((!(rctx->enc_cmd & HACE_CMD_DES_SELECT)) &&59!IS_ALIGNED(areq->cryptlen, AES_BLOCK_SIZE))60return true;6162return false;63}6465static int aspeed_hace_crypto_handle_queue(struct aspeed_hace_dev *hace_dev,66struct skcipher_request *req)67{68if (hace_dev->version == AST2500_VERSION &&69aspeed_crypto_need_fallback(req)) {70CIPHER_DBG(hace_dev, "SW fallback\n");71return aspeed_crypto_do_fallback(req);72}7374return crypto_transfer_skcipher_request_to_engine(75hace_dev->crypt_engine_crypto, req);76}7778static int aspeed_crypto_do_request(struct crypto_engine *engine, void *areq)79{80struct skcipher_request *req = skcipher_request_cast(areq);81struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);82struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);83struct aspeed_hace_dev *hace_dev = ctx->hace_dev;84struct aspeed_engine_crypto *crypto_engine;85int rc;8687crypto_engine = &hace_dev->crypto_engine;88crypto_engine->req = req;89crypto_engine->flags |= CRYPTO_FLAGS_BUSY;9091rc = ctx->start(hace_dev);9293if (rc != -EINPROGRESS)94return -EIO;9596return 0;97}9899static int aspeed_sk_complete(struct aspeed_hace_dev *hace_dev, int err)100{101struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine;102struct aspeed_cipher_reqctx *rctx;103struct skcipher_request *req;104105CIPHER_DBG(hace_dev, "\n");106107req = crypto_engine->req;108rctx = skcipher_request_ctx(req);109110if (rctx->enc_cmd & HACE_CMD_IV_REQUIRE) {111if (rctx->enc_cmd & HACE_CMD_DES_SELECT)112memcpy(req->iv, crypto_engine->cipher_ctx +113DES_KEY_SIZE, DES_KEY_SIZE);114else115memcpy(req->iv, crypto_engine->cipher_ctx,116AES_BLOCK_SIZE);117}118119crypto_engine->flags &= ~CRYPTO_FLAGS_BUSY;120121crypto_finalize_skcipher_request(hace_dev->crypt_engine_crypto, req,122err);123124return err;125}126127static int aspeed_sk_transfer_sg(struct aspeed_hace_dev *hace_dev)128{129struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine;130struct device *dev = hace_dev->dev;131struct aspeed_cipher_reqctx *rctx;132struct skcipher_request *req;133134CIPHER_DBG(hace_dev, "\n");135136req = crypto_engine->req;137rctx = skcipher_request_ctx(req);138139if (req->src == req->dst) {140dma_unmap_sg(dev, req->src, rctx->src_nents, DMA_BIDIRECTIONAL);141} else {142dma_unmap_sg(dev, req->src, rctx->src_nents, DMA_TO_DEVICE);143dma_unmap_sg(dev, req->dst, rctx->dst_nents, DMA_FROM_DEVICE);144}145146return aspeed_sk_complete(hace_dev, 0);147}148149static int aspeed_sk_transfer(struct aspeed_hace_dev *hace_dev)150{151struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine;152struct aspeed_cipher_reqctx *rctx;153struct skcipher_request *req;154struct scatterlist *out_sg;155int nbytes = 0;156int rc = 0;157158req = crypto_engine->req;159rctx = skcipher_request_ctx(req);160out_sg = req->dst;161162/* Copy output buffer to dst scatter-gather lists */163nbytes = sg_copy_from_buffer(out_sg, rctx->dst_nents,164crypto_engine->cipher_addr, req->cryptlen);165if (!nbytes) {166dev_warn(hace_dev->dev, "invalid sg copy, %s:0x%x, %s:0x%x\n",167"nbytes", nbytes, "cryptlen", req->cryptlen);168rc = -EINVAL;169}170171CIPHER_DBG(hace_dev, "%s:%d, %s:%d, %s:%d, %s:%p\n",172"nbytes", nbytes, "req->cryptlen", req->cryptlen,173"nb_out_sg", rctx->dst_nents,174"cipher addr", crypto_engine->cipher_addr);175176return aspeed_sk_complete(hace_dev, rc);177}178179static int aspeed_sk_start(struct aspeed_hace_dev *hace_dev)180{181struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine;182struct aspeed_cipher_reqctx *rctx;183struct skcipher_request *req;184struct scatterlist *in_sg;185int nbytes;186187req = crypto_engine->req;188rctx = skcipher_request_ctx(req);189in_sg = req->src;190191nbytes = sg_copy_to_buffer(in_sg, rctx->src_nents,192crypto_engine->cipher_addr, req->cryptlen);193194CIPHER_DBG(hace_dev, "%s:%d, %s:%d, %s:%d, %s:%p\n",195"nbytes", nbytes, "req->cryptlen", req->cryptlen,196"nb_in_sg", rctx->src_nents,197"cipher addr", crypto_engine->cipher_addr);198199if (!nbytes) {200dev_warn(hace_dev->dev, "invalid sg copy, %s:0x%x, %s:0x%x\n",201"nbytes", nbytes, "cryptlen", req->cryptlen);202return -EINVAL;203}204205crypto_engine->resume = aspeed_sk_transfer;206207/* Trigger engines */208ast_hace_write(hace_dev, crypto_engine->cipher_dma_addr,209ASPEED_HACE_SRC);210ast_hace_write(hace_dev, crypto_engine->cipher_dma_addr,211ASPEED_HACE_DEST);212ast_hace_write(hace_dev, req->cryptlen, ASPEED_HACE_DATA_LEN);213ast_hace_write(hace_dev, rctx->enc_cmd, ASPEED_HACE_CMD);214215return -EINPROGRESS;216}217218static int aspeed_sk_start_sg(struct aspeed_hace_dev *hace_dev)219{220struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine;221struct aspeed_sg_list *src_list, *dst_list;222dma_addr_t src_dma_addr, dst_dma_addr;223struct aspeed_cipher_reqctx *rctx;224struct skcipher_request *req;225struct scatterlist *s;226int src_sg_len;227int dst_sg_len;228int total, i;229int rc;230231CIPHER_DBG(hace_dev, "\n");232233req = crypto_engine->req;234rctx = skcipher_request_ctx(req);235236rctx->enc_cmd |= HACE_CMD_DES_SG_CTRL | HACE_CMD_SRC_SG_CTRL |237HACE_CMD_AES_KEY_HW_EXP | HACE_CMD_MBUS_REQ_SYNC_EN;238239/* BIDIRECTIONAL */240if (req->dst == req->src) {241src_sg_len = dma_map_sg(hace_dev->dev, req->src,242rctx->src_nents, DMA_BIDIRECTIONAL);243dst_sg_len = src_sg_len;244if (!src_sg_len) {245dev_warn(hace_dev->dev, "dma_map_sg() src error\n");246return -EINVAL;247}248249} else {250src_sg_len = dma_map_sg(hace_dev->dev, req->src,251rctx->src_nents, DMA_TO_DEVICE);252if (!src_sg_len) {253dev_warn(hace_dev->dev, "dma_map_sg() src error\n");254return -EINVAL;255}256257dst_sg_len = dma_map_sg(hace_dev->dev, req->dst,258rctx->dst_nents, DMA_FROM_DEVICE);259if (!dst_sg_len) {260dev_warn(hace_dev->dev, "dma_map_sg() dst error\n");261rc = -EINVAL;262goto free_req_src;263}264}265266src_list = (struct aspeed_sg_list *)crypto_engine->cipher_addr;267src_dma_addr = crypto_engine->cipher_dma_addr;268total = req->cryptlen;269270for_each_sg(req->src, s, src_sg_len, i) {271u32 phy_addr = sg_dma_address(s);272u32 len = sg_dma_len(s);273274if (total > len)275total -= len;276else {277/* last sg list */278len = total;279len |= BIT(31);280total = 0;281}282283src_list[i].phy_addr = cpu_to_le32(phy_addr);284src_list[i].len = cpu_to_le32(len);285}286287if (total != 0) {288rc = -EINVAL;289goto free_req;290}291292if (req->dst == req->src) {293dst_list = src_list;294dst_dma_addr = src_dma_addr;295296} else {297dst_list = (struct aspeed_sg_list *)crypto_engine->dst_sg_addr;298dst_dma_addr = crypto_engine->dst_sg_dma_addr;299total = req->cryptlen;300301for_each_sg(req->dst, s, dst_sg_len, i) {302u32 phy_addr = sg_dma_address(s);303u32 len = sg_dma_len(s);304305if (total > len)306total -= len;307else {308/* last sg list */309len = total;310len |= BIT(31);311total = 0;312}313314dst_list[i].phy_addr = cpu_to_le32(phy_addr);315dst_list[i].len = cpu_to_le32(len);316317}318319dst_list[dst_sg_len].phy_addr = 0;320dst_list[dst_sg_len].len = 0;321}322323if (total != 0) {324rc = -EINVAL;325goto free_req;326}327328crypto_engine->resume = aspeed_sk_transfer_sg;329330/* Memory barrier to ensure all data setup before engine starts */331mb();332333/* Trigger engines */334ast_hace_write(hace_dev, src_dma_addr, ASPEED_HACE_SRC);335ast_hace_write(hace_dev, dst_dma_addr, ASPEED_HACE_DEST);336ast_hace_write(hace_dev, req->cryptlen, ASPEED_HACE_DATA_LEN);337ast_hace_write(hace_dev, rctx->enc_cmd, ASPEED_HACE_CMD);338339return -EINPROGRESS;340341free_req:342if (req->dst == req->src) {343dma_unmap_sg(hace_dev->dev, req->src, rctx->src_nents,344DMA_BIDIRECTIONAL);345346} else {347dma_unmap_sg(hace_dev->dev, req->dst, rctx->dst_nents,348DMA_TO_DEVICE);349dma_unmap_sg(hace_dev->dev, req->src, rctx->src_nents,350DMA_TO_DEVICE);351}352353return rc;354355free_req_src:356dma_unmap_sg(hace_dev->dev, req->src, rctx->src_nents, DMA_TO_DEVICE);357358return rc;359}360361static int aspeed_hace_skcipher_trigger(struct aspeed_hace_dev *hace_dev)362{363struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine;364struct aspeed_cipher_reqctx *rctx;365struct crypto_skcipher *cipher;366struct aspeed_cipher_ctx *ctx;367struct skcipher_request *req;368369CIPHER_DBG(hace_dev, "\n");370371req = crypto_engine->req;372rctx = skcipher_request_ctx(req);373cipher = crypto_skcipher_reqtfm(req);374ctx = crypto_skcipher_ctx(cipher);375376/* enable interrupt */377rctx->enc_cmd |= HACE_CMD_ISR_EN;378379rctx->dst_nents = sg_nents(req->dst);380rctx->src_nents = sg_nents(req->src);381382ast_hace_write(hace_dev, crypto_engine->cipher_ctx_dma,383ASPEED_HACE_CONTEXT);384385if (rctx->enc_cmd & HACE_CMD_IV_REQUIRE) {386if (rctx->enc_cmd & HACE_CMD_DES_SELECT)387memcpy(crypto_engine->cipher_ctx + DES_BLOCK_SIZE,388req->iv, DES_BLOCK_SIZE);389else390memcpy(crypto_engine->cipher_ctx, req->iv,391AES_BLOCK_SIZE);392}393394if (hace_dev->version == AST2600_VERSION) {395memcpy(crypto_engine->cipher_ctx + 16, ctx->key, ctx->key_len);396397return aspeed_sk_start_sg(hace_dev);398}399400memcpy(crypto_engine->cipher_ctx + 16, ctx->key, AES_MAX_KEYLENGTH);401402return aspeed_sk_start(hace_dev);403}404405static int aspeed_des_crypt(struct skcipher_request *req, u32 cmd)406{407struct aspeed_cipher_reqctx *rctx = skcipher_request_ctx(req);408struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);409struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);410struct aspeed_hace_dev *hace_dev = ctx->hace_dev;411u32 crypto_alg = cmd & HACE_CMD_OP_MODE_MASK;412413CIPHER_DBG(hace_dev, "\n");414415if (crypto_alg == HACE_CMD_CBC || crypto_alg == HACE_CMD_ECB) {416if (!IS_ALIGNED(req->cryptlen, DES_BLOCK_SIZE))417return -EINVAL;418}419420rctx->enc_cmd = cmd | HACE_CMD_DES_SELECT | HACE_CMD_RI_WO_DATA_ENABLE |421HACE_CMD_DES | HACE_CMD_CONTEXT_LOAD_ENABLE |422HACE_CMD_CONTEXT_SAVE_ENABLE;423424return aspeed_hace_crypto_handle_queue(hace_dev, req);425}426427static int aspeed_des_setkey(struct crypto_skcipher *cipher, const u8 *key,428unsigned int keylen)429{430struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);431struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);432struct aspeed_hace_dev *hace_dev = ctx->hace_dev;433int rc;434435CIPHER_DBG(hace_dev, "keylen: %d bits\n", keylen);436437if (keylen != DES_KEY_SIZE && keylen != DES3_EDE_KEY_SIZE) {438dev_warn(hace_dev->dev, "invalid keylen: %d bits\n", keylen);439return -EINVAL;440}441442if (keylen == DES_KEY_SIZE) {443rc = crypto_des_verify_key(tfm, key);444if (rc)445return rc;446447} else if (keylen == DES3_EDE_KEY_SIZE) {448rc = crypto_des3_ede_verify_key(tfm, key);449if (rc)450return rc;451}452453memcpy(ctx->key, key, keylen);454ctx->key_len = keylen;455456crypto_skcipher_clear_flags(ctx->fallback_tfm, CRYPTO_TFM_REQ_MASK);457crypto_skcipher_set_flags(ctx->fallback_tfm, cipher->base.crt_flags &458CRYPTO_TFM_REQ_MASK);459460return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);461}462463static int aspeed_tdes_ctr_decrypt(struct skcipher_request *req)464{465return aspeed_des_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_CTR |466HACE_CMD_TRIPLE_DES);467}468469static int aspeed_tdes_ctr_encrypt(struct skcipher_request *req)470{471return aspeed_des_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_CTR |472HACE_CMD_TRIPLE_DES);473}474475static int aspeed_tdes_cbc_decrypt(struct skcipher_request *req)476{477return aspeed_des_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_CBC |478HACE_CMD_TRIPLE_DES);479}480481static int aspeed_tdes_cbc_encrypt(struct skcipher_request *req)482{483return aspeed_des_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_CBC |484HACE_CMD_TRIPLE_DES);485}486487static int aspeed_tdes_ecb_decrypt(struct skcipher_request *req)488{489return aspeed_des_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_ECB |490HACE_CMD_TRIPLE_DES);491}492493static int aspeed_tdes_ecb_encrypt(struct skcipher_request *req)494{495return aspeed_des_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_ECB |496HACE_CMD_TRIPLE_DES);497}498499static int aspeed_des_ctr_decrypt(struct skcipher_request *req)500{501return aspeed_des_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_CTR |502HACE_CMD_SINGLE_DES);503}504505static int aspeed_des_ctr_encrypt(struct skcipher_request *req)506{507return aspeed_des_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_CTR |508HACE_CMD_SINGLE_DES);509}510511static int aspeed_des_cbc_decrypt(struct skcipher_request *req)512{513return aspeed_des_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_CBC |514HACE_CMD_SINGLE_DES);515}516517static int aspeed_des_cbc_encrypt(struct skcipher_request *req)518{519return aspeed_des_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_CBC |520HACE_CMD_SINGLE_DES);521}522523static int aspeed_des_ecb_decrypt(struct skcipher_request *req)524{525return aspeed_des_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_ECB |526HACE_CMD_SINGLE_DES);527}528529static int aspeed_des_ecb_encrypt(struct skcipher_request *req)530{531return aspeed_des_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_ECB |532HACE_CMD_SINGLE_DES);533}534535static int aspeed_aes_crypt(struct skcipher_request *req, u32 cmd)536{537struct aspeed_cipher_reqctx *rctx = skcipher_request_ctx(req);538struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);539struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);540struct aspeed_hace_dev *hace_dev = ctx->hace_dev;541u32 crypto_alg = cmd & HACE_CMD_OP_MODE_MASK;542543if (crypto_alg == HACE_CMD_CBC || crypto_alg == HACE_CMD_ECB) {544if (!IS_ALIGNED(req->cryptlen, AES_BLOCK_SIZE))545return -EINVAL;546}547548CIPHER_DBG(hace_dev, "%s\n",549(cmd & HACE_CMD_ENCRYPT) ? "encrypt" : "decrypt");550551cmd |= HACE_CMD_AES_SELECT | HACE_CMD_RI_WO_DATA_ENABLE |552HACE_CMD_CONTEXT_LOAD_ENABLE | HACE_CMD_CONTEXT_SAVE_ENABLE;553554switch (ctx->key_len) {555case AES_KEYSIZE_128:556cmd |= HACE_CMD_AES128;557break;558case AES_KEYSIZE_192:559cmd |= HACE_CMD_AES192;560break;561case AES_KEYSIZE_256:562cmd |= HACE_CMD_AES256;563break;564default:565return -EINVAL;566}567568rctx->enc_cmd = cmd;569570return aspeed_hace_crypto_handle_queue(hace_dev, req);571}572573static int aspeed_aes_setkey(struct crypto_skcipher *cipher, const u8 *key,574unsigned int keylen)575{576struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);577struct aspeed_hace_dev *hace_dev = ctx->hace_dev;578struct crypto_aes_ctx gen_aes_key;579580CIPHER_DBG(hace_dev, "keylen: %d bits\n", (keylen * 8));581582if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&583keylen != AES_KEYSIZE_256)584return -EINVAL;585586if (ctx->hace_dev->version == AST2500_VERSION) {587aes_expandkey(&gen_aes_key, key, keylen);588memcpy(ctx->key, gen_aes_key.key_enc, AES_MAX_KEYLENGTH);589590} else {591memcpy(ctx->key, key, keylen);592}593594ctx->key_len = keylen;595596crypto_skcipher_clear_flags(ctx->fallback_tfm, CRYPTO_TFM_REQ_MASK);597crypto_skcipher_set_flags(ctx->fallback_tfm, cipher->base.crt_flags &598CRYPTO_TFM_REQ_MASK);599600return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);601}602603static int aspeed_aes_ctr_decrypt(struct skcipher_request *req)604{605return aspeed_aes_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_CTR);606}607608static int aspeed_aes_ctr_encrypt(struct skcipher_request *req)609{610return aspeed_aes_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_CTR);611}612613static int aspeed_aes_cbc_decrypt(struct skcipher_request *req)614{615return aspeed_aes_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_CBC);616}617618static int aspeed_aes_cbc_encrypt(struct skcipher_request *req)619{620return aspeed_aes_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_CBC);621}622623static int aspeed_aes_ecb_decrypt(struct skcipher_request *req)624{625return aspeed_aes_crypt(req, HACE_CMD_DECRYPT | HACE_CMD_ECB);626}627628static int aspeed_aes_ecb_encrypt(struct skcipher_request *req)629{630return aspeed_aes_crypt(req, HACE_CMD_ENCRYPT | HACE_CMD_ECB);631}632633static int aspeed_crypto_cra_init(struct crypto_skcipher *tfm)634{635struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);636struct skcipher_alg *alg = crypto_skcipher_alg(tfm);637const char *name = crypto_tfm_alg_name(&tfm->base);638struct aspeed_hace_alg *crypto_alg;639640641crypto_alg = container_of(alg, struct aspeed_hace_alg, alg.skcipher.base);642ctx->hace_dev = crypto_alg->hace_dev;643ctx->start = aspeed_hace_skcipher_trigger;644645CIPHER_DBG(ctx->hace_dev, "%s\n", name);646647ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_ASYNC |648CRYPTO_ALG_NEED_FALLBACK);649if (IS_ERR(ctx->fallback_tfm)) {650dev_err(ctx->hace_dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",651name, PTR_ERR(ctx->fallback_tfm));652return PTR_ERR(ctx->fallback_tfm);653}654655crypto_skcipher_set_reqsize(tfm, sizeof(struct aspeed_cipher_reqctx) +656crypto_skcipher_reqsize(ctx->fallback_tfm));657658return 0;659}660661static void aspeed_crypto_cra_exit(struct crypto_skcipher *tfm)662{663struct aspeed_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);664struct aspeed_hace_dev *hace_dev = ctx->hace_dev;665666CIPHER_DBG(hace_dev, "%s\n", crypto_tfm_alg_name(&tfm->base));667crypto_free_skcipher(ctx->fallback_tfm);668}669670static struct aspeed_hace_alg aspeed_crypto_algs[] = {671{672.alg.skcipher.base = {673.min_keysize = AES_MIN_KEY_SIZE,674.max_keysize = AES_MAX_KEY_SIZE,675.setkey = aspeed_aes_setkey,676.encrypt = aspeed_aes_ecb_encrypt,677.decrypt = aspeed_aes_ecb_decrypt,678.init = aspeed_crypto_cra_init,679.exit = aspeed_crypto_cra_exit,680.base = {681.cra_name = "ecb(aes)",682.cra_driver_name = "aspeed-ecb-aes",683.cra_priority = 300,684.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |685CRYPTO_ALG_ASYNC |686CRYPTO_ALG_NEED_FALLBACK,687.cra_blocksize = AES_BLOCK_SIZE,688.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),689.cra_alignmask = 0x0f,690.cra_module = THIS_MODULE,691}692},693.alg.skcipher.op = {694.do_one_request = aspeed_crypto_do_request,695},696},697{698.alg.skcipher.base = {699.ivsize = AES_BLOCK_SIZE,700.min_keysize = AES_MIN_KEY_SIZE,701.max_keysize = AES_MAX_KEY_SIZE,702.setkey = aspeed_aes_setkey,703.encrypt = aspeed_aes_cbc_encrypt,704.decrypt = aspeed_aes_cbc_decrypt,705.init = aspeed_crypto_cra_init,706.exit = aspeed_crypto_cra_exit,707.base = {708.cra_name = "cbc(aes)",709.cra_driver_name = "aspeed-cbc-aes",710.cra_priority = 300,711.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |712CRYPTO_ALG_ASYNC |713CRYPTO_ALG_NEED_FALLBACK,714.cra_blocksize = AES_BLOCK_SIZE,715.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),716.cra_alignmask = 0x0f,717.cra_module = THIS_MODULE,718}719},720.alg.skcipher.op = {721.do_one_request = aspeed_crypto_do_request,722},723},724{725.alg.skcipher.base = {726.min_keysize = DES_KEY_SIZE,727.max_keysize = DES_KEY_SIZE,728.setkey = aspeed_des_setkey,729.encrypt = aspeed_des_ecb_encrypt,730.decrypt = aspeed_des_ecb_decrypt,731.init = aspeed_crypto_cra_init,732.exit = aspeed_crypto_cra_exit,733.base = {734.cra_name = "ecb(des)",735.cra_driver_name = "aspeed-ecb-des",736.cra_priority = 300,737.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |738CRYPTO_ALG_ASYNC |739CRYPTO_ALG_NEED_FALLBACK,740.cra_blocksize = DES_BLOCK_SIZE,741.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),742.cra_alignmask = 0x0f,743.cra_module = THIS_MODULE,744}745},746.alg.skcipher.op = {747.do_one_request = aspeed_crypto_do_request,748},749},750{751.alg.skcipher.base = {752.ivsize = DES_BLOCK_SIZE,753.min_keysize = DES_KEY_SIZE,754.max_keysize = DES_KEY_SIZE,755.setkey = aspeed_des_setkey,756.encrypt = aspeed_des_cbc_encrypt,757.decrypt = aspeed_des_cbc_decrypt,758.init = aspeed_crypto_cra_init,759.exit = aspeed_crypto_cra_exit,760.base = {761.cra_name = "cbc(des)",762.cra_driver_name = "aspeed-cbc-des",763.cra_priority = 300,764.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |765CRYPTO_ALG_ASYNC |766CRYPTO_ALG_NEED_FALLBACK,767.cra_blocksize = DES_BLOCK_SIZE,768.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),769.cra_alignmask = 0x0f,770.cra_module = THIS_MODULE,771}772},773.alg.skcipher.op = {774.do_one_request = aspeed_crypto_do_request,775},776},777{778.alg.skcipher.base = {779.min_keysize = DES3_EDE_KEY_SIZE,780.max_keysize = DES3_EDE_KEY_SIZE,781.setkey = aspeed_des_setkey,782.encrypt = aspeed_tdes_ecb_encrypt,783.decrypt = aspeed_tdes_ecb_decrypt,784.init = aspeed_crypto_cra_init,785.exit = aspeed_crypto_cra_exit,786.base = {787.cra_name = "ecb(des3_ede)",788.cra_driver_name = "aspeed-ecb-tdes",789.cra_priority = 300,790.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |791CRYPTO_ALG_ASYNC |792CRYPTO_ALG_NEED_FALLBACK,793.cra_blocksize = DES_BLOCK_SIZE,794.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),795.cra_alignmask = 0x0f,796.cra_module = THIS_MODULE,797}798},799.alg.skcipher.op = {800.do_one_request = aspeed_crypto_do_request,801},802},803{804.alg.skcipher.base = {805.ivsize = DES_BLOCK_SIZE,806.min_keysize = DES3_EDE_KEY_SIZE,807.max_keysize = DES3_EDE_KEY_SIZE,808.setkey = aspeed_des_setkey,809.encrypt = aspeed_tdes_cbc_encrypt,810.decrypt = aspeed_tdes_cbc_decrypt,811.init = aspeed_crypto_cra_init,812.exit = aspeed_crypto_cra_exit,813.base = {814.cra_name = "cbc(des3_ede)",815.cra_driver_name = "aspeed-cbc-tdes",816.cra_priority = 300,817.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |818CRYPTO_ALG_ASYNC |819CRYPTO_ALG_NEED_FALLBACK,820.cra_blocksize = DES_BLOCK_SIZE,821.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),822.cra_alignmask = 0x0f,823.cra_module = THIS_MODULE,824}825},826.alg.skcipher.op = {827.do_one_request = aspeed_crypto_do_request,828},829},830};831832static struct aspeed_hace_alg aspeed_crypto_algs_g6[] = {833{834.alg.skcipher.base = {835.ivsize = AES_BLOCK_SIZE,836.min_keysize = AES_MIN_KEY_SIZE,837.max_keysize = AES_MAX_KEY_SIZE,838.setkey = aspeed_aes_setkey,839.encrypt = aspeed_aes_ctr_encrypt,840.decrypt = aspeed_aes_ctr_decrypt,841.init = aspeed_crypto_cra_init,842.exit = aspeed_crypto_cra_exit,843.base = {844.cra_name = "ctr(aes)",845.cra_driver_name = "aspeed-ctr-aes",846.cra_priority = 300,847.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |848CRYPTO_ALG_ASYNC,849.cra_blocksize = 1,850.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),851.cra_alignmask = 0x0f,852.cra_module = THIS_MODULE,853}854},855.alg.skcipher.op = {856.do_one_request = aspeed_crypto_do_request,857},858},859{860.alg.skcipher.base = {861.ivsize = DES_BLOCK_SIZE,862.min_keysize = DES_KEY_SIZE,863.max_keysize = DES_KEY_SIZE,864.setkey = aspeed_des_setkey,865.encrypt = aspeed_des_ctr_encrypt,866.decrypt = aspeed_des_ctr_decrypt,867.init = aspeed_crypto_cra_init,868.exit = aspeed_crypto_cra_exit,869.base = {870.cra_name = "ctr(des)",871.cra_driver_name = "aspeed-ctr-des",872.cra_priority = 300,873.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |874CRYPTO_ALG_ASYNC,875.cra_blocksize = 1,876.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),877.cra_alignmask = 0x0f,878.cra_module = THIS_MODULE,879}880},881.alg.skcipher.op = {882.do_one_request = aspeed_crypto_do_request,883},884},885{886.alg.skcipher.base = {887.ivsize = DES_BLOCK_SIZE,888.min_keysize = DES3_EDE_KEY_SIZE,889.max_keysize = DES3_EDE_KEY_SIZE,890.setkey = aspeed_des_setkey,891.encrypt = aspeed_tdes_ctr_encrypt,892.decrypt = aspeed_tdes_ctr_decrypt,893.init = aspeed_crypto_cra_init,894.exit = aspeed_crypto_cra_exit,895.base = {896.cra_name = "ctr(des3_ede)",897.cra_driver_name = "aspeed-ctr-tdes",898.cra_priority = 300,899.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |900CRYPTO_ALG_ASYNC,901.cra_blocksize = 1,902.cra_ctxsize = sizeof(struct aspeed_cipher_ctx),903.cra_alignmask = 0x0f,904.cra_module = THIS_MODULE,905}906},907.alg.skcipher.op = {908.do_one_request = aspeed_crypto_do_request,909},910},911912};913914void aspeed_unregister_hace_crypto_algs(struct aspeed_hace_dev *hace_dev)915{916int i;917918for (i = 0; i < ARRAY_SIZE(aspeed_crypto_algs); i++)919crypto_engine_unregister_skcipher(&aspeed_crypto_algs[i].alg.skcipher);920921if (hace_dev->version != AST2600_VERSION)922return;923924for (i = 0; i < ARRAY_SIZE(aspeed_crypto_algs_g6); i++)925crypto_engine_unregister_skcipher(&aspeed_crypto_algs_g6[i].alg.skcipher);926}927928void aspeed_register_hace_crypto_algs(struct aspeed_hace_dev *hace_dev)929{930int rc, i;931932CIPHER_DBG(hace_dev, "\n");933934for (i = 0; i < ARRAY_SIZE(aspeed_crypto_algs); i++) {935aspeed_crypto_algs[i].hace_dev = hace_dev;936rc = crypto_engine_register_skcipher(&aspeed_crypto_algs[i].alg.skcipher);937if (rc) {938CIPHER_DBG(hace_dev, "Failed to register %s\n",939aspeed_crypto_algs[i].alg.skcipher.base.base.cra_name);940}941}942943if (hace_dev->version != AST2600_VERSION)944return;945946for (i = 0; i < ARRAY_SIZE(aspeed_crypto_algs_g6); i++) {947aspeed_crypto_algs_g6[i].hace_dev = hace_dev;948rc = crypto_engine_register_skcipher(&aspeed_crypto_algs_g6[i].alg.skcipher);949if (rc) {950CIPHER_DBG(hace_dev, "Failed to register %s\n",951aspeed_crypto_algs_g6[i].alg.skcipher.base.base.cra_name);952}953}954}955956957