linux/drivers/crypto/caam/caamhash.c
<<
>>
Prefs
   1/*
   2 * caam - Freescale FSL CAAM support for ahash functions of crypto API
   3 *
   4 * Copyright 2011 Freescale Semiconductor, Inc.
   5 *
   6 * Based on caamalg.c crypto API driver.
   7 *
   8 * relationship of digest job descriptor or first job descriptor after init to
   9 * shared descriptors:
  10 *
  11 * ---------------                     ---------------
  12 * | JobDesc #1  |-------------------->|  ShareDesc  |
  13 * | *(packet 1) |                     |  (hashKey)  |
  14 * ---------------                     | (operation) |
  15 *                                     ---------------
  16 *
  17 * relationship of subsequent job descriptors to shared descriptors:
  18 *
  19 * ---------------                     ---------------
  20 * | JobDesc #2  |-------------------->|  ShareDesc  |
  21 * | *(packet 2) |      |------------->|  (hashKey)  |
  22 * ---------------      |    |-------->| (operation) |
  23 *       .              |    |         | (load ctx2) |
  24 *       .              |    |         ---------------
  25 * ---------------      |    |
  26 * | JobDesc #3  |------|    |
  27 * | *(packet 3) |           |
  28 * ---------------           |
  29 *       .                   |
  30 *       .                   |
  31 * ---------------           |
  32 * | JobDesc #4  |------------
  33 * | *(packet 4) |
  34 * ---------------
  35 *
  36 * The SharedDesc never changes for a connection unless rekeyed, but
  37 * each packet will likely be in a different place. So all we need
  38 * to know to process the packet is where the input is, where the
  39 * output goes, and what context we want to process with. Context is
  40 * in the SharedDesc, packet references in the JobDesc.
  41 *
  42 * So, a job desc looks like:
  43 *
  44 * ---------------------
  45 * | Header            |
  46 * | ShareDesc Pointer |
  47 * | SEQ_OUT_PTR       |
  48 * | (output buffer)   |
  49 * | (output length)   |
  50 * | SEQ_IN_PTR        |
  51 * | (input buffer)    |
  52 * | (input length)    |
  53 * ---------------------
  54 */
  55
  56#include "compat.h"
  57
  58#include "regs.h"
  59#include "intern.h"
  60#include "desc_constr.h"
  61#include "jr.h"
  62#include "error.h"
  63#include "sg_sw_sec4.h"
  64#include "key_gen.h"
  65
  66#define CAAM_CRA_PRIORITY               3000
  67
  68/* max hash key is max split key size */
  69#define CAAM_MAX_HASH_KEY_SIZE          (SHA512_DIGEST_SIZE * 2)
  70
  71#define CAAM_MAX_HASH_BLOCK_SIZE        SHA512_BLOCK_SIZE
  72#define CAAM_MAX_HASH_DIGEST_SIZE       SHA512_DIGEST_SIZE
  73
  74/* length of descriptors text */
  75#define DESC_JOB_IO_LEN                 (CAAM_CMD_SZ * 5 + CAAM_PTR_SZ * 3)
  76
  77#define DESC_AHASH_BASE                 (4 * CAAM_CMD_SZ)
  78#define DESC_AHASH_UPDATE_LEN           (6 * CAAM_CMD_SZ)
  79#define DESC_AHASH_UPDATE_FIRST_LEN     (DESC_AHASH_BASE + 4 * CAAM_CMD_SZ)
  80#define DESC_AHASH_FINAL_LEN            (DESC_AHASH_BASE + 5 * CAAM_CMD_SZ)
  81#define DESC_AHASH_FINUP_LEN            (DESC_AHASH_BASE + 5 * CAAM_CMD_SZ)
  82#define DESC_AHASH_DIGEST_LEN           (DESC_AHASH_BASE + 4 * CAAM_CMD_SZ)
  83
  84#define DESC_HASH_MAX_USED_BYTES        (DESC_AHASH_FINAL_LEN + \
  85                                         CAAM_MAX_HASH_KEY_SIZE)
  86#define DESC_HASH_MAX_USED_LEN          (DESC_HASH_MAX_USED_BYTES / CAAM_CMD_SZ)
  87
  88/* caam context sizes for hashes: running digest + 8 */
  89#define HASH_MSG_LEN                    8
  90#define MAX_CTX_LEN                     (HASH_MSG_LEN + SHA512_DIGEST_SIZE)
  91
  92#ifdef DEBUG
  93/* for print_hex_dumps with line references */
  94#define xstr(s) str(s)
  95#define str(s) #s
  96#define debug(format, arg...) printk(format, arg)
  97#else
  98#define debug(format, arg...)
  99#endif
 100
 101/* ahash per-session context */
 102struct caam_hash_ctx {
 103        struct device *jrdev;
 104        u32 sh_desc_update[DESC_HASH_MAX_USED_LEN];
 105        u32 sh_desc_update_first[DESC_HASH_MAX_USED_LEN];
 106        u32 sh_desc_fin[DESC_HASH_MAX_USED_LEN];
 107        u32 sh_desc_digest[DESC_HASH_MAX_USED_LEN];
 108        u32 sh_desc_finup[DESC_HASH_MAX_USED_LEN];
 109        dma_addr_t sh_desc_update_dma;
 110        dma_addr_t sh_desc_update_first_dma;
 111        dma_addr_t sh_desc_fin_dma;
 112        dma_addr_t sh_desc_digest_dma;
 113        dma_addr_t sh_desc_finup_dma;
 114        u32 alg_type;
 115        u32 alg_op;
 116        u8 key[CAAM_MAX_HASH_KEY_SIZE];
 117        dma_addr_t key_dma;
 118        int ctx_len;
 119        unsigned int split_key_len;
 120        unsigned int split_key_pad_len;
 121};
 122
 123/* ahash state */
 124struct caam_hash_state {
 125        dma_addr_t buf_dma;
 126        dma_addr_t ctx_dma;
 127        u8 buf_0[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned;
 128        int buflen_0;
 129        u8 buf_1[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned;
 130        int buflen_1;
 131        u8 caam_ctx[MAX_CTX_LEN];
 132        int (*update)(struct ahash_request *req);
 133        int (*final)(struct ahash_request *req);
 134        int (*finup)(struct ahash_request *req);
 135        int current_buf;
 136};
 137
 138/* Common job descriptor seq in/out ptr routines */
 139
 140/* Map state->caam_ctx, and append seq_out_ptr command that points to it */
 141static inline void map_seq_out_ptr_ctx(u32 *desc, struct device *jrdev,
 142                                       struct caam_hash_state *state,
 143                                       int ctx_len)
 144{
 145        state->ctx_dma = dma_map_single(jrdev, state->caam_ctx,
 146                                        ctx_len, DMA_FROM_DEVICE);
 147        append_seq_out_ptr(desc, state->ctx_dma, ctx_len, 0);
 148}
 149
 150/* Map req->result, and append seq_out_ptr command that points to it */
 151static inline dma_addr_t map_seq_out_ptr_result(u32 *desc, struct device *jrdev,
 152                                                u8 *result, int digestsize)
 153{
 154        dma_addr_t dst_dma;
 155
 156        dst_dma = dma_map_single(jrdev, result, digestsize, DMA_FROM_DEVICE);
 157        append_seq_out_ptr(desc, dst_dma, digestsize, 0);
 158
 159        return dst_dma;
 160}
 161
 162/* Map current buffer in state and put it in link table */
 163static inline dma_addr_t buf_map_to_sec4_sg(struct device *jrdev,
 164                                            struct sec4_sg_entry *sec4_sg,
 165                                            u8 *buf, int buflen)
 166{
 167        dma_addr_t buf_dma;
 168
 169        buf_dma = dma_map_single(jrdev, buf, buflen, DMA_TO_DEVICE);
 170        dma_to_sec4_sg_one(sec4_sg, buf_dma, buflen, 0);
 171
 172        return buf_dma;
 173}
 174
 175/* Map req->src and put it in link table */
 176static inline void src_map_to_sec4_sg(struct device *jrdev,
 177                                      struct scatterlist *src, int src_nents,
 178                                      struct sec4_sg_entry *sec4_sg,
 179                                      bool chained)
 180{
 181        dma_map_sg_chained(jrdev, src, src_nents, DMA_TO_DEVICE, chained);
 182        sg_to_sec4_sg_last(src, src_nents, sec4_sg, 0);
 183}
 184
 185/*
 186 * Only put buffer in link table if it contains data, which is possible,
 187 * since a buffer has previously been used, and needs to be unmapped,
 188 */
 189static inline dma_addr_t
 190try_buf_map_to_sec4_sg(struct device *jrdev, struct sec4_sg_entry *sec4_sg,
 191                       u8 *buf, dma_addr_t buf_dma, int buflen,
 192                       int last_buflen)
 193{
 194        if (buf_dma && !dma_mapping_error(jrdev, buf_dma))
 195                dma_unmap_single(jrdev, buf_dma, last_buflen, DMA_TO_DEVICE);
 196        if (buflen)
 197                buf_dma = buf_map_to_sec4_sg(jrdev, sec4_sg, buf, buflen);
 198        else
 199                buf_dma = 0;
 200
 201        return buf_dma;
 202}
 203
 204/* Map state->caam_ctx, and add it to link table */
 205static inline void ctx_map_to_sec4_sg(u32 *desc, struct device *jrdev,
 206                                      struct caam_hash_state *state,
 207                                      int ctx_len,
 208                                      struct sec4_sg_entry *sec4_sg,
 209                                      u32 flag)
 210{
 211        state->ctx_dma = dma_map_single(jrdev, state->caam_ctx, ctx_len, flag);
 212        dma_to_sec4_sg_one(sec4_sg, state->ctx_dma, ctx_len, 0);
 213}
 214
 215/* Common shared descriptor commands */
 216static inline void append_key_ahash(u32 *desc, struct caam_hash_ctx *ctx)
 217{
 218        append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len,
 219                          ctx->split_key_len, CLASS_2 |
 220                          KEY_DEST_MDHA_SPLIT | KEY_ENC);
 221}
 222
 223/* Append key if it has been set */
 224static inline void init_sh_desc_key_ahash(u32 *desc, struct caam_hash_ctx *ctx)
 225{
 226        u32 *key_jump_cmd;
 227
 228        init_sh_desc(desc, HDR_SHARE_SERIAL);
 229
 230        if (ctx->split_key_len) {
 231                /* Skip if already shared */
 232                key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
 233                                           JUMP_COND_SHRD);
 234
 235                append_key_ahash(desc, ctx);
 236
 237                set_jump_tgt_here(desc, key_jump_cmd);
 238        }
 239
 240        /* Propagate errors from shared to job descriptor */
 241        append_cmd(desc, SET_OK_NO_PROP_ERRORS | CMD_LOAD);
 242}
 243
 244/*
 245 * For ahash read data from seqin following state->caam_ctx,
 246 * and write resulting class2 context to seqout, which may be state->caam_ctx
 247 * or req->result
 248 */
 249static inline void ahash_append_load_str(u32 *desc, int digestsize)
 250{
 251        /* Calculate remaining bytes to read */
 252        append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
 253
 254        /* Read remaining bytes */
 255        append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_LAST2 |
 256                             FIFOLD_TYPE_MSG | KEY_VLF);
 257
 258        /* Store class2 context bytes */
 259        append_seq_store(desc, digestsize, LDST_CLASS_2_CCB |
 260                         LDST_SRCDST_BYTE_CONTEXT);
 261}
 262
 263/*
 264 * For ahash update, final and finup, import context, read and write to seqout
 265 */
 266static inline void ahash_ctx_data_to_out(u32 *desc, u32 op, u32 state,
 267                                         int digestsize,
 268                                         struct caam_hash_ctx *ctx)
 269{
 270        init_sh_desc_key_ahash(desc, ctx);
 271
 272        /* Import context from software */
 273        append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT |
 274                   LDST_CLASS_2_CCB | ctx->ctx_len);
 275
 276        /* Class 2 operation */
 277        append_operation(desc, op | state | OP_ALG_ENCRYPT);
 278
 279        /*
 280         * Load from buf and/or src and write to req->result or state->context
 281         */
 282        ahash_append_load_str(desc, digestsize);
 283}
 284
 285/* For ahash firsts and digest, read and write to seqout */
 286static inline void ahash_data_to_out(u32 *desc, u32 op, u32 state,
 287                                     int digestsize, struct caam_hash_ctx *ctx)
 288{
 289        init_sh_desc_key_ahash(desc, ctx);
 290
 291        /* Class 2 operation */
 292        append_operation(desc, op | state | OP_ALG_ENCRYPT);
 293
 294        /*
 295         * Load from buf and/or src and write to req->result or state->context
 296         */
 297        ahash_append_load_str(desc, digestsize);
 298}
 299
 300static int ahash_set_sh_desc(struct crypto_ahash *ahash)
 301{
 302        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 303        int digestsize = crypto_ahash_digestsize(ahash);
 304        struct device *jrdev = ctx->jrdev;
 305        u32 have_key = 0;
 306        u32 *desc;
 307
 308        if (ctx->split_key_len)
 309                have_key = OP_ALG_AAI_HMAC_PRECOMP;
 310
 311        /* ahash_update shared descriptor */
 312        desc = ctx->sh_desc_update;
 313
 314        init_sh_desc(desc, HDR_SHARE_SERIAL);
 315
 316        /* Import context from software */
 317        append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT |
 318                   LDST_CLASS_2_CCB | ctx->ctx_len);
 319
 320        /* Class 2 operation */
 321        append_operation(desc, ctx->alg_type | OP_ALG_AS_UPDATE |
 322                         OP_ALG_ENCRYPT);
 323
 324        /* Load data and write to result or context */
 325        ahash_append_load_str(desc, ctx->ctx_len);
 326
 327        ctx->sh_desc_update_dma = dma_map_single(jrdev, desc, desc_bytes(desc),
 328                                                 DMA_TO_DEVICE);
 329        if (dma_mapping_error(jrdev, ctx->sh_desc_update_dma)) {
 330                dev_err(jrdev, "unable to map shared descriptor\n");
 331                return -ENOMEM;
 332        }
 333#ifdef DEBUG
 334        print_hex_dump(KERN_ERR, "ahash update shdesc@"xstr(__LINE__)": ",
 335                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
 336#endif
 337
 338        /* ahash_update_first shared descriptor */
 339        desc = ctx->sh_desc_update_first;
 340
 341        ahash_data_to_out(desc, have_key | ctx->alg_type, OP_ALG_AS_INIT,
 342                          ctx->ctx_len, ctx);
 343
 344        ctx->sh_desc_update_first_dma = dma_map_single(jrdev, desc,
 345                                                       desc_bytes(desc),
 346                                                       DMA_TO_DEVICE);
 347        if (dma_mapping_error(jrdev, ctx->sh_desc_update_first_dma)) {
 348                dev_err(jrdev, "unable to map shared descriptor\n");
 349                return -ENOMEM;
 350        }
 351#ifdef DEBUG
 352        print_hex_dump(KERN_ERR, "ahash update first shdesc@"xstr(__LINE__)": ",
 353                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
 354#endif
 355
 356        /* ahash_final shared descriptor */
 357        desc = ctx->sh_desc_fin;
 358
 359        ahash_ctx_data_to_out(desc, have_key | ctx->alg_type,
 360                              OP_ALG_AS_FINALIZE, digestsize, ctx);
 361
 362        ctx->sh_desc_fin_dma = dma_map_single(jrdev, desc, desc_bytes(desc),
 363                                              DMA_TO_DEVICE);
 364        if (dma_mapping_error(jrdev, ctx->sh_desc_fin_dma)) {
 365                dev_err(jrdev, "unable to map shared descriptor\n");
 366                return -ENOMEM;
 367        }
 368#ifdef DEBUG
 369        print_hex_dump(KERN_ERR, "ahash final shdesc@"xstr(__LINE__)": ",
 370                       DUMP_PREFIX_ADDRESS, 16, 4, desc,
 371                       desc_bytes(desc), 1);
 372#endif
 373
 374        /* ahash_finup shared descriptor */
 375        desc = ctx->sh_desc_finup;
 376
 377        ahash_ctx_data_to_out(desc, have_key | ctx->alg_type,
 378                              OP_ALG_AS_FINALIZE, digestsize, ctx);
 379
 380        ctx->sh_desc_finup_dma = dma_map_single(jrdev, desc, desc_bytes(desc),
 381                                                DMA_TO_DEVICE);
 382        if (dma_mapping_error(jrdev, ctx->sh_desc_finup_dma)) {
 383                dev_err(jrdev, "unable to map shared descriptor\n");
 384                return -ENOMEM;
 385        }
 386#ifdef DEBUG
 387        print_hex_dump(KERN_ERR, "ahash finup shdesc@"xstr(__LINE__)": ",
 388                       DUMP_PREFIX_ADDRESS, 16, 4, desc,
 389                       desc_bytes(desc), 1);
 390#endif
 391
 392        /* ahash_digest shared descriptor */
 393        desc = ctx->sh_desc_digest;
 394
 395        ahash_data_to_out(desc, have_key | ctx->alg_type, OP_ALG_AS_INITFINAL,
 396                          digestsize, ctx);
 397
 398        ctx->sh_desc_digest_dma = dma_map_single(jrdev, desc,
 399                                                 desc_bytes(desc),
 400                                                 DMA_TO_DEVICE);
 401        if (dma_mapping_error(jrdev, ctx->sh_desc_digest_dma)) {
 402                dev_err(jrdev, "unable to map shared descriptor\n");
 403                return -ENOMEM;
 404        }
 405#ifdef DEBUG
 406        print_hex_dump(KERN_ERR, "ahash digest shdesc@"xstr(__LINE__)": ",
 407                       DUMP_PREFIX_ADDRESS, 16, 4, desc,
 408                       desc_bytes(desc), 1);
 409#endif
 410
 411        return 0;
 412}
 413
 414static int gen_split_hash_key(struct caam_hash_ctx *ctx, const u8 *key_in,
 415                              u32 keylen)
 416{
 417        return gen_split_key(ctx->jrdev, ctx->key, ctx->split_key_len,
 418                               ctx->split_key_pad_len, key_in, keylen,
 419                               ctx->alg_op);
 420}
 421
 422/* Digest hash size if it is too large */
 423static int hash_digest_key(struct caam_hash_ctx *ctx, const u8 *key_in,
 424                           u32 *keylen, u8 *key_out, u32 digestsize)
 425{
 426        struct device *jrdev = ctx->jrdev;
 427        u32 *desc;
 428        struct split_key_result result;
 429        dma_addr_t src_dma, dst_dma;
 430        int ret = 0;
 431
 432        desc = kmalloc(CAAM_CMD_SZ * 8 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
 433        if (!desc) {
 434                dev_err(jrdev, "unable to allocate key input memory\n");
 435                return -ENOMEM;
 436        }
 437
 438        init_job_desc(desc, 0);
 439
 440        src_dma = dma_map_single(jrdev, (void *)key_in, *keylen,
 441                                 DMA_TO_DEVICE);
 442        if (dma_mapping_error(jrdev, src_dma)) {
 443                dev_err(jrdev, "unable to map key input memory\n");
 444                kfree(desc);
 445                return -ENOMEM;
 446        }
 447        dst_dma = dma_map_single(jrdev, (void *)key_out, digestsize,
 448                                 DMA_FROM_DEVICE);
 449        if (dma_mapping_error(jrdev, dst_dma)) {
 450                dev_err(jrdev, "unable to map key output memory\n");
 451                dma_unmap_single(jrdev, src_dma, *keylen, DMA_TO_DEVICE);
 452                kfree(desc);
 453                return -ENOMEM;
 454        }
 455
 456        /* Job descriptor to perform unkeyed hash on key_in */
 457        append_operation(desc, ctx->alg_type | OP_ALG_ENCRYPT |
 458                         OP_ALG_AS_INITFINAL);
 459        append_seq_in_ptr(desc, src_dma, *keylen, 0);
 460        append_seq_fifo_load(desc, *keylen, FIFOLD_CLASS_CLASS2 |
 461                             FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_MSG);
 462        append_seq_out_ptr(desc, dst_dma, digestsize, 0);
 463        append_seq_store(desc, digestsize, LDST_CLASS_2_CCB |
 464                         LDST_SRCDST_BYTE_CONTEXT);
 465
 466#ifdef DEBUG
 467        print_hex_dump(KERN_ERR, "key_in@"xstr(__LINE__)": ",
 468                       DUMP_PREFIX_ADDRESS, 16, 4, key_in, *keylen, 1);
 469        print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
 470                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
 471#endif
 472
 473        result.err = 0;
 474        init_completion(&result.completion);
 475
 476        ret = caam_jr_enqueue(jrdev, desc, split_key_done, &result);
 477        if (!ret) {
 478                /* in progress */
 479                wait_for_completion_interruptible(&result.completion);
 480                ret = result.err;
 481#ifdef DEBUG
 482                print_hex_dump(KERN_ERR, "digested key@"xstr(__LINE__)": ",
 483                               DUMP_PREFIX_ADDRESS, 16, 4, key_in,
 484                               digestsize, 1);
 485#endif
 486        }
 487        *keylen = digestsize;
 488
 489        dma_unmap_single(jrdev, src_dma, *keylen, DMA_TO_DEVICE);
 490        dma_unmap_single(jrdev, dst_dma, digestsize, DMA_FROM_DEVICE);
 491
 492        kfree(desc);
 493
 494        return ret;
 495}
 496
 497static int ahash_setkey(struct crypto_ahash *ahash,
 498                        const u8 *key, unsigned int keylen)
 499{
 500        /* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
 501        static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
 502        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 503        struct device *jrdev = ctx->jrdev;
 504        int blocksize = crypto_tfm_alg_blocksize(&ahash->base);
 505        int digestsize = crypto_ahash_digestsize(ahash);
 506        int ret = 0;
 507        u8 *hashed_key = NULL;
 508
 509#ifdef DEBUG
 510        printk(KERN_ERR "keylen %d\n", keylen);
 511#endif
 512
 513        if (keylen > blocksize) {
 514                hashed_key = kmalloc(sizeof(u8) * digestsize, GFP_KERNEL |
 515                                     GFP_DMA);
 516                if (!hashed_key)
 517                        return -ENOMEM;
 518                ret = hash_digest_key(ctx, key, &keylen, hashed_key,
 519                                      digestsize);
 520                if (ret)
 521                        goto badkey;
 522                key = hashed_key;
 523        }
 524
 525        /* Pick class 2 key length from algorithm submask */
 526        ctx->split_key_len = mdpadlen[(ctx->alg_op & OP_ALG_ALGSEL_SUBMASK) >>
 527                                      OP_ALG_ALGSEL_SHIFT] * 2;
 528        ctx->split_key_pad_len = ALIGN(ctx->split_key_len, 16);
 529
 530#ifdef DEBUG
 531        printk(KERN_ERR "split_key_len %d split_key_pad_len %d\n",
 532               ctx->split_key_len, ctx->split_key_pad_len);
 533        print_hex_dump(KERN_ERR, "key in @"xstr(__LINE__)": ",
 534                       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
 535#endif
 536
 537        ret = gen_split_hash_key(ctx, key, keylen);
 538        if (ret)
 539                goto badkey;
 540
 541        ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->split_key_pad_len,
 542                                      DMA_TO_DEVICE);
 543        if (dma_mapping_error(jrdev, ctx->key_dma)) {
 544                dev_err(jrdev, "unable to map key i/o memory\n");
 545                return -ENOMEM;
 546        }
 547#ifdef DEBUG
 548        print_hex_dump(KERN_ERR, "ctx.key@"xstr(__LINE__)": ",
 549                       DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
 550                       ctx->split_key_pad_len, 1);
 551#endif
 552
 553        ret = ahash_set_sh_desc(ahash);
 554        if (ret) {
 555                dma_unmap_single(jrdev, ctx->key_dma, ctx->split_key_pad_len,
 556                                 DMA_TO_DEVICE);
 557        }
 558
 559        kfree(hashed_key);
 560        return ret;
 561badkey:
 562        kfree(hashed_key);
 563        crypto_ahash_set_flags(ahash, CRYPTO_TFM_RES_BAD_KEY_LEN);
 564        return -EINVAL;
 565}
 566
 567/*
 568 * ahash_edesc - s/w-extended ahash descriptor
 569 * @dst_dma: physical mapped address of req->result
 570 * @sec4_sg_dma: physical mapped address of h/w link table
 571 * @chained: if source is chained
 572 * @src_nents: number of segments in input scatterlist
 573 * @sec4_sg_bytes: length of dma mapped sec4_sg space
 574 * @sec4_sg: pointer to h/w link table
 575 * @hw_desc: the h/w job descriptor followed by any referenced link tables
 576 */
 577struct ahash_edesc {
 578        dma_addr_t dst_dma;
 579        dma_addr_t sec4_sg_dma;
 580        bool chained;
 581        int src_nents;
 582        int sec4_sg_bytes;
 583        struct sec4_sg_entry *sec4_sg;
 584        u32 hw_desc[0];
 585};
 586
 587static inline void ahash_unmap(struct device *dev,
 588                        struct ahash_edesc *edesc,
 589                        struct ahash_request *req, int dst_len)
 590{
 591        if (edesc->src_nents)
 592                dma_unmap_sg_chained(dev, req->src, edesc->src_nents,
 593                                     DMA_TO_DEVICE, edesc->chained);
 594        if (edesc->dst_dma)
 595                dma_unmap_single(dev, edesc->dst_dma, dst_len, DMA_FROM_DEVICE);
 596
 597        if (edesc->sec4_sg_bytes)
 598                dma_unmap_single(dev, edesc->sec4_sg_dma,
 599                                 edesc->sec4_sg_bytes, DMA_TO_DEVICE);
 600}
 601
 602static inline void ahash_unmap_ctx(struct device *dev,
 603                        struct ahash_edesc *edesc,
 604                        struct ahash_request *req, int dst_len, u32 flag)
 605{
 606        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 607        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 608        struct caam_hash_state *state = ahash_request_ctx(req);
 609
 610        if (state->ctx_dma)
 611                dma_unmap_single(dev, state->ctx_dma, ctx->ctx_len, flag);
 612        ahash_unmap(dev, edesc, req, dst_len);
 613}
 614
 615static void ahash_done(struct device *jrdev, u32 *desc, u32 err,
 616                       void *context)
 617{
 618        struct ahash_request *req = context;
 619        struct ahash_edesc *edesc;
 620        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 621        int digestsize = crypto_ahash_digestsize(ahash);
 622#ifdef DEBUG
 623        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 624        struct caam_hash_state *state = ahash_request_ctx(req);
 625
 626        dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
 627#endif
 628
 629        edesc = (struct ahash_edesc *)((char *)desc -
 630                 offsetof(struct ahash_edesc, hw_desc));
 631        if (err) {
 632                char tmp[CAAM_ERROR_STR_MAX];
 633
 634                dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
 635        }
 636
 637        ahash_unmap(jrdev, edesc, req, digestsize);
 638        kfree(edesc);
 639
 640#ifdef DEBUG
 641        print_hex_dump(KERN_ERR, "ctx@"xstr(__LINE__)": ",
 642                       DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
 643                       ctx->ctx_len, 1);
 644        if (req->result)
 645                print_hex_dump(KERN_ERR, "result@"xstr(__LINE__)": ",
 646                               DUMP_PREFIX_ADDRESS, 16, 4, req->result,
 647                               digestsize, 1);
 648#endif
 649
 650        req->base.complete(&req->base, err);
 651}
 652
 653static void ahash_done_bi(struct device *jrdev, u32 *desc, u32 err,
 654                            void *context)
 655{
 656        struct ahash_request *req = context;
 657        struct ahash_edesc *edesc;
 658        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 659        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 660#ifdef DEBUG
 661        struct caam_hash_state *state = ahash_request_ctx(req);
 662        int digestsize = crypto_ahash_digestsize(ahash);
 663
 664        dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
 665#endif
 666
 667        edesc = (struct ahash_edesc *)((char *)desc -
 668                 offsetof(struct ahash_edesc, hw_desc));
 669        if (err) {
 670                char tmp[CAAM_ERROR_STR_MAX];
 671
 672                dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
 673        }
 674
 675        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len, DMA_BIDIRECTIONAL);
 676        kfree(edesc);
 677
 678#ifdef DEBUG
 679        print_hex_dump(KERN_ERR, "ctx@"xstr(__LINE__)": ",
 680                       DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
 681                       ctx->ctx_len, 1);
 682        if (req->result)
 683                print_hex_dump(KERN_ERR, "result@"xstr(__LINE__)": ",
 684                               DUMP_PREFIX_ADDRESS, 16, 4, req->result,
 685                               digestsize, 1);
 686#endif
 687
 688        req->base.complete(&req->base, err);
 689}
 690
 691static void ahash_done_ctx_src(struct device *jrdev, u32 *desc, u32 err,
 692                               void *context)
 693{
 694        struct ahash_request *req = context;
 695        struct ahash_edesc *edesc;
 696        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 697        int digestsize = crypto_ahash_digestsize(ahash);
 698#ifdef DEBUG
 699        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 700        struct caam_hash_state *state = ahash_request_ctx(req);
 701
 702        dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
 703#endif
 704
 705        edesc = (struct ahash_edesc *)((char *)desc -
 706                 offsetof(struct ahash_edesc, hw_desc));
 707        if (err) {
 708                char tmp[CAAM_ERROR_STR_MAX];
 709
 710                dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
 711        }
 712
 713        ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE);
 714        kfree(edesc);
 715
 716#ifdef DEBUG
 717        print_hex_dump(KERN_ERR, "ctx@"xstr(__LINE__)": ",
 718                       DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
 719                       ctx->ctx_len, 1);
 720        if (req->result)
 721                print_hex_dump(KERN_ERR, "result@"xstr(__LINE__)": ",
 722                               DUMP_PREFIX_ADDRESS, 16, 4, req->result,
 723                               digestsize, 1);
 724#endif
 725
 726        req->base.complete(&req->base, err);
 727}
 728
 729static void ahash_done_ctx_dst(struct device *jrdev, u32 *desc, u32 err,
 730                               void *context)
 731{
 732        struct ahash_request *req = context;
 733        struct ahash_edesc *edesc;
 734        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 735        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 736#ifdef DEBUG
 737        struct caam_hash_state *state = ahash_request_ctx(req);
 738        int digestsize = crypto_ahash_digestsize(ahash);
 739
 740        dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
 741#endif
 742
 743        edesc = (struct ahash_edesc *)((char *)desc -
 744                 offsetof(struct ahash_edesc, hw_desc));
 745        if (err) {
 746                char tmp[CAAM_ERROR_STR_MAX];
 747
 748                dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
 749        }
 750
 751        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len, DMA_TO_DEVICE);
 752        kfree(edesc);
 753
 754#ifdef DEBUG
 755        print_hex_dump(KERN_ERR, "ctx@"xstr(__LINE__)": ",
 756                       DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx,
 757                       ctx->ctx_len, 1);
 758        if (req->result)
 759                print_hex_dump(KERN_ERR, "result@"xstr(__LINE__)": ",
 760                               DUMP_PREFIX_ADDRESS, 16, 4, req->result,
 761                               digestsize, 1);
 762#endif
 763
 764        req->base.complete(&req->base, err);
 765}
 766
 767/* submit update job descriptor */
 768static int ahash_update_ctx(struct ahash_request *req)
 769{
 770        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 771        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 772        struct caam_hash_state *state = ahash_request_ctx(req);
 773        struct device *jrdev = ctx->jrdev;
 774        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
 775                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
 776        u8 *buf = state->current_buf ? state->buf_1 : state->buf_0;
 777        int *buflen = state->current_buf ? &state->buflen_1 : &state->buflen_0;
 778        u8 *next_buf = state->current_buf ? state->buf_0 : state->buf_1;
 779        int *next_buflen = state->current_buf ? &state->buflen_0 :
 780                           &state->buflen_1, last_buflen;
 781        int in_len = *buflen + req->nbytes, to_hash;
 782        u32 *sh_desc = ctx->sh_desc_update, *desc;
 783        dma_addr_t ptr = ctx->sh_desc_update_dma;
 784        int src_nents, sec4_sg_bytes, sec4_sg_src_index;
 785        struct ahash_edesc *edesc;
 786        bool chained = false;
 787        int ret = 0;
 788        int sh_len;
 789
 790        last_buflen = *next_buflen;
 791        *next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1);
 792        to_hash = in_len - *next_buflen;
 793
 794        if (to_hash) {
 795                src_nents = __sg_count(req->src, req->nbytes - (*next_buflen),
 796                                       &chained);
 797                sec4_sg_src_index = 1 + (*buflen ? 1 : 0);
 798                sec4_sg_bytes = (sec4_sg_src_index + src_nents) *
 799                                 sizeof(struct sec4_sg_entry);
 800
 801                /*
 802                 * allocate space for base edesc and hw desc commands,
 803                 * link tables
 804                 */
 805                edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
 806                                sec4_sg_bytes, GFP_DMA | flags);
 807                if (!edesc) {
 808                        dev_err(jrdev,
 809                                "could not allocate extended descriptor\n");
 810                        return -ENOMEM;
 811                }
 812
 813                edesc->src_nents = src_nents;
 814                edesc->chained = chained;
 815                edesc->sec4_sg_bytes = sec4_sg_bytes;
 816                edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
 817                                 DESC_JOB_IO_LEN;
 818                edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
 819                                                     sec4_sg_bytes,
 820                                                     DMA_TO_DEVICE);
 821
 822                ctx_map_to_sec4_sg(desc, jrdev, state, ctx->ctx_len,
 823                                   edesc->sec4_sg, DMA_BIDIRECTIONAL);
 824
 825                state->buf_dma = try_buf_map_to_sec4_sg(jrdev,
 826                                                        edesc->sec4_sg + 1,
 827                                                        buf, state->buf_dma,
 828                                                        *buflen, last_buflen);
 829
 830                if (src_nents) {
 831                        src_map_to_sec4_sg(jrdev, req->src, src_nents,
 832                                           edesc->sec4_sg + sec4_sg_src_index,
 833                                           chained);
 834                        if (*next_buflen) {
 835                                sg_copy_part(next_buf, req->src, to_hash -
 836                                             *buflen, req->nbytes);
 837                                state->current_buf = !state->current_buf;
 838                        }
 839                } else {
 840                        (edesc->sec4_sg + sec4_sg_src_index - 1)->len |=
 841                                                        SEC4_SG_LEN_FIN;
 842                }
 843
 844                sh_len = desc_len(sh_desc);
 845                desc = edesc->hw_desc;
 846                init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER |
 847                                     HDR_REVERSE);
 848
 849                append_seq_in_ptr(desc, edesc->sec4_sg_dma, ctx->ctx_len +
 850                                       to_hash, LDST_SGF);
 851
 852                append_seq_out_ptr(desc, state->ctx_dma, ctx->ctx_len, 0);
 853
 854#ifdef DEBUG
 855                print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
 856                               DUMP_PREFIX_ADDRESS, 16, 4, desc,
 857                               desc_bytes(desc), 1);
 858#endif
 859
 860                ret = caam_jr_enqueue(jrdev, desc, ahash_done_bi, req);
 861                if (!ret) {
 862                        ret = -EINPROGRESS;
 863                } else {
 864                        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len,
 865                                           DMA_BIDIRECTIONAL);
 866                        kfree(edesc);
 867                }
 868        } else if (*next_buflen) {
 869                sg_copy(buf + *buflen, req->src, req->nbytes);
 870                *buflen = *next_buflen;
 871                *next_buflen = last_buflen;
 872        }
 873#ifdef DEBUG
 874        print_hex_dump(KERN_ERR, "buf@"xstr(__LINE__)": ",
 875                       DUMP_PREFIX_ADDRESS, 16, 4, buf, *buflen, 1);
 876        print_hex_dump(KERN_ERR, "next buf@"xstr(__LINE__)": ",
 877                       DUMP_PREFIX_ADDRESS, 16, 4, next_buf,
 878                       *next_buflen, 1);
 879#endif
 880
 881        return ret;
 882}
 883
 884static int ahash_final_ctx(struct ahash_request *req)
 885{
 886        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 887        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 888        struct caam_hash_state *state = ahash_request_ctx(req);
 889        struct device *jrdev = ctx->jrdev;
 890        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
 891                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
 892        u8 *buf = state->current_buf ? state->buf_1 : state->buf_0;
 893        int buflen = state->current_buf ? state->buflen_1 : state->buflen_0;
 894        int last_buflen = state->current_buf ? state->buflen_0 :
 895                          state->buflen_1;
 896        u32 *sh_desc = ctx->sh_desc_fin, *desc;
 897        dma_addr_t ptr = ctx->sh_desc_fin_dma;
 898        int sec4_sg_bytes;
 899        int digestsize = crypto_ahash_digestsize(ahash);
 900        struct ahash_edesc *edesc;
 901        int ret = 0;
 902        int sh_len;
 903
 904        sec4_sg_bytes = (1 + (buflen ? 1 : 0)) * sizeof(struct sec4_sg_entry);
 905
 906        /* allocate space for base edesc and hw desc commands, link tables */
 907        edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
 908                        sec4_sg_bytes, GFP_DMA | flags);
 909        if (!edesc) {
 910                dev_err(jrdev, "could not allocate extended descriptor\n");
 911                return -ENOMEM;
 912        }
 913
 914        sh_len = desc_len(sh_desc);
 915        desc = edesc->hw_desc;
 916        init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER | HDR_REVERSE);
 917
 918        edesc->sec4_sg_bytes = sec4_sg_bytes;
 919        edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
 920                         DESC_JOB_IO_LEN;
 921        edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
 922                                            sec4_sg_bytes, DMA_TO_DEVICE);
 923        edesc->src_nents = 0;
 924
 925        ctx_map_to_sec4_sg(desc, jrdev, state, ctx->ctx_len, edesc->sec4_sg,
 926                           DMA_TO_DEVICE);
 927
 928        state->buf_dma = try_buf_map_to_sec4_sg(jrdev, edesc->sec4_sg + 1,
 929                                                buf, state->buf_dma, buflen,
 930                                                last_buflen);
 931        (edesc->sec4_sg + sec4_sg_bytes - 1)->len |= SEC4_SG_LEN_FIN;
 932
 933        append_seq_in_ptr(desc, edesc->sec4_sg_dma, ctx->ctx_len + buflen,
 934                          LDST_SGF);
 935
 936        edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result,
 937                                                digestsize);
 938
 939#ifdef DEBUG
 940        print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
 941                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
 942#endif
 943
 944        ret = caam_jr_enqueue(jrdev, desc, ahash_done_ctx_src, req);
 945        if (!ret) {
 946                ret = -EINPROGRESS;
 947        } else {
 948                ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE);
 949                kfree(edesc);
 950        }
 951
 952        return ret;
 953}
 954
 955static int ahash_finup_ctx(struct ahash_request *req)
 956{
 957        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
 958        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
 959        struct caam_hash_state *state = ahash_request_ctx(req);
 960        struct device *jrdev = ctx->jrdev;
 961        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
 962                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
 963        u8 *buf = state->current_buf ? state->buf_1 : state->buf_0;
 964        int buflen = state->current_buf ? state->buflen_1 : state->buflen_0;
 965        int last_buflen = state->current_buf ? state->buflen_0 :
 966                          state->buflen_1;
 967        u32 *sh_desc = ctx->sh_desc_finup, *desc;
 968        dma_addr_t ptr = ctx->sh_desc_finup_dma;
 969        int sec4_sg_bytes, sec4_sg_src_index;
 970        int src_nents;
 971        int digestsize = crypto_ahash_digestsize(ahash);
 972        struct ahash_edesc *edesc;
 973        bool chained = false;
 974        int ret = 0;
 975        int sh_len;
 976
 977        src_nents = __sg_count(req->src, req->nbytes, &chained);
 978        sec4_sg_src_index = 1 + (buflen ? 1 : 0);
 979        sec4_sg_bytes = (sec4_sg_src_index + src_nents) *
 980                         sizeof(struct sec4_sg_entry);
 981
 982        /* allocate space for base edesc and hw desc commands, link tables */
 983        edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
 984                        sec4_sg_bytes, GFP_DMA | flags);
 985        if (!edesc) {
 986                dev_err(jrdev, "could not allocate extended descriptor\n");
 987                return -ENOMEM;
 988        }
 989
 990        sh_len = desc_len(sh_desc);
 991        desc = edesc->hw_desc;
 992        init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER | HDR_REVERSE);
 993
 994        edesc->src_nents = src_nents;
 995        edesc->chained = chained;
 996        edesc->sec4_sg_bytes = sec4_sg_bytes;
 997        edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
 998                         DESC_JOB_IO_LEN;
 999        edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1000                                            sec4_sg_bytes, DMA_TO_DEVICE);
1001
1002        ctx_map_to_sec4_sg(desc, jrdev, state, ctx->ctx_len, edesc->sec4_sg,
1003                           DMA_TO_DEVICE);
1004
1005        state->buf_dma = try_buf_map_to_sec4_sg(jrdev, edesc->sec4_sg + 1,
1006                                                buf, state->buf_dma, buflen,
1007                                                last_buflen);
1008
1009        src_map_to_sec4_sg(jrdev, req->src, src_nents, edesc->sec4_sg +
1010                           sec4_sg_src_index, chained);
1011
1012        append_seq_in_ptr(desc, edesc->sec4_sg_dma, ctx->ctx_len +
1013                               buflen + req->nbytes, LDST_SGF);
1014
1015        edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result,
1016                                                digestsize);
1017
1018#ifdef DEBUG
1019        print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
1020                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1021#endif
1022
1023        ret = caam_jr_enqueue(jrdev, desc, ahash_done_ctx_src, req);
1024        if (!ret) {
1025                ret = -EINPROGRESS;
1026        } else {
1027                ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE);
1028                kfree(edesc);
1029        }
1030
1031        return ret;
1032}
1033
1034static int ahash_digest(struct ahash_request *req)
1035{
1036        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1037        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1038        struct device *jrdev = ctx->jrdev;
1039        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
1040                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
1041        u32 *sh_desc = ctx->sh_desc_digest, *desc;
1042        dma_addr_t ptr = ctx->sh_desc_digest_dma;
1043        int digestsize = crypto_ahash_digestsize(ahash);
1044        int src_nents, sec4_sg_bytes;
1045        dma_addr_t src_dma;
1046        struct ahash_edesc *edesc;
1047        bool chained = false;
1048        int ret = 0;
1049        u32 options;
1050        int sh_len;
1051
1052        src_nents = sg_count(req->src, req->nbytes, &chained);
1053        dma_map_sg_chained(jrdev, req->src, src_nents ? : 1, DMA_TO_DEVICE,
1054                           chained);
1055        sec4_sg_bytes = src_nents * sizeof(struct sec4_sg_entry);
1056
1057        /* allocate space for base edesc and hw desc commands, link tables */
1058        edesc = kmalloc(sizeof(struct ahash_edesc) + sec4_sg_bytes +
1059                        DESC_JOB_IO_LEN, GFP_DMA | flags);
1060        if (!edesc) {
1061                dev_err(jrdev, "could not allocate extended descriptor\n");
1062                return -ENOMEM;
1063        }
1064        edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
1065                          DESC_JOB_IO_LEN;
1066        edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1067                                            sec4_sg_bytes, DMA_TO_DEVICE);
1068        edesc->src_nents = src_nents;
1069        edesc->chained = chained;
1070
1071        sh_len = desc_len(sh_desc);
1072        desc = edesc->hw_desc;
1073        init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER | HDR_REVERSE);
1074
1075        if (src_nents) {
1076                sg_to_sec4_sg_last(req->src, src_nents, edesc->sec4_sg, 0);
1077                src_dma = edesc->sec4_sg_dma;
1078                options = LDST_SGF;
1079        } else {
1080                src_dma = sg_dma_address(req->src);
1081                options = 0;
1082        }
1083        append_seq_in_ptr(desc, src_dma, req->nbytes, options);
1084
1085        edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result,
1086                                                digestsize);
1087
1088#ifdef DEBUG
1089        print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
1090                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1091#endif
1092
1093        ret = caam_jr_enqueue(jrdev, desc, ahash_done, req);
1094        if (!ret) {
1095                ret = -EINPROGRESS;
1096        } else {
1097                ahash_unmap(jrdev, edesc, req, digestsize);
1098                kfree(edesc);
1099        }
1100
1101        return ret;
1102}
1103
1104/* submit ahash final if it the first job descriptor */
1105static int ahash_final_no_ctx(struct ahash_request *req)
1106{
1107        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1108        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1109        struct caam_hash_state *state = ahash_request_ctx(req);
1110        struct device *jrdev = ctx->jrdev;
1111        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
1112                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
1113        u8 *buf = state->current_buf ? state->buf_1 : state->buf_0;
1114        int buflen = state->current_buf ? state->buflen_1 : state->buflen_0;
1115        u32 *sh_desc = ctx->sh_desc_digest, *desc;
1116        dma_addr_t ptr = ctx->sh_desc_digest_dma;
1117        int digestsize = crypto_ahash_digestsize(ahash);
1118        struct ahash_edesc *edesc;
1119        int ret = 0;
1120        int sh_len;
1121
1122        /* allocate space for base edesc and hw desc commands, link tables */
1123        edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN,
1124                        GFP_DMA | flags);
1125        if (!edesc) {
1126                dev_err(jrdev, "could not allocate extended descriptor\n");
1127                return -ENOMEM;
1128        }
1129
1130        sh_len = desc_len(sh_desc);
1131        desc = edesc->hw_desc;
1132        init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER | HDR_REVERSE);
1133
1134        state->buf_dma = dma_map_single(jrdev, buf, buflen, DMA_TO_DEVICE);
1135
1136        append_seq_in_ptr(desc, state->buf_dma, buflen, 0);
1137
1138        edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result,
1139                                                digestsize);
1140        edesc->src_nents = 0;
1141
1142#ifdef DEBUG
1143        print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
1144                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1145#endif
1146
1147        ret = caam_jr_enqueue(jrdev, desc, ahash_done, req);
1148        if (!ret) {
1149                ret = -EINPROGRESS;
1150        } else {
1151                ahash_unmap(jrdev, edesc, req, digestsize);
1152                kfree(edesc);
1153        }
1154
1155        return ret;
1156}
1157
1158/* submit ahash update if it the first job descriptor after update */
1159static int ahash_update_no_ctx(struct ahash_request *req)
1160{
1161        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1162        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1163        struct caam_hash_state *state = ahash_request_ctx(req);
1164        struct device *jrdev = ctx->jrdev;
1165        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
1166                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
1167        u8 *buf = state->current_buf ? state->buf_1 : state->buf_0;
1168        int *buflen = state->current_buf ? &state->buflen_1 : &state->buflen_0;
1169        u8 *next_buf = state->current_buf ? state->buf_0 : state->buf_1;
1170        int *next_buflen = state->current_buf ? &state->buflen_0 :
1171                           &state->buflen_1;
1172        int in_len = *buflen + req->nbytes, to_hash;
1173        int sec4_sg_bytes, src_nents;
1174        struct ahash_edesc *edesc;
1175        u32 *desc, *sh_desc = ctx->sh_desc_update_first;
1176        dma_addr_t ptr = ctx->sh_desc_update_first_dma;
1177        bool chained = false;
1178        int ret = 0;
1179        int sh_len;
1180
1181        *next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1);
1182        to_hash = in_len - *next_buflen;
1183
1184        if (to_hash) {
1185                src_nents = __sg_count(req->src, req->nbytes - (*next_buflen),
1186                                       &chained);
1187                sec4_sg_bytes = (1 + src_nents) *
1188                                sizeof(struct sec4_sg_entry);
1189
1190                /*
1191                 * allocate space for base edesc and hw desc commands,
1192                 * link tables
1193                 */
1194                edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
1195                                sec4_sg_bytes, GFP_DMA | flags);
1196                if (!edesc) {
1197                        dev_err(jrdev,
1198                                "could not allocate extended descriptor\n");
1199                        return -ENOMEM;
1200                }
1201
1202                edesc->src_nents = src_nents;
1203                edesc->chained = chained;
1204                edesc->sec4_sg_bytes = sec4_sg_bytes;
1205                edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
1206                                 DESC_JOB_IO_LEN;
1207                edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1208                                                    sec4_sg_bytes,
1209                                                    DMA_TO_DEVICE);
1210
1211                state->buf_dma = buf_map_to_sec4_sg(jrdev, edesc->sec4_sg,
1212                                                    buf, *buflen);
1213                src_map_to_sec4_sg(jrdev, req->src, src_nents,
1214                                   edesc->sec4_sg + 1, chained);
1215                if (*next_buflen) {
1216                        sg_copy_part(next_buf, req->src, to_hash - *buflen,
1217                                    req->nbytes);
1218                        state->current_buf = !state->current_buf;
1219                }
1220
1221                sh_len = desc_len(sh_desc);
1222                desc = edesc->hw_desc;
1223                init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER |
1224                                     HDR_REVERSE);
1225
1226                append_seq_in_ptr(desc, edesc->sec4_sg_dma, to_hash, LDST_SGF);
1227
1228                map_seq_out_ptr_ctx(desc, jrdev, state, ctx->ctx_len);
1229
1230#ifdef DEBUG
1231                print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
1232                               DUMP_PREFIX_ADDRESS, 16, 4, desc,
1233                               desc_bytes(desc), 1);
1234#endif
1235
1236                ret = caam_jr_enqueue(jrdev, desc, ahash_done_ctx_dst, req);
1237                if (!ret) {
1238                        ret = -EINPROGRESS;
1239                        state->update = ahash_update_ctx;
1240                        state->finup = ahash_finup_ctx;
1241                        state->final = ahash_final_ctx;
1242                } else {
1243                        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len,
1244                                        DMA_TO_DEVICE);
1245                        kfree(edesc);
1246                }
1247        } else if (*next_buflen) {
1248                sg_copy(buf + *buflen, req->src, req->nbytes);
1249                *buflen = *next_buflen;
1250                *next_buflen = 0;
1251        }
1252#ifdef DEBUG
1253        print_hex_dump(KERN_ERR, "buf@"xstr(__LINE__)": ",
1254                       DUMP_PREFIX_ADDRESS, 16, 4, buf, *buflen, 1);
1255        print_hex_dump(KERN_ERR, "next buf@"xstr(__LINE__)": ",
1256                       DUMP_PREFIX_ADDRESS, 16, 4, next_buf,
1257                       *next_buflen, 1);
1258#endif
1259
1260        return ret;
1261}
1262
1263/* submit ahash finup if it the first job descriptor after update */
1264static int ahash_finup_no_ctx(struct ahash_request *req)
1265{
1266        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1267        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1268        struct caam_hash_state *state = ahash_request_ctx(req);
1269        struct device *jrdev = ctx->jrdev;
1270        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
1271                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
1272        u8 *buf = state->current_buf ? state->buf_1 : state->buf_0;
1273        int buflen = state->current_buf ? state->buflen_1 : state->buflen_0;
1274        int last_buflen = state->current_buf ? state->buflen_0 :
1275                          state->buflen_1;
1276        u32 *sh_desc = ctx->sh_desc_digest, *desc;
1277        dma_addr_t ptr = ctx->sh_desc_digest_dma;
1278        int sec4_sg_bytes, sec4_sg_src_index, src_nents;
1279        int digestsize = crypto_ahash_digestsize(ahash);
1280        struct ahash_edesc *edesc;
1281        bool chained = false;
1282        int sh_len;
1283        int ret = 0;
1284
1285        src_nents = __sg_count(req->src, req->nbytes, &chained);
1286        sec4_sg_src_index = 2;
1287        sec4_sg_bytes = (sec4_sg_src_index + src_nents) *
1288                         sizeof(struct sec4_sg_entry);
1289
1290        /* allocate space for base edesc and hw desc commands, link tables */
1291        edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
1292                        sec4_sg_bytes, GFP_DMA | flags);
1293        if (!edesc) {
1294                dev_err(jrdev, "could not allocate extended descriptor\n");
1295                return -ENOMEM;
1296        }
1297
1298        sh_len = desc_len(sh_desc);
1299        desc = edesc->hw_desc;
1300        init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER | HDR_REVERSE);
1301
1302        edesc->src_nents = src_nents;
1303        edesc->chained = chained;
1304        edesc->sec4_sg_bytes = sec4_sg_bytes;
1305        edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
1306                         DESC_JOB_IO_LEN;
1307        edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1308                                            sec4_sg_bytes, DMA_TO_DEVICE);
1309
1310        state->buf_dma = try_buf_map_to_sec4_sg(jrdev, edesc->sec4_sg, buf,
1311                                                state->buf_dma, buflen,
1312                                                last_buflen);
1313
1314        src_map_to_sec4_sg(jrdev, req->src, src_nents, edesc->sec4_sg + 1,
1315                           chained);
1316
1317        append_seq_in_ptr(desc, edesc->sec4_sg_dma, buflen +
1318                               req->nbytes, LDST_SGF);
1319
1320        edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result,
1321                                                digestsize);
1322
1323#ifdef DEBUG
1324        print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
1325                       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1326#endif
1327
1328        ret = caam_jr_enqueue(jrdev, desc, ahash_done, req);
1329        if (!ret) {
1330                ret = -EINPROGRESS;
1331        } else {
1332                ahash_unmap(jrdev, edesc, req, digestsize);
1333                kfree(edesc);
1334        }
1335
1336        return ret;
1337}
1338
1339/* submit first update job descriptor after init */
1340static int ahash_update_first(struct ahash_request *req)
1341{
1342        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1343        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1344        struct caam_hash_state *state = ahash_request_ctx(req);
1345        struct device *jrdev = ctx->jrdev;
1346        gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
1347                       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
1348        u8 *next_buf = state->buf_0 + state->current_buf *
1349                       CAAM_MAX_HASH_BLOCK_SIZE;
1350        int *next_buflen = &state->buflen_0 + state->current_buf;
1351        int to_hash;
1352        u32 *sh_desc = ctx->sh_desc_update_first, *desc;
1353        dma_addr_t ptr = ctx->sh_desc_update_first_dma;
1354        int sec4_sg_bytes, src_nents;
1355        dma_addr_t src_dma;
1356        u32 options;
1357        struct ahash_edesc *edesc;
1358        bool chained = false;
1359        int ret = 0;
1360        int sh_len;
1361
1362        *next_buflen = req->nbytes & (crypto_tfm_alg_blocksize(&ahash->base) -
1363                                      1);
1364        to_hash = req->nbytes - *next_buflen;
1365
1366        if (to_hash) {
1367                src_nents = sg_count(req->src, req->nbytes - (*next_buflen),
1368                                     &chained);
1369                dma_map_sg_chained(jrdev, req->src, src_nents ? : 1,
1370                                   DMA_TO_DEVICE, chained);
1371                sec4_sg_bytes = src_nents * sizeof(struct sec4_sg_entry);
1372
1373                /*
1374                 * allocate space for base edesc and hw desc commands,
1375                 * link tables
1376                 */
1377                edesc = kmalloc(sizeof(struct ahash_edesc) + DESC_JOB_IO_LEN +
1378                                sec4_sg_bytes, GFP_DMA | flags);
1379                if (!edesc) {
1380                        dev_err(jrdev,
1381                                "could not allocate extended descriptor\n");
1382                        return -ENOMEM;
1383                }
1384
1385                edesc->src_nents = src_nents;
1386                edesc->chained = chained;
1387                edesc->sec4_sg_bytes = sec4_sg_bytes;
1388                edesc->sec4_sg = (void *)edesc + sizeof(struct ahash_edesc) +
1389                                 DESC_JOB_IO_LEN;
1390                edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1391                                                    sec4_sg_bytes,
1392                                                    DMA_TO_DEVICE);
1393
1394                if (src_nents) {
1395                        sg_to_sec4_sg_last(req->src, src_nents,
1396                                           edesc->sec4_sg, 0);
1397                        src_dma = edesc->sec4_sg_dma;
1398                        options = LDST_SGF;
1399                } else {
1400                        src_dma = sg_dma_address(req->src);
1401                        options = 0;
1402                }
1403
1404                if (*next_buflen)
1405                        sg_copy_part(next_buf, req->src, to_hash, req->nbytes);
1406
1407                sh_len = desc_len(sh_desc);
1408                desc = edesc->hw_desc;
1409                init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER |
1410                                     HDR_REVERSE);
1411
1412                append_seq_in_ptr(desc, src_dma, to_hash, options);
1413
1414                map_seq_out_ptr_ctx(desc, jrdev, state, ctx->ctx_len);
1415
1416#ifdef DEBUG
1417                print_hex_dump(KERN_ERR, "jobdesc@"xstr(__LINE__)": ",
1418                               DUMP_PREFIX_ADDRESS, 16, 4, desc,
1419                               desc_bytes(desc), 1);
1420#endif
1421
1422                ret = caam_jr_enqueue(jrdev, desc, ahash_done_ctx_dst,
1423                                      req);
1424                if (!ret) {
1425                        ret = -EINPROGRESS;
1426                        state->update = ahash_update_ctx;
1427                        state->finup = ahash_finup_ctx;
1428                        state->final = ahash_final_ctx;
1429                } else {
1430                        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len,
1431                                        DMA_TO_DEVICE);
1432                        kfree(edesc);
1433                }
1434        } else if (*next_buflen) {
1435                state->update = ahash_update_no_ctx;
1436                state->finup = ahash_finup_no_ctx;
1437                state->final = ahash_final_no_ctx;
1438                sg_copy(next_buf, req->src, req->nbytes);
1439        }
1440#ifdef DEBUG
1441        print_hex_dump(KERN_ERR, "next buf@"xstr(__LINE__)": ",
1442                       DUMP_PREFIX_ADDRESS, 16, 4, next_buf,
1443                       *next_buflen, 1);
1444#endif
1445
1446        return ret;
1447}
1448
1449static int ahash_finup_first(struct ahash_request *req)
1450{
1451        return ahash_digest(req);
1452}
1453
1454static int ahash_init(struct ahash_request *req)
1455{
1456        struct caam_hash_state *state = ahash_request_ctx(req);
1457
1458        state->update = ahash_update_first;
1459        state->finup = ahash_finup_first;
1460        state->final = ahash_final_no_ctx;
1461
1462        state->current_buf = 0;
1463
1464        return 0;
1465}
1466
1467static int ahash_update(struct ahash_request *req)
1468{
1469        struct caam_hash_state *state = ahash_request_ctx(req);
1470
1471        return state->update(req);
1472}
1473
1474static int ahash_finup(struct ahash_request *req)
1475{
1476        struct caam_hash_state *state = ahash_request_ctx(req);
1477
1478        return state->finup(req);
1479}
1480
1481static int ahash_final(struct ahash_request *req)
1482{
1483        struct caam_hash_state *state = ahash_request_ctx(req);
1484
1485        return state->final(req);
1486}
1487
1488static int ahash_export(struct ahash_request *req, void *out)
1489{
1490        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1491        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1492        struct caam_hash_state *state = ahash_request_ctx(req);
1493
1494        memcpy(out, ctx, sizeof(struct caam_hash_ctx));
1495        memcpy(out + sizeof(struct caam_hash_ctx), state,
1496               sizeof(struct caam_hash_state));
1497        return 0;
1498}
1499
1500static int ahash_import(struct ahash_request *req, const void *in)
1501{
1502        struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1503        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1504        struct caam_hash_state *state = ahash_request_ctx(req);
1505
1506        memcpy(ctx, in, sizeof(struct caam_hash_ctx));
1507        memcpy(state, in + sizeof(struct caam_hash_ctx),
1508               sizeof(struct caam_hash_state));
1509        return 0;
1510}
1511
1512struct caam_hash_template {
1513        char name[CRYPTO_MAX_ALG_NAME];
1514        char driver_name[CRYPTO_MAX_ALG_NAME];
1515        char hmac_name[CRYPTO_MAX_ALG_NAME];
1516        char hmac_driver_name[CRYPTO_MAX_ALG_NAME];
1517        unsigned int blocksize;
1518        struct ahash_alg template_ahash;
1519        u32 alg_type;
1520        u32 alg_op;
1521};
1522
1523/* ahash descriptors */
1524static struct caam_hash_template driver_hash[] = {
1525        {
1526                .name = "sha1",
1527                .driver_name = "sha1-caam",
1528                .hmac_name = "hmac(sha1)",
1529                .hmac_driver_name = "hmac-sha1-caam",
1530                .blocksize = SHA1_BLOCK_SIZE,
1531                .template_ahash = {
1532                        .init = ahash_init,
1533                        .update = ahash_update,
1534                        .final = ahash_final,
1535                        .finup = ahash_finup,
1536                        .digest = ahash_digest,
1537                        .export = ahash_export,
1538                        .import = ahash_import,
1539                        .setkey = ahash_setkey,
1540                        .halg = {
1541                                .digestsize = SHA1_DIGEST_SIZE,
1542                                },
1543                        },
1544                .alg_type = OP_ALG_ALGSEL_SHA1,
1545                .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
1546        }, {
1547                .name = "sha224",
1548                .driver_name = "sha224-caam",
1549                .hmac_name = "hmac(sha224)",
1550                .hmac_driver_name = "hmac-sha224-caam",
1551                .blocksize = SHA224_BLOCK_SIZE,
1552                .template_ahash = {
1553                        .init = ahash_init,
1554                        .update = ahash_update,
1555                        .final = ahash_final,
1556                        .finup = ahash_finup,
1557                        .digest = ahash_digest,
1558                        .export = ahash_export,
1559                        .import = ahash_import,
1560                        .setkey = ahash_setkey,
1561                        .halg = {
1562                                .digestsize = SHA224_DIGEST_SIZE,
1563                                },
1564                        },
1565                .alg_type = OP_ALG_ALGSEL_SHA224,
1566                .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
1567        }, {
1568                .name = "sha256",
1569                .driver_name = "sha256-caam",
1570                .hmac_name = "hmac(sha256)",
1571                .hmac_driver_name = "hmac-sha256-caam",
1572                .blocksize = SHA256_BLOCK_SIZE,
1573                .template_ahash = {
1574                        .init = ahash_init,
1575                        .update = ahash_update,
1576                        .final = ahash_final,
1577                        .finup = ahash_finup,
1578                        .digest = ahash_digest,
1579                        .export = ahash_export,
1580                        .import = ahash_import,
1581                        .setkey = ahash_setkey,
1582                        .halg = {
1583                                .digestsize = SHA256_DIGEST_SIZE,
1584                                },
1585                        },
1586                .alg_type = OP_ALG_ALGSEL_SHA256,
1587                .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
1588        }, {
1589                .name = "sha384",
1590                .driver_name = "sha384-caam",
1591                .hmac_name = "hmac(sha384)",
1592                .hmac_driver_name = "hmac-sha384-caam",
1593                .blocksize = SHA384_BLOCK_SIZE,
1594                .template_ahash = {
1595                        .init = ahash_init,
1596                        .update = ahash_update,
1597                        .final = ahash_final,
1598                        .finup = ahash_finup,
1599                        .digest = ahash_digest,
1600                        .export = ahash_export,
1601                        .import = ahash_import,
1602                        .setkey = ahash_setkey,
1603                        .halg = {
1604                                .digestsize = SHA384_DIGEST_SIZE,
1605                                },
1606                        },
1607                .alg_type = OP_ALG_ALGSEL_SHA384,
1608                .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
1609        }, {
1610                .name = "sha512",
1611                .driver_name = "sha512-caam",
1612                .hmac_name = "hmac(sha512)",
1613                .hmac_driver_name = "hmac-sha512-caam",
1614                .blocksize = SHA512_BLOCK_SIZE,
1615                .template_ahash = {
1616                        .init = ahash_init,
1617                        .update = ahash_update,
1618                        .final = ahash_final,
1619                        .finup = ahash_finup,
1620                        .digest = ahash_digest,
1621                        .export = ahash_export,
1622                        .import = ahash_import,
1623                        .setkey = ahash_setkey,
1624                        .halg = {
1625                                .digestsize = SHA512_DIGEST_SIZE,
1626                                },
1627                        },
1628                .alg_type = OP_ALG_ALGSEL_SHA512,
1629                .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
1630        }, {
1631                .name = "md5",
1632                .driver_name = "md5-caam",
1633                .hmac_name = "hmac(md5)",
1634                .hmac_driver_name = "hmac-md5-caam",
1635                .blocksize = MD5_BLOCK_WORDS * 4,
1636                .template_ahash = {
1637                        .init = ahash_init,
1638                        .update = ahash_update,
1639                        .final = ahash_final,
1640                        .finup = ahash_finup,
1641                        .digest = ahash_digest,
1642                        .export = ahash_export,
1643                        .import = ahash_import,
1644                        .setkey = ahash_setkey,
1645                        .halg = {
1646                                .digestsize = MD5_DIGEST_SIZE,
1647                                },
1648                        },
1649                .alg_type = OP_ALG_ALGSEL_MD5,
1650                .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
1651        },
1652};
1653
1654struct caam_hash_alg {
1655        struct list_head entry;
1656        struct device *ctrldev;
1657        int alg_type;
1658        int alg_op;
1659        struct ahash_alg ahash_alg;
1660};
1661
1662static int caam_hash_cra_init(struct crypto_tfm *tfm)
1663{
1664        struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
1665        struct crypto_alg *base = tfm->__crt_alg;
1666        struct hash_alg_common *halg =
1667                 container_of(base, struct hash_alg_common, base);
1668        struct ahash_alg *alg =
1669                 container_of(halg, struct ahash_alg, halg);
1670        struct caam_hash_alg *caam_hash =
1671                 container_of(alg, struct caam_hash_alg, ahash_alg);
1672        struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1673        struct caam_drv_private *priv = dev_get_drvdata(caam_hash->ctrldev);
1674        /* Sizes for MDHA running digests: MD5, SHA1, 224, 256, 384, 512 */
1675        static const u8 runninglen[] = { HASH_MSG_LEN + MD5_DIGEST_SIZE,
1676                                         HASH_MSG_LEN + SHA1_DIGEST_SIZE,
1677                                         HASH_MSG_LEN + 32,
1678                                         HASH_MSG_LEN + SHA256_DIGEST_SIZE,
1679                                         HASH_MSG_LEN + 64,
1680                                         HASH_MSG_LEN + SHA512_DIGEST_SIZE };
1681        int tgt_jr = atomic_inc_return(&priv->tfm_count);
1682        int ret = 0;
1683
1684        /*
1685         * distribute tfms across job rings to ensure in-order
1686         * crypto request processing per tfm
1687         */
1688        ctx->jrdev = priv->jrdev[tgt_jr % priv->total_jobrs];
1689
1690        /* copy descriptor header template value */
1691        ctx->alg_type = OP_TYPE_CLASS2_ALG | caam_hash->alg_type;
1692        ctx->alg_op = OP_TYPE_CLASS2_ALG | caam_hash->alg_op;
1693
1694        ctx->ctx_len = runninglen[(ctx->alg_op & OP_ALG_ALGSEL_SUBMASK) >>
1695                                  OP_ALG_ALGSEL_SHIFT];
1696
1697        crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1698                                 sizeof(struct caam_hash_state));
1699
1700        ret = ahash_set_sh_desc(ahash);
1701
1702        return ret;
1703}
1704
1705static void caam_hash_cra_exit(struct crypto_tfm *tfm)
1706{
1707        struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1708
1709        if (ctx->sh_desc_update_dma &&
1710            !dma_mapping_error(ctx->jrdev, ctx->sh_desc_update_dma))
1711                dma_unmap_single(ctx->jrdev, ctx->sh_desc_update_dma,
1712                                 desc_bytes(ctx->sh_desc_update),
1713                                 DMA_TO_DEVICE);
1714        if (ctx->sh_desc_update_first_dma &&
1715            !dma_mapping_error(ctx->jrdev, ctx->sh_desc_update_first_dma))
1716                dma_unmap_single(ctx->jrdev, ctx->sh_desc_update_first_dma,
1717                                 desc_bytes(ctx->sh_desc_update_first),
1718                                 DMA_TO_DEVICE);
1719        if (ctx->sh_desc_fin_dma &&
1720            !dma_mapping_error(ctx->jrdev, ctx->sh_desc_fin_dma))
1721                dma_unmap_single(ctx->jrdev, ctx->sh_desc_fin_dma,
1722                                 desc_bytes(ctx->sh_desc_fin), DMA_TO_DEVICE);
1723        if (ctx->sh_desc_digest_dma &&
1724            !dma_mapping_error(ctx->jrdev, ctx->sh_desc_digest_dma))
1725                dma_unmap_single(ctx->jrdev, ctx->sh_desc_digest_dma,
1726                                 desc_bytes(ctx->sh_desc_digest),
1727                                 DMA_TO_DEVICE);
1728        if (ctx->sh_desc_finup_dma &&
1729            !dma_mapping_error(ctx->jrdev, ctx->sh_desc_finup_dma))
1730                dma_unmap_single(ctx->jrdev, ctx->sh_desc_finup_dma,
1731                                 desc_bytes(ctx->sh_desc_finup), DMA_TO_DEVICE);
1732}
1733
1734static void __exit caam_algapi_hash_exit(void)
1735{
1736        struct device_node *dev_node;
1737        struct platform_device *pdev;
1738        struct device *ctrldev;
1739        struct caam_drv_private *priv;
1740        struct caam_hash_alg *t_alg, *n;
1741
1742        dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
1743        if (!dev_node) {
1744                dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0");
1745                if (!dev_node)
1746                        return;
1747        }
1748
1749        pdev = of_find_device_by_node(dev_node);
1750        if (!pdev)
1751                return;
1752
1753        ctrldev = &pdev->dev;
1754        of_node_put(dev_node);
1755        priv = dev_get_drvdata(ctrldev);
1756
1757        if (!priv->hash_list.next)
1758                return;
1759
1760        list_for_each_entry_safe(t_alg, n, &priv->hash_list, entry) {
1761                crypto_unregister_ahash(&t_alg->ahash_alg);
1762                list_del(&t_alg->entry);
1763                kfree(t_alg);
1764        }
1765}
1766
1767static struct caam_hash_alg *
1768caam_hash_alloc(struct device *ctrldev, struct caam_hash_template *template,
1769                bool keyed)
1770{
1771        struct caam_hash_alg *t_alg;
1772        struct ahash_alg *halg;
1773        struct crypto_alg *alg;
1774
1775        t_alg = kzalloc(sizeof(struct caam_hash_alg), GFP_KERNEL);
1776        if (!t_alg) {
1777                dev_err(ctrldev, "failed to allocate t_alg\n");
1778                return ERR_PTR(-ENOMEM);
1779        }
1780
1781        t_alg->ahash_alg = template->template_ahash;
1782        halg = &t_alg->ahash_alg;
1783        alg = &halg->halg.base;
1784
1785        if (keyed) {
1786                snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
1787                         template->hmac_name);
1788                snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
1789                         template->hmac_driver_name);
1790        } else {
1791                snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
1792                         template->name);
1793                snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
1794                         template->driver_name);
1795        }
1796        alg->cra_module = THIS_MODULE;
1797        alg->cra_init = caam_hash_cra_init;
1798        alg->cra_exit = caam_hash_cra_exit;
1799        alg->cra_ctxsize = sizeof(struct caam_hash_ctx);
1800        alg->cra_priority = CAAM_CRA_PRIORITY;
1801        alg->cra_blocksize = template->blocksize;
1802        alg->cra_alignmask = 0;
1803        alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_TYPE_AHASH;
1804        alg->cra_type = &crypto_ahash_type;
1805
1806        t_alg->alg_type = template->alg_type;
1807        t_alg->alg_op = template->alg_op;
1808        t_alg->ctrldev = ctrldev;
1809
1810        return t_alg;
1811}
1812
1813static int __init caam_algapi_hash_init(void)
1814{
1815        struct device_node *dev_node;
1816        struct platform_device *pdev;
1817        struct device *ctrldev;
1818        struct caam_drv_private *priv;
1819        int i = 0, err = 0;
1820
1821        dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
1822        if (!dev_node) {
1823                dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0");
1824                if (!dev_node)
1825                        return -ENODEV;
1826        }
1827
1828        pdev = of_find_device_by_node(dev_node);
1829        if (!pdev)
1830                return -ENODEV;
1831
1832        ctrldev = &pdev->dev;
1833        priv = dev_get_drvdata(ctrldev);
1834        of_node_put(dev_node);
1835
1836        INIT_LIST_HEAD(&priv->hash_list);
1837
1838        atomic_set(&priv->tfm_count, -1);
1839
1840        /* register crypto algorithms the device supports */
1841        for (i = 0; i < ARRAY_SIZE(driver_hash); i++) {
1842                /* TODO: check if h/w supports alg */
1843                struct caam_hash_alg *t_alg;
1844
1845                /* register hmac version */
1846                t_alg = caam_hash_alloc(ctrldev, &driver_hash[i], true);
1847                if (IS_ERR(t_alg)) {
1848                        err = PTR_ERR(t_alg);
1849                        dev_warn(ctrldev, "%s alg allocation failed\n",
1850                                 driver_hash[i].driver_name);
1851                        continue;
1852                }
1853
1854                err = crypto_register_ahash(&t_alg->ahash_alg);
1855                if (err) {
1856                        dev_warn(ctrldev, "%s alg registration failed\n",
1857                                t_alg->ahash_alg.halg.base.cra_driver_name);
1858                        kfree(t_alg);
1859                } else
1860                        list_add_tail(&t_alg->entry, &priv->hash_list);
1861
1862                /* register unkeyed version */
1863                t_alg = caam_hash_alloc(ctrldev, &driver_hash[i], false);
1864                if (IS_ERR(t_alg)) {
1865                        err = PTR_ERR(t_alg);
1866                        dev_warn(ctrldev, "%s alg allocation failed\n",
1867                                 driver_hash[i].driver_name);
1868                        continue;
1869                }
1870
1871                err = crypto_register_ahash(&t_alg->ahash_alg);
1872                if (err) {
1873                        dev_warn(ctrldev, "%s alg registration failed\n",
1874                                t_alg->ahash_alg.halg.base.cra_driver_name);
1875                        kfree(t_alg);
1876                } else
1877                        list_add_tail(&t_alg->entry, &priv->hash_list);
1878        }
1879
1880        return err;
1881}
1882
1883module_init(caam_algapi_hash_init);
1884module_exit(caam_algapi_hash_exit);
1885
1886MODULE_LICENSE("GPL");
1887MODULE_DESCRIPTION("FSL CAAM support for ahash functions of crypto API");
1888MODULE_AUTHOR("Freescale Semiconductor - NMG");
1889