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