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