linux/drivers/crypto/hisilicon/sec/sec_algs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright (c) 2016-2017 HiSilicon Limited. */
   3#include <linux/crypto.h>
   4#include <linux/dma-mapping.h>
   5#include <linux/dmapool.h>
   6#include <linux/module.h>
   7#include <linux/mutex.h>
   8#include <linux/slab.h>
   9
  10#include <crypto/aes.h>
  11#include <crypto/algapi.h>
  12#include <crypto/internal/des.h>
  13#include <crypto/skcipher.h>
  14#include <crypto/xts.h>
  15#include <crypto/internal/skcipher.h>
  16
  17#include "sec_drv.h"
  18
  19#define SEC_MAX_CIPHER_KEY              64
  20#define SEC_REQ_LIMIT SZ_32M
  21
  22struct sec_c_alg_cfg {
  23        unsigned c_alg          : 3;
  24        unsigned c_mode         : 3;
  25        unsigned key_len        : 2;
  26        unsigned c_width        : 2;
  27};
  28
  29static const struct sec_c_alg_cfg sec_c_alg_cfgs[] =  {
  30        [SEC_C_DES_ECB_64] = {
  31                .c_alg = SEC_C_ALG_DES,
  32                .c_mode = SEC_C_MODE_ECB,
  33                .key_len = SEC_KEY_LEN_DES,
  34        },
  35        [SEC_C_DES_CBC_64] = {
  36                .c_alg = SEC_C_ALG_DES,
  37                .c_mode = SEC_C_MODE_CBC,
  38                .key_len = SEC_KEY_LEN_DES,
  39        },
  40        [SEC_C_3DES_ECB_192_3KEY] = {
  41                .c_alg = SEC_C_ALG_3DES,
  42                .c_mode = SEC_C_MODE_ECB,
  43                .key_len = SEC_KEY_LEN_3DES_3_KEY,
  44        },
  45        [SEC_C_3DES_ECB_192_2KEY] = {
  46                .c_alg = SEC_C_ALG_3DES,
  47                .c_mode = SEC_C_MODE_ECB,
  48                .key_len = SEC_KEY_LEN_3DES_2_KEY,
  49        },
  50        [SEC_C_3DES_CBC_192_3KEY] = {
  51                .c_alg = SEC_C_ALG_3DES,
  52                .c_mode = SEC_C_MODE_CBC,
  53                .key_len = SEC_KEY_LEN_3DES_3_KEY,
  54        },
  55        [SEC_C_3DES_CBC_192_2KEY] = {
  56                .c_alg = SEC_C_ALG_3DES,
  57                .c_mode = SEC_C_MODE_CBC,
  58                .key_len = SEC_KEY_LEN_3DES_2_KEY,
  59        },
  60        [SEC_C_AES_ECB_128] = {
  61                .c_alg = SEC_C_ALG_AES,
  62                .c_mode = SEC_C_MODE_ECB,
  63                .key_len = SEC_KEY_LEN_AES_128,
  64        },
  65        [SEC_C_AES_ECB_192] = {
  66                .c_alg = SEC_C_ALG_AES,
  67                .c_mode = SEC_C_MODE_ECB,
  68                .key_len = SEC_KEY_LEN_AES_192,
  69        },
  70        [SEC_C_AES_ECB_256] = {
  71                .c_alg = SEC_C_ALG_AES,
  72                .c_mode = SEC_C_MODE_ECB,
  73                .key_len = SEC_KEY_LEN_AES_256,
  74        },
  75        [SEC_C_AES_CBC_128] = {
  76                .c_alg = SEC_C_ALG_AES,
  77                .c_mode = SEC_C_MODE_CBC,
  78                .key_len = SEC_KEY_LEN_AES_128,
  79        },
  80        [SEC_C_AES_CBC_192] = {
  81                .c_alg = SEC_C_ALG_AES,
  82                .c_mode = SEC_C_MODE_CBC,
  83                .key_len = SEC_KEY_LEN_AES_192,
  84        },
  85        [SEC_C_AES_CBC_256] = {
  86                .c_alg = SEC_C_ALG_AES,
  87                .c_mode = SEC_C_MODE_CBC,
  88                .key_len = SEC_KEY_LEN_AES_256,
  89        },
  90        [SEC_C_AES_CTR_128] = {
  91                .c_alg = SEC_C_ALG_AES,
  92                .c_mode = SEC_C_MODE_CTR,
  93                .key_len = SEC_KEY_LEN_AES_128,
  94        },
  95        [SEC_C_AES_CTR_192] = {
  96                .c_alg = SEC_C_ALG_AES,
  97                .c_mode = SEC_C_MODE_CTR,
  98                .key_len = SEC_KEY_LEN_AES_192,
  99        },
 100        [SEC_C_AES_CTR_256] = {
 101                .c_alg = SEC_C_ALG_AES,
 102                .c_mode = SEC_C_MODE_CTR,
 103                .key_len = SEC_KEY_LEN_AES_256,
 104        },
 105        [SEC_C_AES_XTS_128] = {
 106                .c_alg = SEC_C_ALG_AES,
 107                .c_mode = SEC_C_MODE_XTS,
 108                .key_len = SEC_KEY_LEN_AES_128,
 109        },
 110        [SEC_C_AES_XTS_256] = {
 111                .c_alg = SEC_C_ALG_AES,
 112                .c_mode = SEC_C_MODE_XTS,
 113                .key_len = SEC_KEY_LEN_AES_256,
 114        },
 115        [SEC_C_NULL] = {
 116        },
 117};
 118
 119/*
 120 * Mutex used to ensure safe operation of reference count of
 121 * alg providers
 122 */
 123static DEFINE_MUTEX(algs_lock);
 124static unsigned int active_devs;
 125
 126static void sec_alg_skcipher_init_template(struct sec_alg_tfm_ctx *ctx,
 127                                           struct sec_bd_info *req,
 128                                           enum sec_cipher_alg alg)
 129{
 130        const struct sec_c_alg_cfg *cfg = &sec_c_alg_cfgs[alg];
 131
 132        memset(req, 0, sizeof(*req));
 133        req->w0 |= cfg->c_mode << SEC_BD_W0_C_MODE_S;
 134        req->w1 |= cfg->c_alg << SEC_BD_W1_C_ALG_S;
 135        req->w3 |= cfg->key_len << SEC_BD_W3_C_KEY_LEN_S;
 136        req->w0 |= cfg->c_width << SEC_BD_W0_C_WIDTH_S;
 137
 138        req->cipher_key_addr_lo = lower_32_bits(ctx->pkey);
 139        req->cipher_key_addr_hi = upper_32_bits(ctx->pkey);
 140}
 141
 142static void sec_alg_skcipher_init_context(struct crypto_skcipher *atfm,
 143                                          const u8 *key,
 144                                          unsigned int keylen,
 145                                          enum sec_cipher_alg alg)
 146{
 147        struct crypto_tfm *tfm = crypto_skcipher_tfm(atfm);
 148        struct sec_alg_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
 149
 150        ctx->cipher_alg = alg;
 151        memcpy(ctx->key, key, keylen);
 152        sec_alg_skcipher_init_template(ctx, &ctx->req_template,
 153                                       ctx->cipher_alg);
 154}
 155
 156static void sec_free_hw_sgl(struct sec_hw_sgl *hw_sgl,
 157                            dma_addr_t psec_sgl, struct sec_dev_info *info)
 158{
 159        struct sec_hw_sgl *sgl_current, *sgl_next;
 160        dma_addr_t sgl_next_dma;
 161
 162        sgl_current = hw_sgl;
 163        while (sgl_current) {
 164                sgl_next = sgl_current->next;
 165                sgl_next_dma = sgl_current->next_sgl;
 166
 167                dma_pool_free(info->hw_sgl_pool, sgl_current, psec_sgl);
 168
 169                sgl_current = sgl_next;
 170                psec_sgl = sgl_next_dma;
 171        }
 172}
 173
 174static int sec_alloc_and_fill_hw_sgl(struct sec_hw_sgl **sec_sgl,
 175                                     dma_addr_t *psec_sgl,
 176                                     struct scatterlist *sgl,
 177                                     int count,
 178                                     struct sec_dev_info *info,
 179                                     gfp_t gfp)
 180{
 181        struct sec_hw_sgl *sgl_current = NULL;
 182        struct sec_hw_sgl *sgl_next;
 183        dma_addr_t sgl_next_dma;
 184        struct scatterlist *sg;
 185        int ret, sge_index, i;
 186
 187        if (!count)
 188                return -EINVAL;
 189
 190        for_each_sg(sgl, sg, count, i) {
 191                sge_index = i % SEC_MAX_SGE_NUM;
 192                if (sge_index == 0) {
 193                        sgl_next = dma_pool_zalloc(info->hw_sgl_pool,
 194                                                   gfp, &sgl_next_dma);
 195                        if (!sgl_next) {
 196                                ret = -ENOMEM;
 197                                goto err_free_hw_sgls;
 198                        }
 199
 200                        if (!sgl_current) { /* First one */
 201                                *psec_sgl = sgl_next_dma;
 202                                *sec_sgl = sgl_next;
 203                        } else { /* Chained */
 204                                sgl_current->entry_sum_in_sgl = SEC_MAX_SGE_NUM;
 205                                sgl_current->next_sgl = sgl_next_dma;
 206                                sgl_current->next = sgl_next;
 207                        }
 208                        sgl_current = sgl_next;
 209                }
 210                sgl_current->sge_entries[sge_index].buf = sg_dma_address(sg);
 211                sgl_current->sge_entries[sge_index].len = sg_dma_len(sg);
 212                sgl_current->data_bytes_in_sgl += sg_dma_len(sg);
 213        }
 214        sgl_current->entry_sum_in_sgl = count % SEC_MAX_SGE_NUM;
 215        sgl_current->next_sgl = 0;
 216        (*sec_sgl)->entry_sum_in_chain = count;
 217
 218        return 0;
 219
 220err_free_hw_sgls:
 221        sec_free_hw_sgl(*sec_sgl, *psec_sgl, info);
 222        *psec_sgl = 0;
 223
 224        return ret;
 225}
 226
 227static int sec_alg_skcipher_setkey(struct crypto_skcipher *tfm,
 228                                   const u8 *key, unsigned int keylen,
 229                                   enum sec_cipher_alg alg)
 230{
 231        struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
 232        struct device *dev = ctx->queue->dev_info->dev;
 233
 234        mutex_lock(&ctx->lock);
 235        if (ctx->key) {
 236                /* rekeying */
 237                memset(ctx->key, 0, SEC_MAX_CIPHER_KEY);
 238        } else {
 239                /* new key */
 240                ctx->key = dma_alloc_coherent(dev, SEC_MAX_CIPHER_KEY,
 241                                              &ctx->pkey, GFP_KERNEL);
 242                if (!ctx->key) {
 243                        mutex_unlock(&ctx->lock);
 244                        return -ENOMEM;
 245                }
 246        }
 247        mutex_unlock(&ctx->lock);
 248        sec_alg_skcipher_init_context(tfm, key, keylen, alg);
 249
 250        return 0;
 251}
 252
 253static int sec_alg_skcipher_setkey_aes_ecb(struct crypto_skcipher *tfm,
 254                                           const u8 *key, unsigned int keylen)
 255{
 256        enum sec_cipher_alg alg;
 257
 258        switch (keylen) {
 259        case AES_KEYSIZE_128:
 260                alg = SEC_C_AES_ECB_128;
 261                break;
 262        case AES_KEYSIZE_192:
 263                alg = SEC_C_AES_ECB_192;
 264                break;
 265        case AES_KEYSIZE_256:
 266                alg = SEC_C_AES_ECB_256;
 267                break;
 268        default:
 269                return -EINVAL;
 270        }
 271
 272        return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
 273}
 274
 275static int sec_alg_skcipher_setkey_aes_cbc(struct crypto_skcipher *tfm,
 276                                           const u8 *key, unsigned int keylen)
 277{
 278        enum sec_cipher_alg alg;
 279
 280        switch (keylen) {
 281        case AES_KEYSIZE_128:
 282                alg = SEC_C_AES_CBC_128;
 283                break;
 284        case AES_KEYSIZE_192:
 285                alg = SEC_C_AES_CBC_192;
 286                break;
 287        case AES_KEYSIZE_256:
 288                alg = SEC_C_AES_CBC_256;
 289                break;
 290        default:
 291                return -EINVAL;
 292        }
 293
 294        return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
 295}
 296
 297static int sec_alg_skcipher_setkey_aes_ctr(struct crypto_skcipher *tfm,
 298                                           const u8 *key, unsigned int keylen)
 299{
 300        enum sec_cipher_alg alg;
 301
 302        switch (keylen) {
 303        case AES_KEYSIZE_128:
 304                alg = SEC_C_AES_CTR_128;
 305                break;
 306        case AES_KEYSIZE_192:
 307                alg = SEC_C_AES_CTR_192;
 308                break;
 309        case AES_KEYSIZE_256:
 310                alg = SEC_C_AES_CTR_256;
 311                break;
 312        default:
 313                return -EINVAL;
 314        }
 315
 316        return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
 317}
 318
 319static int sec_alg_skcipher_setkey_aes_xts(struct crypto_skcipher *tfm,
 320                                           const u8 *key, unsigned int keylen)
 321{
 322        enum sec_cipher_alg alg;
 323        int ret;
 324
 325        ret = xts_verify_key(tfm, key, keylen);
 326        if (ret)
 327                return ret;
 328
 329        switch (keylen) {
 330        case AES_KEYSIZE_128 * 2:
 331                alg = SEC_C_AES_XTS_128;
 332                break;
 333        case AES_KEYSIZE_256 * 2:
 334                alg = SEC_C_AES_XTS_256;
 335                break;
 336        default:
 337                return -EINVAL;
 338        }
 339
 340        return sec_alg_skcipher_setkey(tfm, key, keylen, alg);
 341}
 342
 343static int sec_alg_skcipher_setkey_des_ecb(struct crypto_skcipher *tfm,
 344                                           const u8 *key, unsigned int keylen)
 345{
 346        return verify_skcipher_des_key(tfm, key) ?:
 347               sec_alg_skcipher_setkey(tfm, key, keylen, SEC_C_DES_ECB_64);
 348}
 349
 350static int sec_alg_skcipher_setkey_des_cbc(struct crypto_skcipher *tfm,
 351                                           const u8 *key, unsigned int keylen)
 352{
 353        return verify_skcipher_des_key(tfm, key) ?:
 354               sec_alg_skcipher_setkey(tfm, key, keylen, SEC_C_DES_CBC_64);
 355}
 356
 357static int sec_alg_skcipher_setkey_3des_ecb(struct crypto_skcipher *tfm,
 358                                            const u8 *key, unsigned int keylen)
 359{
 360        return verify_skcipher_des3_key(tfm, key) ?:
 361               sec_alg_skcipher_setkey(tfm, key, keylen,
 362                                       SEC_C_3DES_ECB_192_3KEY);
 363}
 364
 365static int sec_alg_skcipher_setkey_3des_cbc(struct crypto_skcipher *tfm,
 366                                            const u8 *key, unsigned int keylen)
 367{
 368        return verify_skcipher_des3_key(tfm, key) ?:
 369               sec_alg_skcipher_setkey(tfm, key, keylen,
 370                                       SEC_C_3DES_CBC_192_3KEY);
 371}
 372
 373static void sec_alg_free_el(struct sec_request_el *el,
 374                            struct sec_dev_info *info)
 375{
 376        sec_free_hw_sgl(el->out, el->dma_out, info);
 377        sec_free_hw_sgl(el->in, el->dma_in, info);
 378        kfree(el->sgl_in);
 379        kfree(el->sgl_out);
 380        kfree(el);
 381}
 382
 383/* queuelock must be held */
 384static int sec_send_request(struct sec_request *sec_req, struct sec_queue *queue)
 385{
 386        struct sec_request_el *el, *temp;
 387        int ret = 0;
 388
 389        mutex_lock(&sec_req->lock);
 390        list_for_each_entry_safe(el, temp, &sec_req->elements, head) {
 391                /*
 392                 * Add to hardware queue only under following circumstances
 393                 * 1) Software and hardware queue empty so no chain dependencies
 394                 * 2) No dependencies as new IV - (check software queue empty
 395                 *    to maintain order)
 396                 * 3) No dependencies because the mode does no chaining.
 397                 *
 398                 * In other cases first insert onto the software queue which
 399                 * is then emptied as requests complete
 400                 */
 401                if (!queue->havesoftqueue ||
 402                    (kfifo_is_empty(&queue->softqueue) &&
 403                     sec_queue_empty(queue))) {
 404                        ret = sec_queue_send(queue, &el->req, sec_req);
 405                        if (ret == -EAGAIN) {
 406                                /* Wait unti we can send then try again */
 407                                /* DEAD if here - should not happen */
 408                                ret = -EBUSY;
 409                                goto err_unlock;
 410                        }
 411                } else {
 412                        kfifo_put(&queue->softqueue, el);
 413                }
 414        }
 415err_unlock:
 416        mutex_unlock(&sec_req->lock);
 417
 418        return ret;
 419}
 420
 421static void sec_skcipher_alg_callback(struct sec_bd_info *sec_resp,
 422                                      struct crypto_async_request *req_base)
 423{
 424        struct skcipher_request *skreq = container_of(req_base,
 425                                                      struct skcipher_request,
 426                                                      base);
 427        struct sec_request *sec_req = skcipher_request_ctx(skreq);
 428        struct sec_request *backlog_req;
 429        struct sec_request_el *sec_req_el, *nextrequest;
 430        struct sec_alg_tfm_ctx *ctx = sec_req->tfm_ctx;
 431        struct crypto_skcipher *atfm = crypto_skcipher_reqtfm(skreq);
 432        struct device *dev = ctx->queue->dev_info->dev;
 433        int icv_or_skey_en, ret;
 434        bool done;
 435
 436        sec_req_el = list_first_entry(&sec_req->elements, struct sec_request_el,
 437                                      head);
 438        icv_or_skey_en = (sec_resp->w0 & SEC_BD_W0_ICV_OR_SKEY_EN_M) >>
 439                SEC_BD_W0_ICV_OR_SKEY_EN_S;
 440        if (sec_resp->w1 & SEC_BD_W1_BD_INVALID || icv_or_skey_en == 3) {
 441                dev_err(dev, "Got an invalid answer %lu %d\n",
 442                        sec_resp->w1 & SEC_BD_W1_BD_INVALID,
 443                        icv_or_skey_en);
 444                sec_req->err = -EINVAL;
 445                /*
 446                 * We need to muddle on to avoid getting stuck with elements
 447                 * on the queue. Error will be reported so requester so
 448                 * it should be able to handle appropriately.
 449                 */
 450        }
 451
 452        mutex_lock(&ctx->queue->queuelock);
 453        /* Put the IV in place for chained cases */
 454        switch (ctx->cipher_alg) {
 455        case SEC_C_AES_CBC_128:
 456        case SEC_C_AES_CBC_192:
 457        case SEC_C_AES_CBC_256:
 458                if (sec_req_el->req.w0 & SEC_BD_W0_DE)
 459                        sg_pcopy_to_buffer(sec_req_el->sgl_out,
 460                                           sg_nents(sec_req_el->sgl_out),
 461                                           skreq->iv,
 462                                           crypto_skcipher_ivsize(atfm),
 463                                           sec_req_el->el_length -
 464                                           crypto_skcipher_ivsize(atfm));
 465                else
 466                        sg_pcopy_to_buffer(sec_req_el->sgl_in,
 467                                           sg_nents(sec_req_el->sgl_in),
 468                                           skreq->iv,
 469                                           crypto_skcipher_ivsize(atfm),
 470                                           sec_req_el->el_length -
 471                                           crypto_skcipher_ivsize(atfm));
 472                /* No need to sync to the device as coherent DMA */
 473                break;
 474        case SEC_C_AES_CTR_128:
 475        case SEC_C_AES_CTR_192:
 476        case SEC_C_AES_CTR_256:
 477                crypto_inc(skreq->iv, 16);
 478                break;
 479        default:
 480                /* Do not update */
 481                break;
 482        }
 483
 484        if (ctx->queue->havesoftqueue &&
 485            !kfifo_is_empty(&ctx->queue->softqueue) &&
 486            sec_queue_empty(ctx->queue)) {
 487                ret = kfifo_get(&ctx->queue->softqueue, &nextrequest);
 488                if (ret <= 0)
 489                        dev_err(dev,
 490                                "Error getting next element from kfifo %d\n",
 491                                ret);
 492                else
 493                        /* We know there is space so this cannot fail */
 494                        sec_queue_send(ctx->queue, &nextrequest->req,
 495                                       nextrequest->sec_req);
 496        } else if (!list_empty(&ctx->backlog)) {
 497                /* Need to verify there is room first */
 498                backlog_req = list_first_entry(&ctx->backlog,
 499                                               typeof(*backlog_req),
 500                                               backlog_head);
 501                if (sec_queue_can_enqueue(ctx->queue,
 502                    backlog_req->num_elements) ||
 503                    (ctx->queue->havesoftqueue &&
 504                     kfifo_avail(&ctx->queue->softqueue) >
 505                     backlog_req->num_elements)) {
 506                        sec_send_request(backlog_req, ctx->queue);
 507                        backlog_req->req_base->complete(backlog_req->req_base,
 508                                                        -EINPROGRESS);
 509                        list_del(&backlog_req->backlog_head);
 510                }
 511        }
 512        mutex_unlock(&ctx->queue->queuelock);
 513
 514        mutex_lock(&sec_req->lock);
 515        list_del(&sec_req_el->head);
 516        mutex_unlock(&sec_req->lock);
 517        sec_alg_free_el(sec_req_el, ctx->queue->dev_info);
 518
 519        /*
 520         * Request is done.
 521         * The dance is needed as the lock is freed in the completion
 522         */
 523        mutex_lock(&sec_req->lock);
 524        done = list_empty(&sec_req->elements);
 525        mutex_unlock(&sec_req->lock);
 526        if (done) {
 527                if (crypto_skcipher_ivsize(atfm)) {
 528                        dma_unmap_single(dev, sec_req->dma_iv,
 529                                         crypto_skcipher_ivsize(atfm),
 530                                         DMA_TO_DEVICE);
 531                }
 532                dma_unmap_sg(dev, skreq->src, sec_req->len_in,
 533                             DMA_BIDIRECTIONAL);
 534                if (skreq->src != skreq->dst)
 535                        dma_unmap_sg(dev, skreq->dst, sec_req->len_out,
 536                                     DMA_BIDIRECTIONAL);
 537                skreq->base.complete(&skreq->base, sec_req->err);
 538        }
 539}
 540
 541void sec_alg_callback(struct sec_bd_info *resp, void *shadow)
 542{
 543        struct sec_request *sec_req = shadow;
 544
 545        sec_req->cb(resp, sec_req->req_base);
 546}
 547
 548static int sec_alg_alloc_and_calc_split_sizes(int length, size_t **split_sizes,
 549                                              int *steps, gfp_t gfp)
 550{
 551        size_t *sizes;
 552        int i;
 553
 554        /* Split into suitable sized blocks */
 555        *steps = roundup(length, SEC_REQ_LIMIT) / SEC_REQ_LIMIT;
 556        sizes = kcalloc(*steps, sizeof(*sizes), gfp);
 557        if (!sizes)
 558                return -ENOMEM;
 559
 560        for (i = 0; i < *steps - 1; i++)
 561                sizes[i] = SEC_REQ_LIMIT;
 562        sizes[*steps - 1] = length - SEC_REQ_LIMIT * (*steps - 1);
 563        *split_sizes = sizes;
 564
 565        return 0;
 566}
 567
 568static int sec_map_and_split_sg(struct scatterlist *sgl, size_t *split_sizes,
 569                                int steps, struct scatterlist ***splits,
 570                                int **splits_nents,
 571                                int sgl_len_in,
 572                                struct device *dev, gfp_t gfp)
 573{
 574        int ret, count;
 575
 576        count = dma_map_sg(dev, sgl, sgl_len_in, DMA_BIDIRECTIONAL);
 577        if (!count)
 578                return -EINVAL;
 579
 580        *splits = kcalloc(steps, sizeof(struct scatterlist *), gfp);
 581        if (!*splits) {
 582                ret = -ENOMEM;
 583                goto err_unmap_sg;
 584        }
 585        *splits_nents = kcalloc(steps, sizeof(int), gfp);
 586        if (!*splits_nents) {
 587                ret = -ENOMEM;
 588                goto err_free_splits;
 589        }
 590
 591        /* output the scatter list before and after this */
 592        ret = sg_split(sgl, count, 0, steps, split_sizes,
 593                       *splits, *splits_nents, gfp);
 594        if (ret) {
 595                ret = -ENOMEM;
 596                goto err_free_splits_nents;
 597        }
 598
 599        return 0;
 600
 601err_free_splits_nents:
 602        kfree(*splits_nents);
 603err_free_splits:
 604        kfree(*splits);
 605err_unmap_sg:
 606        dma_unmap_sg(dev, sgl, sgl_len_in, DMA_BIDIRECTIONAL);
 607
 608        return ret;
 609}
 610
 611/*
 612 * Reverses the sec_map_and_split_sg call for messages not yet added to
 613 * the queues.
 614 */
 615static void sec_unmap_sg_on_err(struct scatterlist *sgl, int steps,
 616                                struct scatterlist **splits, int *splits_nents,
 617                                int sgl_len_in, struct device *dev)
 618{
 619        int i;
 620
 621        for (i = 0; i < steps; i++)
 622                kfree(splits[i]);
 623        kfree(splits_nents);
 624        kfree(splits);
 625
 626        dma_unmap_sg(dev, sgl, sgl_len_in, DMA_BIDIRECTIONAL);
 627}
 628
 629static struct sec_request_el
 630*sec_alg_alloc_and_fill_el(struct sec_bd_info *template, int encrypt,
 631                           int el_size, bool different_dest,
 632                           struct scatterlist *sgl_in, int n_ents_in,
 633                           struct scatterlist *sgl_out, int n_ents_out,
 634                           struct sec_dev_info *info, gfp_t gfp)
 635{
 636        struct sec_request_el *el;
 637        struct sec_bd_info *req;
 638        int ret;
 639
 640        el = kzalloc(sizeof(*el), gfp);
 641        if (!el)
 642                return ERR_PTR(-ENOMEM);
 643        el->el_length = el_size;
 644        req = &el->req;
 645        memcpy(req, template, sizeof(*req));
 646
 647        req->w0 &= ~SEC_BD_W0_CIPHER_M;
 648        if (encrypt)
 649                req->w0 |= SEC_CIPHER_ENCRYPT << SEC_BD_W0_CIPHER_S;
 650        else
 651                req->w0 |= SEC_CIPHER_DECRYPT << SEC_BD_W0_CIPHER_S;
 652
 653        req->w0 &= ~SEC_BD_W0_C_GRAN_SIZE_19_16_M;
 654        req->w0 |= ((el_size >> 16) << SEC_BD_W0_C_GRAN_SIZE_19_16_S) &
 655                SEC_BD_W0_C_GRAN_SIZE_19_16_M;
 656
 657        req->w0 &= ~SEC_BD_W0_C_GRAN_SIZE_21_20_M;
 658        req->w0 |= ((el_size >> 20) << SEC_BD_W0_C_GRAN_SIZE_21_20_S) &
 659                SEC_BD_W0_C_GRAN_SIZE_21_20_M;
 660
 661        /* Writing whole u32 so no need to take care of masking */
 662        req->w2 = ((1 << SEC_BD_W2_GRAN_NUM_S) & SEC_BD_W2_GRAN_NUM_M) |
 663                ((el_size << SEC_BD_W2_C_GRAN_SIZE_15_0_S) &
 664                 SEC_BD_W2_C_GRAN_SIZE_15_0_M);
 665
 666        req->w3 &= ~SEC_BD_W3_CIPHER_LEN_OFFSET_M;
 667        req->w1 |= SEC_BD_W1_ADDR_TYPE;
 668
 669        el->sgl_in = sgl_in;
 670
 671        ret = sec_alloc_and_fill_hw_sgl(&el->in, &el->dma_in, el->sgl_in,
 672                                        n_ents_in, info, gfp);
 673        if (ret)
 674                goto err_free_el;
 675
 676        req->data_addr_lo = lower_32_bits(el->dma_in);
 677        req->data_addr_hi = upper_32_bits(el->dma_in);
 678
 679        if (different_dest) {
 680                el->sgl_out = sgl_out;
 681                ret = sec_alloc_and_fill_hw_sgl(&el->out, &el->dma_out,
 682                                                el->sgl_out,
 683                                                n_ents_out, info, gfp);
 684                if (ret)
 685                        goto err_free_hw_sgl_in;
 686
 687                req->w0 |= SEC_BD_W0_DE;
 688                req->cipher_destin_addr_lo = lower_32_bits(el->dma_out);
 689                req->cipher_destin_addr_hi = upper_32_bits(el->dma_out);
 690
 691        } else {
 692                req->w0 &= ~SEC_BD_W0_DE;
 693                req->cipher_destin_addr_lo = lower_32_bits(el->dma_in);
 694                req->cipher_destin_addr_hi = upper_32_bits(el->dma_in);
 695        }
 696
 697        return el;
 698
 699err_free_hw_sgl_in:
 700        sec_free_hw_sgl(el->in, el->dma_in, info);
 701err_free_el:
 702        kfree(el);
 703
 704        return ERR_PTR(ret);
 705}
 706
 707static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
 708                                   bool encrypt)
 709{
 710        struct crypto_skcipher *atfm = crypto_skcipher_reqtfm(skreq);
 711        struct crypto_tfm *tfm = crypto_skcipher_tfm(atfm);
 712        struct sec_alg_tfm_ctx *ctx = crypto_tfm_ctx(tfm);
 713        struct sec_queue *queue = ctx->queue;
 714        struct sec_request *sec_req = skcipher_request_ctx(skreq);
 715        struct sec_dev_info *info = queue->dev_info;
 716        int i, ret, steps;
 717        size_t *split_sizes;
 718        struct scatterlist **splits_in;
 719        struct scatterlist **splits_out = NULL;
 720        int *splits_in_nents;
 721        int *splits_out_nents = NULL;
 722        struct sec_request_el *el, *temp;
 723        bool split = skreq->src != skreq->dst;
 724        gfp_t gfp = skreq->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : GFP_ATOMIC;
 725
 726        mutex_init(&sec_req->lock);
 727        sec_req->req_base = &skreq->base;
 728        sec_req->err = 0;
 729        /* SGL mapping out here to allow us to break it up as necessary */
 730        sec_req->len_in = sg_nents(skreq->src);
 731
 732        ret = sec_alg_alloc_and_calc_split_sizes(skreq->cryptlen, &split_sizes,
 733                                                 &steps, gfp);
 734        if (ret)
 735                return ret;
 736        sec_req->num_elements = steps;
 737        ret = sec_map_and_split_sg(skreq->src, split_sizes, steps, &splits_in,
 738                                   &splits_in_nents, sec_req->len_in,
 739                                   info->dev, gfp);
 740        if (ret)
 741                goto err_free_split_sizes;
 742
 743        if (split) {
 744                sec_req->len_out = sg_nents(skreq->dst);
 745                ret = sec_map_and_split_sg(skreq->dst, split_sizes, steps,
 746                                           &splits_out, &splits_out_nents,
 747                                           sec_req->len_out, info->dev, gfp);
 748                if (ret)
 749                        goto err_unmap_in_sg;
 750        }
 751        /* Shared info stored in seq_req - applies to all BDs */
 752        sec_req->tfm_ctx = ctx;
 753        sec_req->cb = sec_skcipher_alg_callback;
 754        INIT_LIST_HEAD(&sec_req->elements);
 755
 756        /*
 757         * Future optimization.
 758         * In the chaining case we can't use a dma pool bounce buffer
 759         * but in the case where we know there is no chaining we can
 760         */
 761        if (crypto_skcipher_ivsize(atfm)) {
 762                sec_req->dma_iv = dma_map_single(info->dev, skreq->iv,
 763                                                 crypto_skcipher_ivsize(atfm),
 764                                                 DMA_TO_DEVICE);
 765                if (dma_mapping_error(info->dev, sec_req->dma_iv)) {
 766                        ret = -ENOMEM;
 767                        goto err_unmap_out_sg;
 768                }
 769        }
 770
 771        /* Set them all up then queue - cleaner error handling. */
 772        for (i = 0; i < steps; i++) {
 773                el = sec_alg_alloc_and_fill_el(&ctx->req_template,
 774                                               encrypt ? 1 : 0,
 775                                               split_sizes[i],
 776                                               skreq->src != skreq->dst,
 777                                               splits_in[i], splits_in_nents[i],
 778                                               split ? splits_out[i] : NULL,
 779                                               split ? splits_out_nents[i] : 0,
 780                                               info, gfp);
 781                if (IS_ERR(el)) {
 782                        ret = PTR_ERR(el);
 783                        goto err_free_elements;
 784                }
 785                el->req.cipher_iv_addr_lo = lower_32_bits(sec_req->dma_iv);
 786                el->req.cipher_iv_addr_hi = upper_32_bits(sec_req->dma_iv);
 787                el->sec_req = sec_req;
 788                list_add_tail(&el->head, &sec_req->elements);
 789        }
 790
 791        /*
 792         * Only attempt to queue if the whole lot can fit in the queue -
 793         * we can't successfully cleanup after a partial queing so this
 794         * must succeed or fail atomically.
 795         *
 796         * Big hammer test of both software and hardware queues - could be
 797         * more refined but this is unlikely to happen so no need.
 798         */
 799
 800        /* Grab a big lock for a long time to avoid concurrency issues */
 801        mutex_lock(&queue->queuelock);
 802
 803        /*
 804         * Can go on to queue if we have space in either:
 805         * 1) The hardware queue and no software queue
 806         * 2) The software queue
 807         * AND there is nothing in the backlog.  If there is backlog we
 808         * have to only queue to the backlog queue and return busy.
 809         */
 810        if ((!sec_queue_can_enqueue(queue, steps) &&
 811             (!queue->havesoftqueue ||
 812              kfifo_avail(&queue->softqueue) > steps)) ||
 813            !list_empty(&ctx->backlog)) {
 814                ret = -EBUSY;
 815                if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
 816                        list_add_tail(&sec_req->backlog_head, &ctx->backlog);
 817                        mutex_unlock(&queue->queuelock);
 818                        goto out;
 819                }
 820
 821                mutex_unlock(&queue->queuelock);
 822                goto err_free_elements;
 823        }
 824        ret = sec_send_request(sec_req, queue);
 825        mutex_unlock(&queue->queuelock);
 826        if (ret)
 827                goto err_free_elements;
 828
 829        ret = -EINPROGRESS;
 830out:
 831        /* Cleanup - all elements in pointer arrays have been copied */
 832        kfree(splits_in_nents);
 833        kfree(splits_in);
 834        kfree(splits_out_nents);
 835        kfree(splits_out);
 836        kfree(split_sizes);
 837        return ret;
 838
 839err_free_elements:
 840        list_for_each_entry_safe(el, temp, &sec_req->elements, head) {
 841                list_del(&el->head);
 842                sec_alg_free_el(el, info);
 843        }
 844        if (crypto_skcipher_ivsize(atfm))
 845                dma_unmap_single(info->dev, sec_req->dma_iv,
 846                                 crypto_skcipher_ivsize(atfm),
 847                                 DMA_BIDIRECTIONAL);
 848err_unmap_out_sg:
 849        if (split)
 850                sec_unmap_sg_on_err(skreq->dst, steps, splits_out,
 851                                    splits_out_nents, sec_req->len_out,
 852                                    info->dev);
 853err_unmap_in_sg:
 854        sec_unmap_sg_on_err(skreq->src, steps, splits_in, splits_in_nents,
 855                            sec_req->len_in, info->dev);
 856err_free_split_sizes:
 857        kfree(split_sizes);
 858
 859        return ret;
 860}
 861
 862static int sec_alg_skcipher_encrypt(struct skcipher_request *req)
 863{
 864        return sec_alg_skcipher_crypto(req, true);
 865}
 866
 867static int sec_alg_skcipher_decrypt(struct skcipher_request *req)
 868{
 869        return sec_alg_skcipher_crypto(req, false);
 870}
 871
 872static int sec_alg_skcipher_init(struct crypto_skcipher *tfm)
 873{
 874        struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
 875
 876        mutex_init(&ctx->lock);
 877        INIT_LIST_HEAD(&ctx->backlog);
 878        crypto_skcipher_set_reqsize(tfm, sizeof(struct sec_request));
 879
 880        ctx->queue = sec_queue_alloc_start_safe();
 881        if (IS_ERR(ctx->queue))
 882                return PTR_ERR(ctx->queue);
 883
 884        mutex_init(&ctx->queue->queuelock);
 885        ctx->queue->havesoftqueue = false;
 886
 887        return 0;
 888}
 889
 890static void sec_alg_skcipher_exit(struct crypto_skcipher *tfm)
 891{
 892        struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
 893        struct device *dev = ctx->queue->dev_info->dev;
 894
 895        if (ctx->key) {
 896                memzero_explicit(ctx->key, SEC_MAX_CIPHER_KEY);
 897                dma_free_coherent(dev, SEC_MAX_CIPHER_KEY, ctx->key,
 898                                  ctx->pkey);
 899        }
 900        sec_queue_stop_release(ctx->queue);
 901}
 902
 903static int sec_alg_skcipher_init_with_queue(struct crypto_skcipher *tfm)
 904{
 905        struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
 906        int ret;
 907
 908        ret = sec_alg_skcipher_init(tfm);
 909        if (ret)
 910                return ret;
 911
 912        INIT_KFIFO(ctx->queue->softqueue);
 913        ret = kfifo_alloc(&ctx->queue->softqueue, 512, GFP_KERNEL);
 914        if (ret) {
 915                sec_alg_skcipher_exit(tfm);
 916                return ret;
 917        }
 918        ctx->queue->havesoftqueue = true;
 919
 920        return 0;
 921}
 922
 923static void sec_alg_skcipher_exit_with_queue(struct crypto_skcipher *tfm)
 924{
 925        struct sec_alg_tfm_ctx *ctx = crypto_skcipher_ctx(tfm);
 926
 927        kfifo_free(&ctx->queue->softqueue);
 928        sec_alg_skcipher_exit(tfm);
 929}
 930
 931static struct skcipher_alg sec_algs[] = {
 932        {
 933                .base = {
 934                        .cra_name = "ecb(aes)",
 935                        .cra_driver_name = "hisi_sec_aes_ecb",
 936                        .cra_priority = 4001,
 937                        .cra_flags = CRYPTO_ALG_ASYNC |
 938                                     CRYPTO_ALG_ALLOCATES_MEMORY,
 939                        .cra_blocksize = AES_BLOCK_SIZE,
 940                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
 941                        .cra_alignmask = 0,
 942                        .cra_module = THIS_MODULE,
 943                },
 944                .init = sec_alg_skcipher_init,
 945                .exit = sec_alg_skcipher_exit,
 946                .setkey = sec_alg_skcipher_setkey_aes_ecb,
 947                .decrypt = sec_alg_skcipher_decrypt,
 948                .encrypt = sec_alg_skcipher_encrypt,
 949                .min_keysize = AES_MIN_KEY_SIZE,
 950                .max_keysize = AES_MAX_KEY_SIZE,
 951                .ivsize = 0,
 952        }, {
 953                .base = {
 954                        .cra_name = "cbc(aes)",
 955                        .cra_driver_name = "hisi_sec_aes_cbc",
 956                        .cra_priority = 4001,
 957                        .cra_flags = CRYPTO_ALG_ASYNC |
 958                                     CRYPTO_ALG_ALLOCATES_MEMORY,
 959                        .cra_blocksize = AES_BLOCK_SIZE,
 960                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
 961                        .cra_alignmask = 0,
 962                        .cra_module = THIS_MODULE,
 963                },
 964                .init = sec_alg_skcipher_init_with_queue,
 965                .exit = sec_alg_skcipher_exit_with_queue,
 966                .setkey = sec_alg_skcipher_setkey_aes_cbc,
 967                .decrypt = sec_alg_skcipher_decrypt,
 968                .encrypt = sec_alg_skcipher_encrypt,
 969                .min_keysize = AES_MIN_KEY_SIZE,
 970                .max_keysize = AES_MAX_KEY_SIZE,
 971                .ivsize = AES_BLOCK_SIZE,
 972        }, {
 973                .base = {
 974                        .cra_name = "ctr(aes)",
 975                        .cra_driver_name = "hisi_sec_aes_ctr",
 976                        .cra_priority = 4001,
 977                        .cra_flags = CRYPTO_ALG_ASYNC |
 978                                     CRYPTO_ALG_ALLOCATES_MEMORY,
 979                        .cra_blocksize = AES_BLOCK_SIZE,
 980                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
 981                        .cra_alignmask = 0,
 982                        .cra_module = THIS_MODULE,
 983                },
 984                .init = sec_alg_skcipher_init_with_queue,
 985                .exit = sec_alg_skcipher_exit_with_queue,
 986                .setkey = sec_alg_skcipher_setkey_aes_ctr,
 987                .decrypt = sec_alg_skcipher_decrypt,
 988                .encrypt = sec_alg_skcipher_encrypt,
 989                .min_keysize = AES_MIN_KEY_SIZE,
 990                .max_keysize = AES_MAX_KEY_SIZE,
 991                .ivsize = AES_BLOCK_SIZE,
 992        }, {
 993                .base = {
 994                        .cra_name = "xts(aes)",
 995                        .cra_driver_name = "hisi_sec_aes_xts",
 996                        .cra_priority = 4001,
 997                        .cra_flags = CRYPTO_ALG_ASYNC |
 998                                     CRYPTO_ALG_ALLOCATES_MEMORY,
 999                        .cra_blocksize = AES_BLOCK_SIZE,
1000                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
1001                        .cra_alignmask = 0,
1002                        .cra_module = THIS_MODULE,
1003                },
1004                .init = sec_alg_skcipher_init,
1005                .exit = sec_alg_skcipher_exit,
1006                .setkey = sec_alg_skcipher_setkey_aes_xts,
1007                .decrypt = sec_alg_skcipher_decrypt,
1008                .encrypt = sec_alg_skcipher_encrypt,
1009                .min_keysize = 2 * AES_MIN_KEY_SIZE,
1010                .max_keysize = 2 * AES_MAX_KEY_SIZE,
1011                .ivsize = AES_BLOCK_SIZE,
1012        }, {
1013        /* Unable to find any test vectors so untested */
1014                .base = {
1015                        .cra_name = "ecb(des)",
1016                        .cra_driver_name = "hisi_sec_des_ecb",
1017                        .cra_priority = 4001,
1018                        .cra_flags = CRYPTO_ALG_ASYNC |
1019                                     CRYPTO_ALG_ALLOCATES_MEMORY,
1020                        .cra_blocksize = DES_BLOCK_SIZE,
1021                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
1022                        .cra_alignmask = 0,
1023                        .cra_module = THIS_MODULE,
1024                },
1025                .init = sec_alg_skcipher_init,
1026                .exit = sec_alg_skcipher_exit,
1027                .setkey = sec_alg_skcipher_setkey_des_ecb,
1028                .decrypt = sec_alg_skcipher_decrypt,
1029                .encrypt = sec_alg_skcipher_encrypt,
1030                .min_keysize = DES_KEY_SIZE,
1031                .max_keysize = DES_KEY_SIZE,
1032                .ivsize = 0,
1033        }, {
1034                .base = {
1035                        .cra_name = "cbc(des)",
1036                        .cra_driver_name = "hisi_sec_des_cbc",
1037                        .cra_priority = 4001,
1038                        .cra_flags = CRYPTO_ALG_ASYNC |
1039                                     CRYPTO_ALG_ALLOCATES_MEMORY,
1040                        .cra_blocksize = DES_BLOCK_SIZE,
1041                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
1042                        .cra_alignmask = 0,
1043                        .cra_module = THIS_MODULE,
1044                },
1045                .init = sec_alg_skcipher_init_with_queue,
1046                .exit = sec_alg_skcipher_exit_with_queue,
1047                .setkey = sec_alg_skcipher_setkey_des_cbc,
1048                .decrypt = sec_alg_skcipher_decrypt,
1049                .encrypt = sec_alg_skcipher_encrypt,
1050                .min_keysize = DES_KEY_SIZE,
1051                .max_keysize = DES_KEY_SIZE,
1052                .ivsize = DES_BLOCK_SIZE,
1053        }, {
1054                .base = {
1055                        .cra_name = "cbc(des3_ede)",
1056                        .cra_driver_name = "hisi_sec_3des_cbc",
1057                        .cra_priority = 4001,
1058                        .cra_flags = CRYPTO_ALG_ASYNC |
1059                                     CRYPTO_ALG_ALLOCATES_MEMORY,
1060                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1061                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
1062                        .cra_alignmask = 0,
1063                        .cra_module = THIS_MODULE,
1064                },
1065                .init = sec_alg_skcipher_init_with_queue,
1066                .exit = sec_alg_skcipher_exit_with_queue,
1067                .setkey = sec_alg_skcipher_setkey_3des_cbc,
1068                .decrypt = sec_alg_skcipher_decrypt,
1069                .encrypt = sec_alg_skcipher_encrypt,
1070                .min_keysize = DES3_EDE_KEY_SIZE,
1071                .max_keysize = DES3_EDE_KEY_SIZE,
1072                .ivsize = DES3_EDE_BLOCK_SIZE,
1073        }, {
1074                .base = {
1075                        .cra_name = "ecb(des3_ede)",
1076                        .cra_driver_name = "hisi_sec_3des_ecb",
1077                        .cra_priority = 4001,
1078                        .cra_flags = CRYPTO_ALG_ASYNC |
1079                                     CRYPTO_ALG_ALLOCATES_MEMORY,
1080                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1081                        .cra_ctxsize = sizeof(struct sec_alg_tfm_ctx),
1082                        .cra_alignmask = 0,
1083                        .cra_module = THIS_MODULE,
1084                },
1085                .init = sec_alg_skcipher_init,
1086                .exit = sec_alg_skcipher_exit,
1087                .setkey = sec_alg_skcipher_setkey_3des_ecb,
1088                .decrypt = sec_alg_skcipher_decrypt,
1089                .encrypt = sec_alg_skcipher_encrypt,
1090                .min_keysize = DES3_EDE_KEY_SIZE,
1091                .max_keysize = DES3_EDE_KEY_SIZE,
1092                .ivsize = 0,
1093        }
1094};
1095
1096int sec_algs_register(void)
1097{
1098        int ret = 0;
1099
1100        mutex_lock(&algs_lock);
1101        if (++active_devs != 1)
1102                goto unlock;
1103
1104        ret = crypto_register_skciphers(sec_algs, ARRAY_SIZE(sec_algs));
1105        if (ret)
1106                --active_devs;
1107unlock:
1108        mutex_unlock(&algs_lock);
1109
1110        return ret;
1111}
1112
1113void sec_algs_unregister(void)
1114{
1115        mutex_lock(&algs_lock);
1116        if (--active_devs != 0)
1117                goto unlock;
1118        crypto_unregister_skciphers(sec_algs, ARRAY_SIZE(sec_algs));
1119
1120unlock:
1121        mutex_unlock(&algs_lock);
1122}
1123