0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/kernel.h>
0016 #include <linux/module.h>
0017 #include <linux/mod_devicetable.h>
0018 #include <linux/device.h>
0019 #include <linux/interrupt.h>
0020 #include <linux/crypto.h>
0021 #include <linux/hw_random.h>
0022 #include <linux/of_address.h>
0023 #include <linux/of_irq.h>
0024 #include <linux/of_platform.h>
0025 #include <linux/dma-mapping.h>
0026 #include <linux/io.h>
0027 #include <linux/spinlock.h>
0028 #include <linux/rtnetlink.h>
0029 #include <linux/slab.h>
0030
0031 #include <crypto/algapi.h>
0032 #include <crypto/aes.h>
0033 #include <crypto/internal/des.h>
0034 #include <crypto/sha1.h>
0035 #include <crypto/sha2.h>
0036 #include <crypto/md5.h>
0037 #include <crypto/internal/aead.h>
0038 #include <crypto/authenc.h>
0039 #include <crypto/internal/skcipher.h>
0040 #include <crypto/hash.h>
0041 #include <crypto/internal/hash.h>
0042 #include <crypto/scatterwalk.h>
0043
0044 #include "talitos.h"
0045
0046 static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
0047 unsigned int len, bool is_sec1)
0048 {
0049 ptr->ptr = cpu_to_be32(lower_32_bits(dma_addr));
0050 if (is_sec1) {
0051 ptr->len1 = cpu_to_be16(len);
0052 } else {
0053 ptr->len = cpu_to_be16(len);
0054 ptr->eptr = upper_32_bits(dma_addr);
0055 }
0056 }
0057
0058 static void copy_talitos_ptr(struct talitos_ptr *dst_ptr,
0059 struct talitos_ptr *src_ptr, bool is_sec1)
0060 {
0061 dst_ptr->ptr = src_ptr->ptr;
0062 if (is_sec1) {
0063 dst_ptr->len1 = src_ptr->len1;
0064 } else {
0065 dst_ptr->len = src_ptr->len;
0066 dst_ptr->eptr = src_ptr->eptr;
0067 }
0068 }
0069
0070 static unsigned short from_talitos_ptr_len(struct talitos_ptr *ptr,
0071 bool is_sec1)
0072 {
0073 if (is_sec1)
0074 return be16_to_cpu(ptr->len1);
0075 else
0076 return be16_to_cpu(ptr->len);
0077 }
0078
0079 static void to_talitos_ptr_ext_set(struct talitos_ptr *ptr, u8 val,
0080 bool is_sec1)
0081 {
0082 if (!is_sec1)
0083 ptr->j_extent = val;
0084 }
0085
0086 static void to_talitos_ptr_ext_or(struct talitos_ptr *ptr, u8 val, bool is_sec1)
0087 {
0088 if (!is_sec1)
0089 ptr->j_extent |= val;
0090 }
0091
0092
0093
0094
0095 static void __map_single_talitos_ptr(struct device *dev,
0096 struct talitos_ptr *ptr,
0097 unsigned int len, void *data,
0098 enum dma_data_direction dir,
0099 unsigned long attrs)
0100 {
0101 dma_addr_t dma_addr = dma_map_single_attrs(dev, data, len, dir, attrs);
0102 struct talitos_private *priv = dev_get_drvdata(dev);
0103 bool is_sec1 = has_ftr_sec1(priv);
0104
0105 to_talitos_ptr(ptr, dma_addr, len, is_sec1);
0106 }
0107
0108 static void map_single_talitos_ptr(struct device *dev,
0109 struct talitos_ptr *ptr,
0110 unsigned int len, void *data,
0111 enum dma_data_direction dir)
0112 {
0113 __map_single_talitos_ptr(dev, ptr, len, data, dir, 0);
0114 }
0115
0116 static void map_single_talitos_ptr_nosync(struct device *dev,
0117 struct talitos_ptr *ptr,
0118 unsigned int len, void *data,
0119 enum dma_data_direction dir)
0120 {
0121 __map_single_talitos_ptr(dev, ptr, len, data, dir,
0122 DMA_ATTR_SKIP_CPU_SYNC);
0123 }
0124
0125
0126
0127
0128 static void unmap_single_talitos_ptr(struct device *dev,
0129 struct talitos_ptr *ptr,
0130 enum dma_data_direction dir)
0131 {
0132 struct talitos_private *priv = dev_get_drvdata(dev);
0133 bool is_sec1 = has_ftr_sec1(priv);
0134
0135 dma_unmap_single(dev, be32_to_cpu(ptr->ptr),
0136 from_talitos_ptr_len(ptr, is_sec1), dir);
0137 }
0138
0139 static int reset_channel(struct device *dev, int ch)
0140 {
0141 struct talitos_private *priv = dev_get_drvdata(dev);
0142 unsigned int timeout = TALITOS_TIMEOUT;
0143 bool is_sec1 = has_ftr_sec1(priv);
0144
0145 if (is_sec1) {
0146 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
0147 TALITOS1_CCCR_LO_RESET);
0148
0149 while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR_LO) &
0150 TALITOS1_CCCR_LO_RESET) && --timeout)
0151 cpu_relax();
0152 } else {
0153 setbits32(priv->chan[ch].reg + TALITOS_CCCR,
0154 TALITOS2_CCCR_RESET);
0155
0156 while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) &
0157 TALITOS2_CCCR_RESET) && --timeout)
0158 cpu_relax();
0159 }
0160
0161 if (timeout == 0) {
0162 dev_err(dev, "failed to reset channel %d\n", ch);
0163 return -EIO;
0164 }
0165
0166
0167 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, TALITOS_CCCR_LO_EAE |
0168 TALITOS_CCCR_LO_CDWE | TALITOS_CCCR_LO_CDIE);
0169
0170 if (is_sec1)
0171 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
0172 TALITOS_CCCR_LO_NE);
0173
0174
0175 if (priv->features & TALITOS_FTR_HW_AUTH_CHECK)
0176 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO,
0177 TALITOS_CCCR_LO_IWSE);
0178
0179 return 0;
0180 }
0181
0182 static int reset_device(struct device *dev)
0183 {
0184 struct talitos_private *priv = dev_get_drvdata(dev);
0185 unsigned int timeout = TALITOS_TIMEOUT;
0186 bool is_sec1 = has_ftr_sec1(priv);
0187 u32 mcr = is_sec1 ? TALITOS1_MCR_SWR : TALITOS2_MCR_SWR;
0188
0189 setbits32(priv->reg + TALITOS_MCR, mcr);
0190
0191 while ((in_be32(priv->reg + TALITOS_MCR) & mcr)
0192 && --timeout)
0193 cpu_relax();
0194
0195 if (priv->irq[1]) {
0196 mcr = TALITOS_MCR_RCA1 | TALITOS_MCR_RCA3;
0197 setbits32(priv->reg + TALITOS_MCR, mcr);
0198 }
0199
0200 if (timeout == 0) {
0201 dev_err(dev, "failed to reset device\n");
0202 return -EIO;
0203 }
0204
0205 return 0;
0206 }
0207
0208
0209
0210
0211 static int init_device(struct device *dev)
0212 {
0213 struct talitos_private *priv = dev_get_drvdata(dev);
0214 int ch, err;
0215 bool is_sec1 = has_ftr_sec1(priv);
0216
0217
0218
0219
0220
0221
0222
0223 err = reset_device(dev);
0224 if (err)
0225 return err;
0226
0227 err = reset_device(dev);
0228 if (err)
0229 return err;
0230
0231
0232 for (ch = 0; ch < priv->num_channels; ch++) {
0233 err = reset_channel(dev, ch);
0234 if (err)
0235 return err;
0236 }
0237
0238
0239 if (is_sec1) {
0240 clrbits32(priv->reg + TALITOS_IMR, TALITOS1_IMR_INIT);
0241 clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT);
0242
0243 setbits32(priv->reg_deu + TALITOS_EUICR, TALITOS1_DEUICR_KPE);
0244 } else {
0245 setbits32(priv->reg + TALITOS_IMR, TALITOS2_IMR_INIT);
0246 setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT);
0247 }
0248
0249
0250 if (priv->features & TALITOS_FTR_HW_AUTH_CHECK)
0251 setbits32(priv->reg_mdeu + TALITOS_EUICR_LO,
0252 TALITOS_MDEUICR_LO_ICE);
0253
0254 return 0;
0255 }
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269 static int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
0270 void (*callback)(struct device *dev,
0271 struct talitos_desc *desc,
0272 void *context, int error),
0273 void *context)
0274 {
0275 struct talitos_private *priv = dev_get_drvdata(dev);
0276 struct talitos_request *request;
0277 unsigned long flags;
0278 int head;
0279 bool is_sec1 = has_ftr_sec1(priv);
0280
0281 spin_lock_irqsave(&priv->chan[ch].head_lock, flags);
0282
0283 if (!atomic_inc_not_zero(&priv->chan[ch].submit_count)) {
0284
0285 spin_unlock_irqrestore(&priv->chan[ch].head_lock, flags);
0286 return -EAGAIN;
0287 }
0288
0289 head = priv->chan[ch].head;
0290 request = &priv->chan[ch].fifo[head];
0291
0292
0293 if (is_sec1) {
0294 desc->hdr1 = desc->hdr;
0295 request->dma_desc = dma_map_single(dev, &desc->hdr1,
0296 TALITOS_DESC_SIZE,
0297 DMA_BIDIRECTIONAL);
0298 } else {
0299 request->dma_desc = dma_map_single(dev, desc,
0300 TALITOS_DESC_SIZE,
0301 DMA_BIDIRECTIONAL);
0302 }
0303 request->callback = callback;
0304 request->context = context;
0305
0306
0307 priv->chan[ch].head = (priv->chan[ch].head + 1) & (priv->fifo_len - 1);
0308
0309 smp_wmb();
0310 request->desc = desc;
0311
0312
0313 wmb();
0314 out_be32(priv->chan[ch].reg + TALITOS_FF,
0315 upper_32_bits(request->dma_desc));
0316 out_be32(priv->chan[ch].reg + TALITOS_FF_LO,
0317 lower_32_bits(request->dma_desc));
0318
0319 spin_unlock_irqrestore(&priv->chan[ch].head_lock, flags);
0320
0321 return -EINPROGRESS;
0322 }
0323
0324 static __be32 get_request_hdr(struct talitos_request *request, bool is_sec1)
0325 {
0326 struct talitos_edesc *edesc;
0327
0328 if (!is_sec1)
0329 return request->desc->hdr;
0330
0331 if (!request->desc->next_desc)
0332 return request->desc->hdr1;
0333
0334 edesc = container_of(request->desc, struct talitos_edesc, desc);
0335
0336 return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))->hdr1;
0337 }
0338
0339
0340
0341
0342 static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
0343 {
0344 struct talitos_private *priv = dev_get_drvdata(dev);
0345 struct talitos_request *request, saved_req;
0346 unsigned long flags;
0347 int tail, status;
0348 bool is_sec1 = has_ftr_sec1(priv);
0349
0350 spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
0351
0352 tail = priv->chan[ch].tail;
0353 while (priv->chan[ch].fifo[tail].desc) {
0354 __be32 hdr;
0355
0356 request = &priv->chan[ch].fifo[tail];
0357
0358
0359 rmb();
0360 hdr = get_request_hdr(request, is_sec1);
0361
0362 if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
0363 status = 0;
0364 else
0365 if (!error)
0366 break;
0367 else
0368 status = error;
0369
0370 dma_unmap_single(dev, request->dma_desc,
0371 TALITOS_DESC_SIZE,
0372 DMA_BIDIRECTIONAL);
0373
0374
0375 saved_req.desc = request->desc;
0376 saved_req.callback = request->callback;
0377 saved_req.context = request->context;
0378
0379
0380 smp_wmb();
0381 request->desc = NULL;
0382
0383
0384 priv->chan[ch].tail = (tail + 1) & (priv->fifo_len - 1);
0385
0386 spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags);
0387
0388 atomic_dec(&priv->chan[ch].submit_count);
0389
0390 saved_req.callback(dev, saved_req.desc, saved_req.context,
0391 status);
0392
0393 if (error && !reset_ch && status == error)
0394 return;
0395 spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
0396 tail = priv->chan[ch].tail;
0397 }
0398
0399 spin_unlock_irqrestore(&priv->chan[ch].tail_lock, flags);
0400 }
0401
0402
0403
0404
0405 #define DEF_TALITOS1_DONE(name, ch_done_mask) \
0406 static void talitos1_done_##name(unsigned long data) \
0407 { \
0408 struct device *dev = (struct device *)data; \
0409 struct talitos_private *priv = dev_get_drvdata(dev); \
0410 unsigned long flags; \
0411 \
0412 if (ch_done_mask & 0x10000000) \
0413 flush_channel(dev, 0, 0, 0); \
0414 if (ch_done_mask & 0x40000000) \
0415 flush_channel(dev, 1, 0, 0); \
0416 if (ch_done_mask & 0x00010000) \
0417 flush_channel(dev, 2, 0, 0); \
0418 if (ch_done_mask & 0x00040000) \
0419 flush_channel(dev, 3, 0, 0); \
0420 \
0421 \
0422 \
0423 spin_lock_irqsave(&priv->reg_lock, flags); \
0424 clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \
0425 clrbits32(priv->reg + TALITOS_IMR_LO, TALITOS1_IMR_LO_INIT); \
0426 spin_unlock_irqrestore(&priv->reg_lock, flags); \
0427 }
0428
0429 DEF_TALITOS1_DONE(4ch, TALITOS1_ISR_4CHDONE)
0430 DEF_TALITOS1_DONE(ch0, TALITOS1_ISR_CH_0_DONE)
0431
0432 #define DEF_TALITOS2_DONE(name, ch_done_mask) \
0433 static void talitos2_done_##name(unsigned long data) \
0434 { \
0435 struct device *dev = (struct device *)data; \
0436 struct talitos_private *priv = dev_get_drvdata(dev); \
0437 unsigned long flags; \
0438 \
0439 if (ch_done_mask & 1) \
0440 flush_channel(dev, 0, 0, 0); \
0441 if (ch_done_mask & (1 << 2)) \
0442 flush_channel(dev, 1, 0, 0); \
0443 if (ch_done_mask & (1 << 4)) \
0444 flush_channel(dev, 2, 0, 0); \
0445 if (ch_done_mask & (1 << 6)) \
0446 flush_channel(dev, 3, 0, 0); \
0447 \
0448 \
0449 \
0450 spin_lock_irqsave(&priv->reg_lock, flags); \
0451 setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \
0452 setbits32(priv->reg + TALITOS_IMR_LO, TALITOS2_IMR_LO_INIT); \
0453 spin_unlock_irqrestore(&priv->reg_lock, flags); \
0454 }
0455
0456 DEF_TALITOS2_DONE(4ch, TALITOS2_ISR_4CHDONE)
0457 DEF_TALITOS2_DONE(ch0, TALITOS2_ISR_CH_0_DONE)
0458 DEF_TALITOS2_DONE(ch0_2, TALITOS2_ISR_CH_0_2_DONE)
0459 DEF_TALITOS2_DONE(ch1_3, TALITOS2_ISR_CH_1_3_DONE)
0460
0461
0462
0463
0464 static __be32 current_desc_hdr(struct device *dev, int ch)
0465 {
0466 struct talitos_private *priv = dev_get_drvdata(dev);
0467 int tail, iter;
0468 dma_addr_t cur_desc;
0469
0470 cur_desc = ((u64)in_be32(priv->chan[ch].reg + TALITOS_CDPR)) << 32;
0471 cur_desc |= in_be32(priv->chan[ch].reg + TALITOS_CDPR_LO);
0472
0473 if (!cur_desc) {
0474 dev_err(dev, "CDPR is NULL, giving up search for offending descriptor\n");
0475 return 0;
0476 }
0477
0478 tail = priv->chan[ch].tail;
0479
0480 iter = tail;
0481 while (priv->chan[ch].fifo[iter].dma_desc != cur_desc &&
0482 priv->chan[ch].fifo[iter].desc->next_desc != cpu_to_be32(cur_desc)) {
0483 iter = (iter + 1) & (priv->fifo_len - 1);
0484 if (iter == tail) {
0485 dev_err(dev, "couldn't locate current descriptor\n");
0486 return 0;
0487 }
0488 }
0489
0490 if (priv->chan[ch].fifo[iter].desc->next_desc == cpu_to_be32(cur_desc)) {
0491 struct talitos_edesc *edesc;
0492
0493 edesc = container_of(priv->chan[ch].fifo[iter].desc,
0494 struct talitos_edesc, desc);
0495 return ((struct talitos_desc *)
0496 (edesc->buf + edesc->dma_len))->hdr;
0497 }
0498
0499 return priv->chan[ch].fifo[iter].desc->hdr;
0500 }
0501
0502
0503
0504
0505 static void report_eu_error(struct device *dev, int ch, __be32 desc_hdr)
0506 {
0507 struct talitos_private *priv = dev_get_drvdata(dev);
0508 int i;
0509
0510 if (!desc_hdr)
0511 desc_hdr = cpu_to_be32(in_be32(priv->chan[ch].reg + TALITOS_DESCBUF));
0512
0513 switch (desc_hdr & DESC_HDR_SEL0_MASK) {
0514 case DESC_HDR_SEL0_AFEU:
0515 dev_err(dev, "AFEUISR 0x%08x_%08x\n",
0516 in_be32(priv->reg_afeu + TALITOS_EUISR),
0517 in_be32(priv->reg_afeu + TALITOS_EUISR_LO));
0518 break;
0519 case DESC_HDR_SEL0_DEU:
0520 dev_err(dev, "DEUISR 0x%08x_%08x\n",
0521 in_be32(priv->reg_deu + TALITOS_EUISR),
0522 in_be32(priv->reg_deu + TALITOS_EUISR_LO));
0523 break;
0524 case DESC_HDR_SEL0_MDEUA:
0525 case DESC_HDR_SEL0_MDEUB:
0526 dev_err(dev, "MDEUISR 0x%08x_%08x\n",
0527 in_be32(priv->reg_mdeu + TALITOS_EUISR),
0528 in_be32(priv->reg_mdeu + TALITOS_EUISR_LO));
0529 break;
0530 case DESC_HDR_SEL0_RNG:
0531 dev_err(dev, "RNGUISR 0x%08x_%08x\n",
0532 in_be32(priv->reg_rngu + TALITOS_ISR),
0533 in_be32(priv->reg_rngu + TALITOS_ISR_LO));
0534 break;
0535 case DESC_HDR_SEL0_PKEU:
0536 dev_err(dev, "PKEUISR 0x%08x_%08x\n",
0537 in_be32(priv->reg_pkeu + TALITOS_EUISR),
0538 in_be32(priv->reg_pkeu + TALITOS_EUISR_LO));
0539 break;
0540 case DESC_HDR_SEL0_AESU:
0541 dev_err(dev, "AESUISR 0x%08x_%08x\n",
0542 in_be32(priv->reg_aesu + TALITOS_EUISR),
0543 in_be32(priv->reg_aesu + TALITOS_EUISR_LO));
0544 break;
0545 case DESC_HDR_SEL0_CRCU:
0546 dev_err(dev, "CRCUISR 0x%08x_%08x\n",
0547 in_be32(priv->reg_crcu + TALITOS_EUISR),
0548 in_be32(priv->reg_crcu + TALITOS_EUISR_LO));
0549 break;
0550 case DESC_HDR_SEL0_KEU:
0551 dev_err(dev, "KEUISR 0x%08x_%08x\n",
0552 in_be32(priv->reg_pkeu + TALITOS_EUISR),
0553 in_be32(priv->reg_pkeu + TALITOS_EUISR_LO));
0554 break;
0555 }
0556
0557 switch (desc_hdr & DESC_HDR_SEL1_MASK) {
0558 case DESC_HDR_SEL1_MDEUA:
0559 case DESC_HDR_SEL1_MDEUB:
0560 dev_err(dev, "MDEUISR 0x%08x_%08x\n",
0561 in_be32(priv->reg_mdeu + TALITOS_EUISR),
0562 in_be32(priv->reg_mdeu + TALITOS_EUISR_LO));
0563 break;
0564 case DESC_HDR_SEL1_CRCU:
0565 dev_err(dev, "CRCUISR 0x%08x_%08x\n",
0566 in_be32(priv->reg_crcu + TALITOS_EUISR),
0567 in_be32(priv->reg_crcu + TALITOS_EUISR_LO));
0568 break;
0569 }
0570
0571 for (i = 0; i < 8; i++)
0572 dev_err(dev, "DESCBUF 0x%08x_%08x\n",
0573 in_be32(priv->chan[ch].reg + TALITOS_DESCBUF + 8*i),
0574 in_be32(priv->chan[ch].reg + TALITOS_DESCBUF_LO + 8*i));
0575 }
0576
0577
0578
0579
0580 static void talitos_error(struct device *dev, u32 isr, u32 isr_lo)
0581 {
0582 struct talitos_private *priv = dev_get_drvdata(dev);
0583 unsigned int timeout = TALITOS_TIMEOUT;
0584 int ch, error, reset_dev = 0;
0585 u32 v_lo;
0586 bool is_sec1 = has_ftr_sec1(priv);
0587 int reset_ch = is_sec1 ? 1 : 0;
0588
0589 for (ch = 0; ch < priv->num_channels; ch++) {
0590
0591 if (is_sec1) {
0592
0593 if (!(isr & (1 << (29 + (ch & 1) * 2 - (ch & 2) * 6))))
0594 continue;
0595 } else {
0596 if (!(isr & (1 << (ch * 2 + 1))))
0597 continue;
0598 }
0599
0600 error = -EINVAL;
0601
0602 v_lo = in_be32(priv->chan[ch].reg + TALITOS_CCPSR_LO);
0603
0604 if (v_lo & TALITOS_CCPSR_LO_DOF) {
0605 dev_err(dev, "double fetch fifo overflow error\n");
0606 error = -EAGAIN;
0607 reset_ch = 1;
0608 }
0609 if (v_lo & TALITOS_CCPSR_LO_SOF) {
0610
0611 dev_err(dev, "single fetch fifo overflow error\n");
0612 error = -EAGAIN;
0613 }
0614 if (v_lo & TALITOS_CCPSR_LO_MDTE)
0615 dev_err(dev, "master data transfer error\n");
0616 if (v_lo & TALITOS_CCPSR_LO_SGDLZ)
0617 dev_err(dev, is_sec1 ? "pointer not complete error\n"
0618 : "s/g data length zero error\n");
0619 if (v_lo & TALITOS_CCPSR_LO_FPZ)
0620 dev_err(dev, is_sec1 ? "parity error\n"
0621 : "fetch pointer zero error\n");
0622 if (v_lo & TALITOS_CCPSR_LO_IDH)
0623 dev_err(dev, "illegal descriptor header error\n");
0624 if (v_lo & TALITOS_CCPSR_LO_IEU)
0625 dev_err(dev, is_sec1 ? "static assignment error\n"
0626 : "invalid exec unit error\n");
0627 if (v_lo & TALITOS_CCPSR_LO_EU)
0628 report_eu_error(dev, ch, current_desc_hdr(dev, ch));
0629 if (!is_sec1) {
0630 if (v_lo & TALITOS_CCPSR_LO_GB)
0631 dev_err(dev, "gather boundary error\n");
0632 if (v_lo & TALITOS_CCPSR_LO_GRL)
0633 dev_err(dev, "gather return/length error\n");
0634 if (v_lo & TALITOS_CCPSR_LO_SB)
0635 dev_err(dev, "scatter boundary error\n");
0636 if (v_lo & TALITOS_CCPSR_LO_SRL)
0637 dev_err(dev, "scatter return/length error\n");
0638 }
0639
0640 flush_channel(dev, ch, error, reset_ch);
0641
0642 if (reset_ch) {
0643 reset_channel(dev, ch);
0644 } else {
0645 setbits32(priv->chan[ch].reg + TALITOS_CCCR,
0646 TALITOS2_CCCR_CONT);
0647 setbits32(priv->chan[ch].reg + TALITOS_CCCR_LO, 0);
0648 while ((in_be32(priv->chan[ch].reg + TALITOS_CCCR) &
0649 TALITOS2_CCCR_CONT) && --timeout)
0650 cpu_relax();
0651 if (timeout == 0) {
0652 dev_err(dev, "failed to restart channel %d\n",
0653 ch);
0654 reset_dev = 1;
0655 }
0656 }
0657 }
0658 if (reset_dev || (is_sec1 && isr & ~TALITOS1_ISR_4CHERR) ||
0659 (!is_sec1 && isr & ~TALITOS2_ISR_4CHERR) || isr_lo) {
0660 if (is_sec1 && (isr_lo & TALITOS1_ISR_TEA_ERR))
0661 dev_err(dev, "TEA error: ISR 0x%08x_%08x\n",
0662 isr, isr_lo);
0663 else
0664 dev_err(dev, "done overflow, internal time out, or "
0665 "rngu error: ISR 0x%08x_%08x\n", isr, isr_lo);
0666
0667
0668 for (ch = 0; ch < priv->num_channels; ch++)
0669 flush_channel(dev, ch, -EIO, 1);
0670
0671
0672 init_device(dev);
0673 }
0674 }
0675
0676 #define DEF_TALITOS1_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) \
0677 static irqreturn_t talitos1_interrupt_##name(int irq, void *data) \
0678 { \
0679 struct device *dev = data; \
0680 struct talitos_private *priv = dev_get_drvdata(dev); \
0681 u32 isr, isr_lo; \
0682 unsigned long flags; \
0683 \
0684 spin_lock_irqsave(&priv->reg_lock, flags); \
0685 isr = in_be32(priv->reg + TALITOS_ISR); \
0686 isr_lo = in_be32(priv->reg + TALITOS_ISR_LO); \
0687 \
0688 out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
0689 out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \
0690 \
0691 if (unlikely(isr & ch_err_mask || isr_lo & TALITOS1_IMR_LO_INIT)) { \
0692 spin_unlock_irqrestore(&priv->reg_lock, flags); \
0693 talitos_error(dev, isr & ch_err_mask, isr_lo); \
0694 } \
0695 else { \
0696 if (likely(isr & ch_done_mask)) { \
0697 \
0698 setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \
0699 \
0700 tasklet_schedule(&priv->done_task[tlet]); \
0701 } \
0702 spin_unlock_irqrestore(&priv->reg_lock, flags); \
0703 } \
0704 \
0705 return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \
0706 IRQ_NONE; \
0707 }
0708
0709 DEF_TALITOS1_INTERRUPT(4ch, TALITOS1_ISR_4CHDONE, TALITOS1_ISR_4CHERR, 0)
0710
0711 #define DEF_TALITOS2_INTERRUPT(name, ch_done_mask, ch_err_mask, tlet) \
0712 static irqreturn_t talitos2_interrupt_##name(int irq, void *data) \
0713 { \
0714 struct device *dev = data; \
0715 struct talitos_private *priv = dev_get_drvdata(dev); \
0716 u32 isr, isr_lo; \
0717 unsigned long flags; \
0718 \
0719 spin_lock_irqsave(&priv->reg_lock, flags); \
0720 isr = in_be32(priv->reg + TALITOS_ISR); \
0721 isr_lo = in_be32(priv->reg + TALITOS_ISR_LO); \
0722 \
0723 out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
0724 out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \
0725 \
0726 if (unlikely(isr & ch_err_mask || isr_lo)) { \
0727 spin_unlock_irqrestore(&priv->reg_lock, flags); \
0728 talitos_error(dev, isr & ch_err_mask, isr_lo); \
0729 } \
0730 else { \
0731 if (likely(isr & ch_done_mask)) { \
0732 \
0733 clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \
0734 \
0735 tasklet_schedule(&priv->done_task[tlet]); \
0736 } \
0737 spin_unlock_irqrestore(&priv->reg_lock, flags); \
0738 } \
0739 \
0740 return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \
0741 IRQ_NONE; \
0742 }
0743
0744 DEF_TALITOS2_INTERRUPT(4ch, TALITOS2_ISR_4CHDONE, TALITOS2_ISR_4CHERR, 0)
0745 DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE, TALITOS2_ISR_CH_0_2_ERR,
0746 0)
0747 DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_3_ERR,
0748 1)
0749
0750
0751
0752
0753 static int talitos_rng_data_present(struct hwrng *rng, int wait)
0754 {
0755 struct device *dev = (struct device *)rng->priv;
0756 struct talitos_private *priv = dev_get_drvdata(dev);
0757 u32 ofl;
0758 int i;
0759
0760 for (i = 0; i < 20; i++) {
0761 ofl = in_be32(priv->reg_rngu + TALITOS_EUSR_LO) &
0762 TALITOS_RNGUSR_LO_OFL;
0763 if (ofl || !wait)
0764 break;
0765 udelay(10);
0766 }
0767
0768 return !!ofl;
0769 }
0770
0771 static int talitos_rng_data_read(struct hwrng *rng, u32 *data)
0772 {
0773 struct device *dev = (struct device *)rng->priv;
0774 struct talitos_private *priv = dev_get_drvdata(dev);
0775
0776
0777 *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO);
0778 *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO);
0779
0780 return sizeof(u32);
0781 }
0782
0783 static int talitos_rng_init(struct hwrng *rng)
0784 {
0785 struct device *dev = (struct device *)rng->priv;
0786 struct talitos_private *priv = dev_get_drvdata(dev);
0787 unsigned int timeout = TALITOS_TIMEOUT;
0788
0789 setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR);
0790 while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO)
0791 & TALITOS_RNGUSR_LO_RD)
0792 && --timeout)
0793 cpu_relax();
0794 if (timeout == 0) {
0795 dev_err(dev, "failed to reset rng hw\n");
0796 return -ENODEV;
0797 }
0798
0799
0800 setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0);
0801
0802 return 0;
0803 }
0804
0805 static int talitos_register_rng(struct device *dev)
0806 {
0807 struct talitos_private *priv = dev_get_drvdata(dev);
0808 int err;
0809
0810 priv->rng.name = dev_driver_string(dev);
0811 priv->rng.init = talitos_rng_init;
0812 priv->rng.data_present = talitos_rng_data_present;
0813 priv->rng.data_read = talitos_rng_data_read;
0814 priv->rng.priv = (unsigned long)dev;
0815
0816 err = hwrng_register(&priv->rng);
0817 if (!err)
0818 priv->rng_registered = true;
0819
0820 return err;
0821 }
0822
0823 static void talitos_unregister_rng(struct device *dev)
0824 {
0825 struct talitos_private *priv = dev_get_drvdata(dev);
0826
0827 if (!priv->rng_registered)
0828 return;
0829
0830 hwrng_unregister(&priv->rng);
0831 priv->rng_registered = false;
0832 }
0833
0834
0835
0836
0837 #define TALITOS_CRA_PRIORITY 3000
0838
0839
0840
0841
0842 #define TALITOS_CRA_PRIORITY_AEAD_HSNA (TALITOS_CRA_PRIORITY - 1)
0843 #ifdef CONFIG_CRYPTO_DEV_TALITOS2
0844 #define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE)
0845 #else
0846 #define TALITOS_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE)
0847 #endif
0848 #define TALITOS_MAX_IV_LENGTH 16
0849
0850 struct talitos_ctx {
0851 struct device *dev;
0852 int ch;
0853 __be32 desc_hdr_template;
0854 u8 key[TALITOS_MAX_KEY_SIZE];
0855 u8 iv[TALITOS_MAX_IV_LENGTH];
0856 dma_addr_t dma_key;
0857 unsigned int keylen;
0858 unsigned int enckeylen;
0859 unsigned int authkeylen;
0860 };
0861
0862 #define HASH_MAX_BLOCK_SIZE SHA512_BLOCK_SIZE
0863 #define TALITOS_MDEU_MAX_CONTEXT_SIZE TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512
0864
0865 struct talitos_ahash_req_ctx {
0866 u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
0867 unsigned int hw_context_size;
0868 u8 buf[2][HASH_MAX_BLOCK_SIZE];
0869 int buf_idx;
0870 unsigned int swinit;
0871 unsigned int first;
0872 unsigned int last;
0873 unsigned int to_hash_later;
0874 unsigned int nbuf;
0875 struct scatterlist bufsl[2];
0876 struct scatterlist *psrc;
0877 };
0878
0879 struct talitos_export_state {
0880 u32 hw_context[TALITOS_MDEU_MAX_CONTEXT_SIZE / sizeof(u32)];
0881 u8 buf[HASH_MAX_BLOCK_SIZE];
0882 unsigned int swinit;
0883 unsigned int first;
0884 unsigned int last;
0885 unsigned int to_hash_later;
0886 unsigned int nbuf;
0887 };
0888
0889 static int aead_setkey(struct crypto_aead *authenc,
0890 const u8 *key, unsigned int keylen)
0891 {
0892 struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
0893 struct device *dev = ctx->dev;
0894 struct crypto_authenc_keys keys;
0895
0896 if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
0897 goto badkey;
0898
0899 if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
0900 goto badkey;
0901
0902 if (ctx->keylen)
0903 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
0904
0905 memcpy(ctx->key, keys.authkey, keys.authkeylen);
0906 memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
0907
0908 ctx->keylen = keys.authkeylen + keys.enckeylen;
0909 ctx->enckeylen = keys.enckeylen;
0910 ctx->authkeylen = keys.authkeylen;
0911 ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
0912 DMA_TO_DEVICE);
0913
0914 memzero_explicit(&keys, sizeof(keys));
0915 return 0;
0916
0917 badkey:
0918 memzero_explicit(&keys, sizeof(keys));
0919 return -EINVAL;
0920 }
0921
0922 static int aead_des3_setkey(struct crypto_aead *authenc,
0923 const u8 *key, unsigned int keylen)
0924 {
0925 struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
0926 struct device *dev = ctx->dev;
0927 struct crypto_authenc_keys keys;
0928 int err;
0929
0930 err = crypto_authenc_extractkeys(&keys, key, keylen);
0931 if (unlikely(err))
0932 goto out;
0933
0934 err = -EINVAL;
0935 if (keys.authkeylen + keys.enckeylen > TALITOS_MAX_KEY_SIZE)
0936 goto out;
0937
0938 err = verify_aead_des3_key(authenc, keys.enckey, keys.enckeylen);
0939 if (err)
0940 goto out;
0941
0942 if (ctx->keylen)
0943 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
0944
0945 memcpy(ctx->key, keys.authkey, keys.authkeylen);
0946 memcpy(&ctx->key[keys.authkeylen], keys.enckey, keys.enckeylen);
0947
0948 ctx->keylen = keys.authkeylen + keys.enckeylen;
0949 ctx->enckeylen = keys.enckeylen;
0950 ctx->authkeylen = keys.authkeylen;
0951 ctx->dma_key = dma_map_single(dev, ctx->key, ctx->keylen,
0952 DMA_TO_DEVICE);
0953
0954 out:
0955 memzero_explicit(&keys, sizeof(keys));
0956 return err;
0957 }
0958
0959 static void talitos_sg_unmap(struct device *dev,
0960 struct talitos_edesc *edesc,
0961 struct scatterlist *src,
0962 struct scatterlist *dst,
0963 unsigned int len, unsigned int offset)
0964 {
0965 struct talitos_private *priv = dev_get_drvdata(dev);
0966 bool is_sec1 = has_ftr_sec1(priv);
0967 unsigned int src_nents = edesc->src_nents ? : 1;
0968 unsigned int dst_nents = edesc->dst_nents ? : 1;
0969
0970 if (is_sec1 && dst && dst_nents > 1) {
0971 dma_sync_single_for_device(dev, edesc->dma_link_tbl + offset,
0972 len, DMA_FROM_DEVICE);
0973 sg_pcopy_from_buffer(dst, dst_nents, edesc->buf + offset, len,
0974 offset);
0975 }
0976 if (src != dst) {
0977 if (src_nents == 1 || !is_sec1)
0978 dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
0979
0980 if (dst && (dst_nents == 1 || !is_sec1))
0981 dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
0982 } else if (src_nents == 1 || !is_sec1) {
0983 dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
0984 }
0985 }
0986
0987 static void ipsec_esp_unmap(struct device *dev,
0988 struct talitos_edesc *edesc,
0989 struct aead_request *areq, bool encrypt)
0990 {
0991 struct crypto_aead *aead = crypto_aead_reqtfm(areq);
0992 struct talitos_ctx *ctx = crypto_aead_ctx(aead);
0993 unsigned int ivsize = crypto_aead_ivsize(aead);
0994 unsigned int authsize = crypto_aead_authsize(aead);
0995 unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
0996 bool is_ipsec_esp = edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP;
0997 struct talitos_ptr *civ_ptr = &edesc->desc.ptr[is_ipsec_esp ? 2 : 3];
0998
0999 if (is_ipsec_esp)
1000 unmap_single_talitos_ptr(dev, &edesc->desc.ptr[6],
1001 DMA_FROM_DEVICE);
1002 unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE);
1003
1004 talitos_sg_unmap(dev, edesc, areq->src, areq->dst,
1005 cryptlen + authsize, areq->assoclen);
1006
1007 if (edesc->dma_len)
1008 dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1009 DMA_BIDIRECTIONAL);
1010
1011 if (!is_ipsec_esp) {
1012 unsigned int dst_nents = edesc->dst_nents ? : 1;
1013
1014 sg_pcopy_to_buffer(areq->dst, dst_nents, ctx->iv, ivsize,
1015 areq->assoclen + cryptlen - ivsize);
1016 }
1017 }
1018
1019
1020
1021
1022 static void ipsec_esp_encrypt_done(struct device *dev,
1023 struct talitos_desc *desc, void *context,
1024 int err)
1025 {
1026 struct aead_request *areq = context;
1027 struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1028 unsigned int ivsize = crypto_aead_ivsize(authenc);
1029 struct talitos_edesc *edesc;
1030
1031 edesc = container_of(desc, struct talitos_edesc, desc);
1032
1033 ipsec_esp_unmap(dev, edesc, areq, true);
1034
1035 dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE);
1036
1037 kfree(edesc);
1038
1039 aead_request_complete(areq, err);
1040 }
1041
1042 static void ipsec_esp_decrypt_swauth_done(struct device *dev,
1043 struct talitos_desc *desc,
1044 void *context, int err)
1045 {
1046 struct aead_request *req = context;
1047 struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1048 unsigned int authsize = crypto_aead_authsize(authenc);
1049 struct talitos_edesc *edesc;
1050 char *oicv, *icv;
1051
1052 edesc = container_of(desc, struct talitos_edesc, desc);
1053
1054 ipsec_esp_unmap(dev, edesc, req, false);
1055
1056 if (!err) {
1057
1058 oicv = edesc->buf + edesc->dma_len;
1059 icv = oicv - authsize;
1060
1061 err = crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0;
1062 }
1063
1064 kfree(edesc);
1065
1066 aead_request_complete(req, err);
1067 }
1068
1069 static void ipsec_esp_decrypt_hwauth_done(struct device *dev,
1070 struct talitos_desc *desc,
1071 void *context, int err)
1072 {
1073 struct aead_request *req = context;
1074 struct talitos_edesc *edesc;
1075
1076 edesc = container_of(desc, struct talitos_edesc, desc);
1077
1078 ipsec_esp_unmap(dev, edesc, req, false);
1079
1080
1081 if (!err && ((desc->hdr_lo & DESC_HDR_LO_ICCR1_MASK) !=
1082 DESC_HDR_LO_ICCR1_PASS))
1083 err = -EBADMSG;
1084
1085 kfree(edesc);
1086
1087 aead_request_complete(req, err);
1088 }
1089
1090
1091
1092
1093
1094 static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count,
1095 unsigned int offset, int datalen, int elen,
1096 struct talitos_ptr *link_tbl_ptr, int align)
1097 {
1098 int n_sg = elen ? sg_count + 1 : sg_count;
1099 int count = 0;
1100 int cryptlen = datalen + elen;
1101 int padding = ALIGN(cryptlen, align) - cryptlen;
1102
1103 while (cryptlen && sg && n_sg--) {
1104 unsigned int len = sg_dma_len(sg);
1105
1106 if (offset >= len) {
1107 offset -= len;
1108 goto next;
1109 }
1110
1111 len -= offset;
1112
1113 if (len > cryptlen)
1114 len = cryptlen;
1115
1116 if (datalen > 0 && len > datalen) {
1117 to_talitos_ptr(link_tbl_ptr + count,
1118 sg_dma_address(sg) + offset, datalen, 0);
1119 to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1120 count++;
1121 len -= datalen;
1122 offset += datalen;
1123 }
1124 to_talitos_ptr(link_tbl_ptr + count,
1125 sg_dma_address(sg) + offset, sg_next(sg) ? len : len + padding, 0);
1126 to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0);
1127 count++;
1128 cryptlen -= len;
1129 datalen -= len;
1130 offset = 0;
1131
1132 next:
1133 sg = sg_next(sg);
1134 }
1135
1136
1137 if (count > 0)
1138 to_talitos_ptr_ext_set(link_tbl_ptr + count - 1,
1139 DESC_PTR_LNKTBL_RET, 0);
1140
1141 return count;
1142 }
1143
1144 static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src,
1145 unsigned int len, struct talitos_edesc *edesc,
1146 struct talitos_ptr *ptr, int sg_count,
1147 unsigned int offset, int tbl_off, int elen,
1148 bool force, int align)
1149 {
1150 struct talitos_private *priv = dev_get_drvdata(dev);
1151 bool is_sec1 = has_ftr_sec1(priv);
1152 int aligned_len = ALIGN(len, align);
1153
1154 if (!src) {
1155 to_talitos_ptr(ptr, 0, 0, is_sec1);
1156 return 1;
1157 }
1158 to_talitos_ptr_ext_set(ptr, elen, is_sec1);
1159 if (sg_count == 1 && !force) {
1160 to_talitos_ptr(ptr, sg_dma_address(src) + offset, aligned_len, is_sec1);
1161 return sg_count;
1162 }
1163 if (is_sec1) {
1164 to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, aligned_len, is_sec1);
1165 return sg_count;
1166 }
1167 sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, elen,
1168 &edesc->link_tbl[tbl_off], align);
1169 if (sg_count == 1 && !force) {
1170
1171 copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1);
1172 return sg_count;
1173 }
1174 to_talitos_ptr(ptr, edesc->dma_link_tbl +
1175 tbl_off * sizeof(struct talitos_ptr), aligned_len, is_sec1);
1176 to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1);
1177
1178 return sg_count;
1179 }
1180
1181 static int talitos_sg_map(struct device *dev, struct scatterlist *src,
1182 unsigned int len, struct talitos_edesc *edesc,
1183 struct talitos_ptr *ptr, int sg_count,
1184 unsigned int offset, int tbl_off)
1185 {
1186 return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset,
1187 tbl_off, 0, false, 1);
1188 }
1189
1190
1191
1192
1193 static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1194 bool encrypt,
1195 void (*callback)(struct device *dev,
1196 struct talitos_desc *desc,
1197 void *context, int error))
1198 {
1199 struct crypto_aead *aead = crypto_aead_reqtfm(areq);
1200 unsigned int authsize = crypto_aead_authsize(aead);
1201 struct talitos_ctx *ctx = crypto_aead_ctx(aead);
1202 struct device *dev = ctx->dev;
1203 struct talitos_desc *desc = &edesc->desc;
1204 unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1205 unsigned int ivsize = crypto_aead_ivsize(aead);
1206 int tbl_off = 0;
1207 int sg_count, ret;
1208 int elen = 0;
1209 bool sync_needed = false;
1210 struct talitos_private *priv = dev_get_drvdata(dev);
1211 bool is_sec1 = has_ftr_sec1(priv);
1212 bool is_ipsec_esp = desc->hdr & DESC_HDR_TYPE_IPSEC_ESP;
1213 struct talitos_ptr *civ_ptr = &desc->ptr[is_ipsec_esp ? 2 : 3];
1214 struct talitos_ptr *ckey_ptr = &desc->ptr[is_ipsec_esp ? 3 : 2];
1215 dma_addr_t dma_icv = edesc->dma_link_tbl + edesc->dma_len - authsize;
1216
1217
1218 to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1);
1219
1220 sg_count = edesc->src_nents ?: 1;
1221 if (is_sec1 && sg_count > 1)
1222 sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1223 areq->assoclen + cryptlen);
1224 else
1225 sg_count = dma_map_sg(dev, areq->src, sg_count,
1226 (areq->src == areq->dst) ?
1227 DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1228
1229
1230 ret = talitos_sg_map(dev, areq->src, areq->assoclen, edesc,
1231 &desc->ptr[1], sg_count, 0, tbl_off);
1232
1233 if (ret > 1) {
1234 tbl_off += ret;
1235 sync_needed = true;
1236 }
1237
1238
1239 to_talitos_ptr(civ_ptr, edesc->iv_dma, ivsize, is_sec1);
1240
1241
1242 to_talitos_ptr(ckey_ptr, ctx->dma_key + ctx->authkeylen,
1243 ctx->enckeylen, is_sec1);
1244
1245
1246
1247
1248
1249
1250
1251 if (is_ipsec_esp && (desc->hdr & DESC_HDR_MODE1_MDEU_CICV))
1252 elen = authsize;
1253
1254 ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4],
1255 sg_count, areq->assoclen, tbl_off, elen,
1256 false, 1);
1257
1258 if (ret > 1) {
1259 tbl_off += ret;
1260 sync_needed = true;
1261 }
1262
1263
1264 if (areq->src != areq->dst) {
1265 sg_count = edesc->dst_nents ? : 1;
1266 if (!is_sec1 || sg_count == 1)
1267 dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1268 }
1269
1270 if (is_ipsec_esp && encrypt)
1271 elen = authsize;
1272 else
1273 elen = 0;
1274 ret = talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5],
1275 sg_count, areq->assoclen, tbl_off, elen,
1276 is_ipsec_esp && !encrypt, 1);
1277 tbl_off += ret;
1278
1279 if (!encrypt && is_ipsec_esp) {
1280 struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
1281
1282
1283 to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1);
1284 to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1);
1285
1286
1287 to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1);
1288 to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1);
1289 sync_needed = true;
1290 } else if (!encrypt) {
1291 to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1);
1292 sync_needed = true;
1293 } else if (!is_ipsec_esp) {
1294 talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6],
1295 sg_count, areq->assoclen + cryptlen, tbl_off);
1296 }
1297
1298
1299 if (is_ipsec_esp)
1300 map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
1301 DMA_FROM_DEVICE);
1302
1303 if (sync_needed)
1304 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1305 edesc->dma_len,
1306 DMA_BIDIRECTIONAL);
1307
1308 ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1309 if (ret != -EINPROGRESS) {
1310 ipsec_esp_unmap(dev, edesc, areq, encrypt);
1311 kfree(edesc);
1312 }
1313 return ret;
1314 }
1315
1316
1317
1318
1319 static struct talitos_edesc *talitos_edesc_alloc(struct device *dev,
1320 struct scatterlist *src,
1321 struct scatterlist *dst,
1322 u8 *iv,
1323 unsigned int assoclen,
1324 unsigned int cryptlen,
1325 unsigned int authsize,
1326 unsigned int ivsize,
1327 int icv_stashing,
1328 u32 cryptoflags,
1329 bool encrypt)
1330 {
1331 struct talitos_edesc *edesc;
1332 int src_nents, dst_nents, alloc_len, dma_len, src_len, dst_len;
1333 dma_addr_t iv_dma = 0;
1334 gfp_t flags = cryptoflags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL :
1335 GFP_ATOMIC;
1336 struct talitos_private *priv = dev_get_drvdata(dev);
1337 bool is_sec1 = has_ftr_sec1(priv);
1338 int max_len = is_sec1 ? TALITOS1_MAX_DATA_LEN : TALITOS2_MAX_DATA_LEN;
1339
1340 if (cryptlen + authsize > max_len) {
1341 dev_err(dev, "length exceeds h/w max limit\n");
1342 return ERR_PTR(-EINVAL);
1343 }
1344
1345 if (!dst || dst == src) {
1346 src_len = assoclen + cryptlen + authsize;
1347 src_nents = sg_nents_for_len(src, src_len);
1348 if (src_nents < 0) {
1349 dev_err(dev, "Invalid number of src SG.\n");
1350 return ERR_PTR(-EINVAL);
1351 }
1352 src_nents = (src_nents == 1) ? 0 : src_nents;
1353 dst_nents = dst ? src_nents : 0;
1354 dst_len = 0;
1355 } else {
1356 src_len = assoclen + cryptlen + (encrypt ? 0 : authsize);
1357 src_nents = sg_nents_for_len(src, src_len);
1358 if (src_nents < 0) {
1359 dev_err(dev, "Invalid number of src SG.\n");
1360 return ERR_PTR(-EINVAL);
1361 }
1362 src_nents = (src_nents == 1) ? 0 : src_nents;
1363 dst_len = assoclen + cryptlen + (encrypt ? authsize : 0);
1364 dst_nents = sg_nents_for_len(dst, dst_len);
1365 if (dst_nents < 0) {
1366 dev_err(dev, "Invalid number of dst SG.\n");
1367 return ERR_PTR(-EINVAL);
1368 }
1369 dst_nents = (dst_nents == 1) ? 0 : dst_nents;
1370 }
1371
1372
1373
1374
1375
1376
1377 alloc_len = sizeof(struct talitos_edesc);
1378 if (src_nents || dst_nents || !encrypt) {
1379 if (is_sec1)
1380 dma_len = (src_nents ? src_len : 0) +
1381 (dst_nents ? dst_len : 0) + authsize;
1382 else
1383 dma_len = (src_nents + dst_nents + 2) *
1384 sizeof(struct talitos_ptr) + authsize;
1385 alloc_len += dma_len;
1386 } else {
1387 dma_len = 0;
1388 }
1389 alloc_len += icv_stashing ? authsize : 0;
1390
1391
1392 if (is_sec1 && !dst)
1393 alloc_len += sizeof(struct talitos_desc);
1394 alloc_len += ivsize;
1395
1396 edesc = kmalloc(alloc_len, GFP_DMA | flags);
1397 if (!edesc)
1398 return ERR_PTR(-ENOMEM);
1399 if (ivsize) {
1400 iv = memcpy(((u8 *)edesc) + alloc_len - ivsize, iv, ivsize);
1401 iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE);
1402 }
1403 memset(&edesc->desc, 0, sizeof(edesc->desc));
1404
1405 edesc->src_nents = src_nents;
1406 edesc->dst_nents = dst_nents;
1407 edesc->iv_dma = iv_dma;
1408 edesc->dma_len = dma_len;
1409 if (dma_len)
1410 edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0],
1411 edesc->dma_len,
1412 DMA_BIDIRECTIONAL);
1413
1414 return edesc;
1415 }
1416
1417 static struct talitos_edesc *aead_edesc_alloc(struct aead_request *areq, u8 *iv,
1418 int icv_stashing, bool encrypt)
1419 {
1420 struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
1421 unsigned int authsize = crypto_aead_authsize(authenc);
1422 struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1423 unsigned int ivsize = crypto_aead_ivsize(authenc);
1424 unsigned int cryptlen = areq->cryptlen - (encrypt ? 0 : authsize);
1425
1426 return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1427 iv, areq->assoclen, cryptlen,
1428 authsize, ivsize, icv_stashing,
1429 areq->base.flags, encrypt);
1430 }
1431
1432 static int aead_encrypt(struct aead_request *req)
1433 {
1434 struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1435 struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1436 struct talitos_edesc *edesc;
1437
1438
1439 edesc = aead_edesc_alloc(req, req->iv, 0, true);
1440 if (IS_ERR(edesc))
1441 return PTR_ERR(edesc);
1442
1443
1444 edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1445
1446 return ipsec_esp(edesc, req, true, ipsec_esp_encrypt_done);
1447 }
1448
1449 static int aead_decrypt(struct aead_request *req)
1450 {
1451 struct crypto_aead *authenc = crypto_aead_reqtfm(req);
1452 unsigned int authsize = crypto_aead_authsize(authenc);
1453 struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
1454 struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1455 struct talitos_edesc *edesc;
1456 void *icvdata;
1457
1458
1459 edesc = aead_edesc_alloc(req, req->iv, 1, false);
1460 if (IS_ERR(edesc))
1461 return PTR_ERR(edesc);
1462
1463 if ((edesc->desc.hdr & DESC_HDR_TYPE_IPSEC_ESP) &&
1464 (priv->features & TALITOS_FTR_HW_AUTH_CHECK) &&
1465 ((!edesc->src_nents && !edesc->dst_nents) ||
1466 priv->features & TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT)) {
1467
1468
1469 edesc->desc.hdr = ctx->desc_hdr_template |
1470 DESC_HDR_DIR_INBOUND |
1471 DESC_HDR_MODE1_MDEU_CICV;
1472
1473
1474
1475 return ipsec_esp(edesc, req, false,
1476 ipsec_esp_decrypt_hwauth_done);
1477 }
1478
1479
1480 edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1481
1482
1483 icvdata = edesc->buf + edesc->dma_len;
1484
1485 sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize,
1486 req->assoclen + req->cryptlen - authsize);
1487
1488 return ipsec_esp(edesc, req, false, ipsec_esp_decrypt_swauth_done);
1489 }
1490
1491 static int skcipher_setkey(struct crypto_skcipher *cipher,
1492 const u8 *key, unsigned int keylen)
1493 {
1494 struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1495 struct device *dev = ctx->dev;
1496
1497 if (ctx->keylen)
1498 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
1499
1500 memcpy(&ctx->key, key, keylen);
1501 ctx->keylen = keylen;
1502
1503 ctx->dma_key = dma_map_single(dev, ctx->key, keylen, DMA_TO_DEVICE);
1504
1505 return 0;
1506 }
1507
1508 static int skcipher_des_setkey(struct crypto_skcipher *cipher,
1509 const u8 *key, unsigned int keylen)
1510 {
1511 return verify_skcipher_des_key(cipher, key) ?:
1512 skcipher_setkey(cipher, key, keylen);
1513 }
1514
1515 static int skcipher_des3_setkey(struct crypto_skcipher *cipher,
1516 const u8 *key, unsigned int keylen)
1517 {
1518 return verify_skcipher_des3_key(cipher, key) ?:
1519 skcipher_setkey(cipher, key, keylen);
1520 }
1521
1522 static int skcipher_aes_setkey(struct crypto_skcipher *cipher,
1523 const u8 *key, unsigned int keylen)
1524 {
1525 if (keylen == AES_KEYSIZE_128 || keylen == AES_KEYSIZE_192 ||
1526 keylen == AES_KEYSIZE_256)
1527 return skcipher_setkey(cipher, key, keylen);
1528
1529 return -EINVAL;
1530 }
1531
1532 static void common_nonsnoop_unmap(struct device *dev,
1533 struct talitos_edesc *edesc,
1534 struct skcipher_request *areq)
1535 {
1536 unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE);
1537
1538 talitos_sg_unmap(dev, edesc, areq->src, areq->dst, areq->cryptlen, 0);
1539 unmap_single_talitos_ptr(dev, &edesc->desc.ptr[1], DMA_TO_DEVICE);
1540
1541 if (edesc->dma_len)
1542 dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1543 DMA_BIDIRECTIONAL);
1544 }
1545
1546 static void skcipher_done(struct device *dev,
1547 struct talitos_desc *desc, void *context,
1548 int err)
1549 {
1550 struct skcipher_request *areq = context;
1551 struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1552 struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1553 unsigned int ivsize = crypto_skcipher_ivsize(cipher);
1554 struct talitos_edesc *edesc;
1555
1556 edesc = container_of(desc, struct talitos_edesc, desc);
1557
1558 common_nonsnoop_unmap(dev, edesc, areq);
1559 memcpy(areq->iv, ctx->iv, ivsize);
1560
1561 kfree(edesc);
1562
1563 areq->base.complete(&areq->base, err);
1564 }
1565
1566 static int common_nonsnoop(struct talitos_edesc *edesc,
1567 struct skcipher_request *areq,
1568 void (*callback) (struct device *dev,
1569 struct talitos_desc *desc,
1570 void *context, int error))
1571 {
1572 struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1573 struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1574 struct device *dev = ctx->dev;
1575 struct talitos_desc *desc = &edesc->desc;
1576 unsigned int cryptlen = areq->cryptlen;
1577 unsigned int ivsize = crypto_skcipher_ivsize(cipher);
1578 int sg_count, ret;
1579 bool sync_needed = false;
1580 struct talitos_private *priv = dev_get_drvdata(dev);
1581 bool is_sec1 = has_ftr_sec1(priv);
1582 bool is_ctr = (desc->hdr & DESC_HDR_SEL0_MASK) == DESC_HDR_SEL0_AESU &&
1583 (desc->hdr & DESC_HDR_MODE0_AESU_MASK) == DESC_HDR_MODE0_AESU_CTR;
1584
1585
1586
1587
1588 to_talitos_ptr(&desc->ptr[1], edesc->iv_dma, ivsize, is_sec1);
1589
1590
1591 to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen, is_sec1);
1592
1593 sg_count = edesc->src_nents ?: 1;
1594 if (is_sec1 && sg_count > 1)
1595 sg_copy_to_buffer(areq->src, sg_count, edesc->buf,
1596 cryptlen);
1597 else
1598 sg_count = dma_map_sg(dev, areq->src, sg_count,
1599 (areq->src == areq->dst) ?
1600 DMA_BIDIRECTIONAL : DMA_TO_DEVICE);
1601
1602
1603
1604 sg_count = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[3],
1605 sg_count, 0, 0, 0, false, is_ctr ? 16 : 1);
1606 if (sg_count > 1)
1607 sync_needed = true;
1608
1609
1610 if (areq->src != areq->dst) {
1611 sg_count = edesc->dst_nents ? : 1;
1612 if (!is_sec1 || sg_count == 1)
1613 dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE);
1614 }
1615
1616 ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[4],
1617 sg_count, 0, (edesc->src_nents + 1));
1618 if (ret > 1)
1619 sync_needed = true;
1620
1621
1622 map_single_talitos_ptr(dev, &desc->ptr[5], ivsize, ctx->iv,
1623 DMA_FROM_DEVICE);
1624
1625
1626
1627 if (sync_needed)
1628 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1629 edesc->dma_len, DMA_BIDIRECTIONAL);
1630
1631 ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1632 if (ret != -EINPROGRESS) {
1633 common_nonsnoop_unmap(dev, edesc, areq);
1634 kfree(edesc);
1635 }
1636 return ret;
1637 }
1638
1639 static struct talitos_edesc *skcipher_edesc_alloc(struct skcipher_request *
1640 areq, bool encrypt)
1641 {
1642 struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1643 struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1644 unsigned int ivsize = crypto_skcipher_ivsize(cipher);
1645
1646 return talitos_edesc_alloc(ctx->dev, areq->src, areq->dst,
1647 areq->iv, 0, areq->cryptlen, 0, ivsize, 0,
1648 areq->base.flags, encrypt);
1649 }
1650
1651 static int skcipher_encrypt(struct skcipher_request *areq)
1652 {
1653 struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1654 struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1655 struct talitos_edesc *edesc;
1656 unsigned int blocksize =
1657 crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher));
1658
1659 if (!areq->cryptlen)
1660 return 0;
1661
1662 if (areq->cryptlen % blocksize)
1663 return -EINVAL;
1664
1665
1666 edesc = skcipher_edesc_alloc(areq, true);
1667 if (IS_ERR(edesc))
1668 return PTR_ERR(edesc);
1669
1670
1671 edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_MODE0_ENCRYPT;
1672
1673 return common_nonsnoop(edesc, areq, skcipher_done);
1674 }
1675
1676 static int skcipher_decrypt(struct skcipher_request *areq)
1677 {
1678 struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(areq);
1679 struct talitos_ctx *ctx = crypto_skcipher_ctx(cipher);
1680 struct talitos_edesc *edesc;
1681 unsigned int blocksize =
1682 crypto_tfm_alg_blocksize(crypto_skcipher_tfm(cipher));
1683
1684 if (!areq->cryptlen)
1685 return 0;
1686
1687 if (areq->cryptlen % blocksize)
1688 return -EINVAL;
1689
1690
1691 edesc = skcipher_edesc_alloc(areq, false);
1692 if (IS_ERR(edesc))
1693 return PTR_ERR(edesc);
1694
1695 edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND;
1696
1697 return common_nonsnoop(edesc, areq, skcipher_done);
1698 }
1699
1700 static void common_nonsnoop_hash_unmap(struct device *dev,
1701 struct talitos_edesc *edesc,
1702 struct ahash_request *areq)
1703 {
1704 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1705 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1706 struct talitos_private *priv = dev_get_drvdata(dev);
1707 bool is_sec1 = has_ftr_sec1(priv);
1708 struct talitos_desc *desc = &edesc->desc;
1709 struct talitos_desc *desc2 = (struct talitos_desc *)
1710 (edesc->buf + edesc->dma_len);
1711
1712 unmap_single_talitos_ptr(dev, &desc->ptr[5], DMA_FROM_DEVICE);
1713 if (desc->next_desc &&
1714 desc->ptr[5].ptr != desc2->ptr[5].ptr)
1715 unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE);
1716 if (req_ctx->last)
1717 memcpy(areq->result, req_ctx->hw_context,
1718 crypto_ahash_digestsize(tfm));
1719
1720 if (req_ctx->psrc)
1721 talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0);
1722
1723
1724 if (from_talitos_ptr_len(&desc->ptr[1], is_sec1))
1725 unmap_single_talitos_ptr(dev, &desc->ptr[1],
1726 DMA_TO_DEVICE);
1727 else if (desc->next_desc)
1728 unmap_single_talitos_ptr(dev, &desc2->ptr[1],
1729 DMA_TO_DEVICE);
1730
1731 if (is_sec1 && req_ctx->nbuf)
1732 unmap_single_talitos_ptr(dev, &desc->ptr[3],
1733 DMA_TO_DEVICE);
1734
1735 if (edesc->dma_len)
1736 dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len,
1737 DMA_BIDIRECTIONAL);
1738
1739 if (desc->next_desc)
1740 dma_unmap_single(dev, be32_to_cpu(desc->next_desc),
1741 TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
1742 }
1743
1744 static void ahash_done(struct device *dev,
1745 struct talitos_desc *desc, void *context,
1746 int err)
1747 {
1748 struct ahash_request *areq = context;
1749 struct talitos_edesc *edesc =
1750 container_of(desc, struct talitos_edesc, desc);
1751 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1752
1753 if (!req_ctx->last && req_ctx->to_hash_later) {
1754
1755 req_ctx->buf_idx = (req_ctx->buf_idx + 1) & 1;
1756 req_ctx->nbuf = req_ctx->to_hash_later;
1757 }
1758 common_nonsnoop_hash_unmap(dev, edesc, areq);
1759
1760 kfree(edesc);
1761
1762 areq->base.complete(&areq->base, err);
1763 }
1764
1765
1766
1767
1768
1769 static void talitos_handle_buggy_hash(struct talitos_ctx *ctx,
1770 struct talitos_edesc *edesc,
1771 struct talitos_ptr *ptr)
1772 {
1773 static u8 padded_hash[64] = {
1774 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1775 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1776 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1777 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1778 };
1779
1780 pr_err_once("Bug in SEC1, padding ourself\n");
1781 edesc->desc.hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1782 map_single_talitos_ptr(ctx->dev, ptr, sizeof(padded_hash),
1783 (char *)padded_hash, DMA_TO_DEVICE);
1784 }
1785
1786 static int common_nonsnoop_hash(struct talitos_edesc *edesc,
1787 struct ahash_request *areq, unsigned int length,
1788 void (*callback) (struct device *dev,
1789 struct talitos_desc *desc,
1790 void *context, int error))
1791 {
1792 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1793 struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1794 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1795 struct device *dev = ctx->dev;
1796 struct talitos_desc *desc = &edesc->desc;
1797 int ret;
1798 bool sync_needed = false;
1799 struct talitos_private *priv = dev_get_drvdata(dev);
1800 bool is_sec1 = has_ftr_sec1(priv);
1801 int sg_count;
1802
1803
1804
1805
1806 if (!req_ctx->first || req_ctx->swinit) {
1807 map_single_talitos_ptr_nosync(dev, &desc->ptr[1],
1808 req_ctx->hw_context_size,
1809 req_ctx->hw_context,
1810 DMA_TO_DEVICE);
1811 req_ctx->swinit = 0;
1812 }
1813
1814 req_ctx->first = 0;
1815
1816
1817 if (ctx->keylen)
1818 to_talitos_ptr(&desc->ptr[2], ctx->dma_key, ctx->keylen,
1819 is_sec1);
1820
1821 if (is_sec1 && req_ctx->nbuf)
1822 length -= req_ctx->nbuf;
1823
1824 sg_count = edesc->src_nents ?: 1;
1825 if (is_sec1 && sg_count > 1)
1826 sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length);
1827 else if (length)
1828 sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count,
1829 DMA_TO_DEVICE);
1830
1831
1832
1833 if (is_sec1 && req_ctx->nbuf) {
1834 map_single_talitos_ptr(dev, &desc->ptr[3], req_ctx->nbuf,
1835 req_ctx->buf[req_ctx->buf_idx],
1836 DMA_TO_DEVICE);
1837 } else {
1838 sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1839 &desc->ptr[3], sg_count, 0, 0);
1840 if (sg_count > 1)
1841 sync_needed = true;
1842 }
1843
1844
1845
1846
1847 if (req_ctx->last)
1848 map_single_talitos_ptr(dev, &desc->ptr[5],
1849 crypto_ahash_digestsize(tfm),
1850 req_ctx->hw_context, DMA_FROM_DEVICE);
1851 else
1852 map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1853 req_ctx->hw_context_size,
1854 req_ctx->hw_context,
1855 DMA_FROM_DEVICE);
1856
1857
1858
1859 if (is_sec1 && from_talitos_ptr_len(&desc->ptr[3], true) == 0)
1860 talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]);
1861
1862 if (is_sec1 && req_ctx->nbuf && length) {
1863 struct talitos_desc *desc2 = (struct talitos_desc *)
1864 (edesc->buf + edesc->dma_len);
1865 dma_addr_t next_desc;
1866
1867 memset(desc2, 0, sizeof(*desc2));
1868 desc2->hdr = desc->hdr;
1869 desc2->hdr &= ~DESC_HDR_MODE0_MDEU_INIT;
1870 desc2->hdr1 = desc2->hdr;
1871 desc->hdr &= ~DESC_HDR_MODE0_MDEU_PAD;
1872 desc->hdr |= DESC_HDR_MODE0_MDEU_CONT;
1873 desc->hdr &= ~DESC_HDR_DONE_NOTIFY;
1874
1875 if (desc->ptr[1].ptr)
1876 copy_talitos_ptr(&desc2->ptr[1], &desc->ptr[1],
1877 is_sec1);
1878 else
1879 map_single_talitos_ptr_nosync(dev, &desc2->ptr[1],
1880 req_ctx->hw_context_size,
1881 req_ctx->hw_context,
1882 DMA_TO_DEVICE);
1883 copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1);
1884 sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc,
1885 &desc2->ptr[3], sg_count, 0, 0);
1886 if (sg_count > 1)
1887 sync_needed = true;
1888 copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1);
1889 if (req_ctx->last)
1890 map_single_talitos_ptr_nosync(dev, &desc->ptr[5],
1891 req_ctx->hw_context_size,
1892 req_ctx->hw_context,
1893 DMA_FROM_DEVICE);
1894
1895 next_desc = dma_map_single(dev, &desc2->hdr1, TALITOS_DESC_SIZE,
1896 DMA_BIDIRECTIONAL);
1897 desc->next_desc = cpu_to_be32(next_desc);
1898 }
1899
1900 if (sync_needed)
1901 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1902 edesc->dma_len, DMA_BIDIRECTIONAL);
1903
1904 ret = talitos_submit(dev, ctx->ch, desc, callback, areq);
1905 if (ret != -EINPROGRESS) {
1906 common_nonsnoop_hash_unmap(dev, edesc, areq);
1907 kfree(edesc);
1908 }
1909 return ret;
1910 }
1911
1912 static struct talitos_edesc *ahash_edesc_alloc(struct ahash_request *areq,
1913 unsigned int nbytes)
1914 {
1915 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1916 struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1917 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1918 struct talitos_private *priv = dev_get_drvdata(ctx->dev);
1919 bool is_sec1 = has_ftr_sec1(priv);
1920
1921 if (is_sec1)
1922 nbytes -= req_ctx->nbuf;
1923
1924 return talitos_edesc_alloc(ctx->dev, req_ctx->psrc, NULL, NULL, 0,
1925 nbytes, 0, 0, 0, areq->base.flags, false);
1926 }
1927
1928 static int ahash_init(struct ahash_request *areq)
1929 {
1930 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1931 struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1932 struct device *dev = ctx->dev;
1933 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1934 unsigned int size;
1935 dma_addr_t dma;
1936
1937
1938 req_ctx->buf_idx = 0;
1939 req_ctx->nbuf = 0;
1940 req_ctx->first = 1;
1941 req_ctx->swinit = 0;
1942 size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
1943 ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
1944 : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
1945 req_ctx->hw_context_size = size;
1946
1947 dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
1948 DMA_TO_DEVICE);
1949 dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
1950
1951 return 0;
1952 }
1953
1954
1955
1956
1957
1958 static int ahash_init_sha224_swinit(struct ahash_request *areq)
1959 {
1960 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1961
1962 req_ctx->hw_context[0] = SHA224_H0;
1963 req_ctx->hw_context[1] = SHA224_H1;
1964 req_ctx->hw_context[2] = SHA224_H2;
1965 req_ctx->hw_context[3] = SHA224_H3;
1966 req_ctx->hw_context[4] = SHA224_H4;
1967 req_ctx->hw_context[5] = SHA224_H5;
1968 req_ctx->hw_context[6] = SHA224_H6;
1969 req_ctx->hw_context[7] = SHA224_H7;
1970
1971
1972 req_ctx->hw_context[8] = 0;
1973 req_ctx->hw_context[9] = 0;
1974
1975 ahash_init(areq);
1976 req_ctx->swinit = 1;
1977
1978 return 0;
1979 }
1980
1981 static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes)
1982 {
1983 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
1984 struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
1985 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1986 struct talitos_edesc *edesc;
1987 unsigned int blocksize =
1988 crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
1989 unsigned int nbytes_to_hash;
1990 unsigned int to_hash_later;
1991 unsigned int nsg;
1992 int nents;
1993 struct device *dev = ctx->dev;
1994 struct talitos_private *priv = dev_get_drvdata(dev);
1995 bool is_sec1 = has_ftr_sec1(priv);
1996 u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx];
1997
1998 if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) {
1999
2000 nents = sg_nents_for_len(areq->src, nbytes);
2001 if (nents < 0) {
2002 dev_err(ctx->dev, "Invalid number of src SG.\n");
2003 return nents;
2004 }
2005 sg_copy_to_buffer(areq->src, nents,
2006 ctx_buf + req_ctx->nbuf, nbytes);
2007 req_ctx->nbuf += nbytes;
2008 return 0;
2009 }
2010
2011
2012 nbytes_to_hash = nbytes + req_ctx->nbuf;
2013 to_hash_later = nbytes_to_hash & (blocksize - 1);
2014
2015 if (req_ctx->last)
2016 to_hash_later = 0;
2017 else if (to_hash_later)
2018
2019 nbytes_to_hash -= to_hash_later;
2020 else {
2021
2022 nbytes_to_hash -= blocksize;
2023 to_hash_later = blocksize;
2024 }
2025
2026
2027 if (!is_sec1 && req_ctx->nbuf) {
2028 nsg = (req_ctx->nbuf < nbytes_to_hash) ? 2 : 1;
2029 sg_init_table(req_ctx->bufsl, nsg);
2030 sg_set_buf(req_ctx->bufsl, ctx_buf, req_ctx->nbuf);
2031 if (nsg > 1)
2032 sg_chain(req_ctx->bufsl, 2, areq->src);
2033 req_ctx->psrc = req_ctx->bufsl;
2034 } else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) {
2035 int offset;
2036
2037 if (nbytes_to_hash > blocksize)
2038 offset = blocksize - req_ctx->nbuf;
2039 else
2040 offset = nbytes_to_hash - req_ctx->nbuf;
2041 nents = sg_nents_for_len(areq->src, offset);
2042 if (nents < 0) {
2043 dev_err(ctx->dev, "Invalid number of src SG.\n");
2044 return nents;
2045 }
2046 sg_copy_to_buffer(areq->src, nents,
2047 ctx_buf + req_ctx->nbuf, offset);
2048 req_ctx->nbuf += offset;
2049 req_ctx->psrc = scatterwalk_ffwd(req_ctx->bufsl, areq->src,
2050 offset);
2051 } else
2052 req_ctx->psrc = areq->src;
2053
2054 if (to_hash_later) {
2055 nents = sg_nents_for_len(areq->src, nbytes);
2056 if (nents < 0) {
2057 dev_err(ctx->dev, "Invalid number of src SG.\n");
2058 return nents;
2059 }
2060 sg_pcopy_to_buffer(areq->src, nents,
2061 req_ctx->buf[(req_ctx->buf_idx + 1) & 1],
2062 to_hash_later,
2063 nbytes - to_hash_later);
2064 }
2065 req_ctx->to_hash_later = to_hash_later;
2066
2067
2068 edesc = ahash_edesc_alloc(areq, nbytes_to_hash);
2069 if (IS_ERR(edesc))
2070 return PTR_ERR(edesc);
2071
2072 edesc->desc.hdr = ctx->desc_hdr_template;
2073
2074
2075 if (req_ctx->last)
2076 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_PAD;
2077 else
2078 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_CONT;
2079
2080
2081 if (req_ctx->first && !req_ctx->swinit)
2082 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_INIT;
2083
2084
2085
2086
2087 if (ctx->keylen && (req_ctx->first || req_ctx->last))
2088 edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC;
2089
2090 return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, ahash_done);
2091 }
2092
2093 static int ahash_update(struct ahash_request *areq)
2094 {
2095 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2096
2097 req_ctx->last = 0;
2098
2099 return ahash_process_req(areq, areq->nbytes);
2100 }
2101
2102 static int ahash_final(struct ahash_request *areq)
2103 {
2104 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2105
2106 req_ctx->last = 1;
2107
2108 return ahash_process_req(areq, 0);
2109 }
2110
2111 static int ahash_finup(struct ahash_request *areq)
2112 {
2113 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2114
2115 req_ctx->last = 1;
2116
2117 return ahash_process_req(areq, areq->nbytes);
2118 }
2119
2120 static int ahash_digest(struct ahash_request *areq)
2121 {
2122 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2123 struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
2124
2125 ahash->init(areq);
2126 req_ctx->last = 1;
2127
2128 return ahash_process_req(areq, areq->nbytes);
2129 }
2130
2131 static int ahash_export(struct ahash_request *areq, void *out)
2132 {
2133 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2134 struct talitos_export_state *export = out;
2135 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2136 struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2137 struct device *dev = ctx->dev;
2138 dma_addr_t dma;
2139
2140 dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2141 DMA_FROM_DEVICE);
2142 dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_FROM_DEVICE);
2143
2144 memcpy(export->hw_context, req_ctx->hw_context,
2145 req_ctx->hw_context_size);
2146 memcpy(export->buf, req_ctx->buf[req_ctx->buf_idx], req_ctx->nbuf);
2147 export->swinit = req_ctx->swinit;
2148 export->first = req_ctx->first;
2149 export->last = req_ctx->last;
2150 export->to_hash_later = req_ctx->to_hash_later;
2151 export->nbuf = req_ctx->nbuf;
2152
2153 return 0;
2154 }
2155
2156 static int ahash_import(struct ahash_request *areq, const void *in)
2157 {
2158 struct talitos_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
2159 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2160 struct talitos_ctx *ctx = crypto_ahash_ctx(tfm);
2161 struct device *dev = ctx->dev;
2162 const struct talitos_export_state *export = in;
2163 unsigned int size;
2164 dma_addr_t dma;
2165
2166 memset(req_ctx, 0, sizeof(*req_ctx));
2167 size = (crypto_ahash_digestsize(tfm) <= SHA256_DIGEST_SIZE)
2168 ? TALITOS_MDEU_CONTEXT_SIZE_MD5_SHA1_SHA256
2169 : TALITOS_MDEU_CONTEXT_SIZE_SHA384_SHA512;
2170 req_ctx->hw_context_size = size;
2171 memcpy(req_ctx->hw_context, export->hw_context, size);
2172 memcpy(req_ctx->buf[0], export->buf, export->nbuf);
2173 req_ctx->swinit = export->swinit;
2174 req_ctx->first = export->first;
2175 req_ctx->last = export->last;
2176 req_ctx->to_hash_later = export->to_hash_later;
2177 req_ctx->nbuf = export->nbuf;
2178
2179 dma = dma_map_single(dev, req_ctx->hw_context, req_ctx->hw_context_size,
2180 DMA_TO_DEVICE);
2181 dma_unmap_single(dev, dma, req_ctx->hw_context_size, DMA_TO_DEVICE);
2182
2183 return 0;
2184 }
2185
2186 static int keyhash(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen,
2187 u8 *hash)
2188 {
2189 struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2190
2191 struct scatterlist sg[1];
2192 struct ahash_request *req;
2193 struct crypto_wait wait;
2194 int ret;
2195
2196 crypto_init_wait(&wait);
2197
2198 req = ahash_request_alloc(tfm, GFP_KERNEL);
2199 if (!req)
2200 return -ENOMEM;
2201
2202
2203 ctx->keylen = 0;
2204 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
2205 crypto_req_done, &wait);
2206
2207 sg_init_one(&sg[0], key, keylen);
2208
2209 ahash_request_set_crypt(req, sg, hash, keylen);
2210 ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
2211
2212 ahash_request_free(req);
2213
2214 return ret;
2215 }
2216
2217 static int ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
2218 unsigned int keylen)
2219 {
2220 struct talitos_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
2221 struct device *dev = ctx->dev;
2222 unsigned int blocksize =
2223 crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
2224 unsigned int digestsize = crypto_ahash_digestsize(tfm);
2225 unsigned int keysize = keylen;
2226 u8 hash[SHA512_DIGEST_SIZE];
2227 int ret;
2228
2229 if (keylen <= blocksize)
2230 memcpy(ctx->key, key, keysize);
2231 else {
2232
2233 ret = keyhash(tfm, key, keylen, hash);
2234
2235 if (ret)
2236 return -EINVAL;
2237
2238 keysize = digestsize;
2239 memcpy(ctx->key, hash, digestsize);
2240 }
2241
2242 if (ctx->keylen)
2243 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
2244
2245 ctx->keylen = keysize;
2246 ctx->dma_key = dma_map_single(dev, ctx->key, keysize, DMA_TO_DEVICE);
2247
2248 return 0;
2249 }
2250
2251
2252 struct talitos_alg_template {
2253 u32 type;
2254 u32 priority;
2255 union {
2256 struct skcipher_alg skcipher;
2257 struct ahash_alg hash;
2258 struct aead_alg aead;
2259 } alg;
2260 __be32 desc_hdr_template;
2261 };
2262
2263 static struct talitos_alg_template driver_algs[] = {
2264
2265 { .type = CRYPTO_ALG_TYPE_AEAD,
2266 .alg.aead = {
2267 .base = {
2268 .cra_name = "authenc(hmac(sha1),cbc(aes))",
2269 .cra_driver_name = "authenc-hmac-sha1-"
2270 "cbc-aes-talitos",
2271 .cra_blocksize = AES_BLOCK_SIZE,
2272 .cra_flags = CRYPTO_ALG_ASYNC |
2273 CRYPTO_ALG_ALLOCATES_MEMORY,
2274 },
2275 .ivsize = AES_BLOCK_SIZE,
2276 .maxauthsize = SHA1_DIGEST_SIZE,
2277 },
2278 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2279 DESC_HDR_SEL0_AESU |
2280 DESC_HDR_MODE0_AESU_CBC |
2281 DESC_HDR_SEL1_MDEUA |
2282 DESC_HDR_MODE1_MDEU_INIT |
2283 DESC_HDR_MODE1_MDEU_PAD |
2284 DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2285 },
2286 { .type = CRYPTO_ALG_TYPE_AEAD,
2287 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2288 .alg.aead = {
2289 .base = {
2290 .cra_name = "authenc(hmac(sha1),cbc(aes))",
2291 .cra_driver_name = "authenc-hmac-sha1-"
2292 "cbc-aes-talitos-hsna",
2293 .cra_blocksize = AES_BLOCK_SIZE,
2294 .cra_flags = CRYPTO_ALG_ASYNC |
2295 CRYPTO_ALG_ALLOCATES_MEMORY,
2296 },
2297 .ivsize = AES_BLOCK_SIZE,
2298 .maxauthsize = SHA1_DIGEST_SIZE,
2299 },
2300 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2301 DESC_HDR_SEL0_AESU |
2302 DESC_HDR_MODE0_AESU_CBC |
2303 DESC_HDR_SEL1_MDEUA |
2304 DESC_HDR_MODE1_MDEU_INIT |
2305 DESC_HDR_MODE1_MDEU_PAD |
2306 DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2307 },
2308 { .type = CRYPTO_ALG_TYPE_AEAD,
2309 .alg.aead = {
2310 .base = {
2311 .cra_name = "authenc(hmac(sha1),"
2312 "cbc(des3_ede))",
2313 .cra_driver_name = "authenc-hmac-sha1-"
2314 "cbc-3des-talitos",
2315 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2316 .cra_flags = CRYPTO_ALG_ASYNC |
2317 CRYPTO_ALG_ALLOCATES_MEMORY,
2318 },
2319 .ivsize = DES3_EDE_BLOCK_SIZE,
2320 .maxauthsize = SHA1_DIGEST_SIZE,
2321 .setkey = aead_des3_setkey,
2322 },
2323 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2324 DESC_HDR_SEL0_DEU |
2325 DESC_HDR_MODE0_DEU_CBC |
2326 DESC_HDR_MODE0_DEU_3DES |
2327 DESC_HDR_SEL1_MDEUA |
2328 DESC_HDR_MODE1_MDEU_INIT |
2329 DESC_HDR_MODE1_MDEU_PAD |
2330 DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2331 },
2332 { .type = CRYPTO_ALG_TYPE_AEAD,
2333 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2334 .alg.aead = {
2335 .base = {
2336 .cra_name = "authenc(hmac(sha1),"
2337 "cbc(des3_ede))",
2338 .cra_driver_name = "authenc-hmac-sha1-"
2339 "cbc-3des-talitos-hsna",
2340 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2341 .cra_flags = CRYPTO_ALG_ASYNC |
2342 CRYPTO_ALG_ALLOCATES_MEMORY,
2343 },
2344 .ivsize = DES3_EDE_BLOCK_SIZE,
2345 .maxauthsize = SHA1_DIGEST_SIZE,
2346 .setkey = aead_des3_setkey,
2347 },
2348 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2349 DESC_HDR_SEL0_DEU |
2350 DESC_HDR_MODE0_DEU_CBC |
2351 DESC_HDR_MODE0_DEU_3DES |
2352 DESC_HDR_SEL1_MDEUA |
2353 DESC_HDR_MODE1_MDEU_INIT |
2354 DESC_HDR_MODE1_MDEU_PAD |
2355 DESC_HDR_MODE1_MDEU_SHA1_HMAC,
2356 },
2357 { .type = CRYPTO_ALG_TYPE_AEAD,
2358 .alg.aead = {
2359 .base = {
2360 .cra_name = "authenc(hmac(sha224),cbc(aes))",
2361 .cra_driver_name = "authenc-hmac-sha224-"
2362 "cbc-aes-talitos",
2363 .cra_blocksize = AES_BLOCK_SIZE,
2364 .cra_flags = CRYPTO_ALG_ASYNC |
2365 CRYPTO_ALG_ALLOCATES_MEMORY,
2366 },
2367 .ivsize = AES_BLOCK_SIZE,
2368 .maxauthsize = SHA224_DIGEST_SIZE,
2369 },
2370 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2371 DESC_HDR_SEL0_AESU |
2372 DESC_HDR_MODE0_AESU_CBC |
2373 DESC_HDR_SEL1_MDEUA |
2374 DESC_HDR_MODE1_MDEU_INIT |
2375 DESC_HDR_MODE1_MDEU_PAD |
2376 DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2377 },
2378 { .type = CRYPTO_ALG_TYPE_AEAD,
2379 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2380 .alg.aead = {
2381 .base = {
2382 .cra_name = "authenc(hmac(sha224),cbc(aes))",
2383 .cra_driver_name = "authenc-hmac-sha224-"
2384 "cbc-aes-talitos-hsna",
2385 .cra_blocksize = AES_BLOCK_SIZE,
2386 .cra_flags = CRYPTO_ALG_ASYNC |
2387 CRYPTO_ALG_ALLOCATES_MEMORY,
2388 },
2389 .ivsize = AES_BLOCK_SIZE,
2390 .maxauthsize = SHA224_DIGEST_SIZE,
2391 },
2392 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2393 DESC_HDR_SEL0_AESU |
2394 DESC_HDR_MODE0_AESU_CBC |
2395 DESC_HDR_SEL1_MDEUA |
2396 DESC_HDR_MODE1_MDEU_INIT |
2397 DESC_HDR_MODE1_MDEU_PAD |
2398 DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2399 },
2400 { .type = CRYPTO_ALG_TYPE_AEAD,
2401 .alg.aead = {
2402 .base = {
2403 .cra_name = "authenc(hmac(sha224),"
2404 "cbc(des3_ede))",
2405 .cra_driver_name = "authenc-hmac-sha224-"
2406 "cbc-3des-talitos",
2407 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2408 .cra_flags = CRYPTO_ALG_ASYNC |
2409 CRYPTO_ALG_ALLOCATES_MEMORY,
2410 },
2411 .ivsize = DES3_EDE_BLOCK_SIZE,
2412 .maxauthsize = SHA224_DIGEST_SIZE,
2413 .setkey = aead_des3_setkey,
2414 },
2415 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2416 DESC_HDR_SEL0_DEU |
2417 DESC_HDR_MODE0_DEU_CBC |
2418 DESC_HDR_MODE0_DEU_3DES |
2419 DESC_HDR_SEL1_MDEUA |
2420 DESC_HDR_MODE1_MDEU_INIT |
2421 DESC_HDR_MODE1_MDEU_PAD |
2422 DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2423 },
2424 { .type = CRYPTO_ALG_TYPE_AEAD,
2425 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2426 .alg.aead = {
2427 .base = {
2428 .cra_name = "authenc(hmac(sha224),"
2429 "cbc(des3_ede))",
2430 .cra_driver_name = "authenc-hmac-sha224-"
2431 "cbc-3des-talitos-hsna",
2432 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2433 .cra_flags = CRYPTO_ALG_ASYNC |
2434 CRYPTO_ALG_ALLOCATES_MEMORY,
2435 },
2436 .ivsize = DES3_EDE_BLOCK_SIZE,
2437 .maxauthsize = SHA224_DIGEST_SIZE,
2438 .setkey = aead_des3_setkey,
2439 },
2440 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2441 DESC_HDR_SEL0_DEU |
2442 DESC_HDR_MODE0_DEU_CBC |
2443 DESC_HDR_MODE0_DEU_3DES |
2444 DESC_HDR_SEL1_MDEUA |
2445 DESC_HDR_MODE1_MDEU_INIT |
2446 DESC_HDR_MODE1_MDEU_PAD |
2447 DESC_HDR_MODE1_MDEU_SHA224_HMAC,
2448 },
2449 { .type = CRYPTO_ALG_TYPE_AEAD,
2450 .alg.aead = {
2451 .base = {
2452 .cra_name = "authenc(hmac(sha256),cbc(aes))",
2453 .cra_driver_name = "authenc-hmac-sha256-"
2454 "cbc-aes-talitos",
2455 .cra_blocksize = AES_BLOCK_SIZE,
2456 .cra_flags = CRYPTO_ALG_ASYNC |
2457 CRYPTO_ALG_ALLOCATES_MEMORY,
2458 },
2459 .ivsize = AES_BLOCK_SIZE,
2460 .maxauthsize = SHA256_DIGEST_SIZE,
2461 },
2462 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2463 DESC_HDR_SEL0_AESU |
2464 DESC_HDR_MODE0_AESU_CBC |
2465 DESC_HDR_SEL1_MDEUA |
2466 DESC_HDR_MODE1_MDEU_INIT |
2467 DESC_HDR_MODE1_MDEU_PAD |
2468 DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2469 },
2470 { .type = CRYPTO_ALG_TYPE_AEAD,
2471 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2472 .alg.aead = {
2473 .base = {
2474 .cra_name = "authenc(hmac(sha256),cbc(aes))",
2475 .cra_driver_name = "authenc-hmac-sha256-"
2476 "cbc-aes-talitos-hsna",
2477 .cra_blocksize = AES_BLOCK_SIZE,
2478 .cra_flags = CRYPTO_ALG_ASYNC |
2479 CRYPTO_ALG_ALLOCATES_MEMORY,
2480 },
2481 .ivsize = AES_BLOCK_SIZE,
2482 .maxauthsize = SHA256_DIGEST_SIZE,
2483 },
2484 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2485 DESC_HDR_SEL0_AESU |
2486 DESC_HDR_MODE0_AESU_CBC |
2487 DESC_HDR_SEL1_MDEUA |
2488 DESC_HDR_MODE1_MDEU_INIT |
2489 DESC_HDR_MODE1_MDEU_PAD |
2490 DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2491 },
2492 { .type = CRYPTO_ALG_TYPE_AEAD,
2493 .alg.aead = {
2494 .base = {
2495 .cra_name = "authenc(hmac(sha256),"
2496 "cbc(des3_ede))",
2497 .cra_driver_name = "authenc-hmac-sha256-"
2498 "cbc-3des-talitos",
2499 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2500 .cra_flags = CRYPTO_ALG_ASYNC |
2501 CRYPTO_ALG_ALLOCATES_MEMORY,
2502 },
2503 .ivsize = DES3_EDE_BLOCK_SIZE,
2504 .maxauthsize = SHA256_DIGEST_SIZE,
2505 .setkey = aead_des3_setkey,
2506 },
2507 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2508 DESC_HDR_SEL0_DEU |
2509 DESC_HDR_MODE0_DEU_CBC |
2510 DESC_HDR_MODE0_DEU_3DES |
2511 DESC_HDR_SEL1_MDEUA |
2512 DESC_HDR_MODE1_MDEU_INIT |
2513 DESC_HDR_MODE1_MDEU_PAD |
2514 DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2515 },
2516 { .type = CRYPTO_ALG_TYPE_AEAD,
2517 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2518 .alg.aead = {
2519 .base = {
2520 .cra_name = "authenc(hmac(sha256),"
2521 "cbc(des3_ede))",
2522 .cra_driver_name = "authenc-hmac-sha256-"
2523 "cbc-3des-talitos-hsna",
2524 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2525 .cra_flags = CRYPTO_ALG_ASYNC |
2526 CRYPTO_ALG_ALLOCATES_MEMORY,
2527 },
2528 .ivsize = DES3_EDE_BLOCK_SIZE,
2529 .maxauthsize = SHA256_DIGEST_SIZE,
2530 .setkey = aead_des3_setkey,
2531 },
2532 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2533 DESC_HDR_SEL0_DEU |
2534 DESC_HDR_MODE0_DEU_CBC |
2535 DESC_HDR_MODE0_DEU_3DES |
2536 DESC_HDR_SEL1_MDEUA |
2537 DESC_HDR_MODE1_MDEU_INIT |
2538 DESC_HDR_MODE1_MDEU_PAD |
2539 DESC_HDR_MODE1_MDEU_SHA256_HMAC,
2540 },
2541 { .type = CRYPTO_ALG_TYPE_AEAD,
2542 .alg.aead = {
2543 .base = {
2544 .cra_name = "authenc(hmac(sha384),cbc(aes))",
2545 .cra_driver_name = "authenc-hmac-sha384-"
2546 "cbc-aes-talitos",
2547 .cra_blocksize = AES_BLOCK_SIZE,
2548 .cra_flags = CRYPTO_ALG_ASYNC |
2549 CRYPTO_ALG_ALLOCATES_MEMORY,
2550 },
2551 .ivsize = AES_BLOCK_SIZE,
2552 .maxauthsize = SHA384_DIGEST_SIZE,
2553 },
2554 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2555 DESC_HDR_SEL0_AESU |
2556 DESC_HDR_MODE0_AESU_CBC |
2557 DESC_HDR_SEL1_MDEUB |
2558 DESC_HDR_MODE1_MDEU_INIT |
2559 DESC_HDR_MODE1_MDEU_PAD |
2560 DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2561 },
2562 { .type = CRYPTO_ALG_TYPE_AEAD,
2563 .alg.aead = {
2564 .base = {
2565 .cra_name = "authenc(hmac(sha384),"
2566 "cbc(des3_ede))",
2567 .cra_driver_name = "authenc-hmac-sha384-"
2568 "cbc-3des-talitos",
2569 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2570 .cra_flags = CRYPTO_ALG_ASYNC |
2571 CRYPTO_ALG_ALLOCATES_MEMORY,
2572 },
2573 .ivsize = DES3_EDE_BLOCK_SIZE,
2574 .maxauthsize = SHA384_DIGEST_SIZE,
2575 .setkey = aead_des3_setkey,
2576 },
2577 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2578 DESC_HDR_SEL0_DEU |
2579 DESC_HDR_MODE0_DEU_CBC |
2580 DESC_HDR_MODE0_DEU_3DES |
2581 DESC_HDR_SEL1_MDEUB |
2582 DESC_HDR_MODE1_MDEU_INIT |
2583 DESC_HDR_MODE1_MDEU_PAD |
2584 DESC_HDR_MODE1_MDEUB_SHA384_HMAC,
2585 },
2586 { .type = CRYPTO_ALG_TYPE_AEAD,
2587 .alg.aead = {
2588 .base = {
2589 .cra_name = "authenc(hmac(sha512),cbc(aes))",
2590 .cra_driver_name = "authenc-hmac-sha512-"
2591 "cbc-aes-talitos",
2592 .cra_blocksize = AES_BLOCK_SIZE,
2593 .cra_flags = CRYPTO_ALG_ASYNC |
2594 CRYPTO_ALG_ALLOCATES_MEMORY,
2595 },
2596 .ivsize = AES_BLOCK_SIZE,
2597 .maxauthsize = SHA512_DIGEST_SIZE,
2598 },
2599 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2600 DESC_HDR_SEL0_AESU |
2601 DESC_HDR_MODE0_AESU_CBC |
2602 DESC_HDR_SEL1_MDEUB |
2603 DESC_HDR_MODE1_MDEU_INIT |
2604 DESC_HDR_MODE1_MDEU_PAD |
2605 DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2606 },
2607 { .type = CRYPTO_ALG_TYPE_AEAD,
2608 .alg.aead = {
2609 .base = {
2610 .cra_name = "authenc(hmac(sha512),"
2611 "cbc(des3_ede))",
2612 .cra_driver_name = "authenc-hmac-sha512-"
2613 "cbc-3des-talitos",
2614 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2615 .cra_flags = CRYPTO_ALG_ASYNC |
2616 CRYPTO_ALG_ALLOCATES_MEMORY,
2617 },
2618 .ivsize = DES3_EDE_BLOCK_SIZE,
2619 .maxauthsize = SHA512_DIGEST_SIZE,
2620 .setkey = aead_des3_setkey,
2621 },
2622 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2623 DESC_HDR_SEL0_DEU |
2624 DESC_HDR_MODE0_DEU_CBC |
2625 DESC_HDR_MODE0_DEU_3DES |
2626 DESC_HDR_SEL1_MDEUB |
2627 DESC_HDR_MODE1_MDEU_INIT |
2628 DESC_HDR_MODE1_MDEU_PAD |
2629 DESC_HDR_MODE1_MDEUB_SHA512_HMAC,
2630 },
2631 { .type = CRYPTO_ALG_TYPE_AEAD,
2632 .alg.aead = {
2633 .base = {
2634 .cra_name = "authenc(hmac(md5),cbc(aes))",
2635 .cra_driver_name = "authenc-hmac-md5-"
2636 "cbc-aes-talitos",
2637 .cra_blocksize = AES_BLOCK_SIZE,
2638 .cra_flags = CRYPTO_ALG_ASYNC |
2639 CRYPTO_ALG_ALLOCATES_MEMORY,
2640 },
2641 .ivsize = AES_BLOCK_SIZE,
2642 .maxauthsize = MD5_DIGEST_SIZE,
2643 },
2644 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2645 DESC_HDR_SEL0_AESU |
2646 DESC_HDR_MODE0_AESU_CBC |
2647 DESC_HDR_SEL1_MDEUA |
2648 DESC_HDR_MODE1_MDEU_INIT |
2649 DESC_HDR_MODE1_MDEU_PAD |
2650 DESC_HDR_MODE1_MDEU_MD5_HMAC,
2651 },
2652 { .type = CRYPTO_ALG_TYPE_AEAD,
2653 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2654 .alg.aead = {
2655 .base = {
2656 .cra_name = "authenc(hmac(md5),cbc(aes))",
2657 .cra_driver_name = "authenc-hmac-md5-"
2658 "cbc-aes-talitos-hsna",
2659 .cra_blocksize = AES_BLOCK_SIZE,
2660 .cra_flags = CRYPTO_ALG_ASYNC |
2661 CRYPTO_ALG_ALLOCATES_MEMORY,
2662 },
2663 .ivsize = AES_BLOCK_SIZE,
2664 .maxauthsize = MD5_DIGEST_SIZE,
2665 },
2666 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2667 DESC_HDR_SEL0_AESU |
2668 DESC_HDR_MODE0_AESU_CBC |
2669 DESC_HDR_SEL1_MDEUA |
2670 DESC_HDR_MODE1_MDEU_INIT |
2671 DESC_HDR_MODE1_MDEU_PAD |
2672 DESC_HDR_MODE1_MDEU_MD5_HMAC,
2673 },
2674 { .type = CRYPTO_ALG_TYPE_AEAD,
2675 .alg.aead = {
2676 .base = {
2677 .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2678 .cra_driver_name = "authenc-hmac-md5-"
2679 "cbc-3des-talitos",
2680 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2681 .cra_flags = CRYPTO_ALG_ASYNC |
2682 CRYPTO_ALG_ALLOCATES_MEMORY,
2683 },
2684 .ivsize = DES3_EDE_BLOCK_SIZE,
2685 .maxauthsize = MD5_DIGEST_SIZE,
2686 .setkey = aead_des3_setkey,
2687 },
2688 .desc_hdr_template = DESC_HDR_TYPE_IPSEC_ESP |
2689 DESC_HDR_SEL0_DEU |
2690 DESC_HDR_MODE0_DEU_CBC |
2691 DESC_HDR_MODE0_DEU_3DES |
2692 DESC_HDR_SEL1_MDEUA |
2693 DESC_HDR_MODE1_MDEU_INIT |
2694 DESC_HDR_MODE1_MDEU_PAD |
2695 DESC_HDR_MODE1_MDEU_MD5_HMAC,
2696 },
2697 { .type = CRYPTO_ALG_TYPE_AEAD,
2698 .priority = TALITOS_CRA_PRIORITY_AEAD_HSNA,
2699 .alg.aead = {
2700 .base = {
2701 .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2702 .cra_driver_name = "authenc-hmac-md5-"
2703 "cbc-3des-talitos-hsna",
2704 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
2705 .cra_flags = CRYPTO_ALG_ASYNC |
2706 CRYPTO_ALG_ALLOCATES_MEMORY,
2707 },
2708 .ivsize = DES3_EDE_BLOCK_SIZE,
2709 .maxauthsize = MD5_DIGEST_SIZE,
2710 .setkey = aead_des3_setkey,
2711 },
2712 .desc_hdr_template = DESC_HDR_TYPE_HMAC_SNOOP_NO_AFEU |
2713 DESC_HDR_SEL0_DEU |
2714 DESC_HDR_MODE0_DEU_CBC |
2715 DESC_HDR_MODE0_DEU_3DES |
2716 DESC_HDR_SEL1_MDEUA |
2717 DESC_HDR_MODE1_MDEU_INIT |
2718 DESC_HDR_MODE1_MDEU_PAD |
2719 DESC_HDR_MODE1_MDEU_MD5_HMAC,
2720 },
2721
2722 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2723 .alg.skcipher = {
2724 .base.cra_name = "ecb(aes)",
2725 .base.cra_driver_name = "ecb-aes-talitos",
2726 .base.cra_blocksize = AES_BLOCK_SIZE,
2727 .base.cra_flags = CRYPTO_ALG_ASYNC |
2728 CRYPTO_ALG_ALLOCATES_MEMORY,
2729 .min_keysize = AES_MIN_KEY_SIZE,
2730 .max_keysize = AES_MAX_KEY_SIZE,
2731 .setkey = skcipher_aes_setkey,
2732 },
2733 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2734 DESC_HDR_SEL0_AESU,
2735 },
2736 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2737 .alg.skcipher = {
2738 .base.cra_name = "cbc(aes)",
2739 .base.cra_driver_name = "cbc-aes-talitos",
2740 .base.cra_blocksize = AES_BLOCK_SIZE,
2741 .base.cra_flags = CRYPTO_ALG_ASYNC |
2742 CRYPTO_ALG_ALLOCATES_MEMORY,
2743 .min_keysize = AES_MIN_KEY_SIZE,
2744 .max_keysize = AES_MAX_KEY_SIZE,
2745 .ivsize = AES_BLOCK_SIZE,
2746 .setkey = skcipher_aes_setkey,
2747 },
2748 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2749 DESC_HDR_SEL0_AESU |
2750 DESC_HDR_MODE0_AESU_CBC,
2751 },
2752 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2753 .alg.skcipher = {
2754 .base.cra_name = "ctr(aes)",
2755 .base.cra_driver_name = "ctr-aes-talitos",
2756 .base.cra_blocksize = 1,
2757 .base.cra_flags = CRYPTO_ALG_ASYNC |
2758 CRYPTO_ALG_ALLOCATES_MEMORY,
2759 .min_keysize = AES_MIN_KEY_SIZE,
2760 .max_keysize = AES_MAX_KEY_SIZE,
2761 .ivsize = AES_BLOCK_SIZE,
2762 .setkey = skcipher_aes_setkey,
2763 },
2764 .desc_hdr_template = DESC_HDR_TYPE_AESU_CTR_NONSNOOP |
2765 DESC_HDR_SEL0_AESU |
2766 DESC_HDR_MODE0_AESU_CTR,
2767 },
2768 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2769 .alg.skcipher = {
2770 .base.cra_name = "ctr(aes)",
2771 .base.cra_driver_name = "ctr-aes-talitos",
2772 .base.cra_blocksize = 1,
2773 .base.cra_flags = CRYPTO_ALG_ASYNC |
2774 CRYPTO_ALG_ALLOCATES_MEMORY,
2775 .min_keysize = AES_MIN_KEY_SIZE,
2776 .max_keysize = AES_MAX_KEY_SIZE,
2777 .ivsize = AES_BLOCK_SIZE,
2778 .setkey = skcipher_aes_setkey,
2779 },
2780 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2781 DESC_HDR_SEL0_AESU |
2782 DESC_HDR_MODE0_AESU_CTR,
2783 },
2784 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2785 .alg.skcipher = {
2786 .base.cra_name = "ecb(des)",
2787 .base.cra_driver_name = "ecb-des-talitos",
2788 .base.cra_blocksize = DES_BLOCK_SIZE,
2789 .base.cra_flags = CRYPTO_ALG_ASYNC |
2790 CRYPTO_ALG_ALLOCATES_MEMORY,
2791 .min_keysize = DES_KEY_SIZE,
2792 .max_keysize = DES_KEY_SIZE,
2793 .setkey = skcipher_des_setkey,
2794 },
2795 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2796 DESC_HDR_SEL0_DEU,
2797 },
2798 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2799 .alg.skcipher = {
2800 .base.cra_name = "cbc(des)",
2801 .base.cra_driver_name = "cbc-des-talitos",
2802 .base.cra_blocksize = DES_BLOCK_SIZE,
2803 .base.cra_flags = CRYPTO_ALG_ASYNC |
2804 CRYPTO_ALG_ALLOCATES_MEMORY,
2805 .min_keysize = DES_KEY_SIZE,
2806 .max_keysize = DES_KEY_SIZE,
2807 .ivsize = DES_BLOCK_SIZE,
2808 .setkey = skcipher_des_setkey,
2809 },
2810 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2811 DESC_HDR_SEL0_DEU |
2812 DESC_HDR_MODE0_DEU_CBC,
2813 },
2814 { .type = CRYPTO_ALG_TYPE_SKCIPHER,
2815 .alg.skcipher = {
2816 .base.cra_name = "ecb(des3_ede)",
2817 .base.cra_driver_name = "ecb-3des-talitos",
2818 .base.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2819 .base.cra_flags = CRYPTO_ALG_ASYNC |
2820 CRYPTO_ALG_ALLOCATES_MEMORY,
2821 .min_keysize = DES3_EDE_KEY_SIZE,
2822 .max_keysize = DES3_EDE_KEY_SIZE,
2823 .setkey = skcipher_des3_setkey,
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_SKCIPHER,
2830 .alg.skcipher = {
2831 .base.cra_name = "cbc(des3_ede)",
2832 .base.cra_driver_name = "cbc-3des-talitos",
2833 .base.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2834 .base.cra_flags = CRYPTO_ALG_ASYNC |
2835 CRYPTO_ALG_ALLOCATES_MEMORY,
2836 .min_keysize = DES3_EDE_KEY_SIZE,
2837 .max_keysize = DES3_EDE_KEY_SIZE,
2838 .ivsize = DES3_EDE_BLOCK_SIZE,
2839 .setkey = skcipher_des3_setkey,
2840 },
2841 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2842 DESC_HDR_SEL0_DEU |
2843 DESC_HDR_MODE0_DEU_CBC |
2844 DESC_HDR_MODE0_DEU_3DES,
2845 },
2846
2847 { .type = CRYPTO_ALG_TYPE_AHASH,
2848 .alg.hash = {
2849 .halg.digestsize = MD5_DIGEST_SIZE,
2850 .halg.statesize = sizeof(struct talitos_export_state),
2851 .halg.base = {
2852 .cra_name = "md5",
2853 .cra_driver_name = "md5-talitos",
2854 .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2855 .cra_flags = CRYPTO_ALG_ASYNC |
2856 CRYPTO_ALG_ALLOCATES_MEMORY,
2857 }
2858 },
2859 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2860 DESC_HDR_SEL0_MDEUA |
2861 DESC_HDR_MODE0_MDEU_MD5,
2862 },
2863 { .type = CRYPTO_ALG_TYPE_AHASH,
2864 .alg.hash = {
2865 .halg.digestsize = SHA1_DIGEST_SIZE,
2866 .halg.statesize = sizeof(struct talitos_export_state),
2867 .halg.base = {
2868 .cra_name = "sha1",
2869 .cra_driver_name = "sha1-talitos",
2870 .cra_blocksize = SHA1_BLOCK_SIZE,
2871 .cra_flags = CRYPTO_ALG_ASYNC |
2872 CRYPTO_ALG_ALLOCATES_MEMORY,
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 CRYPTO_ALG_ALLOCATES_MEMORY,
2889 }
2890 },
2891 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2892 DESC_HDR_SEL0_MDEUA |
2893 DESC_HDR_MODE0_MDEU_SHA224,
2894 },
2895 { .type = CRYPTO_ALG_TYPE_AHASH,
2896 .alg.hash = {
2897 .halg.digestsize = SHA256_DIGEST_SIZE,
2898 .halg.statesize = sizeof(struct talitos_export_state),
2899 .halg.base = {
2900 .cra_name = "sha256",
2901 .cra_driver_name = "sha256-talitos",
2902 .cra_blocksize = SHA256_BLOCK_SIZE,
2903 .cra_flags = CRYPTO_ALG_ASYNC |
2904 CRYPTO_ALG_ALLOCATES_MEMORY,
2905 }
2906 },
2907 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2908 DESC_HDR_SEL0_MDEUA |
2909 DESC_HDR_MODE0_MDEU_SHA256,
2910 },
2911 { .type = CRYPTO_ALG_TYPE_AHASH,
2912 .alg.hash = {
2913 .halg.digestsize = SHA384_DIGEST_SIZE,
2914 .halg.statesize = sizeof(struct talitos_export_state),
2915 .halg.base = {
2916 .cra_name = "sha384",
2917 .cra_driver_name = "sha384-talitos",
2918 .cra_blocksize = SHA384_BLOCK_SIZE,
2919 .cra_flags = CRYPTO_ALG_ASYNC |
2920 CRYPTO_ALG_ALLOCATES_MEMORY,
2921 }
2922 },
2923 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2924 DESC_HDR_SEL0_MDEUB |
2925 DESC_HDR_MODE0_MDEUB_SHA384,
2926 },
2927 { .type = CRYPTO_ALG_TYPE_AHASH,
2928 .alg.hash = {
2929 .halg.digestsize = SHA512_DIGEST_SIZE,
2930 .halg.statesize = sizeof(struct talitos_export_state),
2931 .halg.base = {
2932 .cra_name = "sha512",
2933 .cra_driver_name = "sha512-talitos",
2934 .cra_blocksize = SHA512_BLOCK_SIZE,
2935 .cra_flags = CRYPTO_ALG_ASYNC |
2936 CRYPTO_ALG_ALLOCATES_MEMORY,
2937 }
2938 },
2939 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2940 DESC_HDR_SEL0_MDEUB |
2941 DESC_HDR_MODE0_MDEUB_SHA512,
2942 },
2943 { .type = CRYPTO_ALG_TYPE_AHASH,
2944 .alg.hash = {
2945 .halg.digestsize = MD5_DIGEST_SIZE,
2946 .halg.statesize = sizeof(struct talitos_export_state),
2947 .halg.base = {
2948 .cra_name = "hmac(md5)",
2949 .cra_driver_name = "hmac-md5-talitos",
2950 .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
2951 .cra_flags = CRYPTO_ALG_ASYNC |
2952 CRYPTO_ALG_ALLOCATES_MEMORY,
2953 }
2954 },
2955 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2956 DESC_HDR_SEL0_MDEUA |
2957 DESC_HDR_MODE0_MDEU_MD5,
2958 },
2959 { .type = CRYPTO_ALG_TYPE_AHASH,
2960 .alg.hash = {
2961 .halg.digestsize = SHA1_DIGEST_SIZE,
2962 .halg.statesize = sizeof(struct talitos_export_state),
2963 .halg.base = {
2964 .cra_name = "hmac(sha1)",
2965 .cra_driver_name = "hmac-sha1-talitos",
2966 .cra_blocksize = SHA1_BLOCK_SIZE,
2967 .cra_flags = CRYPTO_ALG_ASYNC |
2968 CRYPTO_ALG_ALLOCATES_MEMORY,
2969 }
2970 },
2971 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2972 DESC_HDR_SEL0_MDEUA |
2973 DESC_HDR_MODE0_MDEU_SHA1,
2974 },
2975 { .type = CRYPTO_ALG_TYPE_AHASH,
2976 .alg.hash = {
2977 .halg.digestsize = SHA224_DIGEST_SIZE,
2978 .halg.statesize = sizeof(struct talitos_export_state),
2979 .halg.base = {
2980 .cra_name = "hmac(sha224)",
2981 .cra_driver_name = "hmac-sha224-talitos",
2982 .cra_blocksize = SHA224_BLOCK_SIZE,
2983 .cra_flags = CRYPTO_ALG_ASYNC |
2984 CRYPTO_ALG_ALLOCATES_MEMORY,
2985 }
2986 },
2987 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
2988 DESC_HDR_SEL0_MDEUA |
2989 DESC_HDR_MODE0_MDEU_SHA224,
2990 },
2991 { .type = CRYPTO_ALG_TYPE_AHASH,
2992 .alg.hash = {
2993 .halg.digestsize = SHA256_DIGEST_SIZE,
2994 .halg.statesize = sizeof(struct talitos_export_state),
2995 .halg.base = {
2996 .cra_name = "hmac(sha256)",
2997 .cra_driver_name = "hmac-sha256-talitos",
2998 .cra_blocksize = SHA256_BLOCK_SIZE,
2999 .cra_flags = CRYPTO_ALG_ASYNC |
3000 CRYPTO_ALG_ALLOCATES_MEMORY,
3001 }
3002 },
3003 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3004 DESC_HDR_SEL0_MDEUA |
3005 DESC_HDR_MODE0_MDEU_SHA256,
3006 },
3007 { .type = CRYPTO_ALG_TYPE_AHASH,
3008 .alg.hash = {
3009 .halg.digestsize = SHA384_DIGEST_SIZE,
3010 .halg.statesize = sizeof(struct talitos_export_state),
3011 .halg.base = {
3012 .cra_name = "hmac(sha384)",
3013 .cra_driver_name = "hmac-sha384-talitos",
3014 .cra_blocksize = SHA384_BLOCK_SIZE,
3015 .cra_flags = CRYPTO_ALG_ASYNC |
3016 CRYPTO_ALG_ALLOCATES_MEMORY,
3017 }
3018 },
3019 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3020 DESC_HDR_SEL0_MDEUB |
3021 DESC_HDR_MODE0_MDEUB_SHA384,
3022 },
3023 { .type = CRYPTO_ALG_TYPE_AHASH,
3024 .alg.hash = {
3025 .halg.digestsize = SHA512_DIGEST_SIZE,
3026 .halg.statesize = sizeof(struct talitos_export_state),
3027 .halg.base = {
3028 .cra_name = "hmac(sha512)",
3029 .cra_driver_name = "hmac-sha512-talitos",
3030 .cra_blocksize = SHA512_BLOCK_SIZE,
3031 .cra_flags = CRYPTO_ALG_ASYNC |
3032 CRYPTO_ALG_ALLOCATES_MEMORY,
3033 }
3034 },
3035 .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3036 DESC_HDR_SEL0_MDEUB |
3037 DESC_HDR_MODE0_MDEUB_SHA512,
3038 }
3039 };
3040
3041 struct talitos_crypto_alg {
3042 struct list_head entry;
3043 struct device *dev;
3044 struct talitos_alg_template algt;
3045 };
3046
3047 static int talitos_init_common(struct talitos_ctx *ctx,
3048 struct talitos_crypto_alg *talitos_alg)
3049 {
3050 struct talitos_private *priv;
3051
3052
3053 ctx->dev = talitos_alg->dev;
3054
3055
3056 priv = dev_get_drvdata(ctx->dev);
3057 ctx->ch = atomic_inc_return(&priv->last_chan) &
3058 (priv->num_channels - 1);
3059
3060
3061 ctx->desc_hdr_template = talitos_alg->algt.desc_hdr_template;
3062
3063
3064 ctx->desc_hdr_template |= DESC_HDR_DONE_NOTIFY;
3065
3066 return 0;
3067 }
3068
3069 static int talitos_cra_init_aead(struct crypto_aead *tfm)
3070 {
3071 struct aead_alg *alg = crypto_aead_alg(tfm);
3072 struct talitos_crypto_alg *talitos_alg;
3073 struct talitos_ctx *ctx = crypto_aead_ctx(tfm);
3074
3075 talitos_alg = container_of(alg, struct talitos_crypto_alg,
3076 algt.alg.aead);
3077
3078 return talitos_init_common(ctx, talitos_alg);
3079 }
3080
3081 static int talitos_cra_init_skcipher(struct crypto_skcipher *tfm)
3082 {
3083 struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
3084 struct talitos_crypto_alg *talitos_alg;
3085 struct talitos_ctx *ctx = crypto_skcipher_ctx(tfm);
3086
3087 talitos_alg = container_of(alg, struct talitos_crypto_alg,
3088 algt.alg.skcipher);
3089
3090 return talitos_init_common(ctx, talitos_alg);
3091 }
3092
3093 static int talitos_cra_init_ahash(struct crypto_tfm *tfm)
3094 {
3095 struct crypto_alg *alg = tfm->__crt_alg;
3096 struct talitos_crypto_alg *talitos_alg;
3097 struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3098
3099 talitos_alg = container_of(__crypto_ahash_alg(alg),
3100 struct talitos_crypto_alg,
3101 algt.alg.hash);
3102
3103 ctx->keylen = 0;
3104 crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
3105 sizeof(struct talitos_ahash_req_ctx));
3106
3107 return talitos_init_common(ctx, talitos_alg);
3108 }
3109
3110 static void talitos_cra_exit(struct crypto_tfm *tfm)
3111 {
3112 struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
3113 struct device *dev = ctx->dev;
3114
3115 if (ctx->keylen)
3116 dma_unmap_single(dev, ctx->dma_key, ctx->keylen, DMA_TO_DEVICE);
3117 }
3118
3119
3120
3121
3122
3123
3124 static int hw_supports(struct device *dev, __be32 desc_hdr_template)
3125 {
3126 struct talitos_private *priv = dev_get_drvdata(dev);
3127 int ret;
3128
3129 ret = (1 << DESC_TYPE(desc_hdr_template) & priv->desc_types) &&
3130 (1 << PRIMARY_EU(desc_hdr_template) & priv->exec_units);
3131
3132 if (SECONDARY_EU(desc_hdr_template))
3133 ret = ret && (1 << SECONDARY_EU(desc_hdr_template)
3134 & priv->exec_units);
3135
3136 return ret;
3137 }
3138
3139 static int talitos_remove(struct platform_device *ofdev)
3140 {
3141 struct device *dev = &ofdev->dev;
3142 struct talitos_private *priv = dev_get_drvdata(dev);
3143 struct talitos_crypto_alg *t_alg, *n;
3144 int i;
3145
3146 list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) {
3147 switch (t_alg->algt.type) {
3148 case CRYPTO_ALG_TYPE_SKCIPHER:
3149 crypto_unregister_skcipher(&t_alg->algt.alg.skcipher);
3150 break;
3151 case CRYPTO_ALG_TYPE_AEAD:
3152 crypto_unregister_aead(&t_alg->algt.alg.aead);
3153 break;
3154 case CRYPTO_ALG_TYPE_AHASH:
3155 crypto_unregister_ahash(&t_alg->algt.alg.hash);
3156 break;
3157 }
3158 list_del(&t_alg->entry);
3159 }
3160
3161 if (hw_supports(dev, DESC_HDR_SEL0_RNG))
3162 talitos_unregister_rng(dev);
3163
3164 for (i = 0; i < 2; i++)
3165 if (priv->irq[i]) {
3166 free_irq(priv->irq[i], dev);
3167 irq_dispose_mapping(priv->irq[i]);
3168 }
3169
3170 tasklet_kill(&priv->done_task[0]);
3171 if (priv->irq[1])
3172 tasklet_kill(&priv->done_task[1]);
3173
3174 return 0;
3175 }
3176
3177 static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
3178 struct talitos_alg_template
3179 *template)
3180 {
3181 struct talitos_private *priv = dev_get_drvdata(dev);
3182 struct talitos_crypto_alg *t_alg;
3183 struct crypto_alg *alg;
3184
3185 t_alg = devm_kzalloc(dev, sizeof(struct talitos_crypto_alg),
3186 GFP_KERNEL);
3187 if (!t_alg)
3188 return ERR_PTR(-ENOMEM);
3189
3190 t_alg->algt = *template;
3191
3192 switch (t_alg->algt.type) {
3193 case CRYPTO_ALG_TYPE_SKCIPHER:
3194 alg = &t_alg->algt.alg.skcipher.base;
3195 alg->cra_exit = talitos_cra_exit;
3196 t_alg->algt.alg.skcipher.init = talitos_cra_init_skcipher;
3197 t_alg->algt.alg.skcipher.setkey =
3198 t_alg->algt.alg.skcipher.setkey ?: skcipher_setkey;
3199 t_alg->algt.alg.skcipher.encrypt = skcipher_encrypt;
3200 t_alg->algt.alg.skcipher.decrypt = skcipher_decrypt;
3201 if (!strcmp(alg->cra_name, "ctr(aes)") && !has_ftr_sec1(priv) &&
3202 DESC_TYPE(t_alg->algt.desc_hdr_template) !=
3203 DESC_TYPE(DESC_HDR_TYPE_AESU_CTR_NONSNOOP)) {
3204 devm_kfree(dev, t_alg);
3205 return ERR_PTR(-ENOTSUPP);
3206 }
3207 break;
3208 case CRYPTO_ALG_TYPE_AEAD:
3209 alg = &t_alg->algt.alg.aead.base;
3210 alg->cra_exit = talitos_cra_exit;
3211 t_alg->algt.alg.aead.init = talitos_cra_init_aead;
3212 t_alg->algt.alg.aead.setkey = t_alg->algt.alg.aead.setkey ?:
3213 aead_setkey;
3214 t_alg->algt.alg.aead.encrypt = aead_encrypt;
3215 t_alg->algt.alg.aead.decrypt = aead_decrypt;
3216 if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3217 !strncmp(alg->cra_name, "authenc(hmac(sha224)", 20)) {
3218 devm_kfree(dev, t_alg);
3219 return ERR_PTR(-ENOTSUPP);
3220 }
3221 break;
3222 case CRYPTO_ALG_TYPE_AHASH:
3223 alg = &t_alg->algt.alg.hash.halg.base;
3224 alg->cra_init = talitos_cra_init_ahash;
3225 alg->cra_exit = talitos_cra_exit;
3226 t_alg->algt.alg.hash.init = ahash_init;
3227 t_alg->algt.alg.hash.update = ahash_update;
3228 t_alg->algt.alg.hash.final = ahash_final;
3229 t_alg->algt.alg.hash.finup = ahash_finup;
3230 t_alg->algt.alg.hash.digest = ahash_digest;
3231 if (!strncmp(alg->cra_name, "hmac", 4))
3232 t_alg->algt.alg.hash.setkey = ahash_setkey;
3233 t_alg->algt.alg.hash.import = ahash_import;
3234 t_alg->algt.alg.hash.export = ahash_export;
3235
3236 if (!(priv->features & TALITOS_FTR_HMAC_OK) &&
3237 !strncmp(alg->cra_name, "hmac", 4)) {
3238 devm_kfree(dev, t_alg);
3239 return ERR_PTR(-ENOTSUPP);
3240 }
3241 if (!(priv->features & TALITOS_FTR_SHA224_HWINIT) &&
3242 (!strcmp(alg->cra_name, "sha224") ||
3243 !strcmp(alg->cra_name, "hmac(sha224)"))) {
3244 t_alg->algt.alg.hash.init = ahash_init_sha224_swinit;
3245 t_alg->algt.desc_hdr_template =
3246 DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU |
3247 DESC_HDR_SEL0_MDEUA |
3248 DESC_HDR_MODE0_MDEU_SHA256;
3249 }
3250 break;
3251 default:
3252 dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
3253 devm_kfree(dev, t_alg);
3254 return ERR_PTR(-EINVAL);
3255 }
3256
3257 alg->cra_module = THIS_MODULE;
3258 if (t_alg->algt.priority)
3259 alg->cra_priority = t_alg->algt.priority;
3260 else
3261 alg->cra_priority = TALITOS_CRA_PRIORITY;
3262 if (has_ftr_sec1(priv))
3263 alg->cra_alignmask = 3;
3264 else
3265 alg->cra_alignmask = 0;
3266 alg->cra_ctxsize = sizeof(struct talitos_ctx);
3267 alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY;
3268
3269 t_alg->dev = dev;
3270
3271 return t_alg;
3272 }
3273
3274 static int talitos_probe_irq(struct platform_device *ofdev)
3275 {
3276 struct device *dev = &ofdev->dev;
3277 struct device_node *np = ofdev->dev.of_node;
3278 struct talitos_private *priv = dev_get_drvdata(dev);
3279 int err;
3280 bool is_sec1 = has_ftr_sec1(priv);
3281
3282 priv->irq[0] = irq_of_parse_and_map(np, 0);
3283 if (!priv->irq[0]) {
3284 dev_err(dev, "failed to map irq\n");
3285 return -EINVAL;
3286 }
3287 if (is_sec1) {
3288 err = request_irq(priv->irq[0], talitos1_interrupt_4ch, 0,
3289 dev_driver_string(dev), dev);
3290 goto primary_out;
3291 }
3292
3293 priv->irq[1] = irq_of_parse_and_map(np, 1);
3294
3295
3296 if (!priv->irq[1]) {
3297 err = request_irq(priv->irq[0], talitos2_interrupt_4ch, 0,
3298 dev_driver_string(dev), dev);
3299 goto primary_out;
3300 }
3301
3302 err = request_irq(priv->irq[0], talitos2_interrupt_ch0_2, 0,
3303 dev_driver_string(dev), dev);
3304 if (err)
3305 goto primary_out;
3306
3307
3308 err = request_irq(priv->irq[1], talitos2_interrupt_ch1_3, 0,
3309 dev_driver_string(dev), dev);
3310 if (err) {
3311 dev_err(dev, "failed to request secondary irq\n");
3312 irq_dispose_mapping(priv->irq[1]);
3313 priv->irq[1] = 0;
3314 }
3315
3316 return err;
3317
3318 primary_out:
3319 if (err) {
3320 dev_err(dev, "failed to request primary irq\n");
3321 irq_dispose_mapping(priv->irq[0]);
3322 priv->irq[0] = 0;
3323 }
3324
3325 return err;
3326 }
3327
3328 static int talitos_probe(struct platform_device *ofdev)
3329 {
3330 struct device *dev = &ofdev->dev;
3331 struct device_node *np = ofdev->dev.of_node;
3332 struct talitos_private *priv;
3333 int i, err;
3334 int stride;
3335 struct resource *res;
3336
3337 priv = devm_kzalloc(dev, sizeof(struct talitos_private), GFP_KERNEL);
3338 if (!priv)
3339 return -ENOMEM;
3340
3341 INIT_LIST_HEAD(&priv->alg_list);
3342
3343 dev_set_drvdata(dev, priv);
3344
3345 priv->ofdev = ofdev;
3346
3347 spin_lock_init(&priv->reg_lock);
3348
3349 res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
3350 if (!res)
3351 return -ENXIO;
3352 priv->reg = devm_ioremap(dev, res->start, resource_size(res));
3353 if (!priv->reg) {
3354 dev_err(dev, "failed to of_iomap\n");
3355 err = -ENOMEM;
3356 goto err_out;
3357 }
3358
3359
3360 of_property_read_u32(np, "fsl,num-channels", &priv->num_channels);
3361 of_property_read_u32(np, "fsl,channel-fifo-len", &priv->chfifo_len);
3362 of_property_read_u32(np, "fsl,exec-units-mask", &priv->exec_units);
3363 of_property_read_u32(np, "fsl,descriptor-types-mask",
3364 &priv->desc_types);
3365
3366 if (!is_power_of_2(priv->num_channels) || !priv->chfifo_len ||
3367 !priv->exec_units || !priv->desc_types) {
3368 dev_err(dev, "invalid property data in device tree node\n");
3369 err = -EINVAL;
3370 goto err_out;
3371 }
3372
3373 if (of_device_is_compatible(np, "fsl,sec3.0"))
3374 priv->features |= TALITOS_FTR_SRC_LINK_TBL_LEN_INCLUDES_EXTENT;
3375
3376 if (of_device_is_compatible(np, "fsl,sec2.1"))
3377 priv->features |= TALITOS_FTR_HW_AUTH_CHECK |
3378 TALITOS_FTR_SHA224_HWINIT |
3379 TALITOS_FTR_HMAC_OK;
3380
3381 if (of_device_is_compatible(np, "fsl,sec1.0"))
3382 priv->features |= TALITOS_FTR_SEC1;
3383
3384 if (of_device_is_compatible(np, "fsl,sec1.2")) {
3385 priv->reg_deu = priv->reg + TALITOS12_DEU;
3386 priv->reg_aesu = priv->reg + TALITOS12_AESU;
3387 priv->reg_mdeu = priv->reg + TALITOS12_MDEU;
3388 stride = TALITOS1_CH_STRIDE;
3389 } else if (of_device_is_compatible(np, "fsl,sec1.0")) {
3390 priv->reg_deu = priv->reg + TALITOS10_DEU;
3391 priv->reg_aesu = priv->reg + TALITOS10_AESU;
3392 priv->reg_mdeu = priv->reg + TALITOS10_MDEU;
3393 priv->reg_afeu = priv->reg + TALITOS10_AFEU;
3394 priv->reg_rngu = priv->reg + TALITOS10_RNGU;
3395 priv->reg_pkeu = priv->reg + TALITOS10_PKEU;
3396 stride = TALITOS1_CH_STRIDE;
3397 } else {
3398 priv->reg_deu = priv->reg + TALITOS2_DEU;
3399 priv->reg_aesu = priv->reg + TALITOS2_AESU;
3400 priv->reg_mdeu = priv->reg + TALITOS2_MDEU;
3401 priv->reg_afeu = priv->reg + TALITOS2_AFEU;
3402 priv->reg_rngu = priv->reg + TALITOS2_RNGU;
3403 priv->reg_pkeu = priv->reg + TALITOS2_PKEU;
3404 priv->reg_keu = priv->reg + TALITOS2_KEU;
3405 priv->reg_crcu = priv->reg + TALITOS2_CRCU;
3406 stride = TALITOS2_CH_STRIDE;
3407 }
3408
3409 err = talitos_probe_irq(ofdev);
3410 if (err)
3411 goto err_out;
3412
3413 if (has_ftr_sec1(priv)) {
3414 if (priv->num_channels == 1)
3415 tasklet_init(&priv->done_task[0], talitos1_done_ch0,
3416 (unsigned long)dev);
3417 else
3418 tasklet_init(&priv->done_task[0], talitos1_done_4ch,
3419 (unsigned long)dev);
3420 } else {
3421 if (priv->irq[1]) {
3422 tasklet_init(&priv->done_task[0], talitos2_done_ch0_2,
3423 (unsigned long)dev);
3424 tasklet_init(&priv->done_task[1], talitos2_done_ch1_3,
3425 (unsigned long)dev);
3426 } else if (priv->num_channels == 1) {
3427 tasklet_init(&priv->done_task[0], talitos2_done_ch0,
3428 (unsigned long)dev);
3429 } else {
3430 tasklet_init(&priv->done_task[0], talitos2_done_4ch,
3431 (unsigned long)dev);
3432 }
3433 }
3434
3435 priv->chan = devm_kcalloc(dev,
3436 priv->num_channels,
3437 sizeof(struct talitos_channel),
3438 GFP_KERNEL);
3439 if (!priv->chan) {
3440 dev_err(dev, "failed to allocate channel management space\n");
3441 err = -ENOMEM;
3442 goto err_out;
3443 }
3444
3445 priv->fifo_len = roundup_pow_of_two(priv->chfifo_len);
3446
3447 for (i = 0; i < priv->num_channels; i++) {
3448 priv->chan[i].reg = priv->reg + stride * (i + 1);
3449 if (!priv->irq[1] || !(i & 1))
3450 priv->chan[i].reg += TALITOS_CH_BASE_OFFSET;
3451
3452 spin_lock_init(&priv->chan[i].head_lock);
3453 spin_lock_init(&priv->chan[i].tail_lock);
3454
3455 priv->chan[i].fifo = devm_kcalloc(dev,
3456 priv->fifo_len,
3457 sizeof(struct talitos_request),
3458 GFP_KERNEL);
3459 if (!priv->chan[i].fifo) {
3460 dev_err(dev, "failed to allocate request fifo %d\n", i);
3461 err = -ENOMEM;
3462 goto err_out;
3463 }
3464
3465 atomic_set(&priv->chan[i].submit_count,
3466 -(priv->chfifo_len - 1));
3467 }
3468
3469 dma_set_mask(dev, DMA_BIT_MASK(36));
3470
3471
3472 err = init_device(dev);
3473 if (err) {
3474 dev_err(dev, "failed to initialize device\n");
3475 goto err_out;
3476 }
3477
3478
3479 if (hw_supports(dev, DESC_HDR_SEL0_RNG)) {
3480 err = talitos_register_rng(dev);
3481 if (err) {
3482 dev_err(dev, "failed to register hwrng: %d\n", err);
3483 goto err_out;
3484 } else
3485 dev_info(dev, "hwrng\n");
3486 }
3487
3488
3489 for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
3490 if (hw_supports(dev, driver_algs[i].desc_hdr_template)) {
3491 struct talitos_crypto_alg *t_alg;
3492 struct crypto_alg *alg = NULL;
3493
3494 t_alg = talitos_alg_alloc(dev, &driver_algs[i]);
3495 if (IS_ERR(t_alg)) {
3496 err = PTR_ERR(t_alg);
3497 if (err == -ENOTSUPP)
3498 continue;
3499 goto err_out;
3500 }
3501
3502 switch (t_alg->algt.type) {
3503 case CRYPTO_ALG_TYPE_SKCIPHER:
3504 err = crypto_register_skcipher(
3505 &t_alg->algt.alg.skcipher);
3506 alg = &t_alg->algt.alg.skcipher.base;
3507 break;
3508
3509 case CRYPTO_ALG_TYPE_AEAD:
3510 err = crypto_register_aead(
3511 &t_alg->algt.alg.aead);
3512 alg = &t_alg->algt.alg.aead.base;
3513 break;
3514
3515 case CRYPTO_ALG_TYPE_AHASH:
3516 err = crypto_register_ahash(
3517 &t_alg->algt.alg.hash);
3518 alg = &t_alg->algt.alg.hash.halg.base;
3519 break;
3520 }
3521 if (err) {
3522 dev_err(dev, "%s alg registration failed\n",
3523 alg->cra_driver_name);
3524 devm_kfree(dev, t_alg);
3525 } else
3526 list_add_tail(&t_alg->entry, &priv->alg_list);
3527 }
3528 }
3529 if (!list_empty(&priv->alg_list))
3530 dev_info(dev, "%s algorithms registered in /proc/crypto\n",
3531 (char *)of_get_property(np, "compatible", NULL));
3532
3533 return 0;
3534
3535 err_out:
3536 talitos_remove(ofdev);
3537
3538 return err;
3539 }
3540
3541 static const struct of_device_id talitos_match[] = {
3542 #ifdef CONFIG_CRYPTO_DEV_TALITOS1
3543 {
3544 .compatible = "fsl,sec1.0",
3545 },
3546 #endif
3547 #ifdef CONFIG_CRYPTO_DEV_TALITOS2
3548 {
3549 .compatible = "fsl,sec2.0",
3550 },
3551 #endif
3552 {},
3553 };
3554 MODULE_DEVICE_TABLE(of, talitos_match);
3555
3556 static struct platform_driver talitos_driver = {
3557 .driver = {
3558 .name = "talitos",
3559 .of_match_table = talitos_match,
3560 },
3561 .probe = talitos_probe,
3562 .remove = talitos_remove,
3563 };
3564
3565 module_platform_driver(talitos_driver);
3566
3567 MODULE_LICENSE("GPL");
3568 MODULE_AUTHOR("Kim Phillips <kim.phillips@freescale.com>");
3569 MODULE_DESCRIPTION("Freescale integrated security engine (SEC) driver");