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