linux/drivers/crypto/talitos.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * talitos - Freescale Integrated Security Engine (SEC) device driver
   4 *
   5 * Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
   6 *
   7 * Scatterlist Crypto API glue code copied from files with the following:
   8 * Copyright (c) 2006-2007 Herbert Xu <herbert@gondor.apana.org.au>
   9 *
  10 * Crypto algorithm registration code copied from hifn driver:
  11 * 2007+ Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
  12 * All rights reserved.
  13 */
  14
  15#include <linux/kernel.h>
  16#include <linux/module.h>
  17#include <linux/mod_devicetable.h>
  18#include <linux/device.h>
  19#include <linux/interrupt.h>
  20#include <linux/crypto.h>
  21#include <linux/hw_random.h>
  22#include <linux/of_address.h>
  23#include <linux/of_irq.h>
  24#include <linux/of_platform.h>
  25#include <linux/dma-mapping.h>
  26#include <linux/io.h>
  27#include <linux/spinlock.h>
  28#include <linux/rtnetlink.h>
  29#include <linux/slab.h>
  30
  31#include <crypto/algapi.h>
  32#include <crypto/aes.h>
  33#include <crypto/internal/des.h>
  34#include <crypto/sha.h>
  35#include <crypto/md5.h>
  36#include <crypto/internal/aead.h>
  37#include <crypto/authenc.h>
  38#include <crypto/internal/skcipher.h>
  39#include <crypto/hash.h>
  40#include <crypto/internal/hash.h>
  41#include <crypto/scatterwalk.h>
  42
  43#include "talitos.h"
  44
  45static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
  46                           unsigned int len, bool is_sec1)
  47{
  48        ptr->ptr = cpu_to_be32(lower_32_bits(dma_addr));
  49        if (is_sec1) {
  50                ptr->len1 = cpu_to_be16(len);
  51        } else {
  52                ptr->len = cpu_to_be16(len);
  53                ptr->eptr = upper_32_bits(dma_addr);
  54        }
  55}
  56
  57static void copy_talitos_ptr(struct talitos_ptr *dst_ptr,
  58                             struct talitos_ptr *src_ptr, bool is_sec1)
  59{
  60        dst_ptr->ptr = src_ptr->ptr;
  61        if (is_sec1) {
  62                dst_ptr->len1 = src_ptr->len1;
  63        } else {
  64                dst_ptr->len = src_ptr->len;
  65                dst_ptr->eptr = src_ptr->eptr;
  66        }
  67}
  68
  69static unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr,
  70                                           bool is_sec1)
  71{
  72        if (is_sec1)
  73                return be16_to_cpu(ptr->len1);
  74        else
  75                return be16_to_cpu(ptr->len);
  76}
  77
  78static void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val,
  79                                   bool is_sec1)
  80{
  81        if (!is_sec1)
  82                ptr->j_extent = val;
  83}
  84
  85static void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1)
  86{
  87        if (!is_sec1)
  88                ptr->j_extent |= val;
  89}
  90
  91/*
  92 * map virtual single (contiguous) pointer to h/w descriptor pointer
  93 */
  94static void __map_single_talitos_ptr(struct device *dev,
  95                                     struct talitos_ptr *ptr,
  96                                     unsigned int len, void *data,
  97                                     enum dma_data_direction dir,
  98                                     unsigned long attrs)
  99{
 100        dma_addr_t dma_addr = dma_map_single_attrs(dev, data, len, dir, attrs);
 101        struct talitos_private *priv = dev_get_drvdata(dev);
 102        bool is_sec1 = has_ftr_sec1(priv);
 103
 104        to_talitos_ptr(ptr, dma_addr, len, is_sec1);
 105}
 106
 107static void map_single_talitos_ptr(struct device *dev,
 108                                   struct talitos_ptr *ptr,
 109                                   unsigned int len, void *data,
 110                                   enum dma_data_direction dir)
 111{
 112        __map_single_talitos_ptr(dev, ptr, len, data, dir, 0);
 113}
 114
 115static void map_single_talitos_ptr_nosync(struct device *dev,
 116                                          struct talitos_ptr *ptr,
 117                                          unsigned int len, void *data,
 118                                          enum dma_data_direction dir)
 119{
 120        __map_single_talitos_ptr(dev, ptr, len, data, dir,
 121                                 DMA_ATTR_SKIP_CPU_SYNC);
 122}
 123
 124/*
 125 * unmap bus single (contiguous) h/w descriptor pointer
 126 */
 127static void unmap_single_talitos_ptr(struct device *dev,
 128                                     struct talitos_ptr *ptr,
 129                                     enum dma_data_direction dir)
 130{
 131        struct talitos_private *priv = dev_get_drvdata(dev);
 132        bool is_sec1 = has_ftr_sec1(priv);
 133
 134        dma_unmap_single(dev, be32_to_cpu(ptr->ptr),
 135                         from_talitos_ptr_len(ptr, is_sec1), dir);
 136}
 137
 138static int reset_channel(struct device *dev, int ch)
 139{
 140        struct talitos_private *priv = dev_get_drvdata(dev);
 141        unsigned int timeout = TALITOS_TIMEOUT;
 142        bool is_sec1 = has_ftr_sec1(priv);
 143
 144        if (is_sec1) {
 145                setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
 146                          TALITOS1_CCCR_LO_RESET);
 147
 148                while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) &
 149                        TALITOS1_CCCR_LO_RESET) && --timeout)
 150                        cpu_relax();
 151        } else {
 152                setbits32(priv->chan[ch].reg + TALITOS_CCCR,
 153                          TALITOS2_CCCR_RESET);
 154
 155                while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) &
 156                        TALITOS2_CCCR_RESET) && --timeout)
 157                        cpu_relax();
 158        }
 159
 160        if (timeout == 0) {
 161                dev_err(dev, "failed to reset channel %d\n", ch);
 162                return -EIO;
 163        }
 164
 165        /* set 36-bit addressing, done writeback enable and done IRQ enable */
 166        setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS_CCCR_LO_EAE |
 167                  TALITOS_CCCR_LO_CDWE | TALITOS_CCCR_LO_CDIE);
 168        /* enable chaining descriptors */
 169        if (is_sec1)
 170                setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
 171                          TALITOS_CCCR_LO_NE);
 172
 173        /* and ICCR writeback, if available */
 174        if (priv->features & TALITOS_FTR_HW_AUTH_CHECK)
 175                setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
 176                          TALITOS_CCCR_LO_IWSE);
 177
 178        return 0;
 179}
 180
 181static int reset_device(struct device *dev)
 182{
 183        struct talitos_private *priv = dev_get_drvdata(dev);
 184        unsigned int timeout = TALITOS_TIMEOUT;
 185        bool is_sec1 = has_ftr_sec1(priv);
 186        u32 mcr = is_sec1 ? TALITOS1_MCR_SWR : TALITOS2_MCR_SWR;
 187
 188        setbits32(priv->reg + TALITOS_MCR, mcr);
 189
 190        while ((in_be32(priv->reg + TALITOS_MCR) & mcr)
 191               && --timeout)
 192                cpu_relax();
 193
 194        if (priv->irq[1]) {
 195                mcr = TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3;
 196                setbits32(priv->reg + TALITOS_MCR, mcr);
 197        }
 198
 199        if (timeout == 0) {
 200                dev_err(dev, "failed to reset device\n");
 201                return -EIO;
 202        }
 203
 204        return 0;
 205}
 206
 207/*
 208 * Reset and initialize the device
 209 */
 210static int init_device(struct device *dev)
 211{
 212        struct talitos_private *priv = dev_get_drvdata(dev);
 213        int ch, err;
 214        bool is_sec1 = has_ftr_sec1(priv);
 215
 216        /*
 217         * Master reset
 218         * errata documentation: warning: certain SEC interrupts
 219         * are not fully cleared by writing the MCR:SWR bit,
 220         * set bit twice to completely reset
 221         */
 222        err = reset_device(dev);
 223        if (err)
 224                return err;
 225
 226        err = reset_device(dev);
 227        if (err)
 228                return err;
 229
 230        /* reset channels */
 231        for (ch = 0; ch < priv->num_channels; ch++) {
 232                err = reset_channel(dev, ch);
 233                if (err)
 234                        return err;
 235        }
 236
 237        /* enable channel done and error interrupts */
 238        if (is_sec1) {
 239                clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT);
 240                clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT);
 241                /* disable parity error check in DEU (erroneous? test vect.) */
 242                setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE);
 243        } else {
 244                setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT);
 245                setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT);
 246        }
 247
 248        /* disable integrity check error interrupts (use writeback instead) */
 249        if (priv->features & TALITOS_FTR_HW_AUTH_CHECK)
 250                setbits32(priv->reg_mdeu + TALITOS_EUICR_LO,
 251                          TALITOS_MDEUICR_LO_ICE);
 252
 253        return 0;
 254}
 255
 256/**
 257 * talitos_submit - submits a descriptor to the device for processing
 258 * @dev:        the SEC device to be used
 259 * @ch:         the SEC device channel to be used
 260 * @desc:       the descriptor to be processed by the device
 261 * @callback:   whom to call when processing is complete
 262 * @context:    a handle for use by caller (optional)
 263 *
 264 * desc must contain valid dma-mapped (bus physical) address pointers.
 265 * callback must check err and feedback in descriptor header
 266 * for device processing status.
 267 */
 268static int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
 269                          void (*callback)(struct device *dev,
 270                                           struct talitos_desc *desc,
 271                                           void *context, int error),
 272                          void *context)
 273{
 274        struct talitos_private *priv = dev_get_drvdata(dev);
 275        struct talitos_request *request;
 276        unsigned long flags;
 277        int head;
 278        bool is_sec1 = has_ftr_sec1(priv);
 279
 280        spin_lock_irqsave(&priv->chan[ch].head_lock, flags);
 281
 282        if (!atomic_inc_not_zero(&priv->chan[ch].submit_count)) {
 283                /* h/w fifo is full */
 284                spin_unlock_irqrestore(&priv->chan[ch].head_lock, flags);
 285                return -EAGAIN;
 286        }
 287
 288        head = priv->chan[ch].head;
 289        request = &priv->chan[ch].fifo[head];
 290
 291        /* map descriptor and save caller data */
 292        if (is_sec1) {
 293                desc->hdr1 = desc->hdr;
 294                request->dma_desc = dma_map_single(dev, &desc->hdr1,
 295                                                   TALITOS_DESC_SIZE,
 296                                                   DMA_BIDIRECTIONAL);
 297        } else {
 298                request->dma_desc = dma_map_single(dev, desc,
 299                                                   TALITOS_DESC_SIZE,
 300                                                   DMA_BIDIRECTIONAL);
 301        }
 302        request->callback = callback;
 303        request->context = context;
 304
 305        /* increment fifo head */
 306        priv->chan[ch].head = (priv->chan[ch].head + 1) & (priv->fifo_len - 1);
 307
 308        smp_wmb();
 309        request->desc = desc;
 310
 311        /* GO! */
 312        wmb();
 313        out_be32(priv->chan[ch].reg + TALITOS_FF,
 314                 upper_32_bits(request->dma_desc));
 315        out_be32(priv->chan[ch].reg + TALITOS_FF_LO,
 316                 lower_32_bits(request->dma_desc));
 317
 318        spin_unlock_irqrestore(&priv->chan[ch].head_lock, flags);
 319
 320        return -EINPROGRESS;
 321}
 322
 323static __be32 get_request_hdr(struct talitos_request *request, bool is_sec1)
 324{
 325        struct talitos_edesc *edesc;
 326
 327        if (!is_sec1)
 328                return request->desc->hdr;
 329
 330        if (!request->desc->next_desc)
 331                return request->desc->hdr1;
 332
 333        edesc = container_of(request->desc, struct talitos_edesc, desc);
 334
 335        return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))->hdr1;
 336}
 337
 338/*
 339 * process what was done, notify callback of error if not
 340 */
 341static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
 342{
 343        struct talitos_private *priv = dev_get_drvdata(dev);
 344        struct talitos_request *request, saved_req;
 345        unsigned long flags;
 346        int tail, status;
 347        bool is_sec1 = has_ftr_sec1(priv);
 348
 349        spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
 350
 351        tail = priv->chan[ch].tail;
 352        while (priv->chan[ch].fifo[tail].desc) {
 353                __be32 hdr;
 354
 355                request = &priv->chan[ch].fifo[tail];
 356
 357                /* descriptors with their done bits set don't get the error */
 358                rmb();
 359                hdr = get_request_hdr(request, is_sec1);
 360
 361                if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
 362                        status = 0;
 363                else
 364                        if (!error)
 365                                break;
 366                        else
 367                                status = error;
 368
 369                dma_unmap_single(dev, request->dma_desc,
 370                                 TALITOS_DESC_SIZE,
 371                                 DMA_BIDIRECTIONAL);
 372
 373                /* copy entries so we can call callback outside lock */
 374                saved_req.desc = request->desc;
 375                saved_req.callback = request->callback;
 376                saved_req.context = request->context;
 377
 378                /* release request entry in fifo */
 379                smp_wmb();
 380                request->desc = NULL;
 381
 382                /* increment fifo tail */
 383                priv->chan[ch].tail = (tail + 1) & (priv->fifo_len - 1);
 384
 385                spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags);
 386
 387                atomic_dec(&priv->chan[ch].submit_count);
 388
 389                saved_req.callback(dev, saved_req.desc, saved_req.context,
 390                                   status);
 391                /* channel may resume processing in single desc error case */
 392                if (error && !reset_ch && status == error)
 393                        return;
 394                spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
 395                tail = priv->chan[ch].tail;
 396        }
 397
 398        spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags);
 399}
 400
 401/*
 402 * process completed requests for channels that have done status
 403 */
 404#define DEF_TALITOS1_DONE(name, ch_done_mask)                           \
 405static void talitos1_done_##name(unsigned long data)                    \
 406{                                                                       \
 407        struct device *dev = (struct device *)data;                     \
 408        struct talitos_private *priv = dev_get_drvdata(dev);            \
 409        unsigned long flags;                                            \
 410                                                                        \
 411        if (ch_done_mask & 0x10000000)                                  \
 412                flush_channel(dev, 0, 0, 0);                    \
 413        if (ch_done_mask & 0x40000000)                                  \
 414                flush_channel(dev, 1, 0, 0);                    \
 415        if (ch_done_mask & 0x00010000)                                  \
 416                flush_channel(dev, 2, 0, 0);                    \
 417        if (ch_done_mask & 0x00040000)                                  \
 418                flush_channel(dev, 3, 0, 0);                    \
 419                                                                        \
 420        /* At this point, all completed channels have been processed */ \
 421        /* Unmask done interrupts for channels completed later on. */   \
 422        spin_lock_irqsave(&priv->reg_lock, flags);                      \
 423        clrbits32(priv->reg + TALITOS_IMR, ch_done_mask);               \
 424        clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT);    \
 425        spin_unlock_irqrestore(&priv->reg_lock, flags);                 \
 426}
 427
 428DEF_TALITOS1_DONE(4ch, TALITOS1_ISR_4CHDONE)
 429DEF_TALITOS1_DONE(ch0, TALITOS1_ISR_CH_0_DONE)
 430
 431#define DEF_TALITOS2_DONE(name, ch_done_mask)                           \
 432static void talitos2_done_##name(unsigned long data)                    \
 433{                                                                       \
 434        struct device *dev = (struct device *)data;                     \
 435        struct talitos_private *priv = dev_get_drvdata(dev);            \
 436        unsigned long flags;                                            \
 437                                                                        \
 438        if (ch_done_mask & 1)                                           \
 439                flush_channel(dev, 0, 0, 0);                            \
 440        if (ch_done_mask & (1 << 2))                                    \
 441                flush_channel(dev, 1, 0, 0);                            \
 442        if (ch_done_mask & (1 << 4))                                    \
 443                flush_channel(dev, 2, 0, 0);                            \
 444        if (ch_done_mask & (1 << 6))                                    \
 445                flush_channel(dev, 3, 0, 0);                            \
 446                                                                        \
 447        /* At this point, all completed channels have been processed */ \
 448        /* Unmask done interrupts for channels completed later on. */   \
 449        spin_lock_irqsave(&priv->reg_lock, flags);                      \
 450        setbits32(priv->reg + TALITOS_IMR, ch_done_mask);               \
 451        setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT);    \
 452        spin_unlock_irqrestore(&priv->reg_lock, flags);                 \
 453}
 454
 455DEF_TALITOS2_DONE(4ch, TALITOS2_ISR_4CHDONE)
 456DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE)
 457DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE)
 458DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE)
 459
 460/*
 461 * locate current (offending) descriptor
 462 */
 463static u32 current_desc_hdr(struct device *dev, int ch)
 464{
 465        struct talitos_private *priv = dev_get_drvdata(dev);
 466        int tail, iter;
 467        dma_addr_t cur_desc;
 468
 469        cur_desc = ((u64)in_be32(priv->chan[ch].reg + TALITOS_CDPR)) << 32;
 470        cur_desc |= in_be32(priv->chan[ch].reg + TALITOS_CDPR_LO);
 471
 472        if (!cur_desc) {
 473                dev_err(dev, "CDPR is NULL, giving up search for offending descriptor\n");
 474                return 0;
 475        }
 476
 477        tail = priv->chan[ch].tail;
 478
 479        iter = tail;
 480        while (priv->chan[ch].fifo[iter].dma_desc != cur_desc &&
 481               priv->chan[ch].fifo[iter].desc->next_desc != cur_desc) {
 482                iter = (iter + 1) & (priv->fifo_len - 1);
 483                if (iter == tail) {
 484                        dev_err(dev, "couldn't locate current descriptor\n");
 485                        return 0;
 486                }
 487        }
 488
 489        if (priv->chan[ch].fifo[iter].desc->next_desc == cur_desc) {
 490                struct talitos_edesc *edesc;
 491
 492                edesc = container_of(priv->chan[ch].fifo[iter].desc,
 493                                     struct talitos_edesc, desc);
 494                return ((struct talitos_desc *)
 495                        (edesc->buf + edesc->dma_len))->hdr;
 496        }
 497
 498        return priv->chan[ch].fifo[iter].desc->hdr;
 499}
 500
 501/*
 502 * user diagnostics; report root cause of error based on execution unit status
 503 */
 504static void report_eu_error(struct device *dev, int ch, u32 desc_hdr)
 505{
 506        struct talitos_private *priv = dev_get_drvdata(dev);
 507        int i;
 508
 509        if (!desc_hdr)
 510                desc_hdr = in_be32(priv->chan[ch].reg + TALITOS_DESCBUF);
 511
 512        switch (desc_hdr & DESC_HDR_SEL0_MASK) {
 513        case DESC_HDR_SEL0_AFEU:
 514                dev_err(dev, "AFEUISR 0x%08x_%08x\n",
 515                        in_be32(priv->reg_afeu + TALITOS_EUISR),
 516                        in_be32(priv->reg_afeu + TALITOS_EUISR_LO));
 517                break;
 518        case DESC_HDR_SEL0_DEU:
 519                dev_err(dev, "DEUISR 0x%08x_%08x\n",
 520                        in_be32(priv->reg_deu + TALITOS_EUISR),
 521                        in_be32(priv->reg_deu + TALITOS_EUISR_LO));
 522                break;
 523        case DESC_HDR_SEL0_MDEUA:
 524        case DESC_HDR_SEL0_MDEUB:
 525                dev_err(dev, "MDEUISR 0x%08x_%08x\n",
 526                        in_be32(priv->reg_mdeu + TALITOS_EUISR),
 527                        in_be32(priv->reg_mdeu + TALITOS_EUISR_LO));
 528                break;
 529        case DESC_HDR_SEL0_RNG:
 530                dev_err(dev, "RNGUISR 0x%08x_%08x\n",
 531                        in_be32(priv->reg_rngu + TALITOS_ISR),
 532                        in_be32(priv->reg_rngu + TALITOS_ISR_LO));
 533                break;
 534        case DESC_HDR_SEL0_PKEU:
 535                dev_err(dev, "PKEUISR 0x%08x_%08x\n",
 536                        in_be32(priv->reg_pkeu + TALITOS_EUISR),
 537                        in_be32(priv->reg_pkeu + TALITOS_EUISR_LO));
 538                break;
 539        case DESC_HDR_SEL0_AESU:
 540                dev_err(dev, "AESUISR 0x%08x_%08x\n",
 541                        in_be32(priv->reg_aesu + TALITOS_EUISR),
 542                        in_be32(priv->reg_aesu + TALITOS_EUISR_LO));
 543                break;
 544        case DESC_HDR_SEL0_CRCU:
 545                dev_err(dev, "CRCUISR 0x%08x_%08x\n",
 546                        in_be32(priv->reg_crcu + TALITOS_EUISR),
 547                        in_be32(priv->reg_crcu + TALITOS_EUISR_LO));
 548                break;
 549        case DESC_HDR_SEL0_KEU:
 550                dev_err(dev, "KEUISR 0x%08x_%08x\n",
 551                        in_be32(priv->reg_pkeu + TALITOS_EUISR),
 552                        in_be32(priv->reg_pkeu + TALITOS_EUISR_LO));
 553                break;
 554        }
 555
 556        switch (desc_hdr & DESC_HDR_SEL1_MASK) {
 557        case DESC_HDR_SEL1_MDEUA:
 558        case DESC_HDR_SEL1_MDEUB:
 559                dev_err(dev, "MDEUISR 0x%08x_%08x\n",
 560                        in_be32(priv->reg_mdeu + TALITOS_EUISR),
 561                        in_be32(priv->reg_mdeu + TALITOS_EUISR_LO));
 562                break;
 563        case DESC_HDR_SEL1_CRCU:
 564                dev_err(dev, "CRCUISR 0x%08x_%08x\n",
 565                        in_be32(priv->reg_crcu + TALITOS_EUISR),
 566                        in_be32(priv->reg_crcu + TALITOS_EUISR_LO));
 567                break;
 568        }
 569
 570        for (i = 0; i < 8; i++)
 571                dev_err(dev, "DESCBUF 0x%08x_%08x\n",
 572                        in_be32(priv->chan[ch].reg + TALITOS_DESCBUF + 8*i),
 573                        in_be32(priv->chan[ch].reg + TALITOS_DESCBUF_LO + 8*i));
 574}
 575
 576/*
 577 * recover from error interrupts
 578 */
 579static void talitos_error(struct device *dev, u32 isr, u32 isr_lo)
 580{
 581        struct talitos_private *priv = dev_get_drvdata(dev);
 582        unsigned int timeout = TALITOS_TIMEOUT;
 583        int ch, error, reset_dev = 0;
 584        u32 v_lo;
 585        bool is_sec1 = has_ftr_sec1(priv);
 586        int reset_ch = is_sec1 ? 1 : 0; /* only SEC2 supports continuation */
 587
 588        for (ch = 0; ch < priv->num_channels; ch++) {
 589                /* skip channels without errors */
 590                if (is_sec1) {
 591                        /* bits 29, 31, 17, 19 */
 592                        if (!(isr & (1 << (29 + (ch & 1) * 2 - (ch & 2) * 6))))
 593                                continue;
 594                } else {
 595                        if (!(isr & (1 << (ch * 2 + 1))))
 596                                continue;
 597                }
 598
 599                error = -EINVAL;
 600
 601                v_lo = in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO);
 602
 603                if (v_lo & TALITOS_CCPSR_LO_DOF) {
 604                        dev_err(dev, "double fetch fifo overflow error\n");
 605                        error = -EAGAIN;
 606                        reset_ch = 1;
 607                }
 608                if (v_lo & TALITOS_CCPSR_LO_SOF) {
 609                        /* h/w dropped descriptor */
 610                        dev_err(dev, "single fetch fifo overflow error\n");
 611                        error = -EAGAIN;
 612                }
 613                if (v_lo & TALITOS_CCPSR_LO_MDTE)
 614                        dev_err(dev, "master data transfer error\n");
 615                if (v_lo & TALITOS_CCPSR_LO_SGDLZ)
 616                        dev_err(dev, is_sec1 ? "pointer not complete error\n"
 617                                             : "s/g data length zero error\n");
 618                if (v_lo & TALITOS_CCPSR_LO_FPZ)
 619                        dev_err(dev, is_sec1 ? "parity error\n"
 620                                             : "fetch pointer zero error\n");
 621                if (v_lo & TALITOS_CCPSR_LO_IDH)
 622                        dev_err(dev, "illegal descriptor header error\n");
 623                if (v_lo & TALITOS_CCPSR_LO_IEU)
 624                        dev_err(dev, is_sec1 ? "static assignment error\n"
 625                                             : "invalid exec unit error\n");
 626                if (v_lo & TALITOS_CCPSR_LO_EU)
 627                        report_eu_error(dev, ch, current_desc_hdr(dev, ch));
 628                if (!is_sec1) {
 629                        if (v_lo & TALITOS_CCPSR_LO_GB)
 630                                dev_err(dev, "gather boundary error\n");
 631                        if (v_lo & TALITOS_CCPSR_LO_GRL)
 632                                dev_err(dev, "gather return/length error\n");
 633                        if (v_lo & TALITOS_CCPSR_LO_SB)
 634                                dev_err(dev, "scatter boundary error\n");
 635                        if (v_lo & TALITOS_CCPSR_LO_SRL)
 636                                dev_err(dev, "scatter return/length error\n");
 637                }
 638
 639                flush_channel(dev, ch, error, reset_ch);
 640
 641                if (reset_ch) {
 642                        reset_channel(dev, ch);
 643                } else {
 644                        setbits32(priv->chan[ch].reg + TALITOS_CCCR,
 645                                  TALITOS2_CCCR_CONT);
 646                        setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, 0);
 647                        while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) &
 648                               TALITOS2_CCCR_CONT) && --timeout)
 649                                cpu_relax();
 650                        if (timeout == 0) {
 651                                dev_err(dev, "failed to restart channel %d\n",
 652                                        ch);
 653                                reset_dev = 1;
 654                        }
 655                }
 656        }
 657        if (reset_dev || (is_sec1 && isr & ~TALITOS1_ISR_4CHERR) ||
 658            (!is_sec1 && isr & ~TALITOS2_ISR_4CHERR) || isr_lo) {
 659                if (is_sec1 && (isr_lo & TALITOS1_ISR_TEA_ERR))
 660                        dev_err(dev, "TEA error: ISR 0x%08x_%08x\n",
 661                                isr, isr_lo);
 662                else
 663                        dev_err(dev, "done overflow, internal time out, or "
 664                                "rngu error: ISR 0x%08x_%08x\n", isr, isr_lo);
 665
 666                /* purge request queues */
 667                for (ch = 0; ch < priv->num_channels; ch++)
 668                        flush_channel(dev, ch, -EIO, 1);
 669
 670                /* reset and reinitialize the device */
 671                init_device(dev);
 672        }
 673}
 674
 675#define DEF_TALITOS1_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet)          \
 676static irqreturn_t talitos1_interrupt_##name(int irq, void *data)              \
 677{                                                                              \
 678        struct device *dev = data;                                             \
 679        struct talitos_private *priv = dev_get_drvdata(dev);                   \
 680        u32 isr, isr_lo;                                                       \
 681        unsigned long flags;                                                   \
 682                                                                               \
 683        spin_lock_irqsave(&priv->reg_lock, flags);                             \
 684        isr = in_be32(priv->reg + TALITOS_ISR);                                \
 685        isr_lo = in_be32(priv->reg + TALITOS_ISR_LO);                          \
 686        /* Acknowledge interrupt */                                            \
 687        out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
 688        out_be32(priv->reg + TALITOS_ICR_LO, isr_lo);                          \
 689                                                                               \
 690        if (unlikely(isr & ch_err_mask || isr_lo & TALITOS1_IMR_LO_INIT)) {    \
 691                spin_unlock_irqrestore(&priv->reg_lock, flags);                \
 692                talitos_error(dev, isr & ch_err_mask, isr_lo);                 \
 693        }                                                                      \
 694        else {                                                                 \
 695                if (likely(isr & ch_done_mask)) {                              \
 696                        /* mask further done interrupts. */                    \
 697                        setbits32(priv->reg + TALITOS_IMR, ch_done_mask);      \
 698                        /* done_task will unmask done interrupts at exit */    \
 699                        tasklet_schedule(&priv->done_task[tlet]);              \
 700                }                                                              \
 701                spin_unlock_irqrestore(&priv->reg_lock, flags);                \
 702        }                                                                      \
 703                                                                               \
 704        return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED :  \
 705                                                                IRQ_NONE;      \
 706}
 707
 708DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALITOS1_ISR_4CHERR, 0)
 709
 710#define DEF_TALITOS2_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet)          \
 711static irqreturn_t talitos2_interrupt_##name(int irq, void *data)              \
 712{                                                                              \
 713        struct device *dev = data;                                             \
 714        struct talitos_private *priv = dev_get_drvdata(dev);                   \
 715        u32 isr, isr_lo;                                                       \
 716        unsigned long flags;                                                   \
 717                                                                               \
 718        spin_lock_irqsave(&priv->reg_lock, flags);                             \
 719        isr = in_be32(priv->reg + TALITOS_ISR);                                \
 720        isr_lo = in_be32(priv->reg + TALITOS_ISR_LO);                          \
 721        /* Acknowledge interrupt */                                            \
 722        out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
 723        out_be32(priv->reg + TALITOS_ICR_LO, isr_lo);                          \
 724                                                                               \
 725        if (unlikely(isr & ch_err_mask || isr_lo)) {                           \
 726                spin_unlock_irqrestore(&priv->reg_lock, flags);                \
 727                talitos_error(dev, isr & ch_err_mask, isr_lo);                 \
 728        }                                                                      \
 729        else {                                                                 \
 730                if (likely(isr & ch_done_mask)) {                              \
 731                        /* mask further done interrupts. */                    \
 732                        clrbits32(priv->reg + TALITOS_IMR, ch_done_mask);      \
 733                        /* done_task will unmask done interrupts at exit */    \
 734                        tasklet_schedule(&priv->done_task[tlet]);              \
 735                }                                                              \
 736                spin_unlock_irqrestore(&priv->reg_lock, flags);                \
 737        }                                                                      \
 738                                                                               \
 739        return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED :  \
 740                                                                IRQ_NONE;      \
 741}
 742
 743DEF_TALITOS2_INTERRUPT(4ch, TALITOS2_ISR_4CHDONE, TALITOS2_ISR_4CHERR, 0)
 744DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE, TALITOS2_ISR_CH_0_2_ERR,
 745                       0)
 746DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_3_ERR,
 747                       1)
 748
 749/*
 750 * hwrng
 751 */
 752static int talitos_rng_data_present(struct hwrng *rng, int wait)
 753{
 754        struct device *dev = (struct device *)rng->priv;
 755        struct talitos_private *priv = dev_get_drvdata(dev);
 756        u32 ofl;
 757        int i;
 758
 759        for (i = 0; i < 20; i++) {
 760                ofl = in_be32(priv->reg_rngu + TALITOS_EUSR_LO) &
 761                      TALITOS_RNGUSR_LO_OFL;
 762                if (ofl || !wait)
 763                        break;
 764                udelay(10);
 765        }
 766
 767        return !!ofl;
 768}
 769
 770static int talitos_rng_data_read(struct hwrng *rng, u32 *data)
 771{
 772        struct device *dev = (struct device *)rng->priv;
 773        struct talitos_private *priv = dev_get_drvdata(dev);
 774
 775        /* rng fifo requires 64-bit accesses */
 776        *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO);
 777        *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO);
 778
 779        return sizeof(u32);
 780}
 781
 782static int talitos_rng_init(struct hwrng *rng)
 783{
 784        struct device *dev = (struct device *)rng->priv;
 785        struct talitos_private *priv = dev_get_drvdata(dev);
 786        unsigned int timeout = TALITOS_TIMEOUT;
 787
 788        setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR);
 789        while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO)
 790                 & TALITOS_RNGUSR_LO_RD)
 791               && --timeout)
 792                cpu_relax();
 793        if (timeout == 0) {
 794                dev_err(dev, "failed to reset rng hw\n");
 795                return -ENODEV;
 796        }
 797
 798        /* start generating */
 799        setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0);
 800
 801        return 0;
 802}
 803
 804static int talitos_register_rng(struct device *dev)
 805{
 806        struct talitos_private *priv = dev_get_drvdata(dev);
 807        int err;
 808
 809        priv->rng.name          = dev_driver_string(dev),
 810        priv->rng.init          = talitos_rng_init,
 811        priv->rng.data_present  = talitos_rng_data_present,
 812        priv->rng.data_read     = talitos_rng_data_read,
 813        priv->rng.priv          = (unsigned long)dev;
 814
 815        err = hwrng_register(&priv->rng);
 816        if (!err)
 817                priv->rng_registered = true;
 818
 819        return err;
 820}
 821
 822static void talitos_unregister_rng(struct device *dev)
 823{
 824        struct talitos_private *priv = dev_get_drvdata(dev);
 825
 826        if (!priv->rng_registered)
 827                return;
 828
 829        hwrng_unregister(&priv->rng);
 830        priv->rng_registered = false;
 831}
 832
 833/*
 834 * crypto alg
 835 */
 836#define TALITOS_CRA_PRIORITY            3000
 837/*
 838 * Defines a priority for doing AEAD with descriptors type
 839 * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP
 840 */
 841#define TALITOS_CRA_PRIORITY_AEAD_HSNA  (TALITOS_CRA_PRIORITY - 1)
 842#ifdef CONFIG_CRYPTO_DEV_TALITOS2
 843#define TALITOS_MAX_KEY_SIZE            (AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE)
 844#else
 845#define TALITOS_MAX_KEY_SIZE            (AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE)
 846#endif
 847#define TALITOS_MAX_IV_LENGTH           16 /* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */
 848
 849struct talitos_ctx {
 850        struct device *dev;
 851        int ch;
 852        __be32 desc_hdr_template;
 853        u8 key[TALITOS_MAX_KEY_SIZE];
 854        u8 iv[TALITOS_MAX_IV_LENGTH];
 855        dma_addr_t dma_key;
 856        unsigned int keylen;
 857        unsigned int enckeylen;
 858        unsigned int authkeylen;
 859};
 860
 861#define HASH_MAX_BLOCK_SIZE             SHA512_BLOCK_SIZE
 862#define TALITOS_MDEU_MAX_CONTEXT_SIZE   TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512
 863
 864struct talitos_ahash_req_ctx {
 865        u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
 866        unsigned int hw_context_size;
 867        u8 buf[2][HASH_MAX_BLOCK_SIZE];
 868        int buf_idx;
 869        unsigned int swinit;
 870        unsigned int first;
 871        unsigned int last;
 872        unsigned int to_hash_later;
 873        unsigned int nbuf;
 874        struct scatterlist bufsl[2];
 875        struct scatterlist *psrc;
 876};
 877
 878struct talitos_export_state {
 879        u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
 880        u8 buf[HASH_MAX_BLOCK_SIZE];
 881        unsigned int swinit;
 882        unsigned int first;
 883        unsigned int last;
 884        unsigned int to_hash_later;
 885        unsigned int nbuf;
 886};
 887
 888static int aead_setkey(struct crypto_aead *authenc,
 889                       const u8 *key, unsigned int keylen)
 890{
 891        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
 892        struct device *dev = ctx->dev;
 893        struct crypto_authenc_keys keys;
 894
 895        if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
 896                goto badkey;
 897
 898        if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
 899                goto badkey;
 900
 901        if (ctx->keylen)
 902                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
 903
 904        memcpy(ctx->key, keys.authkey, keys.authkeylen);
 905        memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
 906
 907        ctx->keylen = keys.authkeylen + keys.enckeylen;
 908        ctx->enckeylen = keys.enckeylen;
 909        ctx->authkeylen = keys.authkeylen;
 910        ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
 911                                      DMA_TO_DEVICE);
 912
 913        memzero_explicit(&keys, sizeof(keys));
 914        return 0;
 915
 916badkey:
 917        memzero_explicit(&keys, sizeof(keys));
 918        return -EINVAL;
 919}
 920
 921static int aead_des3_setkey(struct crypto_aead *authenc,
 922                            const u8 *key, unsigned int keylen)
 923{
 924        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
 925        struct device *dev = ctx->dev;
 926        struct crypto_authenc_keys keys;
 927        int err;
 928
 929        err = crypto_authenc_extractkeys(&keys, key, keylen);
 930        if (unlikely(err))
 931                goto out;
 932
 933        err = -EINVAL;
 934        if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
 935                goto out;
 936
 937        err = verify_aead_des3_key(authenc, keys.enckey, keys.enckeylen);
 938        if (err)
 939                goto out;
 940
 941        if (ctx->keylen)
 942                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
 943
 944        memcpy(ctx->key, keys.authkey, keys.authkeylen);
 945        memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
 946
 947        ctx->keylen = keys.authkeylen + keys.enckeylen;
 948        ctx->enckeylen = keys.enckeylen;
 949        ctx->authkeylen = keys.authkeylen;
 950        ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
 951                                      DMA_TO_DEVICE);
 952
 953out:
 954        memzero_explicit(&keys, sizeof(keys));
 955        return err;
 956}
 957
 958static void talitos_sg_unmap(struct device *dev,
 959                             struct talitos_edesc *edesc,
 960                             struct scatterlist *src,
 961                             struct scatterlist *dst,
 962                             unsigned int len, unsigned int offset)
 963{
 964        struct talitos_private *priv = dev_get_drvdata(dev);
 965        bool is_sec1 = has_ftr_sec1(priv);
 966        unsigned int src_nents = edesc->src_nents ? : 1;
 967        unsigned int dst_nents = edesc->dst_nents ? : 1;
 968
 969        if (is_sec1 && dst && dst_nents > 1) {
 970                dma_sync_single_for_device(dev, edesc->dma_link_tbl + offset,
 971                                           len, DMA_FROM_DEVICE);
 972                sg_pcopy_from_buffer(dst, dst_nents, edesc->buf + offset, len,
 973                                     offset);
 974        }
 975        if (src != dst) {
 976                if (src_nents == 1 || !is_sec1)
 977                        dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
 978
 979                if (dst && (dst_nents == 1 || !is_sec1))
 980                        dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
 981        } else if (src_nents == 1 || !is_sec1) {
 982                dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
 983        }
 984}
 985
 986static void ipsec_esp_unmap(struct device *dev,
 987                            struct talitos_edesc *edesc,
 988                            struct aead_request *areq, bool encrypt)
 989{
 990        struct crypto_aead *aead = crypto_aead_reqtfm(areq);
 991        struct talitos_ctx *ctx = crypto_aead_ctx(aead);
 992        unsigned int ivsize = crypto_aead_ivsize(aead);
 993        unsigned int authsize = crypto_aead_authsize(aead);
 994        unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
 995        bool is_ipsec_esp = edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP;
 996        struct talitos_ptr *civ_ptr = &edesc->desc.ptr[is_ipsec_esp ? 2 : 3];
 997
 998        if (is_ipsec_esp)
 999                unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6],
1000                                         DMA_FROM_DEVICE);
1001        unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE);
1002
1003        talitos_sg_unmap(dev, edesc, areq->src, areq->dst,
1004                         cryptlen + authsize, areq->assoclen);
1005
1006        if (edesc->dma_len)
1007                dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1008                                 DMA_BIDIRECTIONAL);
1009
1010        if (!is_ipsec_esp) {
1011                unsigned int dst_nents = edesc->dst_nents ? : 1;
1012
1013                sg_pcopy_to_buffer(areq->dst, dst_nents, ctx->iv, ivsize,
1014                                   areq->assoclen + cryptlen - ivsize);
1015        }
1016}
1017
1018/*
1019 * ipsec_esp descriptor callbacks
1020 */
1021static void ipsec_esp_encrypt_done(struct device *dev,
1022                                   struct talitos_desc *desc, void *context,
1023                                   int err)
1024{
1025        struct aead_request *areq = context;
1026        struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1027        unsigned int ivsize = crypto_aead_ivsize(authenc);
1028        struct talitos_edesc *edesc;
1029
1030        edesc = container_of(desc, struct talitos_edesc, desc);
1031
1032        ipsec_esp_unmap(dev, edesc, areq, true);
1033
1034        dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE);
1035
1036        kfree(edesc);
1037
1038        aead_request_complete(areq, err);
1039}
1040
1041static void ipsec_esp_decrypt_swauth_done(struct device *dev,
1042                                          struct talitos_desc *desc,
1043                                          void *context, int err)
1044{
1045        struct aead_request *req = context;
1046        struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1047        unsigned int authsize = crypto_aead_authsize(authenc);
1048        struct talitos_edesc *edesc;
1049        char *oicv, *icv;
1050
1051        edesc = container_of(desc, struct talitos_edesc, desc);
1052
1053        ipsec_esp_unmap(dev, edesc, req, false);
1054
1055        if (!err) {
1056                /* auth check */
1057                oicv = edesc->buf + edesc->dma_len;
1058                icv = oicv - authsize;
1059
1060                err = crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0;
1061        }
1062
1063        kfree(edesc);
1064
1065        aead_request_complete(req, err);
1066}
1067
1068static void ipsec_esp_decrypt_hwauth_done(struct device *dev,
1069                                          struct talitos_desc *desc,
1070                                          void *context, int err)
1071{
1072        struct aead_request *req = context;
1073        struct talitos_edesc *edesc;
1074
1075        edesc = container_of(desc, struct talitos_edesc, desc);
1076
1077        ipsec_esp_unmap(dev, edesc, req, false);
1078
1079        /* check ICV auth status */
1080        if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=
1081                     DESC_HDR_LO_ICCR1_PASS))
1082                err = -EBADMSG;
1083
1084        kfree(edesc);
1085
1086        aead_request_complete(req, err);
1087}
1088
1089/*
1090 * convert scatterlist to SEC h/w link table format
1091 * stop at cryptlen bytes
1092 */
1093static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count,
1094                                 unsigned int offset, int datalen, int elen,
1095                                 struct talitos_ptr *link_tbl_ptr)
1096{
1097        int n_sg = elen ? sg_count + 1 : sg_count;
1098        int count = 0;
1099        int cryptlen = datalen + elen;
1100
1101        while (cryptlen && sg && n_sg--) {
1102                unsigned int len = sg_dma_len(sg);
1103
1104                if (offset >= len) {
1105                        offset -= len;
1106                        goto next;
1107                }
1108
1109                len -= offset;
1110
1111                if (len > cryptlen)
1112                        len = cryptlen;
1113
1114                if (datalen > 0 && len > datalen) {
1115                        to_talitos_ptr(link_tbl_ptr + count,
1116                                       sg_dma_address(sg) + offset, datalen, 0);
1117                        to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1118                        count++;
1119                        len -= datalen;
1120                        offset += datalen;
1121                }
1122                to_talitos_ptr(link_tbl_ptr + count,
1123                               sg_dma_address(sg) + offset, len, 0);
1124                to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1125                count++;
1126                cryptlen -= len;
1127                datalen -= len;
1128                offset = 0;
1129
1130next:
1131                sg = sg_next(sg);
1132        }
1133
1134        /* tag end of link table */
1135        if (count > 0)
1136                to_talitos_ptr_ext_set(link_tbl_ptr + count - 1,
1137                                       DESC_PTR_LNKTBL_RET, 0);
1138
1139        return count;
1140}
1141
1142static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src,
1143                              unsigned int len, struct talitos_edesc *edesc,
1144                              struct talitos_ptr *ptr, int sg_count,
1145                              unsigned int offset, int tbl_off, int elen,
1146                              bool force)
1147{
1148        struct talitos_private *priv = dev_get_drvdata(dev);
1149        bool is_sec1 = has_ftr_sec1(priv);
1150
1151        if (!src) {
1152                to_talitos_ptr(ptr, 0, 0, is_sec1);
1153                return 1;
1154        }
1155        to_talitos_ptr_ext_set(ptr, elen, is_sec1);
1156        if (sg_count == 1 && !force) {
1157                to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1);
1158                return sg_count;
1159        }
1160        if (is_sec1) {
1161                to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1);
1162                return sg_count;
1163        }
1164        sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, elen,
1165                                         &edesc->link_tbl[tbl_off]);
1166        if (sg_count == 1 && !force) {
1167                /* Only one segment now, so no link tbl needed*/
1168                copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1);
1169                return sg_count;
1170        }
1171        to_talitos_ptr(ptr, edesc->dma_link_tbl +
1172                            tbl_off * sizeof(struct talitos_ptr), len, is_sec1);
1173        to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1);
1174
1175        return sg_count;
1176}
1177
1178static int talitos_sg_map(struct device *dev, struct scatterlist *src,
1179                          unsigned int len, struct talitos_edesc *edesc,
1180                          struct talitos_ptr *ptr, int sg_count,
1181                          unsigned int offset, int tbl_off)
1182{
1183        return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset,
1184                                  tbl_off, 0, false);
1185}
1186
1187/*
1188 * fill in and submit ipsec_esp descriptor
1189 */
1190static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1191                     bool encrypt,
1192                     void (*callback)(struct device *dev,
1193                                      struct talitos_desc *desc,
1194                                      void *context, int error))
1195{
1196        struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1197        unsigned int authsize = crypto_aead_authsize(aead);
1198        struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1199        struct device *dev = ctx->dev;
1200        struct talitos_desc *desc = &edesc->desc;
1201        unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1202        unsigned int ivsize = crypto_aead_ivsize(aead);
1203        int tbl_off = 0;
1204        int sg_count, ret;
1205        int elen = 0;
1206        bool sync_needed = false;
1207        struct talitos_private *priv = dev_get_drvdata(dev);
1208        bool is_sec1 = has_ftr_sec1(priv);
1209        bool is_ipsec_esp = desc->hdr & DESC_HDR_TYPE_IPSEC_ESP;
1210        struct talitos_ptr *civ_ptr = &desc->ptr[is_ipsec_esp ? 2 : 3];
1211        struct talitos_ptr *ckey_ptr = &desc->ptr[is_ipsec_esp ? 3 : 2];
1212        dma_addr_t dma_icv = edesc->dma_link_tbl + edesc->dma_len - authsize;
1213
1214        /* hmac key */
1215        to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1);
1216
1217        sg_count = edesc->src_nents ?: 1;
1218        if (is_sec1 && sg_count > 1)
1219                sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1220                                  areq->assoclen + cryptlen);
1221        else
1222                sg_count = dma_map_sg(dev, areq->src, sg_count,
1223                                      (areq->src == areq->dst) ?
1224                                      DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1225
1226        /* hmac data */
1227        ret = talitos_sg_map(dev, areq->src, areq->assoclen, edesc,
1228                             &desc->ptr[1], sg_count, 0, tbl_off);
1229
1230        if (ret > 1) {
1231                tbl_off += ret;
1232                sync_needed = true;
1233        }
1234
1235        /* cipher iv */
1236        to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1);
1237
1238        /* cipher key */
1239        to_talitos_ptr(ckey_ptr, ctx->dma_key  + ctx->authkeylen,
1240                       ctx->enckeylen, is_sec1);
1241
1242        /*
1243         * cipher in
1244         * map and adjust cipher len to aead request cryptlen.
1245         * extent is bytes of HMAC postpended to ciphertext,
1246         * typically 12 for ipsec
1247         */
1248        if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV))
1249                elen = authsize;
1250
1251        ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4],
1252                                 sg_count, areq->assoclen, tbl_off, elen,
1253                                 false);
1254
1255        if (ret > 1) {
1256                tbl_off += ret;
1257                sync_needed = true;
1258        }
1259
1260        /* cipher out */
1261        if (areq->src != areq->dst) {
1262                sg_count = edesc->dst_nents ? : 1;
1263                if (!is_sec1 || sg_count == 1)
1264                        dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1265        }
1266
1267        if (is_ipsec_esp && encrypt)
1268                elen = authsize;
1269        else
1270                elen = 0;
1271        ret = talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5],
1272                                 sg_count, areq->assoclen, tbl_off, elen,
1273                                 is_ipsec_esp && !encrypt);
1274        tbl_off += ret;
1275
1276        if (!encrypt && is_ipsec_esp) {
1277                struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
1278
1279                /* Add an entry to the link table for ICV data */
1280                to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1);
1281                to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1);
1282
1283                /* icv data follows link tables */
1284                to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1);
1285                to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1);
1286                sync_needed = true;
1287        } else if (!encrypt) {
1288                to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1);
1289                sync_needed = true;
1290        } else if (!is_ipsec_esp) {
1291                talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6],
1292                               sg_count, areq->assoclen + cryptlen, tbl_off);
1293        }
1294
1295        /* iv out */
1296        if (is_ipsec_esp)
1297                map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
1298                                       DMA_FROM_DEVICE);
1299
1300        if (sync_needed)
1301                dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1302                                           edesc->dma_len,
1303                                           DMA_BIDIRECTIONAL);
1304
1305        ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1306        if (ret != -EINPROGRESS) {
1307                ipsec_esp_unmap(dev, edesc, areq, encrypt);
1308                kfree(edesc);
1309        }
1310        return ret;
1311}
1312
1313/*
1314 * allocate and map the extended descriptor
1315 */
1316static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
1317                                                 struct scatterlist *src,
1318                                                 struct scatterlist *dst,
1319                                                 u8 *iv,
1320                                                 unsigned int assoclen,
1321                                                 unsigned int cryptlen,
1322                                                 unsigned int authsize,
1323                                                 unsigned int ivsize,
1324                                                 int icv_stashing,
1325                                                 u32 cryptoflags,
1326                                                 bool encrypt)
1327{
1328        struct talitos_edesc *edesc;
1329        int src_nents, dst_nents, alloc_len, dma_len, src_len, dst_len;
1330        dma_addr_t iv_dma = 0;
1331        gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
1332                      GFP_ATOMIC;
1333        struct talitos_private *priv = dev_get_drvdata(dev);
1334        bool is_sec1 = has_ftr_sec1(priv);
1335        int max_len = is_sec1 ? TALITOS1_MAX_DATA_LEN : TALITOS2_MAX_DATA_LEN;
1336
1337        if (cryptlen + authsize > max_len) {
1338                dev_err(dev, "length exceeds h/w max limit\n");
1339                return ERR_PTR(-EINVAL);
1340        }
1341
1342        if (!dst || dst == src) {
1343                src_len = assoclen + cryptlen + authsize;
1344                src_nents = sg_nents_for_len(src, src_len);
1345                if (src_nents < 0) {
1346                        dev_err(dev, "Invalid number of src SG.\n");
1347                        return ERR_PTR(-EINVAL);
1348                }
1349                src_nents = (src_nents == 1) ? 0 : src_nents;
1350                dst_nents = dst ? src_nents : 0;
1351                dst_len = 0;
1352        } else { /* dst && dst != src*/
1353                src_len = assoclen + cryptlen + (encrypt ? 0 : authsize);
1354                src_nents = sg_nents_for_len(src, src_len);
1355                if (src_nents < 0) {
1356                        dev_err(dev, "Invalid number of src SG.\n");
1357                        return ERR_PTR(-EINVAL);
1358                }
1359                src_nents = (src_nents == 1) ? 0 : src_nents;
1360                dst_len = assoclen + cryptlen + (encrypt ? authsize : 0);
1361                dst_nents = sg_nents_for_len(dst, dst_len);
1362                if (dst_nents < 0) {
1363                        dev_err(dev, "Invalid number of dst SG.\n");
1364                        return ERR_PTR(-EINVAL);
1365                }
1366                dst_nents = (dst_nents == 1) ? 0 : dst_nents;
1367        }
1368
1369        /*
1370         * allocate space for base edesc plus the link tables,
1371         * allowing for two separate entries for AD and generated ICV (+ 2),
1372         * and space for two sets of ICVs (stashed and generated)
1373         */
1374        alloc_len = sizeof(struct talitos_edesc);
1375        if (src_nents || dst_nents || !encrypt) {
1376                if (is_sec1)
1377                        dma_len = (src_nents ? src_len : 0) +
1378                                  (dst_nents ? dst_len : 0) + authsize;
1379                else
1380                        dma_len = (src_nents + dst_nents + 2) *
1381                                  sizeof(struct talitos_ptr) + authsize;
1382                alloc_len += dma_len;
1383        } else {
1384                dma_len = 0;
1385        }
1386        alloc_len += icv_stashing ? authsize : 0;
1387
1388        /* if its a ahash, add space for a second desc next to the first one */
1389        if (is_sec1 && !dst)
1390                alloc_len += sizeof(struct talitos_desc);
1391        alloc_len += ivsize;
1392
1393        edesc = kmalloc(alloc_len, GFP_DMA | flags);
1394        if (!edesc)
1395                return ERR_PTR(-ENOMEM);
1396        if (ivsize) {
1397                iv = memcpy(((u8 *)edesc) + alloc_len - ivsize, iv, ivsize);
1398                iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
1399        }
1400        memset(&edesc->desc, 0, sizeof(edesc->desc));
1401
1402        edesc->src_nents = src_nents;
1403        edesc->dst_nents = dst_nents;
1404        edesc->iv_dma = iv_dma;
1405        edesc->dma_len = dma_len;
1406        if (dma_len)
1407                edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0],
1408                                                     edesc->dma_len,
1409                                                     DMA_BIDIRECTIONAL);
1410
1411        return edesc;
1412}
1413
1414static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
1415                                              int icv_stashing, bool encrypt)
1416{
1417        struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1418        unsigned int authsize = crypto_aead_authsize(authenc);
1419        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1420        unsigned int ivsize = crypto_aead_ivsize(authenc);
1421        unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1422
1423        return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1424                                   iv, areq->assoclen, cryptlen,
1425                                   authsize, ivsize, icv_stashing,
1426                                   areq->base.flags, encrypt);
1427}
1428
1429static int aead_encrypt(struct aead_request *req)
1430{
1431        struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1432        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1433        struct talitos_edesc *edesc;
1434
1435        /* allocate extended descriptor */
1436        edesc = aead_edesc_alloc(req, req->iv, 0, true);
1437        if (IS_ERR(edesc))
1438                return PTR_ERR(edesc);
1439
1440        /* set encrypt */
1441        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1442
1443        return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done);
1444}
1445
1446static int aead_decrypt(struct aead_request *req)
1447{
1448        struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1449        unsigned int authsize = crypto_aead_authsize(authenc);
1450        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1451        struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1452        struct talitos_edesc *edesc;
1453        void *icvdata;
1454
1455        /* allocate extended descriptor */
1456        edesc = aead_edesc_alloc(req, req->iv, 1, false);
1457        if (IS_ERR(edesc))
1458                return PTR_ERR(edesc);
1459
1460        if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) &&
1461            (priv->features & TALITOS_FTR_HW_AUTH_CHECK) &&
1462            ((!edesc->src_nents && !edesc->dst_nents) ||
1463             priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) {
1464
1465                /* decrypt and check the ICV */
1466                edesc->desc.hdr = ctx->desc_hdr_template |
1467                                  DESC_HDR_DIR_INBOUND |
1468                                  DESC_HDR_MODE1_MDEU_CICV;
1469
1470                /* reset integrity check result bits */
1471
1472                return ipsec_esp(edesc, req, false,
1473                                 ipsec_esp_decrypt_hwauth_done);
1474        }
1475
1476        /* Have to check the ICV with software */
1477        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1478
1479        /* stash incoming ICV for later cmp with ICV generated by the h/w */
1480        icvdata = edesc->buf + edesc->dma_len;
1481
1482        sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize,
1483                           req->assoclen + req->cryptlen - authsize);
1484
1485        return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done);
1486}
1487
1488static int skcipher_setkey(struct crypto_skcipher *cipher,
1489                             const u8 *key, unsigned int keylen)
1490{
1491        struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1492        struct device *dev = ctx->dev;
1493
1494        if (ctx->keylen)
1495                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
1496
1497        memcpy(&ctx->key, key, keylen);
1498        ctx->keylen = keylen;
1499
1500        ctx->dma_key = dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE);
1501
1502        return 0;
1503}
1504
1505static int skcipher_des_setkey(struct crypto_skcipher *cipher,
1506                                 const u8 *key, unsigned int keylen)
1507{
1508        return verify_skcipher_des_key(cipher, key) ?:
1509               skcipher_setkey(cipher, key, keylen);
1510}
1511
1512static int skcipher_des3_setkey(struct crypto_skcipher *cipher,
1513                                  const u8 *key, unsigned int keylen)
1514{
1515        return verify_skcipher_des3_key(cipher, key) ?:
1516               skcipher_setkey(cipher, key, keylen);
1517}
1518
1519static int skcipher_aes_setkey(struct crypto_skcipher *cipher,
1520                                  const u8 *key, unsigned int keylen)
1521{
1522        if (keylen == AES_KEYSIZE_128 || keylen == AES_KEYSIZE_192 ||
1523            keylen == AES_KEYSIZE_256)
1524                return skcipher_setkey(cipher, key, keylen);
1525
1526        return -EINVAL;
1527}
1528
1529static void common_nonsnoop_unmap(struct device *dev,
1530                                  struct talitos_edesc *edesc,
1531                                  struct skcipher_request *areq)
1532{
1533        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1534
1535        talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->cryptlen, 0);
1536        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE);
1537
1538        if (edesc->dma_len)
1539                dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1540                                 DMA_BIDIRECTIONAL);
1541}
1542
1543static void skcipher_done(struct device *dev,
1544                            struct talitos_desc *desc, void *context,
1545                            int err)
1546{
1547        struct skcipher_request *areq = context;
1548        struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1549        struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1550        unsigned int ivsize = crypto_skcipher_ivsize(cipher);
1551        struct talitos_edesc *edesc;
1552
1553        edesc = container_of(desc, struct talitos_edesc, desc);
1554
1555        common_nonsnoop_unmap(dev, edesc, areq);
1556        memcpy(areq->iv, ctx->iv, ivsize);
1557
1558        kfree(edesc);
1559
1560        areq->base.complete(&areq->base, err);
1561}
1562
1563static int common_nonsnoop(struct talitos_edesc *edesc,
1564                           struct skcipher_request *areq,
1565                           void (*callback) (struct device *dev,
1566                                             struct talitos_desc *desc,
1567                                             void *context, int error))
1568{
1569        struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1570        struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1571        struct device *dev = ctx->dev;
1572        struct talitos_desc *desc = &edesc->desc;
1573        unsigned int cryptlen = areq->cryptlen;
1574        unsigned int ivsize = crypto_skcipher_ivsize(cipher);
1575        int sg_count, ret;
1576        bool sync_needed = false;
1577        struct talitos_private *priv = dev_get_drvdata(dev);
1578        bool is_sec1 = has_ftr_sec1(priv);
1579
1580        /* first DWORD empty */
1581
1582        /* cipher iv */
1583        to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1);
1584
1585        /* cipher key */
1586        to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1);
1587
1588        sg_count = edesc->src_nents ?: 1;
1589        if (is_sec1 && sg_count > 1)
1590                sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1591                                  cryptlen);
1592        else
1593                sg_count = dma_map_sg(dev, areq->src, sg_count,
1594                                      (areq->src == areq->dst) ?
1595                                      DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1596        /*
1597         * cipher in
1598         */
1599        sg_count = talitos_sg_map(dev, areq->src, cryptlen, edesc,
1600                                  &desc->ptr[3], sg_count, 0, 0);
1601        if (sg_count > 1)
1602                sync_needed = true;
1603
1604        /* cipher out */
1605        if (areq->src != areq->dst) {
1606                sg_count = edesc->dst_nents ? : 1;
1607                if (!is_sec1 || sg_count == 1)
1608                        dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1609        }
1610
1611        ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4],
1612                             sg_count, 0, (edesc->src_nents + 1));
1613        if (ret > 1)
1614                sync_needed = true;
1615
1616        /* iv out */
1617        map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv,
1618                               DMA_FROM_DEVICE);
1619
1620        /* last DWORD empty */
1621
1622        if (sync_needed)
1623                dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1624                                           edesc->dma_len, DMA_BIDIRECTIONAL);
1625
1626        ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1627        if (ret != -EINPROGRESS) {
1628                common_nonsnoop_unmap(dev, edesc, areq);
1629                kfree(edesc);
1630        }
1631        return ret;
1632}
1633
1634static struct talitos_edesc *skcipher_edesc_alloc(struct skcipher_request *
1635                                                    areq, bool encrypt)
1636{
1637        struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1638        struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1639        unsigned int ivsize = crypto_skcipher_ivsize(cipher);
1640
1641        return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1642                                   areq->iv, 0, areq->cryptlen, 0, ivsize, 0,
1643                                   areq->base.flags, encrypt);
1644}
1645
1646static int skcipher_encrypt(struct skcipher_request *areq)
1647{
1648        struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1649        struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1650        struct talitos_edesc *edesc;
1651        unsigned int blocksize =
1652                        crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher));
1653
1654        if (!areq->cryptlen)
1655                return 0;
1656
1657        if (areq->cryptlen % blocksize)
1658                return -EINVAL;
1659
1660        /* allocate extended descriptor */
1661        edesc = skcipher_edesc_alloc(areq, true);
1662        if (IS_ERR(edesc))
1663                return PTR_ERR(edesc);
1664
1665        /* set encrypt */
1666        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1667
1668        return common_nonsnoop(edesc, areq, skcipher_done);
1669}
1670
1671static int skcipher_decrypt(struct skcipher_request *areq)
1672{
1673        struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1674        struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1675        struct talitos_edesc *edesc;
1676        unsigned int blocksize =
1677                        crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher));
1678
1679        if (!areq->cryptlen)
1680                return 0;
1681
1682        if (areq->cryptlen % blocksize)
1683                return -EINVAL;
1684
1685        /* allocate extended descriptor */
1686        edesc = skcipher_edesc_alloc(areq, false);
1687        if (IS_ERR(edesc))
1688                return PTR_ERR(edesc);
1689
1690        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1691
1692        return common_nonsnoop(edesc, areq, skcipher_done);
1693}
1694
1695static void common_nonsnoop_hash_unmap(struct device *dev,
1696                                       struct talitos_edesc *edesc,
1697                                       struct ahash_request *areq)
1698{
1699        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1700        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1701        struct talitos_private *priv = dev_get_drvdata(dev);
1702        bool is_sec1 = has_ftr_sec1(priv);
1703        struct talitos_desc *desc = &edesc->desc;
1704        struct talitos_desc *desc2 = (struct talitos_desc *)
1705                                     (edesc->buf + edesc->dma_len);
1706
1707        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1708        if (desc->next_desc &&
1709            desc->ptr[5].ptr != desc2->ptr[5].ptr)
1710                unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE);
1711        if (req_ctx->last)
1712                memcpy(areq->result, req_ctx->hw_context,
1713                       crypto_ahash_digestsize(tfm));
1714
1715        if (req_ctx->psrc)
1716                talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0);
1717
1718        /* When using hashctx-in, must unmap it. */
1719        if (from_talitos_ptr_len(&edesc->desc.ptr[1], is_sec1))
1720                unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1],
1721                                         DMA_TO_DEVICE);
1722        else if (desc->next_desc)
1723                unmap_single_talitos_ptr(dev, &desc2->ptr[1],
1724                                         DMA_TO_DEVICE);
1725
1726        if (is_sec1 && req_ctx->nbuf)
1727                unmap_single_talitos_ptr(dev, &desc->ptr[3],
1728                                         DMA_TO_DEVICE);
1729
1730        if (edesc->dma_len)
1731                dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1732                                 DMA_BIDIRECTIONAL);
1733
1734        if (edesc->desc.next_desc)
1735                dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc),
1736                                 TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
1737}
1738
1739static void ahash_done(struct device *dev,
1740                       struct talitos_desc *desc, void *context,
1741                       int err)
1742{
1743        struct ahash_request *areq = context;
1744        struct talitos_edesc *edesc =
1745                 container_of(desc, struct talitos_edesc, desc);
1746        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1747
1748        if (!req_ctx->last && req_ctx->to_hash_later) {
1749                /* Position any partial block for next update/final/finup */
1750                req_ctx->buf_idx = (req_ctx->buf_idx + 1) & 1;
1751                req_ctx->nbuf = req_ctx->to_hash_later;
1752        }
1753        common_nonsnoop_hash_unmap(dev, edesc, areq);
1754
1755        kfree(edesc);
1756
1757        areq->base.complete(&areq->base, err);
1758}
1759
1760/*
1761 * SEC1 doesn't like hashing of 0 sized message, so we do the padding
1762 * ourself and submit a padded block
1763 */
1764static void talitos_handle_buggy_hash(struct talitos_ctx *ctx,
1765                               struct talitos_edesc *edesc,
1766                               struct talitos_ptr *ptr)
1767{
1768        static u8 padded_hash[64] = {
1769                0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1770                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1771                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1772                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1773        };
1774
1775        pr_err_once("Bug in SEC1, padding ourself\n");
1776        edesc->desc.hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1777        map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash),
1778                               (char *)padded_hash, DMA_TO_DEVICE);
1779}
1780
1781static int common_nonsnoop_hash(struct talitos_edesc *edesc,
1782                                struct ahash_request *areq, unsigned int length,
1783                                void (*callback) (struct device *dev,
1784                                                  struct talitos_desc *desc,
1785                                                  void *context, int error))
1786{
1787        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1788        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1789        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1790        struct device *dev = ctx->dev;
1791        struct talitos_desc *desc = &edesc->desc;
1792        int ret;
1793        bool sync_needed = false;
1794        struct talitos_private *priv = dev_get_drvdata(dev);
1795        bool is_sec1 = has_ftr_sec1(priv);
1796        int sg_count;
1797
1798        /* first DWORD empty */
1799
1800        /* hash context in */
1801        if (!req_ctx->first || req_ctx->swinit) {
1802                map_single_talitos_ptr_nosync(dev, &desc->ptr[1],
1803                                              req_ctx->hw_context_size,
1804                                              req_ctx->hw_context,
1805                                              DMA_TO_DEVICE);
1806                req_ctx->swinit = 0;
1807        }
1808        /* Indicate next op is not the first. */
1809        req_ctx->first = 0;
1810
1811        /* HMAC key */
1812        if (ctx->keylen)
1813                to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen,
1814                               is_sec1);
1815
1816        if (is_sec1 && req_ctx->nbuf)
1817                length -= req_ctx->nbuf;
1818
1819        sg_count = edesc->src_nents ?: 1;
1820        if (is_sec1 && sg_count > 1)
1821                sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length);
1822        else if (length)
1823                sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count,
1824                                      DMA_TO_DEVICE);
1825        /*
1826         * data in
1827         */
1828        if (is_sec1 && req_ctx->nbuf) {
1829                map_single_talitos_ptr(dev, &desc->ptr[3], req_ctx->nbuf,
1830                                       req_ctx->buf[req_ctx->buf_idx],
1831                                       DMA_TO_DEVICE);
1832        } else {
1833                sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1834                                          &desc->ptr[3], sg_count, 0, 0);
1835                if (sg_count > 1)
1836                        sync_needed = true;
1837        }
1838
1839        /* fifth DWORD empty */
1840
1841        /* hash/HMAC out -or- hash context out */
1842        if (req_ctx->last)
1843                map_single_talitos_ptr(dev, &desc->ptr[5],
1844                                       crypto_ahash_digestsize(tfm),
1845                                       req_ctx->hw_context, DMA_FROM_DEVICE);
1846        else
1847                map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1848                                              req_ctx->hw_context_size,
1849                                              req_ctx->hw_context,
1850                                              DMA_FROM_DEVICE);
1851
1852        /* last DWORD empty */
1853
1854        if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) == 0)
1855                talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]);
1856
1857        if (is_sec1 && req_ctx->nbuf && length) {
1858                struct talitos_desc *desc2 = (struct talitos_desc *)
1859                                             (edesc->buf + edesc->dma_len);
1860                dma_addr_t next_desc;
1861
1862                memset(desc2, 0, sizeof(*desc2));
1863                desc2->hdr = desc->hdr;
1864                desc2->hdr &= ~DESC_HDR_MODE0_MDEU_INIT;
1865                desc2->hdr1 = desc2->hdr;
1866                desc->hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1867                desc->hdr |= DESC_HDR_MODE0_MDEU_CONT;
1868                desc->hdr &= ~DESC_HDR_DONE_NOTIFY;
1869
1870                if (desc->ptr[1].ptr)
1871                        copy_talitos_ptr(&desc2->ptr[1], &desc->ptr[1],
1872                                         is_sec1);
1873                else
1874                        map_single_talitos_ptr_nosync(dev, &desc2->ptr[1],
1875                                                      req_ctx->hw_context_size,
1876                                                      req_ctx->hw_context,
1877                                                      DMA_TO_DEVICE);
1878                copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1);
1879                sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1880                                          &desc2->ptr[3], sg_count, 0, 0);
1881                if (sg_count > 1)
1882                        sync_needed = true;
1883                copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1);
1884                if (req_ctx->last)
1885                        map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1886                                                      req_ctx->hw_context_size,
1887                                                      req_ctx->hw_context,
1888                                                      DMA_FROM_DEVICE);
1889
1890                next_desc = dma_map_single(dev, &desc2->hdr1, TALITOS_DESC_SIZE,
1891                                           DMA_BIDIRECTIONAL);
1892                desc->next_desc = cpu_to_be32(next_desc);
1893        }
1894
1895        if (sync_needed)
1896                dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1897                                           edesc->dma_len, DMA_BIDIRECTIONAL);
1898
1899        ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1900        if (ret != -EINPROGRESS) {
1901                common_nonsnoop_hash_unmap(dev, edesc, areq);
1902                kfree(edesc);
1903        }
1904        return ret;
1905}
1906
1907static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
1908                                               unsigned int nbytes)
1909{
1910        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1911        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1912        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1913        struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1914        bool is_sec1 = has_ftr_sec1(priv);
1915
1916        if (is_sec1)
1917                nbytes -= req_ctx->nbuf;
1918
1919        return talitos_edesc_alloc(ctx->dev, req_ctx->psrc, NULL, NULL, 0,
1920                                   nbytes, 0, 0, 0, areq->base.flags, false);
1921}
1922
1923static int ahash_init(struct ahash_request *areq)
1924{
1925        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1926        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1927        struct device *dev = ctx->dev;
1928        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1929        unsigned int size;
1930        dma_addr_t dma;
1931
1932        /* Initialize the context */
1933        req_ctx->buf_idx = 0;
1934        req_ctx->nbuf = 0;
1935        req_ctx->first = 1; /* first indicates h/w must init its context */
1936        req_ctx->swinit = 0; /* assume h/w init of context */
1937        size =  (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
1938                        ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
1939                        : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
1940        req_ctx->hw_context_size = size;
1941
1942        dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
1943                             DMA_TO_DEVICE);
1944        dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
1945
1946        return 0;
1947}
1948
1949/*
1950 * on h/w without explicit sha224 support, we initialize h/w context
1951 * manually with sha224 constants, and tell it to run sha256.
1952 */
1953static int ahash_init_sha224_swinit(struct ahash_request *areq)
1954{
1955        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1956
1957        req_ctx->hw_context[0] = SHA224_H0;
1958        req_ctx->hw_context[1] = SHA224_H1;
1959        req_ctx->hw_context[2] = SHA224_H2;
1960        req_ctx->hw_context[3] = SHA224_H3;
1961        req_ctx->hw_context[4] = SHA224_H4;
1962        req_ctx->hw_context[5] = SHA224_H5;
1963        req_ctx->hw_context[6] = SHA224_H6;
1964        req_ctx->hw_context[7] = SHA224_H7;
1965
1966        /* init 64-bit count */
1967        req_ctx->hw_context[8] = 0;
1968        req_ctx->hw_context[9] = 0;
1969
1970        ahash_init(areq);
1971        req_ctx->swinit = 1;/* prevent h/w initting context with sha256 values*/
1972
1973        return 0;
1974}
1975
1976static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes)
1977{
1978        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1979        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1980        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1981        struct talitos_edesc *edesc;
1982        unsigned int blocksize =
1983                        crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
1984        unsigned int nbytes_to_hash;
1985        unsigned int to_hash_later;
1986        unsigned int nsg;
1987        int nents;
1988        struct device *dev = ctx->dev;
1989        struct talitos_private *priv = dev_get_drvdata(dev);
1990        bool is_sec1 = has_ftr_sec1(priv);
1991        u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx];
1992
1993        if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) {
1994                /* Buffer up to one whole block */
1995                nents = sg_nents_for_len(areq->src, nbytes);
1996                if (nents < 0) {
1997                        dev_err(ctx->dev, "Invalid number of src SG.\n");
1998                        return nents;
1999                }
2000                sg_copy_to_buffer(areq->src, nents,
2001                                  ctx_buf + req_ctx->nbuf, nbytes);
2002                req_ctx->nbuf += nbytes;
2003                return 0;
2004        }
2005
2006        /* At least (blocksize + 1) bytes are available to hash */
2007        nbytes_to_hash = nbytes + req_ctx->nbuf;
2008        to_hash_later = nbytes_to_hash & (blocksize - 1);
2009
2010        if (req_ctx->last)
2011                to_hash_later = 0;
2012        else if (to_hash_later)
2013                /* There is a partial block. Hash the full block(s) now */
2014                nbytes_to_hash -= to_hash_later;
2015        else {
2016                /* Keep one block buffered */
2017                nbytes_to_hash -= blocksize;
2018                to_hash_later = blocksize;
2019        }
2020
2021        /* Chain in any previously buffered data */
2022        if (!is_sec1 && req_ctx->nbuf) {
2023                nsg = (req_ctx->nbuf < nbytes_to_hash) ? 2 : 1;
2024                sg_init_table(req_ctx->bufsl, nsg);
2025                sg_set_buf(req_ctx->bufsl, ctx_buf, req_ctx->nbuf);
2026                if (nsg > 1)
2027                        sg_chain(req_ctx->bufsl, 2, areq->src);
2028                req_ctx->psrc = req_ctx->bufsl;
2029        } else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) {
2030                int offset;
2031
2032                if (nbytes_to_hash > blocksize)
2033                        offset = blocksize - req_ctx->nbuf;
2034                else
2035                        offset = nbytes_to_hash - req_ctx->nbuf;
2036                nents = sg_nents_for_len(areq->src, offset);
2037                if (nents < 0) {
2038                        dev_err(ctx->dev, "Invalid number of src SG.\n");
2039                        return nents;
2040                }
2041                sg_copy_to_buffer(areq->src, nents,
2042                                  ctx_buf + req_ctx->nbuf, offset);
2043                req_ctx->nbuf += offset;
2044                req_ctx->psrc = scatterwalk_ffwd(req_ctx->bufsl, areq->src,
2045                                                 offset);
2046        } else
2047                req_ctx->psrc = areq->src;
2048
2049        if (to_hash_later) {
2050                nents = sg_nents_for_len(areq->src, nbytes);
2051                if (nents < 0) {
2052                        dev_err(ctx->dev, "Invalid number of src SG.\n");
2053                        return nents;
2054                }
2055                sg_pcopy_to_buffer(areq->src, nents,
2056                                   req_ctx->buf[(req_ctx->buf_idx + 1) & 1],
2057                                      to_hash_later,
2058                                      nbytes - to_hash_later);
2059        }
2060        req_ctx->to_hash_later = to_hash_later;
2061
2062        /* Allocate extended descriptor */
2063        edesc = ahash_edesc_alloc(areq, nbytes_to_hash);
2064        if (IS_ERR(edesc))
2065                return PTR_ERR(edesc);
2066
2067        edesc->desc.hdr = ctx->desc_hdr_template;
2068
2069        /* On last one, request SEC to pad; otherwise continue */
2070        if (req_ctx->last)
2071                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_PAD;
2072        else
2073                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_CONT;
2074
2075        /* request SEC to INIT hash. */
2076        if (req_ctx->first && !req_ctx->swinit)
2077                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_INIT;
2078
2079        /* When the tfm context has a keylen, it's an HMAC.
2080         * A first or last (ie. not middle) descriptor must request HMAC.
2081         */
2082        if (ctx->keylen && (req_ctx->first || req_ctx->last))
2083                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC;
2084
2085        return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, ahash_done);
2086}
2087
2088static int ahash_update(struct ahash_request *areq)
2089{
2090        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2091
2092        req_ctx->last = 0;
2093
2094        return ahash_process_req(areq, areq->nbytes);
2095}
2096
2097static int ahash_final(struct ahash_request *areq)
2098{
2099        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2100
2101        req_ctx->last = 1;
2102
2103        return ahash_process_req(areq, 0);
2104}
2105
2106static int ahash_finup(struct ahash_request *areq)
2107{
2108        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2109
2110        req_ctx->last = 1;
2111
2112        return ahash_process_req(areq, areq->nbytes);
2113}
2114
2115static int ahash_digest(struct ahash_request *areq)
2116{
2117        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2118        struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
2119
2120        ahash->init(areq);
2121        req_ctx->last = 1;
2122
2123        return ahash_process_req(areq, areq->nbytes);
2124}
2125
2126static int ahash_export(struct ahash_request *areq, void *out)
2127{
2128        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2129        struct talitos_export_state *export = out;
2130        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2131        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2132        struct device *dev = ctx->dev;
2133        dma_addr_t dma;
2134
2135        dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2136                             DMA_FROM_DEVICE);
2137        dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_FROM_DEVICE);
2138
2139        memcpy(export->hw_context, req_ctx->hw_context,
2140               req_ctx->hw_context_size);
2141        memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf);
2142        export->swinit = req_ctx->swinit;
2143        export->first = req_ctx->first;
2144        export->last = req_ctx->last;
2145        export->to_hash_later = req_ctx->to_hash_later;
2146        export->nbuf = req_ctx->nbuf;
2147
2148        return 0;
2149}
2150
2151static int ahash_import(struct ahash_request *areq, const void *in)
2152{
2153        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2154        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2155        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2156        struct device *dev = ctx->dev;
2157        const struct talitos_export_state *export = in;
2158        unsigned int size;
2159        dma_addr_t dma;
2160
2161        memset(req_ctx, 0, sizeof(*req_ctx));
2162        size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
2163                        ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
2164                        : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
2165        req_ctx->hw_context_size = size;
2166        memcpy(req_ctx->hw_context, export->hw_context, size);
2167        memcpy(req_ctx->buf[0], export->buf, export->nbuf);
2168        req_ctx->swinit = export->swinit;
2169        req_ctx->first = export->first;
2170        req_ctx->last = export->last;
2171        req_ctx->to_hash_later = export->to_hash_later;
2172        req_ctx->nbuf = export->nbuf;
2173
2174        dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2175                             DMA_TO_DEVICE);
2176        dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
2177
2178        return 0;
2179}
2180
2181static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
2182                   u8 *hash)
2183{
2184        struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2185
2186        struct scatterlist sg[1];
2187        struct ahash_request *req;
2188        struct crypto_wait wait;
2189        int ret;
2190
2191        crypto_init_wait(&wait);
2192
2193        req = ahash_request_alloc(tfm, GFP_KERNEL);
2194        if (!req)
2195                return -ENOMEM;
2196
2197        /* Keep tfm keylen == 0 during hash of the long key */
2198        ctx->keylen = 0;
2199        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2200                                   crypto_req_done, &wait);
2201
2202        sg_init_one(&sg[0], key, keylen);
2203
2204        ahash_request_set_crypt(req, sg, hash, keylen);
2205        ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
2206
2207        ahash_request_free(req);
2208
2209        return ret;
2210}
2211
2212static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
2213                        unsigned int keylen)
2214{
2215        struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2216        struct device *dev = ctx->dev;
2217        unsigned int blocksize =
2218                        crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2219        unsigned int digestsize = crypto_ahash_digestsize(tfm);
2220        unsigned int keysize = keylen;
2221        u8 hash[SHA512_DIGEST_SIZE];
2222        int ret;
2223
2224        if (keylen <= blocksize)
2225                memcpy(ctx->key, key, keysize);
2226        else {
2227                /* Must get the hash of the long key */
2228                ret = keyhash(tfm, key, keylen, hash);
2229
2230                if (ret)
2231                        return -EINVAL;
2232
2233                keysize = digestsize;
2234                memcpy(ctx->key, hash, digestsize);
2235        }
2236
2237        if (ctx->keylen)
2238                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
2239
2240        ctx->keylen = keysize;
2241        ctx->dma_key = dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE);
2242
2243        return 0;
2244}
2245
2246
2247struct talitos_alg_template {
2248        u32 type;
2249        u32 priority;
2250        union {
2251                struct skcipher_alg skcipher;
2252                struct ahash_alg hash;
2253                struct aead_alg aead;
2254        } alg;
2255        __be32 desc_hdr_template;
2256};
2257
2258static struct talitos_alg_template driver_algs[] = {
2259        /* AEAD algorithms.  These use a single-pass ipsec_esp descriptor */
2260        {       .type = CRYPTO_ALG_TYPE_AEAD,
2261                .alg.aead = {
2262                        .base = {
2263                                .cra_name = "authenc(hmac(sha1),cbc(aes))",
2264                                .cra_driver_name = "authenc-hmac-sha1-"
2265                                                   "cbc-aes-talitos",
2266                                .cra_blocksize = AES_BLOCK_SIZE,
2267                                .cra_flags = CRYPTO_ALG_ASYNC |
2268                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2269                        },
2270                        .ivsize = AES_BLOCK_SIZE,
2271                        .maxauthsize = SHA1_DIGEST_SIZE,
2272                },
2273                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2274                                     DESC_HDR_SEL0_AESU |
2275                                     DESC_HDR_MODE0_AESU_CBC |
2276                                     DESC_HDR_SEL1_MDEUA |
2277                                     DESC_HDR_MODE1_MDEU_INIT |
2278                                     DESC_HDR_MODE1_MDEU_PAD |
2279                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2280        },
2281        {       .type = CRYPTO_ALG_TYPE_AEAD,
2282                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2283                .alg.aead = {
2284                        .base = {
2285                                .cra_name = "authenc(hmac(sha1),cbc(aes))",
2286                                .cra_driver_name = "authenc-hmac-sha1-"
2287                                                   "cbc-aes-talitos-hsna",
2288                                .cra_blocksize = AES_BLOCK_SIZE,
2289                                .cra_flags = CRYPTO_ALG_ASYNC |
2290                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2291                        },
2292                        .ivsize = AES_BLOCK_SIZE,
2293                        .maxauthsize = SHA1_DIGEST_SIZE,
2294                },
2295                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2296                                     DESC_HDR_SEL0_AESU |
2297                                     DESC_HDR_MODE0_AESU_CBC |
2298                                     DESC_HDR_SEL1_MDEUA |
2299                                     DESC_HDR_MODE1_MDEU_INIT |
2300                                     DESC_HDR_MODE1_MDEU_PAD |
2301                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2302        },
2303        {       .type = CRYPTO_ALG_TYPE_AEAD,
2304                .alg.aead = {
2305                        .base = {
2306                                .cra_name = "authenc(hmac(sha1),"
2307                                            "cbc(des3_ede))",
2308                                .cra_driver_name = "authenc-hmac-sha1-"
2309                                                   "cbc-3des-talitos",
2310                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2311                                .cra_flags = CRYPTO_ALG_ASYNC |
2312                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2313                        },
2314                        .ivsize = DES3_EDE_BLOCK_SIZE,
2315                        .maxauthsize = SHA1_DIGEST_SIZE,
2316                        .setkey = aead_des3_setkey,
2317                },
2318                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2319                                     DESC_HDR_SEL0_DEU |
2320                                     DESC_HDR_MODE0_DEU_CBC |
2321                                     DESC_HDR_MODE0_DEU_3DES |
2322                                     DESC_HDR_SEL1_MDEUA |
2323                                     DESC_HDR_MODE1_MDEU_INIT |
2324                                     DESC_HDR_MODE1_MDEU_PAD |
2325                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2326        },
2327        {       .type = CRYPTO_ALG_TYPE_AEAD,
2328                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2329                .alg.aead = {
2330                        .base = {
2331                                .cra_name = "authenc(hmac(sha1),"
2332                                            "cbc(des3_ede))",
2333                                .cra_driver_name = "authenc-hmac-sha1-"
2334                                                   "cbc-3des-talitos-hsna",
2335                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2336                                .cra_flags = CRYPTO_ALG_ASYNC |
2337                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2338                        },
2339                        .ivsize = DES3_EDE_BLOCK_SIZE,
2340                        .maxauthsize = SHA1_DIGEST_SIZE,
2341                        .setkey = aead_des3_setkey,
2342                },
2343                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2344                                     DESC_HDR_SEL0_DEU |
2345                                     DESC_HDR_MODE0_DEU_CBC |
2346                                     DESC_HDR_MODE0_DEU_3DES |
2347                                     DESC_HDR_SEL1_MDEUA |
2348                                     DESC_HDR_MODE1_MDEU_INIT |
2349                                     DESC_HDR_MODE1_MDEU_PAD |
2350                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2351        },
2352        {       .type = CRYPTO_ALG_TYPE_AEAD,
2353                .alg.aead = {
2354                        .base = {
2355                                .cra_name = "authenc(hmac(sha224),cbc(aes))",
2356                                .cra_driver_name = "authenc-hmac-sha224-"
2357                                                   "cbc-aes-talitos",
2358                                .cra_blocksize = AES_BLOCK_SIZE,
2359                                .cra_flags = CRYPTO_ALG_ASYNC |
2360                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2361                        },
2362                        .ivsize = AES_BLOCK_SIZE,
2363                        .maxauthsize = SHA224_DIGEST_SIZE,
2364                },
2365                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2366                                     DESC_HDR_SEL0_AESU |
2367                                     DESC_HDR_MODE0_AESU_CBC |
2368                                     DESC_HDR_SEL1_MDEUA |
2369                                     DESC_HDR_MODE1_MDEU_INIT |
2370                                     DESC_HDR_MODE1_MDEU_PAD |
2371                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2372        },
2373        {       .type = CRYPTO_ALG_TYPE_AEAD,
2374                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2375                .alg.aead = {
2376                        .base = {
2377                                .cra_name = "authenc(hmac(sha224),cbc(aes))",
2378                                .cra_driver_name = "authenc-hmac-sha224-"
2379                                                   "cbc-aes-talitos-hsna",
2380                                .cra_blocksize = AES_BLOCK_SIZE,
2381                                .cra_flags = CRYPTO_ALG_ASYNC |
2382                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2383                        },
2384                        .ivsize = AES_BLOCK_SIZE,
2385                        .maxauthsize = SHA224_DIGEST_SIZE,
2386                },
2387                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2388                                     DESC_HDR_SEL0_AESU |
2389                                     DESC_HDR_MODE0_AESU_CBC |
2390                                     DESC_HDR_SEL1_MDEUA |
2391                                     DESC_HDR_MODE1_MDEU_INIT |
2392                                     DESC_HDR_MODE1_MDEU_PAD |
2393                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2394        },
2395        {       .type = CRYPTO_ALG_TYPE_AEAD,
2396                .alg.aead = {
2397                        .base = {
2398                                .cra_name = "authenc(hmac(sha224),"
2399                                            "cbc(des3_ede))",
2400                                .cra_driver_name = "authenc-hmac-sha224-"
2401                                                   "cbc-3des-talitos",
2402                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2403                                .cra_flags = CRYPTO_ALG_ASYNC |
2404                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2405                        },
2406                        .ivsize = DES3_EDE_BLOCK_SIZE,
2407                        .maxauthsize = SHA224_DIGEST_SIZE,
2408                        .setkey = aead_des3_setkey,
2409                },
2410                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2411                                     DESC_HDR_SEL0_DEU |
2412                                     DESC_HDR_MODE0_DEU_CBC |
2413                                     DESC_HDR_MODE0_DEU_3DES |
2414                                     DESC_HDR_SEL1_MDEUA |
2415                                     DESC_HDR_MODE1_MDEU_INIT |
2416                                     DESC_HDR_MODE1_MDEU_PAD |
2417                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2418        },
2419        {       .type = CRYPTO_ALG_TYPE_AEAD,
2420                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2421                .alg.aead = {
2422                        .base = {
2423                                .cra_name = "authenc(hmac(sha224),"
2424                                            "cbc(des3_ede))",
2425                                .cra_driver_name = "authenc-hmac-sha224-"
2426                                                   "cbc-3des-talitos-hsna",
2427                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2428                                .cra_flags = CRYPTO_ALG_ASYNC |
2429                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2430                        },
2431                        .ivsize = DES3_EDE_BLOCK_SIZE,
2432                        .maxauthsize = SHA224_DIGEST_SIZE,
2433                        .setkey = aead_des3_setkey,
2434                },
2435                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2436                                     DESC_HDR_SEL0_DEU |
2437                                     DESC_HDR_MODE0_DEU_CBC |
2438                                     DESC_HDR_MODE0_DEU_3DES |
2439                                     DESC_HDR_SEL1_MDEUA |
2440                                     DESC_HDR_MODE1_MDEU_INIT |
2441                                     DESC_HDR_MODE1_MDEU_PAD |
2442                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2443        },
2444        {       .type = CRYPTO_ALG_TYPE_AEAD,
2445                .alg.aead = {
2446                        .base = {
2447                                .cra_name = "authenc(hmac(sha256),cbc(aes))",
2448                                .cra_driver_name = "authenc-hmac-sha256-"
2449                                                   "cbc-aes-talitos",
2450                                .cra_blocksize = AES_BLOCK_SIZE,
2451                                .cra_flags = CRYPTO_ALG_ASYNC |
2452                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2453                        },
2454                        .ivsize = AES_BLOCK_SIZE,
2455                        .maxauthsize = SHA256_DIGEST_SIZE,
2456                },
2457                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2458                                     DESC_HDR_SEL0_AESU |
2459                                     DESC_HDR_MODE0_AESU_CBC |
2460                                     DESC_HDR_SEL1_MDEUA |
2461                                     DESC_HDR_MODE1_MDEU_INIT |
2462                                     DESC_HDR_MODE1_MDEU_PAD |
2463                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2464        },
2465        {       .type = CRYPTO_ALG_TYPE_AEAD,
2466                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2467                .alg.aead = {
2468                        .base = {
2469                                .cra_name = "authenc(hmac(sha256),cbc(aes))",
2470                                .cra_driver_name = "authenc-hmac-sha256-"
2471                                                   "cbc-aes-talitos-hsna",
2472                                .cra_blocksize = AES_BLOCK_SIZE,
2473                                .cra_flags = CRYPTO_ALG_ASYNC |
2474                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2475                        },
2476                        .ivsize = AES_BLOCK_SIZE,
2477                        .maxauthsize = SHA256_DIGEST_SIZE,
2478                },
2479                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2480                                     DESC_HDR_SEL0_AESU |
2481                                     DESC_HDR_MODE0_AESU_CBC |
2482                                     DESC_HDR_SEL1_MDEUA |
2483                                     DESC_HDR_MODE1_MDEU_INIT |
2484                                     DESC_HDR_MODE1_MDEU_PAD |
2485                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2486        },
2487        {       .type = CRYPTO_ALG_TYPE_AEAD,
2488                .alg.aead = {
2489                        .base = {
2490                                .cra_name = "authenc(hmac(sha256),"
2491                                            "cbc(des3_ede))",
2492                                .cra_driver_name = "authenc-hmac-sha256-"
2493                                                   "cbc-3des-talitos",
2494                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2495                                .cra_flags = CRYPTO_ALG_ASYNC |
2496                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2497                        },
2498                        .ivsize = DES3_EDE_BLOCK_SIZE,
2499                        .maxauthsize = SHA256_DIGEST_SIZE,
2500                        .setkey = aead_des3_setkey,
2501                },
2502                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2503                                     DESC_HDR_SEL0_DEU |
2504                                     DESC_HDR_MODE0_DEU_CBC |
2505                                     DESC_HDR_MODE0_DEU_3DES |
2506                                     DESC_HDR_SEL1_MDEUA |
2507                                     DESC_HDR_MODE1_MDEU_INIT |
2508                                     DESC_HDR_MODE1_MDEU_PAD |
2509                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2510        },
2511        {       .type = CRYPTO_ALG_TYPE_AEAD,
2512                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2513                .alg.aead = {
2514                        .base = {
2515                                .cra_name = "authenc(hmac(sha256),"
2516                                            "cbc(des3_ede))",
2517                                .cra_driver_name = "authenc-hmac-sha256-"
2518                                                   "cbc-3des-talitos-hsna",
2519                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2520                                .cra_flags = CRYPTO_ALG_ASYNC |
2521                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2522                        },
2523                        .ivsize = DES3_EDE_BLOCK_SIZE,
2524                        .maxauthsize = SHA256_DIGEST_SIZE,
2525                        .setkey = aead_des3_setkey,
2526                },
2527                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2528                                     DESC_HDR_SEL0_DEU |
2529                                     DESC_HDR_MODE0_DEU_CBC |
2530                                     DESC_HDR_MODE0_DEU_3DES |
2531                                     DESC_HDR_SEL1_MDEUA |
2532                                     DESC_HDR_MODE1_MDEU_INIT |
2533                                     DESC_HDR_MODE1_MDEU_PAD |
2534                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2535        },
2536        {       .type = CRYPTO_ALG_TYPE_AEAD,
2537                .alg.aead = {
2538                        .base = {
2539                                .cra_name = "authenc(hmac(sha384),cbc(aes))",
2540                                .cra_driver_name = "authenc-hmac-sha384-"
2541                                                   "cbc-aes-talitos",
2542                                .cra_blocksize = AES_BLOCK_SIZE,
2543                                .cra_flags = CRYPTO_ALG_ASYNC |
2544                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2545                        },
2546                        .ivsize = AES_BLOCK_SIZE,
2547                        .maxauthsize = SHA384_DIGEST_SIZE,
2548                },
2549                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2550                                     DESC_HDR_SEL0_AESU |
2551                                     DESC_HDR_MODE0_AESU_CBC |
2552                                     DESC_HDR_SEL1_MDEUB |
2553                                     DESC_HDR_MODE1_MDEU_INIT |
2554                                     DESC_HDR_MODE1_MDEU_PAD |
2555                                     DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2556        },
2557        {       .type = CRYPTO_ALG_TYPE_AEAD,
2558                .alg.aead = {
2559                        .base = {
2560                                .cra_name = "authenc(hmac(sha384),"
2561                                            "cbc(des3_ede))",
2562                                .cra_driver_name = "authenc-hmac-sha384-"
2563                                                   "cbc-3des-talitos",
2564                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2565                                .cra_flags = CRYPTO_ALG_ASYNC |
2566                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2567                        },
2568                        .ivsize = DES3_EDE_BLOCK_SIZE,
2569                        .maxauthsize = SHA384_DIGEST_SIZE,
2570                        .setkey = aead_des3_setkey,
2571                },
2572                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2573                                     DESC_HDR_SEL0_DEU |
2574                                     DESC_HDR_MODE0_DEU_CBC |
2575                                     DESC_HDR_MODE0_DEU_3DES |
2576                                     DESC_HDR_SEL1_MDEUB |
2577                                     DESC_HDR_MODE1_MDEU_INIT |
2578                                     DESC_HDR_MODE1_MDEU_PAD |
2579                                     DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2580        },
2581        {       .type = CRYPTO_ALG_TYPE_AEAD,
2582                .alg.aead = {
2583                        .base = {
2584                                .cra_name = "authenc(hmac(sha512),cbc(aes))",
2585                                .cra_driver_name = "authenc-hmac-sha512-"
2586                                                   "cbc-aes-talitos",
2587                                .cra_blocksize = AES_BLOCK_SIZE,
2588                                .cra_flags = CRYPTO_ALG_ASYNC |
2589                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2590                        },
2591                        .ivsize = AES_BLOCK_SIZE,
2592                        .maxauthsize = SHA512_DIGEST_SIZE,
2593                },
2594                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2595                                     DESC_HDR_SEL0_AESU |
2596                                     DESC_HDR_MODE0_AESU_CBC |
2597                                     DESC_HDR_SEL1_MDEUB |
2598                                     DESC_HDR_MODE1_MDEU_INIT |
2599                                     DESC_HDR_MODE1_MDEU_PAD |
2600                                     DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2601        },
2602        {       .type = CRYPTO_ALG_TYPE_AEAD,
2603                .alg.aead = {
2604                        .base = {
2605                                .cra_name = "authenc(hmac(sha512),"
2606                                            "cbc(des3_ede))",
2607                                .cra_driver_name = "authenc-hmac-sha512-"
2608                                                   "cbc-3des-talitos",
2609                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2610                                .cra_flags = CRYPTO_ALG_ASYNC |
2611                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2612                        },
2613                        .ivsize = DES3_EDE_BLOCK_SIZE,
2614                        .maxauthsize = SHA512_DIGEST_SIZE,
2615                        .setkey = aead_des3_setkey,
2616                },
2617                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2618                                     DESC_HDR_SEL0_DEU |
2619                                     DESC_HDR_MODE0_DEU_CBC |
2620                                     DESC_HDR_MODE0_DEU_3DES |
2621                                     DESC_HDR_SEL1_MDEUB |
2622                                     DESC_HDR_MODE1_MDEU_INIT |
2623                                     DESC_HDR_MODE1_MDEU_PAD |
2624                                     DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2625        },
2626        {       .type = CRYPTO_ALG_TYPE_AEAD,
2627                .alg.aead = {
2628                        .base = {
2629                                .cra_name = "authenc(hmac(md5),cbc(aes))",
2630                                .cra_driver_name = "authenc-hmac-md5-"
2631                                                   "cbc-aes-talitos",
2632                                .cra_blocksize = AES_BLOCK_SIZE,
2633                                .cra_flags = CRYPTO_ALG_ASYNC |
2634                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2635                        },
2636                        .ivsize = AES_BLOCK_SIZE,
2637                        .maxauthsize = MD5_DIGEST_SIZE,
2638                },
2639                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2640                                     DESC_HDR_SEL0_AESU |
2641                                     DESC_HDR_MODE0_AESU_CBC |
2642                                     DESC_HDR_SEL1_MDEUA |
2643                                     DESC_HDR_MODE1_MDEU_INIT |
2644                                     DESC_HDR_MODE1_MDEU_PAD |
2645                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2646        },
2647        {       .type = CRYPTO_ALG_TYPE_AEAD,
2648                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2649                .alg.aead = {
2650                        .base = {
2651                                .cra_name = "authenc(hmac(md5),cbc(aes))",
2652                                .cra_driver_name = "authenc-hmac-md5-"
2653                                                   "cbc-aes-talitos-hsna",
2654                                .cra_blocksize = AES_BLOCK_SIZE,
2655                                .cra_flags = CRYPTO_ALG_ASYNC |
2656                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2657                        },
2658                        .ivsize = AES_BLOCK_SIZE,
2659                        .maxauthsize = MD5_DIGEST_SIZE,
2660                },
2661                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2662                                     DESC_HDR_SEL0_AESU |
2663                                     DESC_HDR_MODE0_AESU_CBC |
2664                                     DESC_HDR_SEL1_MDEUA |
2665                                     DESC_HDR_MODE1_MDEU_INIT |
2666                                     DESC_HDR_MODE1_MDEU_PAD |
2667                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2668        },
2669        {       .type = CRYPTO_ALG_TYPE_AEAD,
2670                .alg.aead = {
2671                        .base = {
2672                                .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2673                                .cra_driver_name = "authenc-hmac-md5-"
2674                                                   "cbc-3des-talitos",
2675                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2676                                .cra_flags = CRYPTO_ALG_ASYNC |
2677                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2678                        },
2679                        .ivsize = DES3_EDE_BLOCK_SIZE,
2680                        .maxauthsize = MD5_DIGEST_SIZE,
2681                        .setkey = aead_des3_setkey,
2682                },
2683                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2684                                     DESC_HDR_SEL0_DEU |
2685                                     DESC_HDR_MODE0_DEU_CBC |
2686                                     DESC_HDR_MODE0_DEU_3DES |
2687                                     DESC_HDR_SEL1_MDEUA |
2688                                     DESC_HDR_MODE1_MDEU_INIT |
2689                                     DESC_HDR_MODE1_MDEU_PAD |
2690                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2691        },
2692        {       .type = CRYPTO_ALG_TYPE_AEAD,
2693                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2694                .alg.aead = {
2695                        .base = {
2696                                .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2697                                .cra_driver_name = "authenc-hmac-md5-"
2698                                                   "cbc-3des-talitos-hsna",
2699                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2700                                .cra_flags = CRYPTO_ALG_ASYNC |
2701                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2702                        },
2703                        .ivsize = DES3_EDE_BLOCK_SIZE,
2704                        .maxauthsize = MD5_DIGEST_SIZE,
2705                        .setkey = aead_des3_setkey,
2706                },
2707                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2708                                     DESC_HDR_SEL0_DEU |
2709                                     DESC_HDR_MODE0_DEU_CBC |
2710                                     DESC_HDR_MODE0_DEU_3DES |
2711                                     DESC_HDR_SEL1_MDEUA |
2712                                     DESC_HDR_MODE1_MDEU_INIT |
2713                                     DESC_HDR_MODE1_MDEU_PAD |
2714                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2715        },
2716        /* SKCIPHER algorithms. */
2717        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2718                .alg.skcipher = {
2719                        .base.cra_name = "ecb(aes)",
2720                        .base.cra_driver_name = "ecb-aes-talitos",
2721                        .base.cra_blocksize = AES_BLOCK_SIZE,
2722                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2723                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2724                        .min_keysize = AES_MIN_KEY_SIZE,
2725                        .max_keysize = AES_MAX_KEY_SIZE,
2726                        .setkey = skcipher_aes_setkey,
2727                },
2728                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2729                                     DESC_HDR_SEL0_AESU,
2730        },
2731        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2732                .alg.skcipher = {
2733                        .base.cra_name = "cbc(aes)",
2734                        .base.cra_driver_name = "cbc-aes-talitos",
2735                        .base.cra_blocksize = AES_BLOCK_SIZE,
2736                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2737                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2738                        .min_keysize = AES_MIN_KEY_SIZE,
2739                        .max_keysize = AES_MAX_KEY_SIZE,
2740                        .ivsize = AES_BLOCK_SIZE,
2741                        .setkey = skcipher_aes_setkey,
2742                },
2743                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2744                                     DESC_HDR_SEL0_AESU |
2745                                     DESC_HDR_MODE0_AESU_CBC,
2746        },
2747        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2748                .alg.skcipher = {
2749                        .base.cra_name = "ctr(aes)",
2750                        .base.cra_driver_name = "ctr-aes-talitos",
2751                        .base.cra_blocksize = 1,
2752                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2753                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2754                        .min_keysize = AES_MIN_KEY_SIZE,
2755                        .max_keysize = AES_MAX_KEY_SIZE,
2756                        .ivsize = AES_BLOCK_SIZE,
2757                        .setkey = skcipher_aes_setkey,
2758                },
2759                .desc_hdr_template = DESC_HDR_TYPE_AESU_CTR_NONSNOOP |
2760                                     DESC_HDR_SEL0_AESU |
2761                                     DESC_HDR_MODE0_AESU_CTR,
2762        },
2763        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2764                .alg.skcipher = {
2765                        .base.cra_name = "ecb(des)",
2766                        .base.cra_driver_name = "ecb-des-talitos",
2767                        .base.cra_blocksize = DES_BLOCK_SIZE,
2768                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2769                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2770                        .min_keysize = DES_KEY_SIZE,
2771                        .max_keysize = DES_KEY_SIZE,
2772                        .setkey = skcipher_des_setkey,
2773                },
2774                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2775                                     DESC_HDR_SEL0_DEU,
2776        },
2777        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2778                .alg.skcipher = {
2779                        .base.cra_name = "cbc(des)",
2780                        .base.cra_driver_name = "cbc-des-talitos",
2781                        .base.cra_blocksize = DES_BLOCK_SIZE,
2782                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2783                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2784                        .min_keysize = DES_KEY_SIZE,
2785                        .max_keysize = DES_KEY_SIZE,
2786                        .ivsize = DES_BLOCK_SIZE,
2787                        .setkey = skcipher_des_setkey,
2788                },
2789                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2790                                     DESC_HDR_SEL0_DEU |
2791                                     DESC_HDR_MODE0_DEU_CBC,
2792        },
2793        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2794                .alg.skcipher = {
2795                        .base.cra_name = "ecb(des3_ede)",
2796                        .base.cra_driver_name = "ecb-3des-talitos",
2797                        .base.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2798                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2799                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2800                        .min_keysize = DES3_EDE_KEY_SIZE,
2801                        .max_keysize = DES3_EDE_KEY_SIZE,
2802                        .setkey = skcipher_des3_setkey,
2803                },
2804                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2805                                     DESC_HDR_SEL0_DEU |
2806                                     DESC_HDR_MODE0_DEU_3DES,
2807        },
2808        {       .type = CRYPTO_ALG_TYPE_SKCIPHER,
2809                .alg.skcipher = {
2810                        .base.cra_name = "cbc(des3_ede)",
2811                        .base.cra_driver_name = "cbc-3des-talitos",
2812                        .base.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2813                        .base.cra_flags = CRYPTO_ALG_ASYNC |
2814                                          CRYPTO_ALG_ALLOCATES_MEMORY,
2815                        .min_keysize = DES3_EDE_KEY_SIZE,
2816                        .max_keysize = DES3_EDE_KEY_SIZE,
2817                        .ivsize = DES3_EDE_BLOCK_SIZE,
2818                        .setkey = skcipher_des3_setkey,
2819                },
2820                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2821                                     DESC_HDR_SEL0_DEU |
2822                                     DESC_HDR_MODE0_DEU_CBC |
2823                                     DESC_HDR_MODE0_DEU_3DES,
2824        },
2825        /* AHASH algorithms. */
2826        {       .type = CRYPTO_ALG_TYPE_AHASH,
2827                .alg.hash = {
2828                        .halg.digestsize = MD5_DIGEST_SIZE,
2829                        .halg.statesize = sizeof(struct talitos_export_state),
2830                        .halg.base = {
2831                                .cra_name = "md5",
2832                                .cra_driver_name = "md5-talitos",
2833                                .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2834                                .cra_flags = CRYPTO_ALG_ASYNC |
2835                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2836                        }
2837                },
2838                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2839                                     DESC_HDR_SEL0_MDEUA |
2840                                     DESC_HDR_MODE0_MDEU_MD5,
2841        },
2842        {       .type = CRYPTO_ALG_TYPE_AHASH,
2843                .alg.hash = {
2844                        .halg.digestsize = SHA1_DIGEST_SIZE,
2845                        .halg.statesize = sizeof(struct talitos_export_state),
2846                        .halg.base = {
2847                                .cra_name = "sha1",
2848                                .cra_driver_name = "sha1-talitos",
2849                                .cra_blocksize = SHA1_BLOCK_SIZE,
2850                                .cra_flags = CRYPTO_ALG_ASYNC |
2851                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2852                        }
2853                },
2854                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2855                                     DESC_HDR_SEL0_MDEUA |
2856                                     DESC_HDR_MODE0_MDEU_SHA1,
2857        },
2858        {       .type = CRYPTO_ALG_TYPE_AHASH,
2859                .alg.hash = {
2860                        .halg.digestsize = SHA224_DIGEST_SIZE,
2861                        .halg.statesize = sizeof(struct talitos_export_state),
2862                        .halg.base = {
2863                                .cra_name = "sha224",
2864                                .cra_driver_name = "sha224-talitos",
2865                                .cra_blocksize = SHA224_BLOCK_SIZE,
2866                                .cra_flags = CRYPTO_ALG_ASYNC |
2867                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2868                        }
2869                },
2870                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2871                                     DESC_HDR_SEL0_MDEUA |
2872                                     DESC_HDR_MODE0_MDEU_SHA224,
2873        },
2874        {       .type = CRYPTO_ALG_TYPE_AHASH,
2875                .alg.hash = {
2876                        .halg.digestsize = SHA256_DIGEST_SIZE,
2877                        .halg.statesize = sizeof(struct talitos_export_state),
2878                        .halg.base = {
2879                                .cra_name = "sha256",
2880                                .cra_driver_name = "sha256-talitos",
2881                                .cra_blocksize = SHA256_BLOCK_SIZE,
2882                                .cra_flags = CRYPTO_ALG_ASYNC |
2883                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2884                        }
2885                },
2886                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2887                                     DESC_HDR_SEL0_MDEUA |
2888                                     DESC_HDR_MODE0_MDEU_SHA256,
2889        },
2890        {       .type = CRYPTO_ALG_TYPE_AHASH,
2891                .alg.hash = {
2892                        .halg.digestsize = SHA384_DIGEST_SIZE,
2893                        .halg.statesize = sizeof(struct talitos_export_state),
2894                        .halg.base = {
2895                                .cra_name = "sha384",
2896                                .cra_driver_name = "sha384-talitos",
2897                                .cra_blocksize = SHA384_BLOCK_SIZE,
2898                                .cra_flags = CRYPTO_ALG_ASYNC |
2899                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2900                        }
2901                },
2902                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2903                                     DESC_HDR_SEL0_MDEUB |
2904                                     DESC_HDR_MODE0_MDEUB_SHA384,
2905        },
2906        {       .type = CRYPTO_ALG_TYPE_AHASH,
2907                .alg.hash = {
2908                        .halg.digestsize = SHA512_DIGEST_SIZE,
2909                        .halg.statesize = sizeof(struct talitos_export_state),
2910                        .halg.base = {
2911                                .cra_name = "sha512",
2912                                .cra_driver_name = "sha512-talitos",
2913                                .cra_blocksize = SHA512_BLOCK_SIZE,
2914                                .cra_flags = CRYPTO_ALG_ASYNC |
2915                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2916                        }
2917                },
2918                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2919                                     DESC_HDR_SEL0_MDEUB |
2920                                     DESC_HDR_MODE0_MDEUB_SHA512,
2921        },
2922        {       .type = CRYPTO_ALG_TYPE_AHASH,
2923                .alg.hash = {
2924                        .halg.digestsize = MD5_DIGEST_SIZE,
2925                        .halg.statesize = sizeof(struct talitos_export_state),
2926                        .halg.base = {
2927                                .cra_name = "hmac(md5)",
2928                                .cra_driver_name = "hmac-md5-talitos",
2929                                .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2930                                .cra_flags = CRYPTO_ALG_ASYNC |
2931                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2932                        }
2933                },
2934                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2935                                     DESC_HDR_SEL0_MDEUA |
2936                                     DESC_HDR_MODE0_MDEU_MD5,
2937        },
2938        {       .type = CRYPTO_ALG_TYPE_AHASH,
2939                .alg.hash = {
2940                        .halg.digestsize = SHA1_DIGEST_SIZE,
2941                        .halg.statesize = sizeof(struct talitos_export_state),
2942                        .halg.base = {
2943                                .cra_name = "hmac(sha1)",
2944                                .cra_driver_name = "hmac-sha1-talitos",
2945                                .cra_blocksize = SHA1_BLOCK_SIZE,
2946                                .cra_flags = CRYPTO_ALG_ASYNC |
2947                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2948                        }
2949                },
2950                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2951                                     DESC_HDR_SEL0_MDEUA |
2952                                     DESC_HDR_MODE0_MDEU_SHA1,
2953        },
2954        {       .type = CRYPTO_ALG_TYPE_AHASH,
2955                .alg.hash = {
2956                        .halg.digestsize = SHA224_DIGEST_SIZE,
2957                        .halg.statesize = sizeof(struct talitos_export_state),
2958                        .halg.base = {
2959                                .cra_name = "hmac(sha224)",
2960                                .cra_driver_name = "hmac-sha224-talitos",
2961                                .cra_blocksize = SHA224_BLOCK_SIZE,
2962                                .cra_flags = CRYPTO_ALG_ASYNC |
2963                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2964                        }
2965                },
2966                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2967                                     DESC_HDR_SEL0_MDEUA |
2968                                     DESC_HDR_MODE0_MDEU_SHA224,
2969        },
2970        {       .type = CRYPTO_ALG_TYPE_AHASH,
2971                .alg.hash = {
2972                        .halg.digestsize = SHA256_DIGEST_SIZE,
2973                        .halg.statesize = sizeof(struct talitos_export_state),
2974                        .halg.base = {
2975                                .cra_name = "hmac(sha256)",
2976                                .cra_driver_name = "hmac-sha256-talitos",
2977                                .cra_blocksize = SHA256_BLOCK_SIZE,
2978                                .cra_flags = CRYPTO_ALG_ASYNC |
2979                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2980                        }
2981                },
2982                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2983                                     DESC_HDR_SEL0_MDEUA |
2984                                     DESC_HDR_MODE0_MDEU_SHA256,
2985        },
2986        {       .type = CRYPTO_ALG_TYPE_AHASH,
2987                .alg.hash = {
2988                        .halg.digestsize = SHA384_DIGEST_SIZE,
2989                        .halg.statesize = sizeof(struct talitos_export_state),
2990                        .halg.base = {
2991                                .cra_name = "hmac(sha384)",
2992                                .cra_driver_name = "hmac-sha384-talitos",
2993                                .cra_blocksize = SHA384_BLOCK_SIZE,
2994                                .cra_flags = CRYPTO_ALG_ASYNC |
2995                                             CRYPTO_ALG_ALLOCATES_MEMORY,
2996                        }
2997                },
2998                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2999                                     DESC_HDR_SEL0_MDEUB |
3000                                     DESC_HDR_MODE0_MDEUB_SHA384,
3001        },
3002        {       .type = CRYPTO_ALG_TYPE_AHASH,
3003                .alg.hash = {
3004                        .halg.digestsize = SHA512_DIGEST_SIZE,
3005                        .halg.statesize = sizeof(struct talitos_export_state),
3006                        .halg.base = {
3007                                .cra_name = "hmac(sha512)",
3008                                .cra_driver_name = "hmac-sha512-talitos",
3009                                .cra_blocksize = SHA512_BLOCK_SIZE,
3010                                .cra_flags = CRYPTO_ALG_ASYNC |
3011                                             CRYPTO_ALG_ALLOCATES_MEMORY,
3012                        }
3013                },
3014                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3015                                     DESC_HDR_SEL0_MDEUB |
3016                                     DESC_HDR_MODE0_MDEUB_SHA512,
3017        }
3018};
3019
3020struct talitos_crypto_alg {
3021        struct list_head entry;
3022        struct device *dev;
3023        struct talitos_alg_template algt;
3024};
3025
3026static int talitos_init_common(struct talitos_ctx *ctx,
3027                               struct talitos_crypto_alg *talitos_alg)
3028{
3029        struct talitos_private *priv;
3030
3031        /* update context with ptr to dev */
3032        ctx->dev = talitos_alg->dev;
3033
3034        /* assign SEC channel to tfm in round-robin fashion */
3035        priv = dev_get_drvdata(ctx->dev);
3036        ctx->ch = atomic_inc_return(&priv->last_chan) &
3037                  (priv->num_channels - 1);
3038
3039        /* copy descriptor header template value */
3040        ctx->desc_hdr_template = talitos_alg->algt.desc_hdr_template;
3041
3042        /* select done notification */
3043        ctx->desc_hdr_template |= DESC_HDR_DONE_NOTIFY;
3044
3045        return 0;
3046}
3047
3048static int talitos_cra_init_aead(struct crypto_aead *tfm)
3049{
3050        struct aead_alg *alg = crypto_aead_alg(tfm);
3051        struct talitos_crypto_alg *talitos_alg;
3052        struct talitos_ctx *ctx = crypto_aead_ctx(tfm);
3053
3054        talitos_alg = container_of(alg, struct talitos_crypto_alg,
3055                                   algt.alg.aead);
3056
3057        return talitos_init_common(ctx, talitos_alg);
3058}
3059
3060static int talitos_cra_init_skcipher(struct crypto_skcipher *tfm)
3061{
3062        struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
3063        struct talitos_crypto_alg *talitos_alg;
3064        struct talitos_ctx *ctx = crypto_skcipher_ctx(tfm);
3065
3066        talitos_alg = container_of(alg, struct talitos_crypto_alg,
3067                                   algt.alg.skcipher);
3068
3069        return talitos_init_common(ctx, talitos_alg);
3070}
3071
3072static int talitos_cra_init_ahash(struct crypto_tfm *tfm)
3073{
3074        struct crypto_alg *alg = tfm->__crt_alg;
3075        struct talitos_crypto_alg *talitos_alg;
3076        struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3077
3078        talitos_alg = container_of(__crypto_ahash_alg(alg),
3079                                   struct talitos_crypto_alg,
3080                                   algt.alg.hash);
3081
3082        ctx->keylen = 0;
3083        crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
3084                                 sizeof(struct talitos_ahash_req_ctx));
3085
3086        return talitos_init_common(ctx, talitos_alg);
3087}
3088
3089static void talitos_cra_exit(struct crypto_tfm *tfm)
3090{
3091        struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3092        struct device *dev = ctx->dev;
3093
3094        if (ctx->keylen)
3095                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
3096}
3097
3098/*
3099 * given the alg's descriptor header template, determine whether descriptor
3100 * type and primary/secondary execution units required match the hw
3101 * capabilities description provided in the device tree node.
3102 */
3103static int hw_supports(struct device *dev, __be32 desc_hdr_template)
3104{
3105        struct talitos_private *priv = dev_get_drvdata(dev);
3106        int ret;
3107
3108        ret = (1 << DESC_TYPE(desc_hdr_template) & priv->desc_types) &&
3109              (1 << PRIMARY_EU(desc_hdr_template) & priv->exec_units);
3110
3111        if (SECONDARY_EU(desc_hdr_template))
3112                ret = ret && (1 << SECONDARY_EU(desc_hdr_template)
3113                              & priv->exec_units);
3114
3115        return ret;
3116}
3117
3118static int talitos_remove(struct platform_device *ofdev)
3119{
3120        struct device *dev = &ofdev->dev;
3121        struct talitos_private *priv = dev_get_drvdata(dev);
3122        struct talitos_crypto_alg *t_alg, *n;
3123        int i;
3124
3125        list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) {
3126                switch (t_alg->algt.type) {
3127                case CRYPTO_ALG_TYPE_SKCIPHER:
3128                        crypto_unregister_skcipher(&t_alg->algt.alg.skcipher);
3129                        break;
3130                case CRYPTO_ALG_TYPE_AEAD:
3131                        crypto_unregister_aead(&t_alg->algt.alg.aead);
3132                        break;
3133                case CRYPTO_ALG_TYPE_AHASH:
3134                        crypto_unregister_ahash(&t_alg->algt.alg.hash);
3135                        break;
3136                }
3137                list_del(&t_alg->entry);
3138        }
3139
3140        if (hw_supports(dev, DESC_HDR_SEL0_RNG))
3141                talitos_unregister_rng(dev);
3142
3143        for (i = 0; i < 2; i++)
3144                if (priv->irq[i]) {
3145                        free_irq(priv->irq[i], dev);
3146                        irq_dispose_mapping(priv->irq[i]);
3147                }
3148
3149        tasklet_kill(&priv->done_task[0]);
3150        if (priv->irq[1])
3151                tasklet_kill(&priv->done_task[1]);
3152
3153        return 0;
3154}
3155
3156static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
3157                                                    struct talitos_alg_template
3158                                                           *template)
3159{
3160        struct talitos_private *priv = dev_get_drvdata(dev);
3161        struct talitos_crypto_alg *t_alg;
3162        struct crypto_alg *alg;
3163
3164        t_alg = devm_kzalloc(dev, sizeof(struct talitos_crypto_alg),
3165                             GFP_KERNEL);
3166        if (!t_alg)
3167                return ERR_PTR(-ENOMEM);
3168
3169        t_alg->algt = *template;
3170
3171        switch (t_alg->algt.type) {
3172        case CRYPTO_ALG_TYPE_SKCIPHER:
3173                alg = &t_alg->algt.alg.skcipher.base;
3174                alg->cra_exit = talitos_cra_exit;
3175                t_alg->algt.alg.skcipher.init = talitos_cra_init_skcipher;
3176                t_alg->algt.alg.skcipher.setkey =
3177                        t_alg->algt.alg.skcipher.setkey ?: skcipher_setkey;
3178                t_alg->algt.alg.skcipher.encrypt = skcipher_encrypt;
3179                t_alg->algt.alg.skcipher.decrypt = skcipher_decrypt;
3180                break;
3181        case CRYPTO_ALG_TYPE_AEAD:
3182                alg = &t_alg->algt.alg.aead.base;
3183                alg->cra_exit = talitos_cra_exit;
3184                t_alg->algt.alg.aead.init = talitos_cra_init_aead;
3185                t_alg->algt.alg.aead.setkey = t_alg->algt.alg.aead.setkey ?:
3186                                              aead_setkey;
3187                t_alg->algt.alg.aead.encrypt = aead_encrypt;
3188                t_alg->algt.alg.aead.decrypt = aead_decrypt;
3189                if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3190                    !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) {
3191                        devm_kfree(dev, t_alg);
3192                        return ERR_PTR(-ENOTSUPP);
3193                }
3194                break;
3195        case CRYPTO_ALG_TYPE_AHASH:
3196                alg = &t_alg->algt.alg.hash.halg.base;
3197                alg->cra_init = talitos_cra_init_ahash;
3198                alg->cra_exit = talitos_cra_exit;
3199                t_alg->algt.alg.hash.init = ahash_init;
3200                t_alg->algt.alg.hash.update = ahash_update;
3201                t_alg->algt.alg.hash.final = ahash_final;
3202                t_alg->algt.alg.hash.finup = ahash_finup;
3203                t_alg->algt.alg.hash.digest = ahash_digest;
3204                if (!strncmp(alg->cra_name, "hmac", 4))
3205                        t_alg->algt.alg.hash.setkey = ahash_setkey;
3206                t_alg->algt.alg.hash.import = ahash_import;
3207                t_alg->algt.alg.hash.export = ahash_export;
3208
3209                if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
3210                    !strncmp(alg->cra_name, "hmac", 4)) {
3211                        devm_kfree(dev, t_alg);
3212                        return ERR_PTR(-ENOTSUPP);
3213                }
3214                if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3215                    (!strcmp(alg->cra_name, "sha224") ||
3216                     !strcmp(alg->cra_name, "hmac(sha224)"))) {
3217                        t_alg->algt.alg.hash.init = ahash_init_sha224_swinit;
3218                        t_alg->algt.desc_hdr_template =
3219                                        DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3220                                        DESC_HDR_SEL0_MDEUA |
3221                                        DESC_HDR_MODE0_MDEU_SHA256;
3222                }
3223                break;
3224        default:
3225                dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
3226                devm_kfree(dev, t_alg);
3227                return ERR_PTR(-EINVAL);
3228        }
3229
3230        alg->cra_module = THIS_MODULE;
3231        if (t_alg->algt.priority)
3232                alg->cra_priority = t_alg->algt.priority;
3233        else
3234                alg->cra_priority = TALITOS_CRA_PRIORITY;
3235        if (has_ftr_sec1(priv))
3236                alg->cra_alignmask = 3;
3237        else
3238                alg->cra_alignmask = 0;
3239        alg->cra_ctxsize = sizeof(struct talitos_ctx);
3240        alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY;
3241
3242        t_alg->dev = dev;
3243
3244        return t_alg;
3245}
3246
3247static int talitos_probe_irq(struct platform_device *ofdev)
3248{
3249        struct device *dev = &ofdev->dev;
3250        struct device_node *np = ofdev->dev.of_node;
3251        struct talitos_private *priv = dev_get_drvdata(dev);
3252        int err;
3253        bool is_sec1 = has_ftr_sec1(priv);
3254
3255        priv->irq[0] = irq_of_parse_and_map(np, 0);
3256        if (!priv->irq[0]) {
3257                dev_err(dev, "failed to map irq\n");
3258                return -EINVAL;
3259        }
3260        if (is_sec1) {
3261                err = request_irq(priv->irq[0], talitos1_interrupt_4ch, 0,
3262                                  dev_driver_string(dev), dev);
3263                goto primary_out;
3264        }
3265
3266        priv->irq[1] = irq_of_parse_and_map(np, 1);
3267
3268        /* get the primary irq line */
3269        if (!priv->irq[1]) {
3270                err = request_irq(priv->irq[0], talitos2_interrupt_4ch, 0,
3271                                  dev_driver_string(dev), dev);
3272                goto primary_out;
3273        }
3274
3275        err = request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0,
3276                          dev_driver_string(dev), dev);
3277        if (err)
3278                goto primary_out;
3279
3280        /* get the secondary irq line */
3281        err = request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0,
3282                          dev_driver_string(dev), dev);
3283        if (err) {
3284                dev_err(dev, "failed to request secondary irq\n");
3285                irq_dispose_mapping(priv->irq[1]);
3286                priv->irq[1] = 0;
3287        }
3288
3289        return err;
3290
3291primary_out:
3292        if (err) {
3293                dev_err(dev, "failed to request primary irq\n");
3294                irq_dispose_mapping(priv->irq[0]);
3295                priv->irq[0] = 0;
3296        }
3297
3298        return err;
3299}
3300
3301static int talitos_probe(struct platform_device *ofdev)
3302{
3303        struct device *dev = &ofdev->dev;
3304        struct device_node *np = ofdev->dev.of_node;
3305        struct talitos_private *priv;
3306        int i, err;
3307        int stride;
3308        struct resource *res;
3309
3310        priv = devm_kzalloc(dev, sizeof(struct talitos_private), GFP_KERNEL);
3311        if (!priv)
3312                return -ENOMEM;
3313
3314        INIT_LIST_HEAD(&priv->alg_list);
3315
3316        dev_set_drvdata(dev, priv);
3317
3318        priv->ofdev = ofdev;
3319
3320        spin_lock_init(&priv->reg_lock);
3321
3322        res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
3323        if (!res)
3324                return -ENXIO;
3325        priv->reg = devm_ioremap(dev, res->start, resource_size(res));
3326        if (!priv->reg) {
3327                dev_err(dev, "failed to of_iomap\n");
3328                err = -ENOMEM;
3329                goto err_out;
3330        }
3331
3332        /* get SEC version capabilities from device tree */
3333        of_property_read_u32(np, "fsl,num-channels", &priv->num_channels);
3334        of_property_read_u32(np, "fsl,channel-fifo-len", &priv->chfifo_len);
3335        of_property_read_u32(np, "fsl,exec-units-mask", &priv->exec_units);
3336        of_property_read_u32(np, "fsl,descriptor-types-mask",
3337                             &priv->desc_types);
3338
3339        if (!is_power_of_2(priv->num_channels) || !priv->chfifo_len ||
3340            !priv->exec_units || !priv->desc_types) {
3341                dev_err(dev, "invalid property data in device tree node\n");
3342                err = -EINVAL;
3343                goto err_out;
3344        }
3345
3346        if (of_device_is_compatible(np, "fsl,sec3.0"))
3347                priv->features |= TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT;
3348
3349        if (of_device_is_compatible(np, "fsl,sec2.1"))
3350                priv->features |= TALITOS_FTR_HW_AUTH_CHECK |
3351                                  TALITOS_FTR_SHA224_HWINIT |
3352                                  TALITOS_FTR_HMAC_OK;
3353
3354        if (of_device_is_compatible(np, "fsl,sec1.0"))
3355                priv->features |= TALITOS_FTR_SEC1;
3356
3357        if (of_device_is_compatible(np, "fsl,sec1.2")) {
3358                priv->reg_deu = priv->reg + TALITOS12_DEU;
3359                priv->reg_aesu = priv->reg + TALITOS12_AESU;
3360                priv->reg_mdeu = priv->reg + TALITOS12_MDEU;
3361                stride = TALITOS1_CH_STRIDE;
3362        } else if (of_device_is_compatible(np, "fsl,sec1.0")) {
3363                priv->reg_deu = priv->reg + TALITOS10_DEU;
3364                priv->reg_aesu = priv->reg + TALITOS10_AESU;
3365                priv->reg_mdeu = priv->reg + TALITOS10_MDEU;
3366                priv->reg_afeu = priv->reg + TALITOS10_AFEU;
3367                priv->reg_rngu = priv->reg + TALITOS10_RNGU;
3368                priv->reg_pkeu = priv->reg + TALITOS10_PKEU;
3369                stride = TALITOS1_CH_STRIDE;
3370        } else {
3371                priv->reg_deu = priv->reg + TALITOS2_DEU;
3372                priv->reg_aesu = priv->reg + TALITOS2_AESU;
3373                priv->reg_mdeu = priv->reg + TALITOS2_MDEU;
3374                priv->reg_afeu = priv->reg + TALITOS2_AFEU;
3375                priv->reg_rngu = priv->reg + TALITOS2_RNGU;
3376                priv->reg_pkeu = priv->reg + TALITOS2_PKEU;
3377                priv->reg_keu = priv->reg + TALITOS2_KEU;
3378                priv->reg_crcu = priv->reg + TALITOS2_CRCU;
3379                stride = TALITOS2_CH_STRIDE;
3380        }
3381
3382        err = talitos_probe_irq(ofdev);
3383        if (err)
3384                goto err_out;
3385
3386        if (has_ftr_sec1(priv)) {
3387                if (priv->num_channels == 1)
3388                        tasklet_init(&priv->done_task[0], talitos1_done_ch0,
3389                                     (unsigned long)dev);
3390                else
3391                        tasklet_init(&priv->done_task[0], talitos1_done_4ch,
3392                                     (unsigned long)dev);
3393        } else {
3394                if (priv->irq[1]) {
3395                        tasklet_init(&priv->done_task[0], talitos2_done_ch0_2,
3396                                     (unsigned long)dev);
3397                        tasklet_init(&priv->done_task[1], talitos2_done_ch1_3,
3398                                     (unsigned long)dev);
3399                } else if (priv->num_channels == 1) {
3400                        tasklet_init(&priv->done_task[0], talitos2_done_ch0,
3401                                     (unsigned long)dev);
3402                } else {
3403                        tasklet_init(&priv->done_task[0], talitos2_done_4ch,
3404                                     (unsigned long)dev);
3405                }
3406        }
3407
3408        priv->chan = devm_kcalloc(dev,
3409                                  priv->num_channels,
3410                                  sizeof(struct talitos_channel),
3411                                  GFP_KERNEL);
3412        if (!priv->chan) {
3413                dev_err(dev, "failed to allocate channel management space\n");
3414                err = -ENOMEM;
3415                goto err_out;
3416        }
3417
3418        priv->fifo_len = roundup_pow_of_two(priv->chfifo_len);
3419
3420        for (i = 0; i < priv->num_channels; i++) {
3421                priv->chan[i].reg = priv->reg + stride * (i + 1);
3422                if (!priv->irq[1] || !(i & 1))
3423                        priv->chan[i].reg += TALITOS_CH_BASE_OFFSET;
3424
3425                spin_lock_init(&priv->chan[i].head_lock);
3426                spin_lock_init(&priv->chan[i].tail_lock);
3427
3428                priv->chan[i].fifo = devm_kcalloc(dev,
3429                                                priv->fifo_len,
3430                                                sizeof(struct talitos_request),
3431                                                GFP_KERNEL);
3432                if (!priv->chan[i].fifo) {
3433                        dev_err(dev, "failed to allocate request fifo %d\n", i);
3434                        err = -ENOMEM;
3435                        goto err_out;
3436                }
3437
3438                atomic_set(&priv->chan[i].submit_count,
3439                           -(priv->chfifo_len - 1));
3440        }
3441
3442        dma_set_mask(dev, DMA_BIT_MASK(36));
3443
3444        /* reset and initialize the h/w */
3445        err = init_device(dev);
3446        if (err) {
3447                dev_err(dev, "failed to initialize device\n");
3448                goto err_out;
3449        }
3450
3451        /* register the RNG, if available */
3452        if (hw_supports(dev, DESC_HDR_SEL0_RNG)) {
3453                err = talitos_register_rng(dev);
3454                if (err) {
3455                        dev_err(dev, "failed to register hwrng: %d\n", err);
3456                        goto err_out;
3457                } else
3458                        dev_info(dev, "hwrng\n");
3459        }
3460
3461        /* register crypto algorithms the device supports */
3462        for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3463                if (hw_supports(dev, driver_algs[i].desc_hdr_template)) {
3464                        struct talitos_crypto_alg *t_alg;
3465                        struct crypto_alg *alg = NULL;
3466
3467                        t_alg = talitos_alg_alloc(dev, &driver_algs[i]);
3468                        if (IS_ERR(t_alg)) {
3469                                err = PTR_ERR(t_alg);
3470                                if (err == -ENOTSUPP)
3471                                        continue;
3472                                goto err_out;
3473                        }
3474
3475                        switch (t_alg->algt.type) {
3476                        case CRYPTO_ALG_TYPE_SKCIPHER:
3477                                err = crypto_register_skcipher(
3478                                                &t_alg->algt.alg.skcipher);
3479                                alg = &t_alg->algt.alg.skcipher.base;
3480                                break;
3481
3482                        case CRYPTO_ALG_TYPE_AEAD:
3483                                err = crypto_register_aead(
3484                                        &t_alg->algt.alg.aead);
3485                                alg = &t_alg->algt.alg.aead.base;
3486                                break;
3487
3488                        case CRYPTO_ALG_TYPE_AHASH:
3489                                err = crypto_register_ahash(
3490                                                &t_alg->algt.alg.hash);
3491                                alg = &t_alg->algt.alg.hash.halg.base;
3492                                break;
3493                        }
3494                        if (err) {
3495                                dev_err(dev, "%s alg registration failed\n",
3496                                        alg->cra_driver_name);
3497                                devm_kfree(dev, t_alg);
3498                        } else
3499                                list_add_tail(&t_alg->entry, &priv->alg_list);
3500                }
3501        }
3502        if (!list_empty(&priv->alg_list))
3503                dev_info(dev, "%s algorithms registered in /proc/crypto\n",
3504                         (char *)of_get_property(np, "compatible", NULL));
3505
3506        return 0;
3507
3508err_out:
3509        talitos_remove(ofdev);
3510
3511        return err;
3512}
3513
3514static const struct of_device_id talitos_match[] = {
3515#ifdef CONFIG_CRYPTO_DEV_TALITOS1
3516        {
3517                .compatible = "fsl,sec1.0",
3518        },
3519#endif
3520#ifdef CONFIG_CRYPTO_DEV_TALITOS2
3521        {
3522                .compatible = "fsl,sec2.0",
3523        },
3524#endif
3525        {},
3526};
3527MODULE_DEVICE_TABLE(of, talitos_match);
3528
3529static struct platform_driver talitos_driver = {
3530        .driver = {
3531                .name = "talitos",
3532                .of_match_table = talitos_match,
3533        },
3534        .probe = talitos_probe,
3535        .remove = talitos_remove,
3536};
3537
3538module_platform_driver(talitos_driver);
3539
3540MODULE_LICENSE("GPL");
3541MODULE_AUTHOR("Kim Phillips <kim.phillips@freescale.com>");
3542MODULE_DESCRIPTION("Freescale integrated security engine (SEC) driver");
3543