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/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/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        crypto_aead_set_flags(authenc, CRYPTO_TFM_RES_BAD_KEY_LEN);
 918        memzero_explicit(&keys, sizeof(keys));
 919        return -EINVAL;
 920}
 921
 922static int aead_des3_setkey(struct crypto_aead *authenc,
 923                            const u8 *key, unsigned int keylen)
 924{
 925        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
 926        struct device *dev = ctx->dev;
 927        struct crypto_authenc_keys keys;
 928        u32 flags;
 929        int err;
 930
 931        err = crypto_authenc_extractkeys(&keys, key, keylen);
 932        if (unlikely(err))
 933                goto badkey;
 934
 935        err = -EINVAL;
 936        if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
 937                goto badkey;
 938
 939        if (keys.enckeylen != DES3_EDE_KEY_SIZE)
 940                goto badkey;
 941
 942        flags = crypto_aead_get_flags(authenc);
 943        err = __des3_verify_key(&flags, keys.enckey);
 944        if (unlikely(err)) {
 945                crypto_aead_set_flags(authenc, flags);
 946                goto out;
 947        }
 948
 949        if (ctx->keylen)
 950                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
 951
 952        memcpy(ctx->key, keys.authkey, keys.authkeylen);
 953        memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
 954
 955        ctx->keylen = keys.authkeylen + keys.enckeylen;
 956        ctx->enckeylen = keys.enckeylen;
 957        ctx->authkeylen = keys.authkeylen;
 958        ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
 959                                      DMA_TO_DEVICE);
 960
 961out:
 962        memzero_explicit(&keys, sizeof(keys));
 963        return err;
 964
 965badkey:
 966        crypto_aead_set_flags(authenc, CRYPTO_TFM_RES_BAD_KEY_LEN);
 967        goto out;
 968}
 969
 970static void talitos_sg_unmap(struct device *dev,
 971                             struct talitos_edesc *edesc,
 972                             struct scatterlist *src,
 973                             struct scatterlist *dst,
 974                             unsigned int len, unsigned int offset)
 975{
 976        struct talitos_private *priv = dev_get_drvdata(dev);
 977        bool is_sec1 = has_ftr_sec1(priv);
 978        unsigned int src_nents = edesc->src_nents ? : 1;
 979        unsigned int dst_nents = edesc->dst_nents ? : 1;
 980
 981        if (is_sec1 && dst && dst_nents > 1) {
 982                dma_sync_single_for_device(dev, edesc->dma_link_tbl + offset,
 983                                           len, DMA_FROM_DEVICE);
 984                sg_pcopy_from_buffer(dst, dst_nents, edesc->buf + offset, len,
 985                                     offset);
 986        }
 987        if (src != dst) {
 988                if (src_nents == 1 || !is_sec1)
 989                        dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
 990
 991                if (dst && (dst_nents == 1 || !is_sec1))
 992                        dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
 993        } else if (src_nents == 1 || !is_sec1) {
 994                dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
 995        }
 996}
 997
 998static void ipsec_esp_unmap(struct device *dev,
 999                            struct talitos_edesc *edesc,
1000                            struct aead_request *areq, bool encrypt)
1001{
1002        struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1003        struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1004        unsigned int ivsize = crypto_aead_ivsize(aead);
1005        unsigned int authsize = crypto_aead_authsize(aead);
1006        unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1007        bool is_ipsec_esp = edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP;
1008        struct talitos_ptr *civ_ptr = &edesc->desc.ptr[is_ipsec_esp ? 2 : 3];
1009
1010        if (is_ipsec_esp)
1011                unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6],
1012                                         DMA_FROM_DEVICE);
1013        unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE);
1014
1015        talitos_sg_unmap(dev, edesc, areq->src, areq->dst,
1016                         cryptlen + authsize, areq->assoclen);
1017
1018        if (edesc->dma_len)
1019                dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1020                                 DMA_BIDIRECTIONAL);
1021
1022        if (!is_ipsec_esp) {
1023                unsigned int dst_nents = edesc->dst_nents ? : 1;
1024
1025                sg_pcopy_to_buffer(areq->dst, dst_nents, ctx->iv, ivsize,
1026                                   areq->assoclen + cryptlen - ivsize);
1027        }
1028}
1029
1030/*
1031 * ipsec_esp descriptor callbacks
1032 */
1033static void ipsec_esp_encrypt_done(struct device *dev,
1034                                   struct talitos_desc *desc, void *context,
1035                                   int err)
1036{
1037        struct aead_request *areq = context;
1038        struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1039        unsigned int ivsize = crypto_aead_ivsize(authenc);
1040        struct talitos_edesc *edesc;
1041
1042        edesc = container_of(desc, struct talitos_edesc, desc);
1043
1044        ipsec_esp_unmap(dev, edesc, areq, true);
1045
1046        dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE);
1047
1048        kfree(edesc);
1049
1050        aead_request_complete(areq, err);
1051}
1052
1053static void ipsec_esp_decrypt_swauth_done(struct device *dev,
1054                                          struct talitos_desc *desc,
1055                                          void *context, int err)
1056{
1057        struct aead_request *req = context;
1058        struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1059        unsigned int authsize = crypto_aead_authsize(authenc);
1060        struct talitos_edesc *edesc;
1061        char *oicv, *icv;
1062
1063        edesc = container_of(desc, struct talitos_edesc, desc);
1064
1065        ipsec_esp_unmap(dev, edesc, req, false);
1066
1067        if (!err) {
1068                /* auth check */
1069                oicv = edesc->buf + edesc->dma_len;
1070                icv = oicv - authsize;
1071
1072                err = crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0;
1073        }
1074
1075        kfree(edesc);
1076
1077        aead_request_complete(req, err);
1078}
1079
1080static void ipsec_esp_decrypt_hwauth_done(struct device *dev,
1081                                          struct talitos_desc *desc,
1082                                          void *context, int err)
1083{
1084        struct aead_request *req = context;
1085        struct talitos_edesc *edesc;
1086
1087        edesc = container_of(desc, struct talitos_edesc, desc);
1088
1089        ipsec_esp_unmap(dev, edesc, req, false);
1090
1091        /* check ICV auth status */
1092        if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=
1093                     DESC_HDR_LO_ICCR1_PASS))
1094                err = -EBADMSG;
1095
1096        kfree(edesc);
1097
1098        aead_request_complete(req, err);
1099}
1100
1101/*
1102 * convert scatterlist to SEC h/w link table format
1103 * stop at cryptlen bytes
1104 */
1105static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count,
1106                                 unsigned int offset, int datalen, int elen,
1107                                 struct talitos_ptr *link_tbl_ptr)
1108{
1109        int n_sg = elen ? sg_count + 1 : sg_count;
1110        int count = 0;
1111        int cryptlen = datalen + elen;
1112
1113        while (cryptlen && sg && n_sg--) {
1114                unsigned int len = sg_dma_len(sg);
1115
1116                if (offset >= len) {
1117                        offset -= len;
1118                        goto next;
1119                }
1120
1121                len -= offset;
1122
1123                if (len > cryptlen)
1124                        len = cryptlen;
1125
1126                if (datalen > 0 && len > datalen) {
1127                        to_talitos_ptr(link_tbl_ptr + count,
1128                                       sg_dma_address(sg) + offset, datalen, 0);
1129                        to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1130                        count++;
1131                        len -= datalen;
1132                        offset += datalen;
1133                }
1134                to_talitos_ptr(link_tbl_ptr + count,
1135                               sg_dma_address(sg) + offset, len, 0);
1136                to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1137                count++;
1138                cryptlen -= len;
1139                datalen -= len;
1140                offset = 0;
1141
1142next:
1143                sg = sg_next(sg);
1144        }
1145
1146        /* tag end of link table */
1147        if (count > 0)
1148                to_talitos_ptr_ext_set(link_tbl_ptr + count - 1,
1149                                       DESC_PTR_LNKTBL_RET, 0);
1150
1151        return count;
1152}
1153
1154static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src,
1155                              unsigned int len, struct talitos_edesc *edesc,
1156                              struct talitos_ptr *ptr, int sg_count,
1157                              unsigned int offset, int tbl_off, int elen,
1158                              bool force)
1159{
1160        struct talitos_private *priv = dev_get_drvdata(dev);
1161        bool is_sec1 = has_ftr_sec1(priv);
1162
1163        if (!src) {
1164                to_talitos_ptr(ptr, 0, 0, is_sec1);
1165                return 1;
1166        }
1167        to_talitos_ptr_ext_set(ptr, elen, is_sec1);
1168        if (sg_count == 1 && !force) {
1169                to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1);
1170                return sg_count;
1171        }
1172        if (is_sec1) {
1173                to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1);
1174                return sg_count;
1175        }
1176        sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, elen,
1177                                         &edesc->link_tbl[tbl_off]);
1178        if (sg_count == 1 && !force) {
1179                /* Only one segment now, so no link tbl needed*/
1180                copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1);
1181                return sg_count;
1182        }
1183        to_talitos_ptr(ptr, edesc->dma_link_tbl +
1184                            tbl_off * sizeof(struct talitos_ptr), len, is_sec1);
1185        to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1);
1186
1187        return sg_count;
1188}
1189
1190static int talitos_sg_map(struct device *dev, struct scatterlist *src,
1191                          unsigned int len, struct talitos_edesc *edesc,
1192                          struct talitos_ptr *ptr, int sg_count,
1193                          unsigned int offset, int tbl_off)
1194{
1195        return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset,
1196                                  tbl_off, 0, false);
1197}
1198
1199/*
1200 * fill in and submit ipsec_esp descriptor
1201 */
1202static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1203                     bool encrypt,
1204                     void (*callback)(struct device *dev,
1205                                      struct talitos_desc *desc,
1206                                      void *context, int error))
1207{
1208        struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1209        unsigned int authsize = crypto_aead_authsize(aead);
1210        struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1211        struct device *dev = ctx->dev;
1212        struct talitos_desc *desc = &edesc->desc;
1213        unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1214        unsigned int ivsize = crypto_aead_ivsize(aead);
1215        int tbl_off = 0;
1216        int sg_count, ret;
1217        int elen = 0;
1218        bool sync_needed = false;
1219        struct talitos_private *priv = dev_get_drvdata(dev);
1220        bool is_sec1 = has_ftr_sec1(priv);
1221        bool is_ipsec_esp = desc->hdr & DESC_HDR_TYPE_IPSEC_ESP;
1222        struct talitos_ptr *civ_ptr = &desc->ptr[is_ipsec_esp ? 2 : 3];
1223        struct talitos_ptr *ckey_ptr = &desc->ptr[is_ipsec_esp ? 3 : 2];
1224        dma_addr_t dma_icv = edesc->dma_link_tbl + edesc->dma_len - authsize;
1225
1226        /* hmac key */
1227        to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1);
1228
1229        sg_count = edesc->src_nents ?: 1;
1230        if (is_sec1 && sg_count > 1)
1231                sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1232                                  areq->assoclen + cryptlen);
1233        else
1234                sg_count = dma_map_sg(dev, areq->src, sg_count,
1235                                      (areq->src == areq->dst) ?
1236                                      DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1237
1238        /* hmac data */
1239        ret = talitos_sg_map(dev, areq->src, areq->assoclen, edesc,
1240                             &desc->ptr[1], sg_count, 0, tbl_off);
1241
1242        if (ret > 1) {
1243                tbl_off += ret;
1244                sync_needed = true;
1245        }
1246
1247        /* cipher iv */
1248        to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1);
1249
1250        /* cipher key */
1251        to_talitos_ptr(ckey_ptr, ctx->dma_key  + ctx->authkeylen,
1252                       ctx->enckeylen, is_sec1);
1253
1254        /*
1255         * cipher in
1256         * map and adjust cipher len to aead request cryptlen.
1257         * extent is bytes of HMAC postpended to ciphertext,
1258         * typically 12 for ipsec
1259         */
1260        if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV))
1261                elen = authsize;
1262
1263        ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4],
1264                                 sg_count, areq->assoclen, tbl_off, elen,
1265                                 false);
1266
1267        if (ret > 1) {
1268                tbl_off += ret;
1269                sync_needed = true;
1270        }
1271
1272        /* cipher out */
1273        if (areq->src != areq->dst) {
1274                sg_count = edesc->dst_nents ? : 1;
1275                if (!is_sec1 || sg_count == 1)
1276                        dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1277        }
1278
1279        if (is_ipsec_esp && encrypt)
1280                elen = authsize;
1281        else
1282                elen = 0;
1283        ret = talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5],
1284                                 sg_count, areq->assoclen, tbl_off, elen,
1285                                 is_ipsec_esp && !encrypt);
1286        tbl_off += ret;
1287
1288        if (!encrypt && is_ipsec_esp) {
1289                struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
1290
1291                /* Add an entry to the link table for ICV data */
1292                to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1);
1293                to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1);
1294
1295                /* icv data follows link tables */
1296                to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1);
1297                to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1);
1298                sync_needed = true;
1299        } else if (!encrypt) {
1300                to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1);
1301                sync_needed = true;
1302        } else if (!is_ipsec_esp) {
1303                talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6],
1304                               sg_count, areq->assoclen + cryptlen, tbl_off);
1305        }
1306
1307        /* iv out */
1308        if (is_ipsec_esp)
1309                map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
1310                                       DMA_FROM_DEVICE);
1311
1312        if (sync_needed)
1313                dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1314                                           edesc->dma_len,
1315                                           DMA_BIDIRECTIONAL);
1316
1317        ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1318        if (ret != -EINPROGRESS) {
1319                ipsec_esp_unmap(dev, edesc, areq, encrypt);
1320                kfree(edesc);
1321        }
1322        return ret;
1323}
1324
1325/*
1326 * allocate and map the extended descriptor
1327 */
1328static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
1329                                                 struct scatterlist *src,
1330                                                 struct scatterlist *dst,
1331                                                 u8 *iv,
1332                                                 unsigned int assoclen,
1333                                                 unsigned int cryptlen,
1334                                                 unsigned int authsize,
1335                                                 unsigned int ivsize,
1336                                                 int icv_stashing,
1337                                                 u32 cryptoflags,
1338                                                 bool encrypt)
1339{
1340        struct talitos_edesc *edesc;
1341        int src_nents, dst_nents, alloc_len, dma_len, src_len, dst_len;
1342        dma_addr_t iv_dma = 0;
1343        gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
1344                      GFP_ATOMIC;
1345        struct talitos_private *priv = dev_get_drvdata(dev);
1346        bool is_sec1 = has_ftr_sec1(priv);
1347        int max_len = is_sec1 ? TALITOS1_MAX_DATA_LEN : TALITOS2_MAX_DATA_LEN;
1348
1349        if (cryptlen + authsize > max_len) {
1350                dev_err(dev, "length exceeds h/w max limit\n");
1351                return ERR_PTR(-EINVAL);
1352        }
1353
1354        if (!dst || dst == src) {
1355                src_len = assoclen + cryptlen + authsize;
1356                src_nents = sg_nents_for_len(src, src_len);
1357                if (src_nents < 0) {
1358                        dev_err(dev, "Invalid number of src SG.\n");
1359                        return ERR_PTR(-EINVAL);
1360                }
1361                src_nents = (src_nents == 1) ? 0 : src_nents;
1362                dst_nents = dst ? src_nents : 0;
1363                dst_len = 0;
1364        } else { /* dst && dst != src*/
1365                src_len = assoclen + cryptlen + (encrypt ? 0 : authsize);
1366                src_nents = sg_nents_for_len(src, src_len);
1367                if (src_nents < 0) {
1368                        dev_err(dev, "Invalid number of src SG.\n");
1369                        return ERR_PTR(-EINVAL);
1370                }
1371                src_nents = (src_nents == 1) ? 0 : src_nents;
1372                dst_len = assoclen + cryptlen + (encrypt ? authsize : 0);
1373                dst_nents = sg_nents_for_len(dst, dst_len);
1374                if (dst_nents < 0) {
1375                        dev_err(dev, "Invalid number of dst SG.\n");
1376                        return ERR_PTR(-EINVAL);
1377                }
1378                dst_nents = (dst_nents == 1) ? 0 : dst_nents;
1379        }
1380
1381        /*
1382         * allocate space for base edesc plus the link tables,
1383         * allowing for two separate entries for AD and generated ICV (+ 2),
1384         * and space for two sets of ICVs (stashed and generated)
1385         */
1386        alloc_len = sizeof(struct talitos_edesc);
1387        if (src_nents || dst_nents || !encrypt) {
1388                if (is_sec1)
1389                        dma_len = (src_nents ? src_len : 0) +
1390                                  (dst_nents ? dst_len : 0) + authsize;
1391                else
1392                        dma_len = (src_nents + dst_nents + 2) *
1393                                  sizeof(struct talitos_ptr) + authsize;
1394                alloc_len += dma_len;
1395        } else {
1396                dma_len = 0;
1397        }
1398        alloc_len += icv_stashing ? authsize : 0;
1399
1400        /* if its a ahash, add space for a second desc next to the first one */
1401        if (is_sec1 && !dst)
1402                alloc_len += sizeof(struct talitos_desc);
1403        alloc_len += ivsize;
1404
1405        edesc = kmalloc(alloc_len, GFP_DMA | flags);
1406        if (!edesc)
1407                return ERR_PTR(-ENOMEM);
1408        if (ivsize) {
1409                iv = memcpy(((u8 *)edesc) + alloc_len - ivsize, iv, ivsize);
1410                iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
1411        }
1412        memset(&edesc->desc, 0, sizeof(edesc->desc));
1413
1414        edesc->src_nents = src_nents;
1415        edesc->dst_nents = dst_nents;
1416        edesc->iv_dma = iv_dma;
1417        edesc->dma_len = dma_len;
1418        if (dma_len)
1419                edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0],
1420                                                     edesc->dma_len,
1421                                                     DMA_BIDIRECTIONAL);
1422
1423        return edesc;
1424}
1425
1426static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
1427                                              int icv_stashing, bool encrypt)
1428{
1429        struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1430        unsigned int authsize = crypto_aead_authsize(authenc);
1431        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1432        unsigned int ivsize = crypto_aead_ivsize(authenc);
1433        unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1434
1435        return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1436                                   iv, areq->assoclen, cryptlen,
1437                                   authsize, ivsize, icv_stashing,
1438                                   areq->base.flags, encrypt);
1439}
1440
1441static int aead_encrypt(struct aead_request *req)
1442{
1443        struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1444        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1445        struct talitos_edesc *edesc;
1446
1447        /* allocate extended descriptor */
1448        edesc = aead_edesc_alloc(req, req->iv, 0, true);
1449        if (IS_ERR(edesc))
1450                return PTR_ERR(edesc);
1451
1452        /* set encrypt */
1453        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1454
1455        return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done);
1456}
1457
1458static int aead_decrypt(struct aead_request *req)
1459{
1460        struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1461        unsigned int authsize = crypto_aead_authsize(authenc);
1462        struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1463        struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1464        struct talitos_edesc *edesc;
1465        void *icvdata;
1466
1467        /* allocate extended descriptor */
1468        edesc = aead_edesc_alloc(req, req->iv, 1, false);
1469        if (IS_ERR(edesc))
1470                return PTR_ERR(edesc);
1471
1472        if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) &&
1473            (priv->features & TALITOS_FTR_HW_AUTH_CHECK) &&
1474            ((!edesc->src_nents && !edesc->dst_nents) ||
1475             priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) {
1476
1477                /* decrypt and check the ICV */
1478                edesc->desc.hdr = ctx->desc_hdr_template |
1479                                  DESC_HDR_DIR_INBOUND |
1480                                  DESC_HDR_MODE1_MDEU_CICV;
1481
1482                /* reset integrity check result bits */
1483
1484                return ipsec_esp(edesc, req, false,
1485                                 ipsec_esp_decrypt_hwauth_done);
1486        }
1487
1488        /* Have to check the ICV with software */
1489        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1490
1491        /* stash incoming ICV for later cmp with ICV generated by the h/w */
1492        icvdata = edesc->buf + edesc->dma_len;
1493
1494        sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize,
1495                           req->assoclen + req->cryptlen - authsize);
1496
1497        return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done);
1498}
1499
1500static int ablkcipher_setkey(struct crypto_ablkcipher *cipher,
1501                             const u8 *key, unsigned int keylen)
1502{
1503        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1504        struct device *dev = ctx->dev;
1505
1506        if (ctx->keylen)
1507                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
1508
1509        memcpy(&ctx->key, key, keylen);
1510        ctx->keylen = keylen;
1511
1512        ctx->dma_key = dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE);
1513
1514        return 0;
1515}
1516
1517static int ablkcipher_des_setkey(struct crypto_ablkcipher *cipher,
1518                                 const u8 *key, unsigned int keylen)
1519{
1520        u32 tmp[DES_EXPKEY_WORDS];
1521
1522        if (unlikely(crypto_ablkcipher_get_flags(cipher) &
1523                     CRYPTO_TFM_REQ_FORBID_WEAK_KEYS) &&
1524            !des_ekey(tmp, key)) {
1525                crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_WEAK_KEY);
1526                return -EINVAL;
1527        }
1528
1529        return ablkcipher_setkey(cipher, key, keylen);
1530}
1531
1532static int ablkcipher_des3_setkey(struct crypto_ablkcipher *cipher,
1533                                  const u8 *key, unsigned int keylen)
1534{
1535        u32 flags;
1536        int err;
1537
1538        flags = crypto_ablkcipher_get_flags(cipher);
1539        err = __des3_verify_key(&flags, key);
1540        if (unlikely(err)) {
1541                crypto_ablkcipher_set_flags(cipher, flags);
1542                return err;
1543        }
1544
1545        return ablkcipher_setkey(cipher, key, keylen);
1546}
1547
1548static int ablkcipher_aes_setkey(struct crypto_ablkcipher *cipher,
1549                                  const u8 *key, unsigned int keylen)
1550{
1551        if (keylen == AES_KEYSIZE_128 || keylen == AES_KEYSIZE_192 ||
1552            keylen == AES_KEYSIZE_256)
1553                return ablkcipher_setkey(cipher, key, keylen);
1554
1555        crypto_ablkcipher_set_flags(cipher, CRYPTO_TFM_RES_BAD_KEY_LEN);
1556
1557        return -EINVAL;
1558}
1559
1560static void common_nonsnoop_unmap(struct device *dev,
1561                                  struct talitos_edesc *edesc,
1562                                  struct ablkcipher_request *areq)
1563{
1564        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1565
1566        talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->nbytes, 0);
1567        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE);
1568
1569        if (edesc->dma_len)
1570                dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1571                                 DMA_BIDIRECTIONAL);
1572}
1573
1574static void ablkcipher_done(struct device *dev,
1575                            struct talitos_desc *desc, void *context,
1576                            int err)
1577{
1578        struct ablkcipher_request *areq = context;
1579        struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1580        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1581        unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1582        struct talitos_edesc *edesc;
1583
1584        edesc = container_of(desc, struct talitos_edesc, desc);
1585
1586        common_nonsnoop_unmap(dev, edesc, areq);
1587        memcpy(areq->info, ctx->iv, ivsize);
1588
1589        kfree(edesc);
1590
1591        areq->base.complete(&areq->base, err);
1592}
1593
1594static int common_nonsnoop(struct talitos_edesc *edesc,
1595                           struct ablkcipher_request *areq,
1596                           void (*callback) (struct device *dev,
1597                                             struct talitos_desc *desc,
1598                                             void *context, int error))
1599{
1600        struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1601        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1602        struct device *dev = ctx->dev;
1603        struct talitos_desc *desc = &edesc->desc;
1604        unsigned int cryptlen = areq->nbytes;
1605        unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1606        int sg_count, ret;
1607        bool sync_needed = false;
1608        struct talitos_private *priv = dev_get_drvdata(dev);
1609        bool is_sec1 = has_ftr_sec1(priv);
1610
1611        /* first DWORD empty */
1612
1613        /* cipher iv */
1614        to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1);
1615
1616        /* cipher key */
1617        to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1);
1618
1619        sg_count = edesc->src_nents ?: 1;
1620        if (is_sec1 && sg_count > 1)
1621                sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1622                                  cryptlen);
1623        else
1624                sg_count = dma_map_sg(dev, areq->src, sg_count,
1625                                      (areq->src == areq->dst) ?
1626                                      DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1627        /*
1628         * cipher in
1629         */
1630        sg_count = talitos_sg_map(dev, areq->src, cryptlen, edesc,
1631                                  &desc->ptr[3], sg_count, 0, 0);
1632        if (sg_count > 1)
1633                sync_needed = true;
1634
1635        /* cipher out */
1636        if (areq->src != areq->dst) {
1637                sg_count = edesc->dst_nents ? : 1;
1638                if (!is_sec1 || sg_count == 1)
1639                        dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1640        }
1641
1642        ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4],
1643                             sg_count, 0, (edesc->src_nents + 1));
1644        if (ret > 1)
1645                sync_needed = true;
1646
1647        /* iv out */
1648        map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv,
1649                               DMA_FROM_DEVICE);
1650
1651        /* last DWORD empty */
1652
1653        if (sync_needed)
1654                dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1655                                           edesc->dma_len, DMA_BIDIRECTIONAL);
1656
1657        ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1658        if (ret != -EINPROGRESS) {
1659                common_nonsnoop_unmap(dev, edesc, areq);
1660                kfree(edesc);
1661        }
1662        return ret;
1663}
1664
1665static struct talitos_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request *
1666                                                    areq, bool encrypt)
1667{
1668        struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1669        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1670        unsigned int ivsize = crypto_ablkcipher_ivsize(cipher);
1671
1672        return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1673                                   areq->info, 0, areq->nbytes, 0, ivsize, 0,
1674                                   areq->base.flags, encrypt);
1675}
1676
1677static int ablkcipher_encrypt(struct ablkcipher_request *areq)
1678{
1679        struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1680        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1681        struct talitos_edesc *edesc;
1682        unsigned int blocksize =
1683                        crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(cipher));
1684
1685        if (!areq->nbytes)
1686                return 0;
1687
1688        if (areq->nbytes % blocksize)
1689                return -EINVAL;
1690
1691        /* allocate extended descriptor */
1692        edesc = ablkcipher_edesc_alloc(areq, true);
1693        if (IS_ERR(edesc))
1694                return PTR_ERR(edesc);
1695
1696        /* set encrypt */
1697        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1698
1699        return common_nonsnoop(edesc, areq, ablkcipher_done);
1700}
1701
1702static int ablkcipher_decrypt(struct ablkcipher_request *areq)
1703{
1704        struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq);
1705        struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher);
1706        struct talitos_edesc *edesc;
1707        unsigned int blocksize =
1708                        crypto_tfm_alg_blocksize(crypto_ablkcipher_tfm(cipher));
1709
1710        if (!areq->nbytes)
1711                return 0;
1712
1713        if (areq->nbytes % blocksize)
1714                return -EINVAL;
1715
1716        /* allocate extended descriptor */
1717        edesc = ablkcipher_edesc_alloc(areq, false);
1718        if (IS_ERR(edesc))
1719                return PTR_ERR(edesc);
1720
1721        edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1722
1723        return common_nonsnoop(edesc, areq, ablkcipher_done);
1724}
1725
1726static void common_nonsnoop_hash_unmap(struct device *dev,
1727                                       struct talitos_edesc *edesc,
1728                                       struct ahash_request *areq)
1729{
1730        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1731        struct talitos_private *priv = dev_get_drvdata(dev);
1732        bool is_sec1 = has_ftr_sec1(priv);
1733        struct talitos_desc *desc = &edesc->desc;
1734        struct talitos_desc *desc2 = (struct talitos_desc *)
1735                                     (edesc->buf + edesc->dma_len);
1736
1737        unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1738        if (desc->next_desc &&
1739            desc->ptr[5].ptr != desc2->ptr[5].ptr)
1740                unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE);
1741
1742        if (req_ctx->psrc)
1743                talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0);
1744
1745        /* When using hashctx-in, must unmap it. */
1746        if (from_talitos_ptr_len(&edesc->desc.ptr[1], is_sec1))
1747                unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1],
1748                                         DMA_TO_DEVICE);
1749        else if (desc->next_desc)
1750                unmap_single_talitos_ptr(dev, &desc2->ptr[1],
1751                                         DMA_TO_DEVICE);
1752
1753        if (is_sec1 && req_ctx->nbuf)
1754                unmap_single_talitos_ptr(dev, &desc->ptr[3],
1755                                         DMA_TO_DEVICE);
1756
1757        if (edesc->dma_len)
1758                dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1759                                 DMA_BIDIRECTIONAL);
1760
1761        if (edesc->desc.next_desc)
1762                dma_unmap_single(dev, be32_to_cpu(edesc->desc.next_desc),
1763                                 TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
1764}
1765
1766static void ahash_done(struct device *dev,
1767                       struct talitos_desc *desc, void *context,
1768                       int err)
1769{
1770        struct ahash_request *areq = context;
1771        struct talitos_edesc *edesc =
1772                 container_of(desc, struct talitos_edesc, desc);
1773        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1774
1775        if (!req_ctx->last && req_ctx->to_hash_later) {
1776                /* Position any partial block for next update/final/finup */
1777                req_ctx->buf_idx = (req_ctx->buf_idx + 1) & 1;
1778                req_ctx->nbuf = req_ctx->to_hash_later;
1779        }
1780        common_nonsnoop_hash_unmap(dev, edesc, areq);
1781
1782        kfree(edesc);
1783
1784        areq->base.complete(&areq->base, err);
1785}
1786
1787/*
1788 * SEC1 doesn't like hashing of 0 sized message, so we do the padding
1789 * ourself and submit a padded block
1790 */
1791static void talitos_handle_buggy_hash(struct talitos_ctx *ctx,
1792                               struct talitos_edesc *edesc,
1793                               struct talitos_ptr *ptr)
1794{
1795        static u8 padded_hash[64] = {
1796                0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1797                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1798                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1799                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1800        };
1801
1802        pr_err_once("Bug in SEC1, padding ourself\n");
1803        edesc->desc.hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1804        map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash),
1805                               (char *)padded_hash, DMA_TO_DEVICE);
1806}
1807
1808static int common_nonsnoop_hash(struct talitos_edesc *edesc,
1809                                struct ahash_request *areq, unsigned int length,
1810                                void (*callback) (struct device *dev,
1811                                                  struct talitos_desc *desc,
1812                                                  void *context, int error))
1813{
1814        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1815        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1816        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1817        struct device *dev = ctx->dev;
1818        struct talitos_desc *desc = &edesc->desc;
1819        int ret;
1820        bool sync_needed = false;
1821        struct talitos_private *priv = dev_get_drvdata(dev);
1822        bool is_sec1 = has_ftr_sec1(priv);
1823        int sg_count;
1824
1825        /* first DWORD empty */
1826
1827        /* hash context in */
1828        if (!req_ctx->first || req_ctx->swinit) {
1829                map_single_talitos_ptr_nosync(dev, &desc->ptr[1],
1830                                              req_ctx->hw_context_size,
1831                                              req_ctx->hw_context,
1832                                              DMA_TO_DEVICE);
1833                req_ctx->swinit = 0;
1834        }
1835        /* Indicate next op is not the first. */
1836        req_ctx->first = 0;
1837
1838        /* HMAC key */
1839        if (ctx->keylen)
1840                to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen,
1841                               is_sec1);
1842
1843        if (is_sec1 && req_ctx->nbuf)
1844                length -= req_ctx->nbuf;
1845
1846        sg_count = edesc->src_nents ?: 1;
1847        if (is_sec1 && sg_count > 1)
1848                sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length);
1849        else if (length)
1850                sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count,
1851                                      DMA_TO_DEVICE);
1852        /*
1853         * data in
1854         */
1855        if (is_sec1 && req_ctx->nbuf) {
1856                map_single_talitos_ptr(dev, &desc->ptr[3], req_ctx->nbuf,
1857                                       req_ctx->buf[req_ctx->buf_idx],
1858                                       DMA_TO_DEVICE);
1859        } else {
1860                sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1861                                          &desc->ptr[3], sg_count, 0, 0);
1862                if (sg_count > 1)
1863                        sync_needed = true;
1864        }
1865
1866        /* fifth DWORD empty */
1867
1868        /* hash/HMAC out -or- hash context out */
1869        if (req_ctx->last)
1870                map_single_talitos_ptr(dev, &desc->ptr[5],
1871                                       crypto_ahash_digestsize(tfm),
1872                                       areq->result, DMA_FROM_DEVICE);
1873        else
1874                map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1875                                              req_ctx->hw_context_size,
1876                                              req_ctx->hw_context,
1877                                              DMA_FROM_DEVICE);
1878
1879        /* last DWORD empty */
1880
1881        if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) == 0)
1882                talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]);
1883
1884        if (is_sec1 && req_ctx->nbuf && length) {
1885                struct talitos_desc *desc2 = (struct talitos_desc *)
1886                                             (edesc->buf + edesc->dma_len);
1887                dma_addr_t next_desc;
1888
1889                memset(desc2, 0, sizeof(*desc2));
1890                desc2->hdr = desc->hdr;
1891                desc2->hdr &= ~DESC_HDR_MODE0_MDEU_INIT;
1892                desc2->hdr1 = desc2->hdr;
1893                desc->hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1894                desc->hdr |= DESC_HDR_MODE0_MDEU_CONT;
1895                desc->hdr &= ~DESC_HDR_DONE_NOTIFY;
1896
1897                if (desc->ptr[1].ptr)
1898                        copy_talitos_ptr(&desc2->ptr[1], &desc->ptr[1],
1899                                         is_sec1);
1900                else
1901                        map_single_talitos_ptr_nosync(dev, &desc2->ptr[1],
1902                                                      req_ctx->hw_context_size,
1903                                                      req_ctx->hw_context,
1904                                                      DMA_TO_DEVICE);
1905                copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1);
1906                sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1907                                          &desc2->ptr[3], sg_count, 0, 0);
1908                if (sg_count > 1)
1909                        sync_needed = true;
1910                copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1);
1911                if (req_ctx->last)
1912                        map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1913                                                      req_ctx->hw_context_size,
1914                                                      req_ctx->hw_context,
1915                                                      DMA_FROM_DEVICE);
1916
1917                next_desc = dma_map_single(dev, &desc2->hdr1, TALITOS_DESC_SIZE,
1918                                           DMA_BIDIRECTIONAL);
1919                desc->next_desc = cpu_to_be32(next_desc);
1920        }
1921
1922        if (sync_needed)
1923                dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1924                                           edesc->dma_len, DMA_BIDIRECTIONAL);
1925
1926        ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1927        if (ret != -EINPROGRESS) {
1928                common_nonsnoop_hash_unmap(dev, edesc, areq);
1929                kfree(edesc);
1930        }
1931        return ret;
1932}
1933
1934static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
1935                                               unsigned int nbytes)
1936{
1937        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1938        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1939        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1940        struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1941        bool is_sec1 = has_ftr_sec1(priv);
1942
1943        if (is_sec1)
1944                nbytes -= req_ctx->nbuf;
1945
1946        return talitos_edesc_alloc(ctx->dev, req_ctx->psrc, NULL, NULL, 0,
1947                                   nbytes, 0, 0, 0, areq->base.flags, false);
1948}
1949
1950static int ahash_init(struct ahash_request *areq)
1951{
1952        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1953        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1954        struct device *dev = ctx->dev;
1955        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1956        unsigned int size;
1957        dma_addr_t dma;
1958
1959        /* Initialize the context */
1960        req_ctx->buf_idx = 0;
1961        req_ctx->nbuf = 0;
1962        req_ctx->first = 1; /* first indicates h/w must init its context */
1963        req_ctx->swinit = 0; /* assume h/w init of context */
1964        size =  (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
1965                        ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
1966                        : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
1967        req_ctx->hw_context_size = size;
1968
1969        dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
1970                             DMA_TO_DEVICE);
1971        dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
1972
1973        return 0;
1974}
1975
1976/*
1977 * on h/w without explicit sha224 support, we initialize h/w context
1978 * manually with sha224 constants, and tell it to run sha256.
1979 */
1980static int ahash_init_sha224_swinit(struct ahash_request *areq)
1981{
1982        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1983
1984        req_ctx->hw_context[0] = SHA224_H0;
1985        req_ctx->hw_context[1] = SHA224_H1;
1986        req_ctx->hw_context[2] = SHA224_H2;
1987        req_ctx->hw_context[3] = SHA224_H3;
1988        req_ctx->hw_context[4] = SHA224_H4;
1989        req_ctx->hw_context[5] = SHA224_H5;
1990        req_ctx->hw_context[6] = SHA224_H6;
1991        req_ctx->hw_context[7] = SHA224_H7;
1992
1993        /* init 64-bit count */
1994        req_ctx->hw_context[8] = 0;
1995        req_ctx->hw_context[9] = 0;
1996
1997        ahash_init(areq);
1998        req_ctx->swinit = 1;/* prevent h/w initting context with sha256 values*/
1999
2000        return 0;
2001}
2002
2003static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes)
2004{
2005        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2006        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2007        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2008        struct talitos_edesc *edesc;
2009        unsigned int blocksize =
2010                        crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2011        unsigned int nbytes_to_hash;
2012        unsigned int to_hash_later;
2013        unsigned int nsg;
2014        int nents;
2015        struct device *dev = ctx->dev;
2016        struct talitos_private *priv = dev_get_drvdata(dev);
2017        bool is_sec1 = has_ftr_sec1(priv);
2018        u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx];
2019
2020        if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) {
2021                /* Buffer up to one whole block */
2022                nents = sg_nents_for_len(areq->src, nbytes);
2023                if (nents < 0) {
2024                        dev_err(ctx->dev, "Invalid number of src SG.\n");
2025                        return nents;
2026                }
2027                sg_copy_to_buffer(areq->src, nents,
2028                                  ctx_buf + req_ctx->nbuf, nbytes);
2029                req_ctx->nbuf += nbytes;
2030                return 0;
2031        }
2032
2033        /* At least (blocksize + 1) bytes are available to hash */
2034        nbytes_to_hash = nbytes + req_ctx->nbuf;
2035        to_hash_later = nbytes_to_hash & (blocksize - 1);
2036
2037        if (req_ctx->last)
2038                to_hash_later = 0;
2039        else if (to_hash_later)
2040                /* There is a partial block. Hash the full block(s) now */
2041                nbytes_to_hash -= to_hash_later;
2042        else {
2043                /* Keep one block buffered */
2044                nbytes_to_hash -= blocksize;
2045                to_hash_later = blocksize;
2046        }
2047
2048        /* Chain in any previously buffered data */
2049        if (!is_sec1 && req_ctx->nbuf) {
2050                nsg = (req_ctx->nbuf < nbytes_to_hash) ? 2 : 1;
2051                sg_init_table(req_ctx->bufsl, nsg);
2052                sg_set_buf(req_ctx->bufsl, ctx_buf, req_ctx->nbuf);
2053                if (nsg > 1)
2054                        sg_chain(req_ctx->bufsl, 2, areq->src);
2055                req_ctx->psrc = req_ctx->bufsl;
2056        } else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) {
2057                int offset;
2058
2059                if (nbytes_to_hash > blocksize)
2060                        offset = blocksize - req_ctx->nbuf;
2061                else
2062                        offset = nbytes_to_hash - req_ctx->nbuf;
2063                nents = sg_nents_for_len(areq->src, offset);
2064                if (nents < 0) {
2065                        dev_err(ctx->dev, "Invalid number of src SG.\n");
2066                        return nents;
2067                }
2068                sg_copy_to_buffer(areq->src, nents,
2069                                  ctx_buf + req_ctx->nbuf, offset);
2070                req_ctx->nbuf += offset;
2071                req_ctx->psrc = scatterwalk_ffwd(req_ctx->bufsl, areq->src,
2072                                                 offset);
2073        } else
2074                req_ctx->psrc = areq->src;
2075
2076        if (to_hash_later) {
2077                nents = sg_nents_for_len(areq->src, nbytes);
2078                if (nents < 0) {
2079                        dev_err(ctx->dev, "Invalid number of src SG.\n");
2080                        return nents;
2081                }
2082                sg_pcopy_to_buffer(areq->src, nents,
2083                                   req_ctx->buf[(req_ctx->buf_idx + 1) & 1],
2084                                      to_hash_later,
2085                                      nbytes - to_hash_later);
2086        }
2087        req_ctx->to_hash_later = to_hash_later;
2088
2089        /* Allocate extended descriptor */
2090        edesc = ahash_edesc_alloc(areq, nbytes_to_hash);
2091        if (IS_ERR(edesc))
2092                return PTR_ERR(edesc);
2093
2094        edesc->desc.hdr = ctx->desc_hdr_template;
2095
2096        /* On last one, request SEC to pad; otherwise continue */
2097        if (req_ctx->last)
2098                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_PAD;
2099        else
2100                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_CONT;
2101
2102        /* request SEC to INIT hash. */
2103        if (req_ctx->first && !req_ctx->swinit)
2104                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_INIT;
2105
2106        /* When the tfm context has a keylen, it's an HMAC.
2107         * A first or last (ie. not middle) descriptor must request HMAC.
2108         */
2109        if (ctx->keylen && (req_ctx->first || req_ctx->last))
2110                edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC;
2111
2112        return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, ahash_done);
2113}
2114
2115static int ahash_update(struct ahash_request *areq)
2116{
2117        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2118
2119        req_ctx->last = 0;
2120
2121        return ahash_process_req(areq, areq->nbytes);
2122}
2123
2124static int ahash_final(struct ahash_request *areq)
2125{
2126        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2127
2128        req_ctx->last = 1;
2129
2130        return ahash_process_req(areq, 0);
2131}
2132
2133static int ahash_finup(struct ahash_request *areq)
2134{
2135        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2136
2137        req_ctx->last = 1;
2138
2139        return ahash_process_req(areq, areq->nbytes);
2140}
2141
2142static int ahash_digest(struct ahash_request *areq)
2143{
2144        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2145        struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
2146
2147        ahash->init(areq);
2148        req_ctx->last = 1;
2149
2150        return ahash_process_req(areq, areq->nbytes);
2151}
2152
2153static int ahash_export(struct ahash_request *areq, void *out)
2154{
2155        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2156        struct talitos_export_state *export = out;
2157        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2158        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2159        struct device *dev = ctx->dev;
2160        dma_addr_t dma;
2161
2162        dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2163                             DMA_FROM_DEVICE);
2164        dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_FROM_DEVICE);
2165
2166        memcpy(export->hw_context, req_ctx->hw_context,
2167               req_ctx->hw_context_size);
2168        memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf);
2169        export->swinit = req_ctx->swinit;
2170        export->first = req_ctx->first;
2171        export->last = req_ctx->last;
2172        export->to_hash_later = req_ctx->to_hash_later;
2173        export->nbuf = req_ctx->nbuf;
2174
2175        return 0;
2176}
2177
2178static int ahash_import(struct ahash_request *areq, const void *in)
2179{
2180        struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2181        struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2182        struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2183        struct device *dev = ctx->dev;
2184        const struct talitos_export_state *export = in;
2185        unsigned int size;
2186        dma_addr_t dma;
2187
2188        memset(req_ctx, 0, sizeof(*req_ctx));
2189        size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
2190                        ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
2191                        : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
2192        req_ctx->hw_context_size = size;
2193        memcpy(req_ctx->hw_context, export->hw_context, size);
2194        memcpy(req_ctx->buf[0], export->buf, export->nbuf);
2195        req_ctx->swinit = export->swinit;
2196        req_ctx->first = export->first;
2197        req_ctx->last = export->last;
2198        req_ctx->to_hash_later = export->to_hash_later;
2199        req_ctx->nbuf = export->nbuf;
2200
2201        dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2202                             DMA_TO_DEVICE);
2203        dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
2204
2205        return 0;
2206}
2207
2208static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
2209                   u8 *hash)
2210{
2211        struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2212
2213        struct scatterlist sg[1];
2214        struct ahash_request *req;
2215        struct crypto_wait wait;
2216        int ret;
2217
2218        crypto_init_wait(&wait);
2219
2220        req = ahash_request_alloc(tfm, GFP_KERNEL);
2221        if (!req)
2222                return -ENOMEM;
2223
2224        /* Keep tfm keylen == 0 during hash of the long key */
2225        ctx->keylen = 0;
2226        ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2227                                   crypto_req_done, &wait);
2228
2229        sg_init_one(&sg[0], key, keylen);
2230
2231        ahash_request_set_crypt(req, sg, hash, keylen);
2232        ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
2233
2234        ahash_request_free(req);
2235
2236        return ret;
2237}
2238
2239static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
2240                        unsigned int keylen)
2241{
2242        struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2243        struct device *dev = ctx->dev;
2244        unsigned int blocksize =
2245                        crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2246        unsigned int digestsize = crypto_ahash_digestsize(tfm);
2247        unsigned int keysize = keylen;
2248        u8 hash[SHA512_DIGEST_SIZE];
2249        int ret;
2250
2251        if (keylen <= blocksize)
2252                memcpy(ctx->key, key, keysize);
2253        else {
2254                /* Must get the hash of the long key */
2255                ret = keyhash(tfm, key, keylen, hash);
2256
2257                if (ret) {
2258                        crypto_ahash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
2259                        return -EINVAL;
2260                }
2261
2262                keysize = digestsize;
2263                memcpy(ctx->key, hash, digestsize);
2264        }
2265
2266        if (ctx->keylen)
2267                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
2268
2269        ctx->keylen = keysize;
2270        ctx->dma_key = dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE);
2271
2272        return 0;
2273}
2274
2275
2276struct talitos_alg_template {
2277        u32 type;
2278        u32 priority;
2279        union {
2280                struct crypto_alg crypto;
2281                struct ahash_alg hash;
2282                struct aead_alg aead;
2283        } alg;
2284        __be32 desc_hdr_template;
2285};
2286
2287static struct talitos_alg_template driver_algs[] = {
2288        /* AEAD algorithms.  These use a single-pass ipsec_esp descriptor */
2289        {       .type = CRYPTO_ALG_TYPE_AEAD,
2290                .alg.aead = {
2291                        .base = {
2292                                .cra_name = "authenc(hmac(sha1),cbc(aes))",
2293                                .cra_driver_name = "authenc-hmac-sha1-"
2294                                                   "cbc-aes-talitos",
2295                                .cra_blocksize = AES_BLOCK_SIZE,
2296                                .cra_flags = CRYPTO_ALG_ASYNC,
2297                        },
2298                        .ivsize = AES_BLOCK_SIZE,
2299                        .maxauthsize = SHA1_DIGEST_SIZE,
2300                },
2301                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2302                                     DESC_HDR_SEL0_AESU |
2303                                     DESC_HDR_MODE0_AESU_CBC |
2304                                     DESC_HDR_SEL1_MDEUA |
2305                                     DESC_HDR_MODE1_MDEU_INIT |
2306                                     DESC_HDR_MODE1_MDEU_PAD |
2307                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2308        },
2309        {       .type = CRYPTO_ALG_TYPE_AEAD,
2310                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2311                .alg.aead = {
2312                        .base = {
2313                                .cra_name = "authenc(hmac(sha1),cbc(aes))",
2314                                .cra_driver_name = "authenc-hmac-sha1-"
2315                                                   "cbc-aes-talitos-hsna",
2316                                .cra_blocksize = AES_BLOCK_SIZE,
2317                                .cra_flags = CRYPTO_ALG_ASYNC,
2318                        },
2319                        .ivsize = AES_BLOCK_SIZE,
2320                        .maxauthsize = SHA1_DIGEST_SIZE,
2321                },
2322                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2323                                     DESC_HDR_SEL0_AESU |
2324                                     DESC_HDR_MODE0_AESU_CBC |
2325                                     DESC_HDR_SEL1_MDEUA |
2326                                     DESC_HDR_MODE1_MDEU_INIT |
2327                                     DESC_HDR_MODE1_MDEU_PAD |
2328                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2329        },
2330        {       .type = CRYPTO_ALG_TYPE_AEAD,
2331                .alg.aead = {
2332                        .base = {
2333                                .cra_name = "authenc(hmac(sha1),"
2334                                            "cbc(des3_ede))",
2335                                .cra_driver_name = "authenc-hmac-sha1-"
2336                                                   "cbc-3des-talitos",
2337                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2338                                .cra_flags = CRYPTO_ALG_ASYNC,
2339                        },
2340                        .ivsize = DES3_EDE_BLOCK_SIZE,
2341                        .maxauthsize = SHA1_DIGEST_SIZE,
2342                        .setkey = aead_des3_setkey,
2343                },
2344                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2345                                     DESC_HDR_SEL0_DEU |
2346                                     DESC_HDR_MODE0_DEU_CBC |
2347                                     DESC_HDR_MODE0_DEU_3DES |
2348                                     DESC_HDR_SEL1_MDEUA |
2349                                     DESC_HDR_MODE1_MDEU_INIT |
2350                                     DESC_HDR_MODE1_MDEU_PAD |
2351                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2352        },
2353        {       .type = CRYPTO_ALG_TYPE_AEAD,
2354                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2355                .alg.aead = {
2356                        .base = {
2357                                .cra_name = "authenc(hmac(sha1),"
2358                                            "cbc(des3_ede))",
2359                                .cra_driver_name = "authenc-hmac-sha1-"
2360                                                   "cbc-3des-talitos-hsna",
2361                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2362                                .cra_flags = CRYPTO_ALG_ASYNC,
2363                        },
2364                        .ivsize = DES3_EDE_BLOCK_SIZE,
2365                        .maxauthsize = SHA1_DIGEST_SIZE,
2366                        .setkey = aead_des3_setkey,
2367                },
2368                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2369                                     DESC_HDR_SEL0_DEU |
2370                                     DESC_HDR_MODE0_DEU_CBC |
2371                                     DESC_HDR_MODE0_DEU_3DES |
2372                                     DESC_HDR_SEL1_MDEUA |
2373                                     DESC_HDR_MODE1_MDEU_INIT |
2374                                     DESC_HDR_MODE1_MDEU_PAD |
2375                                     DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2376        },
2377        {       .type = CRYPTO_ALG_TYPE_AEAD,
2378                .alg.aead = {
2379                        .base = {
2380                                .cra_name = "authenc(hmac(sha224),cbc(aes))",
2381                                .cra_driver_name = "authenc-hmac-sha224-"
2382                                                   "cbc-aes-talitos",
2383                                .cra_blocksize = AES_BLOCK_SIZE,
2384                                .cra_flags = CRYPTO_ALG_ASYNC,
2385                        },
2386                        .ivsize = AES_BLOCK_SIZE,
2387                        .maxauthsize = SHA224_DIGEST_SIZE,
2388                },
2389                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2390                                     DESC_HDR_SEL0_AESU |
2391                                     DESC_HDR_MODE0_AESU_CBC |
2392                                     DESC_HDR_SEL1_MDEUA |
2393                                     DESC_HDR_MODE1_MDEU_INIT |
2394                                     DESC_HDR_MODE1_MDEU_PAD |
2395                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2396        },
2397        {       .type = CRYPTO_ALG_TYPE_AEAD,
2398                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2399                .alg.aead = {
2400                        .base = {
2401                                .cra_name = "authenc(hmac(sha224),cbc(aes))",
2402                                .cra_driver_name = "authenc-hmac-sha224-"
2403                                                   "cbc-aes-talitos-hsna",
2404                                .cra_blocksize = AES_BLOCK_SIZE,
2405                                .cra_flags = CRYPTO_ALG_ASYNC,
2406                        },
2407                        .ivsize = AES_BLOCK_SIZE,
2408                        .maxauthsize = SHA224_DIGEST_SIZE,
2409                },
2410                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2411                                     DESC_HDR_SEL0_AESU |
2412                                     DESC_HDR_MODE0_AESU_CBC |
2413                                     DESC_HDR_SEL1_MDEUA |
2414                                     DESC_HDR_MODE1_MDEU_INIT |
2415                                     DESC_HDR_MODE1_MDEU_PAD |
2416                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2417        },
2418        {       .type = CRYPTO_ALG_TYPE_AEAD,
2419                .alg.aead = {
2420                        .base = {
2421                                .cra_name = "authenc(hmac(sha224),"
2422                                            "cbc(des3_ede))",
2423                                .cra_driver_name = "authenc-hmac-sha224-"
2424                                                   "cbc-3des-talitos",
2425                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2426                                .cra_flags = CRYPTO_ALG_ASYNC,
2427                        },
2428                        .ivsize = DES3_EDE_BLOCK_SIZE,
2429                        .maxauthsize = SHA224_DIGEST_SIZE,
2430                        .setkey = aead_des3_setkey,
2431                },
2432                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2433                                     DESC_HDR_SEL0_DEU |
2434                                     DESC_HDR_MODE0_DEU_CBC |
2435                                     DESC_HDR_MODE0_DEU_3DES |
2436                                     DESC_HDR_SEL1_MDEUA |
2437                                     DESC_HDR_MODE1_MDEU_INIT |
2438                                     DESC_HDR_MODE1_MDEU_PAD |
2439                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2440        },
2441        {       .type = CRYPTO_ALG_TYPE_AEAD,
2442                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2443                .alg.aead = {
2444                        .base = {
2445                                .cra_name = "authenc(hmac(sha224),"
2446                                            "cbc(des3_ede))",
2447                                .cra_driver_name = "authenc-hmac-sha224-"
2448                                                   "cbc-3des-talitos-hsna",
2449                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2450                                .cra_flags = CRYPTO_ALG_ASYNC,
2451                        },
2452                        .ivsize = DES3_EDE_BLOCK_SIZE,
2453                        .maxauthsize = SHA224_DIGEST_SIZE,
2454                        .setkey = aead_des3_setkey,
2455                },
2456                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2457                                     DESC_HDR_SEL0_DEU |
2458                                     DESC_HDR_MODE0_DEU_CBC |
2459                                     DESC_HDR_MODE0_DEU_3DES |
2460                                     DESC_HDR_SEL1_MDEUA |
2461                                     DESC_HDR_MODE1_MDEU_INIT |
2462                                     DESC_HDR_MODE1_MDEU_PAD |
2463                                     DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2464        },
2465        {       .type = CRYPTO_ALG_TYPE_AEAD,
2466                .alg.aead = {
2467                        .base = {
2468                                .cra_name = "authenc(hmac(sha256),cbc(aes))",
2469                                .cra_driver_name = "authenc-hmac-sha256-"
2470                                                   "cbc-aes-talitos",
2471                                .cra_blocksize = AES_BLOCK_SIZE,
2472                                .cra_flags = CRYPTO_ALG_ASYNC,
2473                        },
2474                        .ivsize = AES_BLOCK_SIZE,
2475                        .maxauthsize = SHA256_DIGEST_SIZE,
2476                },
2477                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2478                                     DESC_HDR_SEL0_AESU |
2479                                     DESC_HDR_MODE0_AESU_CBC |
2480                                     DESC_HDR_SEL1_MDEUA |
2481                                     DESC_HDR_MODE1_MDEU_INIT |
2482                                     DESC_HDR_MODE1_MDEU_PAD |
2483                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2484        },
2485        {       .type = CRYPTO_ALG_TYPE_AEAD,
2486                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2487                .alg.aead = {
2488                        .base = {
2489                                .cra_name = "authenc(hmac(sha256),cbc(aes))",
2490                                .cra_driver_name = "authenc-hmac-sha256-"
2491                                                   "cbc-aes-talitos-hsna",
2492                                .cra_blocksize = AES_BLOCK_SIZE,
2493                                .cra_flags = CRYPTO_ALG_ASYNC,
2494                        },
2495                        .ivsize = AES_BLOCK_SIZE,
2496                        .maxauthsize = SHA256_DIGEST_SIZE,
2497                },
2498                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2499                                     DESC_HDR_SEL0_AESU |
2500                                     DESC_HDR_MODE0_AESU_CBC |
2501                                     DESC_HDR_SEL1_MDEUA |
2502                                     DESC_HDR_MODE1_MDEU_INIT |
2503                                     DESC_HDR_MODE1_MDEU_PAD |
2504                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2505        },
2506        {       .type = CRYPTO_ALG_TYPE_AEAD,
2507                .alg.aead = {
2508                        .base = {
2509                                .cra_name = "authenc(hmac(sha256),"
2510                                            "cbc(des3_ede))",
2511                                .cra_driver_name = "authenc-hmac-sha256-"
2512                                                   "cbc-3des-talitos",
2513                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2514                                .cra_flags = CRYPTO_ALG_ASYNC,
2515                        },
2516                        .ivsize = DES3_EDE_BLOCK_SIZE,
2517                        .maxauthsize = SHA256_DIGEST_SIZE,
2518                        .setkey = aead_des3_setkey,
2519                },
2520                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2521                                     DESC_HDR_SEL0_DEU |
2522                                     DESC_HDR_MODE0_DEU_CBC |
2523                                     DESC_HDR_MODE0_DEU_3DES |
2524                                     DESC_HDR_SEL1_MDEUA |
2525                                     DESC_HDR_MODE1_MDEU_INIT |
2526                                     DESC_HDR_MODE1_MDEU_PAD |
2527                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2528        },
2529        {       .type = CRYPTO_ALG_TYPE_AEAD,
2530                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2531                .alg.aead = {
2532                        .base = {
2533                                .cra_name = "authenc(hmac(sha256),"
2534                                            "cbc(des3_ede))",
2535                                .cra_driver_name = "authenc-hmac-sha256-"
2536                                                   "cbc-3des-talitos-hsna",
2537                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2538                                .cra_flags = CRYPTO_ALG_ASYNC,
2539                        },
2540                        .ivsize = DES3_EDE_BLOCK_SIZE,
2541                        .maxauthsize = SHA256_DIGEST_SIZE,
2542                        .setkey = aead_des3_setkey,
2543                },
2544                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2545                                     DESC_HDR_SEL0_DEU |
2546                                     DESC_HDR_MODE0_DEU_CBC |
2547                                     DESC_HDR_MODE0_DEU_3DES |
2548                                     DESC_HDR_SEL1_MDEUA |
2549                                     DESC_HDR_MODE1_MDEU_INIT |
2550                                     DESC_HDR_MODE1_MDEU_PAD |
2551                                     DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2552        },
2553        {       .type = CRYPTO_ALG_TYPE_AEAD,
2554                .alg.aead = {
2555                        .base = {
2556                                .cra_name = "authenc(hmac(sha384),cbc(aes))",
2557                                .cra_driver_name = "authenc-hmac-sha384-"
2558                                                   "cbc-aes-talitos",
2559                                .cra_blocksize = AES_BLOCK_SIZE,
2560                                .cra_flags = CRYPTO_ALG_ASYNC,
2561                        },
2562                        .ivsize = AES_BLOCK_SIZE,
2563                        .maxauthsize = SHA384_DIGEST_SIZE,
2564                },
2565                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2566                                     DESC_HDR_SEL0_AESU |
2567                                     DESC_HDR_MODE0_AESU_CBC |
2568                                     DESC_HDR_SEL1_MDEUB |
2569                                     DESC_HDR_MODE1_MDEU_INIT |
2570                                     DESC_HDR_MODE1_MDEU_PAD |
2571                                     DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2572        },
2573        {       .type = CRYPTO_ALG_TYPE_AEAD,
2574                .alg.aead = {
2575                        .base = {
2576                                .cra_name = "authenc(hmac(sha384),"
2577                                            "cbc(des3_ede))",
2578                                .cra_driver_name = "authenc-hmac-sha384-"
2579                                                   "cbc-3des-talitos",
2580                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2581                                .cra_flags = CRYPTO_ALG_ASYNC,
2582                        },
2583                        .ivsize = DES3_EDE_BLOCK_SIZE,
2584                        .maxauthsize = SHA384_DIGEST_SIZE,
2585                        .setkey = aead_des3_setkey,
2586                },
2587                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2588                                     DESC_HDR_SEL0_DEU |
2589                                     DESC_HDR_MODE0_DEU_CBC |
2590                                     DESC_HDR_MODE0_DEU_3DES |
2591                                     DESC_HDR_SEL1_MDEUB |
2592                                     DESC_HDR_MODE1_MDEU_INIT |
2593                                     DESC_HDR_MODE1_MDEU_PAD |
2594                                     DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2595        },
2596        {       .type = CRYPTO_ALG_TYPE_AEAD,
2597                .alg.aead = {
2598                        .base = {
2599                                .cra_name = "authenc(hmac(sha512),cbc(aes))",
2600                                .cra_driver_name = "authenc-hmac-sha512-"
2601                                                   "cbc-aes-talitos",
2602                                .cra_blocksize = AES_BLOCK_SIZE,
2603                                .cra_flags = CRYPTO_ALG_ASYNC,
2604                        },
2605                        .ivsize = AES_BLOCK_SIZE,
2606                        .maxauthsize = SHA512_DIGEST_SIZE,
2607                },
2608                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2609                                     DESC_HDR_SEL0_AESU |
2610                                     DESC_HDR_MODE0_AESU_CBC |
2611                                     DESC_HDR_SEL1_MDEUB |
2612                                     DESC_HDR_MODE1_MDEU_INIT |
2613                                     DESC_HDR_MODE1_MDEU_PAD |
2614                                     DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2615        },
2616        {       .type = CRYPTO_ALG_TYPE_AEAD,
2617                .alg.aead = {
2618                        .base = {
2619                                .cra_name = "authenc(hmac(sha512),"
2620                                            "cbc(des3_ede))",
2621                                .cra_driver_name = "authenc-hmac-sha512-"
2622                                                   "cbc-3des-talitos",
2623                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2624                                .cra_flags = CRYPTO_ALG_ASYNC,
2625                        },
2626                        .ivsize = DES3_EDE_BLOCK_SIZE,
2627                        .maxauthsize = SHA512_DIGEST_SIZE,
2628                        .setkey = aead_des3_setkey,
2629                },
2630                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2631                                     DESC_HDR_SEL0_DEU |
2632                                     DESC_HDR_MODE0_DEU_CBC |
2633                                     DESC_HDR_MODE0_DEU_3DES |
2634                                     DESC_HDR_SEL1_MDEUB |
2635                                     DESC_HDR_MODE1_MDEU_INIT |
2636                                     DESC_HDR_MODE1_MDEU_PAD |
2637                                     DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2638        },
2639        {       .type = CRYPTO_ALG_TYPE_AEAD,
2640                .alg.aead = {
2641                        .base = {
2642                                .cra_name = "authenc(hmac(md5),cbc(aes))",
2643                                .cra_driver_name = "authenc-hmac-md5-"
2644                                                   "cbc-aes-talitos",
2645                                .cra_blocksize = AES_BLOCK_SIZE,
2646                                .cra_flags = CRYPTO_ALG_ASYNC,
2647                        },
2648                        .ivsize = AES_BLOCK_SIZE,
2649                        .maxauthsize = MD5_DIGEST_SIZE,
2650                },
2651                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2652                                     DESC_HDR_SEL0_AESU |
2653                                     DESC_HDR_MODE0_AESU_CBC |
2654                                     DESC_HDR_SEL1_MDEUA |
2655                                     DESC_HDR_MODE1_MDEU_INIT |
2656                                     DESC_HDR_MODE1_MDEU_PAD |
2657                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2658        },
2659        {       .type = CRYPTO_ALG_TYPE_AEAD,
2660                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2661                .alg.aead = {
2662                        .base = {
2663                                .cra_name = "authenc(hmac(md5),cbc(aes))",
2664                                .cra_driver_name = "authenc-hmac-md5-"
2665                                                   "cbc-aes-talitos-hsna",
2666                                .cra_blocksize = AES_BLOCK_SIZE,
2667                                .cra_flags = CRYPTO_ALG_ASYNC,
2668                        },
2669                        .ivsize = AES_BLOCK_SIZE,
2670                        .maxauthsize = MD5_DIGEST_SIZE,
2671                },
2672                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2673                                     DESC_HDR_SEL0_AESU |
2674                                     DESC_HDR_MODE0_AESU_CBC |
2675                                     DESC_HDR_SEL1_MDEUA |
2676                                     DESC_HDR_MODE1_MDEU_INIT |
2677                                     DESC_HDR_MODE1_MDEU_PAD |
2678                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2679        },
2680        {       .type = CRYPTO_ALG_TYPE_AEAD,
2681                .alg.aead = {
2682                        .base = {
2683                                .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2684                                .cra_driver_name = "authenc-hmac-md5-"
2685                                                   "cbc-3des-talitos",
2686                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2687                                .cra_flags = CRYPTO_ALG_ASYNC,
2688                        },
2689                        .ivsize = DES3_EDE_BLOCK_SIZE,
2690                        .maxauthsize = MD5_DIGEST_SIZE,
2691                        .setkey = aead_des3_setkey,
2692                },
2693                .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2694                                     DESC_HDR_SEL0_DEU |
2695                                     DESC_HDR_MODE0_DEU_CBC |
2696                                     DESC_HDR_MODE0_DEU_3DES |
2697                                     DESC_HDR_SEL1_MDEUA |
2698                                     DESC_HDR_MODE1_MDEU_INIT |
2699                                     DESC_HDR_MODE1_MDEU_PAD |
2700                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2701        },
2702        {       .type = CRYPTO_ALG_TYPE_AEAD,
2703                .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2704                .alg.aead = {
2705                        .base = {
2706                                .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2707                                .cra_driver_name = "authenc-hmac-md5-"
2708                                                   "cbc-3des-talitos-hsna",
2709                                .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2710                                .cra_flags = CRYPTO_ALG_ASYNC,
2711                        },
2712                        .ivsize = DES3_EDE_BLOCK_SIZE,
2713                        .maxauthsize = MD5_DIGEST_SIZE,
2714                        .setkey = aead_des3_setkey,
2715                },
2716                .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2717                                     DESC_HDR_SEL0_DEU |
2718                                     DESC_HDR_MODE0_DEU_CBC |
2719                                     DESC_HDR_MODE0_DEU_3DES |
2720                                     DESC_HDR_SEL1_MDEUA |
2721                                     DESC_HDR_MODE1_MDEU_INIT |
2722                                     DESC_HDR_MODE1_MDEU_PAD |
2723                                     DESC_HDR_MODE1_MDEU_MD5_HMAC,
2724        },
2725        /* ABLKCIPHER algorithms. */
2726        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2727                .alg.crypto = {
2728                        .cra_name = "ecb(aes)",
2729                        .cra_driver_name = "ecb-aes-talitos",
2730                        .cra_blocksize = AES_BLOCK_SIZE,
2731                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2732                                     CRYPTO_ALG_ASYNC,
2733                        .cra_ablkcipher = {
2734                                .min_keysize = AES_MIN_KEY_SIZE,
2735                                .max_keysize = AES_MAX_KEY_SIZE,
2736                                .setkey = ablkcipher_aes_setkey,
2737                        }
2738                },
2739                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2740                                     DESC_HDR_SEL0_AESU,
2741        },
2742        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2743                .alg.crypto = {
2744                        .cra_name = "cbc(aes)",
2745                        .cra_driver_name = "cbc-aes-talitos",
2746                        .cra_blocksize = AES_BLOCK_SIZE,
2747                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2748                                     CRYPTO_ALG_ASYNC,
2749                        .cra_ablkcipher = {
2750                                .min_keysize = AES_MIN_KEY_SIZE,
2751                                .max_keysize = AES_MAX_KEY_SIZE,
2752                                .ivsize = AES_BLOCK_SIZE,
2753                                .setkey = ablkcipher_aes_setkey,
2754                        }
2755                },
2756                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2757                                     DESC_HDR_SEL0_AESU |
2758                                     DESC_HDR_MODE0_AESU_CBC,
2759        },
2760        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2761                .alg.crypto = {
2762                        .cra_name = "ctr(aes)",
2763                        .cra_driver_name = "ctr-aes-talitos",
2764                        .cra_blocksize = 1,
2765                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2766                                     CRYPTO_ALG_ASYNC,
2767                        .cra_ablkcipher = {
2768                                .min_keysize = AES_MIN_KEY_SIZE,
2769                                .max_keysize = AES_MAX_KEY_SIZE,
2770                                .ivsize = AES_BLOCK_SIZE,
2771                                .setkey = ablkcipher_aes_setkey,
2772                        }
2773                },
2774                .desc_hdr_template = DESC_HDR_TYPE_AESU_CTR_NONSNOOP |
2775                                     DESC_HDR_SEL0_AESU |
2776                                     DESC_HDR_MODE0_AESU_CTR,
2777        },
2778        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2779                .alg.crypto = {
2780                        .cra_name = "ecb(des)",
2781                        .cra_driver_name = "ecb-des-talitos",
2782                        .cra_blocksize = DES_BLOCK_SIZE,
2783                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2784                                     CRYPTO_ALG_ASYNC,
2785                        .cra_ablkcipher = {
2786                                .min_keysize = DES_KEY_SIZE,
2787                                .max_keysize = DES_KEY_SIZE,
2788                                .setkey = ablkcipher_des_setkey,
2789                        }
2790                },
2791                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2792                                     DESC_HDR_SEL0_DEU,
2793        },
2794        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2795                .alg.crypto = {
2796                        .cra_name = "cbc(des)",
2797                        .cra_driver_name = "cbc-des-talitos",
2798                        .cra_blocksize = DES_BLOCK_SIZE,
2799                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2800                                     CRYPTO_ALG_ASYNC,
2801                        .cra_ablkcipher = {
2802                                .min_keysize = DES_KEY_SIZE,
2803                                .max_keysize = DES_KEY_SIZE,
2804                                .ivsize = DES_BLOCK_SIZE,
2805                                .setkey = ablkcipher_des_setkey,
2806                        }
2807                },
2808                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2809                                     DESC_HDR_SEL0_DEU |
2810                                     DESC_HDR_MODE0_DEU_CBC,
2811        },
2812        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2813                .alg.crypto = {
2814                        .cra_name = "ecb(des3_ede)",
2815                        .cra_driver_name = "ecb-3des-talitos",
2816                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2817                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2818                                     CRYPTO_ALG_ASYNC,
2819                        .cra_ablkcipher = {
2820                                .min_keysize = DES3_EDE_KEY_SIZE,
2821                                .max_keysize = DES3_EDE_KEY_SIZE,
2822                                .setkey = ablkcipher_des3_setkey,
2823                        }
2824                },
2825                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2826                                     DESC_HDR_SEL0_DEU |
2827                                     DESC_HDR_MODE0_DEU_3DES,
2828        },
2829        {       .type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2830                .alg.crypto = {
2831                        .cra_name = "cbc(des3_ede)",
2832                        .cra_driver_name = "cbc-3des-talitos",
2833                        .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2834                        .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
2835                                     CRYPTO_ALG_ASYNC,
2836                        .cra_ablkcipher = {
2837                                .min_keysize = DES3_EDE_KEY_SIZE,
2838                                .max_keysize = DES3_EDE_KEY_SIZE,
2839                                .ivsize = DES3_EDE_BLOCK_SIZE,
2840                                .setkey = ablkcipher_des3_setkey,
2841                        }
2842                },
2843                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2844                                     DESC_HDR_SEL0_DEU |
2845                                     DESC_HDR_MODE0_DEU_CBC |
2846                                     DESC_HDR_MODE0_DEU_3DES,
2847        },
2848        /* AHASH algorithms. */
2849        {       .type = CRYPTO_ALG_TYPE_AHASH,
2850                .alg.hash = {
2851                        .halg.digestsize = MD5_DIGEST_SIZE,
2852                        .halg.statesize = sizeof(struct talitos_export_state),
2853                        .halg.base = {
2854                                .cra_name = "md5",
2855                                .cra_driver_name = "md5-talitos",
2856                                .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2857                                .cra_flags = CRYPTO_ALG_ASYNC,
2858                        }
2859                },
2860                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2861                                     DESC_HDR_SEL0_MDEUA |
2862                                     DESC_HDR_MODE0_MDEU_MD5,
2863        },
2864        {       .type = CRYPTO_ALG_TYPE_AHASH,
2865                .alg.hash = {
2866                        .halg.digestsize = SHA1_DIGEST_SIZE,
2867                        .halg.statesize = sizeof(struct talitos_export_state),
2868                        .halg.base = {
2869                                .cra_name = "sha1",
2870                                .cra_driver_name = "sha1-talitos",
2871                                .cra_blocksize = SHA1_BLOCK_SIZE,
2872                                .cra_flags = CRYPTO_ALG_ASYNC,
2873                        }
2874                },
2875                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2876                                     DESC_HDR_SEL0_MDEUA |
2877                                     DESC_HDR_MODE0_MDEU_SHA1,
2878        },
2879        {       .type = CRYPTO_ALG_TYPE_AHASH,
2880                .alg.hash = {
2881                        .halg.digestsize = SHA224_DIGEST_SIZE,
2882                        .halg.statesize = sizeof(struct talitos_export_state),
2883                        .halg.base = {
2884                                .cra_name = "sha224",
2885                                .cra_driver_name = "sha224-talitos",
2886                                .cra_blocksize = SHA224_BLOCK_SIZE,
2887                                .cra_flags = CRYPTO_ALG_ASYNC,
2888                        }
2889                },
2890                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2891                                     DESC_HDR_SEL0_MDEUA |
2892                                     DESC_HDR_MODE0_MDEU_SHA224,
2893        },
2894        {       .type = CRYPTO_ALG_TYPE_AHASH,
2895                .alg.hash = {
2896                        .halg.digestsize = SHA256_DIGEST_SIZE,
2897                        .halg.statesize = sizeof(struct talitos_export_state),
2898                        .halg.base = {
2899                                .cra_name = "sha256",
2900                                .cra_driver_name = "sha256-talitos",
2901                                .cra_blocksize = SHA256_BLOCK_SIZE,
2902                                .cra_flags = CRYPTO_ALG_ASYNC,
2903                        }
2904                },
2905                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2906                                     DESC_HDR_SEL0_MDEUA |
2907                                     DESC_HDR_MODE0_MDEU_SHA256,
2908        },
2909        {       .type = CRYPTO_ALG_TYPE_AHASH,
2910                .alg.hash = {
2911                        .halg.digestsize = SHA384_DIGEST_SIZE,
2912                        .halg.statesize = sizeof(struct talitos_export_state),
2913                        .halg.base = {
2914                                .cra_name = "sha384",
2915                                .cra_driver_name = "sha384-talitos",
2916                                .cra_blocksize = SHA384_BLOCK_SIZE,
2917                                .cra_flags = CRYPTO_ALG_ASYNC,
2918                        }
2919                },
2920                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2921                                     DESC_HDR_SEL0_MDEUB |
2922                                     DESC_HDR_MODE0_MDEUB_SHA384,
2923        },
2924        {       .type = CRYPTO_ALG_TYPE_AHASH,
2925                .alg.hash = {
2926                        .halg.digestsize = SHA512_DIGEST_SIZE,
2927                        .halg.statesize = sizeof(struct talitos_export_state),
2928                        .halg.base = {
2929                                .cra_name = "sha512",
2930                                .cra_driver_name = "sha512-talitos",
2931                                .cra_blocksize = SHA512_BLOCK_SIZE,
2932                                .cra_flags = CRYPTO_ALG_ASYNC,
2933                        }
2934                },
2935                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2936                                     DESC_HDR_SEL0_MDEUB |
2937                                     DESC_HDR_MODE0_MDEUB_SHA512,
2938        },
2939        {       .type = CRYPTO_ALG_TYPE_AHASH,
2940                .alg.hash = {
2941                        .halg.digestsize = MD5_DIGEST_SIZE,
2942                        .halg.statesize = sizeof(struct talitos_export_state),
2943                        .halg.base = {
2944                                .cra_name = "hmac(md5)",
2945                                .cra_driver_name = "hmac-md5-talitos",
2946                                .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2947                                .cra_flags = CRYPTO_ALG_ASYNC,
2948                        }
2949                },
2950                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2951                                     DESC_HDR_SEL0_MDEUA |
2952                                     DESC_HDR_MODE0_MDEU_MD5,
2953        },
2954        {       .type = CRYPTO_ALG_TYPE_AHASH,
2955                .alg.hash = {
2956                        .halg.digestsize = SHA1_DIGEST_SIZE,
2957                        .halg.statesize = sizeof(struct talitos_export_state),
2958                        .halg.base = {
2959                                .cra_name = "hmac(sha1)",
2960                                .cra_driver_name = "hmac-sha1-talitos",
2961                                .cra_blocksize = SHA1_BLOCK_SIZE,
2962                                .cra_flags = CRYPTO_ALG_ASYNC,
2963                        }
2964                },
2965                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2966                                     DESC_HDR_SEL0_MDEUA |
2967                                     DESC_HDR_MODE0_MDEU_SHA1,
2968        },
2969        {       .type = CRYPTO_ALG_TYPE_AHASH,
2970                .alg.hash = {
2971                        .halg.digestsize = SHA224_DIGEST_SIZE,
2972                        .halg.statesize = sizeof(struct talitos_export_state),
2973                        .halg.base = {
2974                                .cra_name = "hmac(sha224)",
2975                                .cra_driver_name = "hmac-sha224-talitos",
2976                                .cra_blocksize = SHA224_BLOCK_SIZE,
2977                                .cra_flags = CRYPTO_ALG_ASYNC,
2978                        }
2979                },
2980                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2981                                     DESC_HDR_SEL0_MDEUA |
2982                                     DESC_HDR_MODE0_MDEU_SHA224,
2983        },
2984        {       .type = CRYPTO_ALG_TYPE_AHASH,
2985                .alg.hash = {
2986                        .halg.digestsize = SHA256_DIGEST_SIZE,
2987                        .halg.statesize = sizeof(struct talitos_export_state),
2988                        .halg.base = {
2989                                .cra_name = "hmac(sha256)",
2990                                .cra_driver_name = "hmac-sha256-talitos",
2991                                .cra_blocksize = SHA256_BLOCK_SIZE,
2992                                .cra_flags = CRYPTO_ALG_ASYNC,
2993                        }
2994                },
2995                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2996                                     DESC_HDR_SEL0_MDEUA |
2997                                     DESC_HDR_MODE0_MDEU_SHA256,
2998        },
2999        {       .type = CRYPTO_ALG_TYPE_AHASH,
3000                .alg.hash = {
3001                        .halg.digestsize = SHA384_DIGEST_SIZE,
3002                        .halg.statesize = sizeof(struct talitos_export_state),
3003                        .halg.base = {
3004                                .cra_name = "hmac(sha384)",
3005                                .cra_driver_name = "hmac-sha384-talitos",
3006                                .cra_blocksize = SHA384_BLOCK_SIZE,
3007                                .cra_flags = CRYPTO_ALG_ASYNC,
3008                        }
3009                },
3010                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3011                                     DESC_HDR_SEL0_MDEUB |
3012                                     DESC_HDR_MODE0_MDEUB_SHA384,
3013        },
3014        {       .type = CRYPTO_ALG_TYPE_AHASH,
3015                .alg.hash = {
3016                        .halg.digestsize = SHA512_DIGEST_SIZE,
3017                        .halg.statesize = sizeof(struct talitos_export_state),
3018                        .halg.base = {
3019                                .cra_name = "hmac(sha512)",
3020                                .cra_driver_name = "hmac-sha512-talitos",
3021                                .cra_blocksize = SHA512_BLOCK_SIZE,
3022                                .cra_flags = CRYPTO_ALG_ASYNC,
3023                        }
3024                },
3025                .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3026                                     DESC_HDR_SEL0_MDEUB |
3027                                     DESC_HDR_MODE0_MDEUB_SHA512,
3028        }
3029};
3030
3031struct talitos_crypto_alg {
3032        struct list_head entry;
3033        struct device *dev;
3034        struct talitos_alg_template algt;
3035};
3036
3037static int talitos_init_common(struct talitos_ctx *ctx,
3038                               struct talitos_crypto_alg *talitos_alg)
3039{
3040        struct talitos_private *priv;
3041
3042        /* update context with ptr to dev */
3043        ctx->dev = talitos_alg->dev;
3044
3045        /* assign SEC channel to tfm in round-robin fashion */
3046        priv = dev_get_drvdata(ctx->dev);
3047        ctx->ch = atomic_inc_return(&priv->last_chan) &
3048                  (priv->num_channels - 1);
3049
3050        /* copy descriptor header template value */
3051        ctx->desc_hdr_template = talitos_alg->algt.desc_hdr_template;
3052
3053        /* select done notification */
3054        ctx->desc_hdr_template |= DESC_HDR_DONE_NOTIFY;
3055
3056        return 0;
3057}
3058
3059static int talitos_cra_init(struct crypto_tfm *tfm)
3060{
3061        struct crypto_alg *alg = tfm->__crt_alg;
3062        struct talitos_crypto_alg *talitos_alg;
3063        struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3064
3065        if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_AHASH)
3066                talitos_alg = container_of(__crypto_ahash_alg(alg),
3067                                           struct talitos_crypto_alg,
3068                                           algt.alg.hash);
3069        else
3070                talitos_alg = container_of(alg, struct talitos_crypto_alg,
3071                                           algt.alg.crypto);
3072
3073        return talitos_init_common(ctx, talitos_alg);
3074}
3075
3076static int talitos_cra_init_aead(struct crypto_aead *tfm)
3077{
3078        struct aead_alg *alg = crypto_aead_alg(tfm);
3079        struct talitos_crypto_alg *talitos_alg;
3080        struct talitos_ctx *ctx = crypto_aead_ctx(tfm);
3081
3082        talitos_alg = container_of(alg, struct talitos_crypto_alg,
3083                                   algt.alg.aead);
3084
3085        return talitos_init_common(ctx, talitos_alg);
3086}
3087
3088static int talitos_cra_init_ahash(struct crypto_tfm *tfm)
3089{
3090        struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3091
3092        talitos_cra_init(tfm);
3093
3094        ctx->keylen = 0;
3095        crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
3096                                 sizeof(struct talitos_ahash_req_ctx));
3097
3098        return 0;
3099}
3100
3101static void talitos_cra_exit(struct crypto_tfm *tfm)
3102{
3103        struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3104        struct device *dev = ctx->dev;
3105
3106        if (ctx->keylen)
3107                dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
3108}
3109
3110/*
3111 * given the alg's descriptor header template, determine whether descriptor
3112 * type and primary/secondary execution units required match the hw
3113 * capabilities description provided in the device tree node.
3114 */
3115static int hw_supports(struct device *dev, __be32 desc_hdr_template)
3116{
3117        struct talitos_private *priv = dev_get_drvdata(dev);
3118        int ret;
3119
3120        ret = (1 << DESC_TYPE(desc_hdr_template) & priv->desc_types) &&
3121              (1 << PRIMARY_EU(desc_hdr_template) & priv->exec_units);
3122
3123        if (SECONDARY_EU(desc_hdr_template))
3124                ret = ret && (1 << SECONDARY_EU(desc_hdr_template)
3125                              & priv->exec_units);
3126
3127        return ret;
3128}
3129
3130static int talitos_remove(struct platform_device *ofdev)
3131{
3132        struct device *dev = &ofdev->dev;
3133        struct talitos_private *priv = dev_get_drvdata(dev);
3134        struct talitos_crypto_alg *t_alg, *n;
3135        int i;
3136
3137        list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) {
3138                switch (t_alg->algt.type) {
3139                case CRYPTO_ALG_TYPE_ABLKCIPHER:
3140                        break;
3141                case CRYPTO_ALG_TYPE_AEAD:
3142                        crypto_unregister_aead(&t_alg->algt.alg.aead);
3143                case CRYPTO_ALG_TYPE_AHASH:
3144                        crypto_unregister_ahash(&t_alg->algt.alg.hash);
3145                        break;
3146                }
3147                list_del(&t_alg->entry);
3148        }
3149
3150        if (hw_supports(dev, DESC_HDR_SEL0_RNG))
3151                talitos_unregister_rng(dev);
3152
3153        for (i = 0; i < 2; i++)
3154                if (priv->irq[i]) {
3155                        free_irq(priv->irq[i], dev);
3156                        irq_dispose_mapping(priv->irq[i]);
3157                }
3158
3159        tasklet_kill(&priv->done_task[0]);
3160        if (priv->irq[1])
3161                tasklet_kill(&priv->done_task[1]);
3162
3163        return 0;
3164}
3165
3166static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
3167                                                    struct talitos_alg_template
3168                                                           *template)
3169{
3170        struct talitos_private *priv = dev_get_drvdata(dev);
3171        struct talitos_crypto_alg *t_alg;
3172        struct crypto_alg *alg;
3173
3174        t_alg = devm_kzalloc(dev, sizeof(struct talitos_crypto_alg),
3175                             GFP_KERNEL);
3176        if (!t_alg)
3177                return ERR_PTR(-ENOMEM);
3178
3179        t_alg->algt = *template;
3180
3181        switch (t_alg->algt.type) {
3182        case CRYPTO_ALG_TYPE_ABLKCIPHER:
3183                alg = &t_alg->algt.alg.crypto;
3184                alg->cra_init = talitos_cra_init;
3185                alg->cra_exit = talitos_cra_exit;
3186                alg->cra_type = &crypto_ablkcipher_type;
3187                alg->cra_ablkcipher.setkey = alg->cra_ablkcipher.setkey ?:
3188                                             ablkcipher_setkey;
3189                alg->cra_ablkcipher.encrypt = ablkcipher_encrypt;
3190                alg->cra_ablkcipher.decrypt = ablkcipher_decrypt;
3191                break;
3192        case CRYPTO_ALG_TYPE_AEAD:
3193                alg = &t_alg->algt.alg.aead.base;
3194                alg->cra_exit = talitos_cra_exit;
3195                t_alg->algt.alg.aead.init = talitos_cra_init_aead;
3196                t_alg->algt.alg.aead.setkey = t_alg->algt.alg.aead.setkey ?:
3197                                              aead_setkey;
3198                t_alg->algt.alg.aead.encrypt = aead_encrypt;
3199                t_alg->algt.alg.aead.decrypt = aead_decrypt;
3200                if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3201                    !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) {
3202                        devm_kfree(dev, t_alg);
3203                        return ERR_PTR(-ENOTSUPP);
3204                }
3205                break;
3206        case CRYPTO_ALG_TYPE_AHASH:
3207                alg = &t_alg->algt.alg.hash.halg.base;
3208                alg->cra_init = talitos_cra_init_ahash;
3209                alg->cra_exit = talitos_cra_exit;
3210                t_alg->algt.alg.hash.init = ahash_init;
3211                t_alg->algt.alg.hash.update = ahash_update;
3212                t_alg->algt.alg.hash.final = ahash_final;
3213                t_alg->algt.alg.hash.finup = ahash_finup;
3214                t_alg->algt.alg.hash.digest = ahash_digest;
3215                if (!strncmp(alg->cra_name, "hmac", 4))
3216                        t_alg->algt.alg.hash.setkey = ahash_setkey;
3217                t_alg->algt.alg.hash.import = ahash_import;
3218                t_alg->algt.alg.hash.export = ahash_export;
3219
3220                if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
3221                    !strncmp(alg->cra_name, "hmac", 4)) {
3222                        devm_kfree(dev, t_alg);
3223                        return ERR_PTR(-ENOTSUPP);
3224                }
3225                if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3226                    (!strcmp(alg->cra_name, "sha224") ||
3227                     !strcmp(alg->cra_name, "hmac(sha224)"))) {
3228                        t_alg->algt.alg.hash.init = ahash_init_sha224_swinit;
3229                        t_alg->algt.desc_hdr_template =
3230                                        DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3231                                        DESC_HDR_SEL0_MDEUA |
3232                                        DESC_HDR_MODE0_MDEU_SHA256;
3233                }
3234                break;
3235        default:
3236                dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
3237                devm_kfree(dev, t_alg);
3238                return ERR_PTR(-EINVAL);
3239        }
3240
3241        alg->cra_module = THIS_MODULE;
3242        if (t_alg->algt.priority)
3243                alg->cra_priority = t_alg->algt.priority;
3244        else
3245                alg->cra_priority = TALITOS_CRA_PRIORITY;
3246        if (has_ftr_sec1(priv))
3247                alg->cra_alignmask = 3;
3248        else
3249                alg->cra_alignmask = 0;
3250        alg->cra_ctxsize = sizeof(struct talitos_ctx);
3251        alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY;
3252
3253        t_alg->dev = dev;
3254
3255        return t_alg;
3256}
3257
3258static int talitos_probe_irq(struct platform_device *ofdev)
3259{
3260        struct device *dev = &ofdev->dev;
3261        struct device_node *np = ofdev->dev.of_node;
3262        struct talitos_private *priv = dev_get_drvdata(dev);
3263        int err;
3264        bool is_sec1 = has_ftr_sec1(priv);
3265
3266        priv->irq[0] = irq_of_parse_and_map(np, 0);
3267        if (!priv->irq[0]) {
3268                dev_err(dev, "failed to map irq\n");
3269                return -EINVAL;
3270        }
3271        if (is_sec1) {
3272                err = request_irq(priv->irq[0], talitos1_interrupt_4ch, 0,
3273                                  dev_driver_string(dev), dev);
3274                goto primary_out;
3275        }
3276
3277        priv->irq[1] = irq_of_parse_and_map(np, 1);
3278
3279        /* get the primary irq line */
3280        if (!priv->irq[1]) {
3281                err = request_irq(priv->irq[0], talitos2_interrupt_4ch, 0,
3282                                  dev_driver_string(dev), dev);
3283                goto primary_out;
3284        }
3285
3286        err = request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0,
3287                          dev_driver_string(dev), dev);
3288        if (err)
3289                goto primary_out;
3290
3291        /* get the secondary irq line */
3292        err = request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0,
3293                          dev_driver_string(dev), dev);
3294        if (err) {
3295                dev_err(dev, "failed to request secondary irq\n");
3296                irq_dispose_mapping(priv->irq[1]);
3297                priv->irq[1] = 0;
3298        }
3299
3300        return err;
3301
3302primary_out:
3303        if (err) {
3304                dev_err(dev, "failed to request primary irq\n");
3305                irq_dispose_mapping(priv->irq[0]);
3306                priv->irq[0] = 0;
3307        }
3308
3309        return err;
3310}
3311
3312static int talitos_probe(struct platform_device *ofdev)
3313{
3314        struct device *dev = &ofdev->dev;
3315        struct device_node *np = ofdev->dev.of_node;
3316        struct talitos_private *priv;
3317        int i, err;
3318        int stride;
3319        struct resource *res;
3320
3321        priv = devm_kzalloc(dev, sizeof(struct talitos_private), GFP_KERNEL);
3322        if (!priv)
3323                return -ENOMEM;
3324
3325        INIT_LIST_HEAD(&priv->alg_list);
3326
3327        dev_set_drvdata(dev, priv);
3328
3329        priv->ofdev = ofdev;
3330
3331        spin_lock_init(&priv->reg_lock);
3332
3333        res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
3334        if (!res)
3335                return -ENXIO;
3336        priv->reg = devm_ioremap(dev, res->start, resource_size(res));
3337        if (!priv->reg) {
3338                dev_err(dev, "failed to of_iomap\n");
3339                err = -ENOMEM;
3340                goto err_out;
3341        }
3342
3343        /* get SEC version capabilities from device tree */
3344        of_property_read_u32(np, "fsl,num-channels", &priv->num_channels);
3345        of_property_read_u32(np, "fsl,channel-fifo-len", &priv->chfifo_len);
3346        of_property_read_u32(np, "fsl,exec-units-mask", &priv->exec_units);
3347        of_property_read_u32(np, "fsl,descriptor-types-mask",
3348                             &priv->desc_types);
3349
3350        if (!is_power_of_2(priv->num_channels) || !priv->chfifo_len ||
3351            !priv->exec_units || !priv->desc_types) {
3352                dev_err(dev, "invalid property data in device tree node\n");
3353                err = -EINVAL;
3354                goto err_out;
3355        }
3356
3357        if (of_device_is_compatible(np, "fsl,sec3.0"))
3358                priv->features |= TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT;
3359
3360        if (of_device_is_compatible(np, "fsl,sec2.1"))
3361                priv->features |= TALITOS_FTR_HW_AUTH_CHECK |
3362                                  TALITOS_FTR_SHA224_HWINIT |
3363                                  TALITOS_FTR_HMAC_OK;
3364
3365        if (of_device_is_compatible(np, "fsl,sec1.0"))
3366                priv->features |= TALITOS_FTR_SEC1;
3367
3368        if (of_device_is_compatible(np, "fsl,sec1.2")) {
3369                priv->reg_deu = priv->reg + TALITOS12_DEU;
3370                priv->reg_aesu = priv->reg + TALITOS12_AESU;
3371                priv->reg_mdeu = priv->reg + TALITOS12_MDEU;
3372                stride = TALITOS1_CH_STRIDE;
3373        } else if (of_device_is_compatible(np, "fsl,sec1.0")) {
3374                priv->reg_deu = priv->reg + TALITOS10_DEU;
3375                priv->reg_aesu = priv->reg + TALITOS10_AESU;
3376                priv->reg_mdeu = priv->reg + TALITOS10_MDEU;
3377                priv->reg_afeu = priv->reg + TALITOS10_AFEU;
3378                priv->reg_rngu = priv->reg + TALITOS10_RNGU;
3379                priv->reg_pkeu = priv->reg + TALITOS10_PKEU;
3380                stride = TALITOS1_CH_STRIDE;
3381        } else {
3382                priv->reg_deu = priv->reg + TALITOS2_DEU;
3383                priv->reg_aesu = priv->reg + TALITOS2_AESU;
3384                priv->reg_mdeu = priv->reg + TALITOS2_MDEU;
3385                priv->reg_afeu = priv->reg + TALITOS2_AFEU;
3386                priv->reg_rngu = priv->reg + TALITOS2_RNGU;
3387                priv->reg_pkeu = priv->reg + TALITOS2_PKEU;
3388                priv->reg_keu = priv->reg + TALITOS2_KEU;
3389                priv->reg_crcu = priv->reg + TALITOS2_CRCU;
3390                stride = TALITOS2_CH_STRIDE;
3391        }
3392
3393        err = talitos_probe_irq(ofdev);
3394        if (err)
3395                goto err_out;
3396
3397        if (has_ftr_sec1(priv)) {
3398                if (priv->num_channels == 1)
3399                        tasklet_init(&priv->done_task[0], talitos1_done_ch0,
3400                                     (unsigned long)dev);
3401                else
3402                        tasklet_init(&priv->done_task[0], talitos1_done_4ch,
3403                                     (unsigned long)dev);
3404        } else {
3405                if (priv->irq[1]) {
3406                        tasklet_init(&priv->done_task[0], talitos2_done_ch0_2,
3407                                     (unsigned long)dev);
3408                        tasklet_init(&priv->done_task[1], talitos2_done_ch1_3,
3409                                     (unsigned long)dev);
3410                } else if (priv->num_channels == 1) {
3411                        tasklet_init(&priv->done_task[0], talitos2_done_ch0,
3412                                     (unsigned long)dev);
3413                } else {
3414                        tasklet_init(&priv->done_task[0], talitos2_done_4ch,
3415                                     (unsigned long)dev);
3416                }
3417        }
3418
3419        priv->chan = devm_kcalloc(dev,
3420                                  priv->num_channels,
3421                                  sizeof(struct talitos_channel),
3422                                  GFP_KERNEL);
3423        if (!priv->chan) {
3424                dev_err(dev, "failed to allocate channel management space\n");
3425                err = -ENOMEM;
3426                goto err_out;
3427        }
3428
3429        priv->fifo_len = roundup_pow_of_two(priv->chfifo_len);
3430
3431        for (i = 0; i < priv->num_channels; i++) {
3432                priv->chan[i].reg = priv->reg + stride * (i + 1);
3433                if (!priv->irq[1] || !(i & 1))
3434                        priv->chan[i].reg += TALITOS_CH_BASE_OFFSET;
3435
3436                spin_lock_init(&priv->chan[i].head_lock);
3437                spin_lock_init(&priv->chan[i].tail_lock);
3438
3439                priv->chan[i].fifo = devm_kcalloc(dev,
3440                                                priv->fifo_len,
3441                                                sizeof(struct talitos_request),
3442                                                GFP_KERNEL);
3443                if (!priv->chan[i].fifo) {
3444                        dev_err(dev, "failed to allocate request fifo %d\n", i);
3445                        err = -ENOMEM;
3446                        goto err_out;
3447                }
3448
3449                atomic_set(&priv->chan[i].submit_count,
3450                           -(priv->chfifo_len - 1));
3451        }
3452
3453        dma_set_mask(dev, DMA_BIT_MASK(36));
3454
3455        /* reset and initialize the h/w */
3456        err = init_device(dev);
3457        if (err) {
3458                dev_err(dev, "failed to initialize device\n");
3459                goto err_out;
3460        }
3461
3462        /* register the RNG, if available */
3463        if (hw_supports(dev, DESC_HDR_SEL0_RNG)) {
3464                err = talitos_register_rng(dev);
3465                if (err) {
3466                        dev_err(dev, "failed to register hwrng: %d\n", err);
3467                        goto err_out;
3468                } else
3469                        dev_info(dev, "hwrng\n");
3470        }
3471
3472        /* register crypto algorithms the device supports */
3473        for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3474                if (hw_supports(dev, driver_algs[i].desc_hdr_template)) {
3475                        struct talitos_crypto_alg *t_alg;
3476                        struct crypto_alg *alg = NULL;
3477
3478                        t_alg = talitos_alg_alloc(dev, &driver_algs[i]);
3479                        if (IS_ERR(t_alg)) {
3480                                err = PTR_ERR(t_alg);
3481                                if (err == -ENOTSUPP)
3482                                        continue;
3483                                goto err_out;
3484                        }
3485
3486                        switch (t_alg->algt.type) {
3487                        case CRYPTO_ALG_TYPE_ABLKCIPHER:
3488                                err = crypto_register_alg(
3489                                                &t_alg->algt.alg.crypto);
3490                                alg = &t_alg->algt.alg.crypto;
3491                                break;
3492
3493                        case CRYPTO_ALG_TYPE_AEAD:
3494                                err = crypto_register_aead(
3495                                        &t_alg->algt.alg.aead);
3496                                alg = &t_alg->algt.alg.aead.base;
3497                                break;
3498
3499                        case CRYPTO_ALG_TYPE_AHASH:
3500                                err = crypto_register_ahash(
3501                                                &t_alg->algt.alg.hash);
3502                                alg = &t_alg->algt.alg.hash.halg.base;
3503                                break;
3504                        }
3505                        if (err) {
3506                                dev_err(dev, "%s alg registration failed\n",
3507                                        alg->cra_driver_name);
3508                                devm_kfree(dev, t_alg);
3509                        } else
3510                                list_add_tail(&t_alg->entry, &priv->alg_list);
3511                }
3512        }
3513        if (!list_empty(&priv->alg_list))
3514                dev_info(dev, "%s algorithms registered in /proc/crypto\n",
3515                         (char *)of_get_property(np, "compatible", NULL));
3516
3517        return 0;
3518
3519err_out:
3520        talitos_remove(ofdev);
3521
3522        return err;
3523}
3524
3525static const struct of_device_id talitos_match[] = {
3526#ifdef CONFIG_CRYPTO_DEV_TALITOS1
3527        {
3528                .compatible = "fsl,sec1.0",
3529        },
3530#endif
3531#ifdef CONFIG_CRYPTO_DEV_TALITOS2
3532        {
3533                .compatible = "fsl,sec2.0",
3534        },
3535#endif
3536        {},
3537};
3538MODULE_DEVICE_TABLE(of, talitos_match);
3539
3540static struct platform_driver talitos_driver = {
3541        .driver = {
3542                .name = "talitos",
3543                .of_match_table = talitos_match,
3544        },
3545        .probe = talitos_probe,
3546        .remove = talitos_remove,
3547};
3548
3549module_platform_driver(talitos_driver);
3550
3551MODULE_LICENSE("GPL");
3552MODULE_AUTHOR("Kim Phillips <kim.phillips@freescale.com>");
3553MODULE_DESCRIPTION("Freescale integrated security engine (SEC) driver");
3554