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