Lines Matching refs:dd
74 struct atmel_tdes_dev *dd; member
180 static inline u32 atmel_tdes_read(struct atmel_tdes_dev *dd, u32 offset) in atmel_tdes_read() argument
182 return readl_relaxed(dd->io_base + offset); in atmel_tdes_read()
185 static inline void atmel_tdes_write(struct atmel_tdes_dev *dd, in atmel_tdes_write() argument
188 writel_relaxed(value, dd->io_base + offset); in atmel_tdes_write()
191 static void atmel_tdes_write_n(struct atmel_tdes_dev *dd, u32 offset, in atmel_tdes_write_n() argument
195 atmel_tdes_write(dd, offset, *value); in atmel_tdes_write_n()
204 if (!ctx->dd) { in atmel_tdes_find_dev()
209 ctx->dd = tdes_dd; in atmel_tdes_find_dev()
211 tdes_dd = ctx->dd; in atmel_tdes_find_dev()
218 static int atmel_tdes_hw_init(struct atmel_tdes_dev *dd) in atmel_tdes_hw_init() argument
220 clk_prepare_enable(dd->iclk); in atmel_tdes_hw_init()
222 if (!(dd->flags & TDES_FLAGS_INIT)) { in atmel_tdes_hw_init()
223 atmel_tdes_write(dd, TDES_CR, TDES_CR_SWRST); in atmel_tdes_hw_init()
224 dd->flags |= TDES_FLAGS_INIT; in atmel_tdes_hw_init()
225 dd->err = 0; in atmel_tdes_hw_init()
231 static inline unsigned int atmel_tdes_get_version(struct atmel_tdes_dev *dd) in atmel_tdes_get_version() argument
233 return atmel_tdes_read(dd, TDES_HW_VERSION) & 0x00000fff; in atmel_tdes_get_version()
236 static void atmel_tdes_hw_version_init(struct atmel_tdes_dev *dd) in atmel_tdes_hw_version_init() argument
238 atmel_tdes_hw_init(dd); in atmel_tdes_hw_version_init()
240 dd->hw_version = atmel_tdes_get_version(dd); in atmel_tdes_hw_version_init()
242 dev_info(dd->dev, in atmel_tdes_hw_version_init()
243 "version: 0x%x\n", dd->hw_version); in atmel_tdes_hw_version_init()
245 clk_disable_unprepare(dd->iclk); in atmel_tdes_hw_version_init()
250 struct atmel_tdes_dev *dd = data; in atmel_tdes_dma_callback() local
253 tasklet_schedule(&dd->done_task); in atmel_tdes_dma_callback()
256 static int atmel_tdes_write_ctrl(struct atmel_tdes_dev *dd) in atmel_tdes_write_ctrl() argument
261 err = atmel_tdes_hw_init(dd); in atmel_tdes_write_ctrl()
266 if (!dd->caps.has_dma) in atmel_tdes_write_ctrl()
267 atmel_tdes_write(dd, TDES_PTCR, in atmel_tdes_write_ctrl()
271 if (dd->ctx->keylen > (DES_KEY_SIZE << 1)) { in atmel_tdes_write_ctrl()
274 } else if (dd->ctx->keylen > DES_KEY_SIZE) { in atmel_tdes_write_ctrl()
281 if (dd->flags & TDES_FLAGS_CBC) { in atmel_tdes_write_ctrl()
283 } else if (dd->flags & TDES_FLAGS_CFB) { in atmel_tdes_write_ctrl()
286 if (dd->flags & TDES_FLAGS_CFB8) in atmel_tdes_write_ctrl()
288 else if (dd->flags & TDES_FLAGS_CFB16) in atmel_tdes_write_ctrl()
290 else if (dd->flags & TDES_FLAGS_CFB32) in atmel_tdes_write_ctrl()
292 else if (dd->flags & TDES_FLAGS_CFB64) in atmel_tdes_write_ctrl()
294 } else if (dd->flags & TDES_FLAGS_OFB) { in atmel_tdes_write_ctrl()
298 if ((dd->flags & TDES_FLAGS_ENCRYPT) || (dd->flags & TDES_FLAGS_OFB)) in atmel_tdes_write_ctrl()
301 atmel_tdes_write(dd, TDES_CR, valcr); in atmel_tdes_write_ctrl()
302 atmel_tdes_write(dd, TDES_MR, valmr); in atmel_tdes_write_ctrl()
304 atmel_tdes_write_n(dd, TDES_KEY1W1R, dd->ctx->key, in atmel_tdes_write_ctrl()
305 dd->ctx->keylen >> 2); in atmel_tdes_write_ctrl()
307 if (((dd->flags & TDES_FLAGS_CBC) || (dd->flags & TDES_FLAGS_CFB) || in atmel_tdes_write_ctrl()
308 (dd->flags & TDES_FLAGS_OFB)) && dd->req->info) { in atmel_tdes_write_ctrl()
309 atmel_tdes_write_n(dd, TDES_IV1R, dd->req->info, 2); in atmel_tdes_write_ctrl()
315 static int atmel_tdes_crypt_pdc_stop(struct atmel_tdes_dev *dd) in atmel_tdes_crypt_pdc_stop() argument
320 atmel_tdes_write(dd, TDES_PTCR, TDES_PTCR_TXTDIS|TDES_PTCR_RXTDIS); in atmel_tdes_crypt_pdc_stop()
322 if (dd->flags & TDES_FLAGS_FAST) { in atmel_tdes_crypt_pdc_stop()
323 dma_unmap_sg(dd->dev, dd->out_sg, 1, DMA_FROM_DEVICE); in atmel_tdes_crypt_pdc_stop()
324 dma_unmap_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_pdc_stop()
326 dma_sync_single_for_device(dd->dev, dd->dma_addr_out, in atmel_tdes_crypt_pdc_stop()
327 dd->dma_size, DMA_FROM_DEVICE); in atmel_tdes_crypt_pdc_stop()
330 count = atmel_tdes_sg_copy(&dd->out_sg, &dd->out_offset, in atmel_tdes_crypt_pdc_stop()
331 dd->buf_out, dd->buflen, dd->dma_size, 1); in atmel_tdes_crypt_pdc_stop()
332 if (count != dd->dma_size) { in atmel_tdes_crypt_pdc_stop()
341 static int atmel_tdes_buff_init(struct atmel_tdes_dev *dd) in atmel_tdes_buff_init() argument
345 dd->buf_in = (void *)__get_free_pages(GFP_KERNEL, 0); in atmel_tdes_buff_init()
346 dd->buf_out = (void *)__get_free_pages(GFP_KERNEL, 0); in atmel_tdes_buff_init()
347 dd->buflen = PAGE_SIZE; in atmel_tdes_buff_init()
348 dd->buflen &= ~(DES_BLOCK_SIZE - 1); in atmel_tdes_buff_init()
350 if (!dd->buf_in || !dd->buf_out) { in atmel_tdes_buff_init()
351 dev_err(dd->dev, "unable to alloc pages.\n"); in atmel_tdes_buff_init()
356 dd->dma_addr_in = dma_map_single(dd->dev, dd->buf_in, in atmel_tdes_buff_init()
357 dd->buflen, DMA_TO_DEVICE); in atmel_tdes_buff_init()
358 if (dma_mapping_error(dd->dev, dd->dma_addr_in)) { in atmel_tdes_buff_init()
359 dev_err(dd->dev, "dma %d bytes error\n", dd->buflen); in atmel_tdes_buff_init()
364 dd->dma_addr_out = dma_map_single(dd->dev, dd->buf_out, in atmel_tdes_buff_init()
365 dd->buflen, DMA_FROM_DEVICE); in atmel_tdes_buff_init()
366 if (dma_mapping_error(dd->dev, dd->dma_addr_out)) { in atmel_tdes_buff_init()
367 dev_err(dd->dev, "dma %d bytes error\n", dd->buflen); in atmel_tdes_buff_init()
375 dma_unmap_single(dd->dev, dd->dma_addr_in, dd->buflen, in atmel_tdes_buff_init()
378 free_page((unsigned long)dd->buf_out); in atmel_tdes_buff_init()
379 free_page((unsigned long)dd->buf_in); in atmel_tdes_buff_init()
386 static void atmel_tdes_buff_cleanup(struct atmel_tdes_dev *dd) in atmel_tdes_buff_cleanup() argument
388 dma_unmap_single(dd->dev, dd->dma_addr_out, dd->buflen, in atmel_tdes_buff_cleanup()
390 dma_unmap_single(dd->dev, dd->dma_addr_in, dd->buflen, in atmel_tdes_buff_cleanup()
392 free_page((unsigned long)dd->buf_out); in atmel_tdes_buff_cleanup()
393 free_page((unsigned long)dd->buf_in); in atmel_tdes_buff_cleanup()
400 struct atmel_tdes_dev *dd = ctx->dd; in atmel_tdes_crypt_pdc() local
403 dd->dma_size = length; in atmel_tdes_crypt_pdc()
405 if (!(dd->flags & TDES_FLAGS_FAST)) { in atmel_tdes_crypt_pdc()
406 dma_sync_single_for_device(dd->dev, dma_addr_in, length, in atmel_tdes_crypt_pdc()
410 if ((dd->flags & TDES_FLAGS_CFB) && (dd->flags & TDES_FLAGS_CFB8)) in atmel_tdes_crypt_pdc()
412 else if ((dd->flags & TDES_FLAGS_CFB) && (dd->flags & TDES_FLAGS_CFB16)) in atmel_tdes_crypt_pdc()
417 atmel_tdes_write(dd, TDES_PTCR, TDES_PTCR_TXTDIS|TDES_PTCR_RXTDIS); in atmel_tdes_crypt_pdc()
418 atmel_tdes_write(dd, TDES_TPR, dma_addr_in); in atmel_tdes_crypt_pdc()
419 atmel_tdes_write(dd, TDES_TCR, len32); in atmel_tdes_crypt_pdc()
420 atmel_tdes_write(dd, TDES_RPR, dma_addr_out); in atmel_tdes_crypt_pdc()
421 atmel_tdes_write(dd, TDES_RCR, len32); in atmel_tdes_crypt_pdc()
424 atmel_tdes_write(dd, TDES_IER, TDES_INT_ENDRX); in atmel_tdes_crypt_pdc()
427 atmel_tdes_write(dd, TDES_PTCR, TDES_PTCR_TXTEN | TDES_PTCR_RXTEN); in atmel_tdes_crypt_pdc()
436 struct atmel_tdes_dev *dd = ctx->dd; in atmel_tdes_crypt_dma() local
440 dd->dma_size = length; in atmel_tdes_crypt_dma()
442 if (!(dd->flags & TDES_FLAGS_FAST)) { in atmel_tdes_crypt_dma()
443 dma_sync_single_for_device(dd->dev, dma_addr_in, length, in atmel_tdes_crypt_dma()
447 if (dd->flags & TDES_FLAGS_CFB8) { in atmel_tdes_crypt_dma()
448 dd->dma_lch_in.dma_conf.dst_addr_width = in atmel_tdes_crypt_dma()
450 dd->dma_lch_out.dma_conf.src_addr_width = in atmel_tdes_crypt_dma()
452 } else if (dd->flags & TDES_FLAGS_CFB16) { in atmel_tdes_crypt_dma()
453 dd->dma_lch_in.dma_conf.dst_addr_width = in atmel_tdes_crypt_dma()
455 dd->dma_lch_out.dma_conf.src_addr_width = in atmel_tdes_crypt_dma()
458 dd->dma_lch_in.dma_conf.dst_addr_width = in atmel_tdes_crypt_dma()
460 dd->dma_lch_out.dma_conf.src_addr_width = in atmel_tdes_crypt_dma()
464 dmaengine_slave_config(dd->dma_lch_in.chan, &dd->dma_lch_in.dma_conf); in atmel_tdes_crypt_dma()
465 dmaengine_slave_config(dd->dma_lch_out.chan, &dd->dma_lch_out.dma_conf); in atmel_tdes_crypt_dma()
467 dd->flags |= TDES_FLAGS_DMA; in atmel_tdes_crypt_dma()
477 in_desc = dmaengine_prep_slave_sg(dd->dma_lch_in.chan, &sg[0], in atmel_tdes_crypt_dma()
483 out_desc = dmaengine_prep_slave_sg(dd->dma_lch_out.chan, &sg[1], in atmel_tdes_crypt_dma()
490 out_desc->callback_param = dd; in atmel_tdes_crypt_dma()
493 dma_async_issue_pending(dd->dma_lch_out.chan); in atmel_tdes_crypt_dma()
496 dma_async_issue_pending(dd->dma_lch_in.chan); in atmel_tdes_crypt_dma()
501 static int atmel_tdes_crypt_start(struct atmel_tdes_dev *dd) in atmel_tdes_crypt_start() argument
504 crypto_ablkcipher_reqtfm(dd->req)); in atmel_tdes_crypt_start()
509 if ((!dd->in_offset) && (!dd->out_offset)) { in atmel_tdes_crypt_start()
511 in = IS_ALIGNED((u32)dd->in_sg->offset, sizeof(u32)) && in atmel_tdes_crypt_start()
512 IS_ALIGNED(dd->in_sg->length, dd->ctx->block_size); in atmel_tdes_crypt_start()
513 out = IS_ALIGNED((u32)dd->out_sg->offset, sizeof(u32)) && in atmel_tdes_crypt_start()
514 IS_ALIGNED(dd->out_sg->length, dd->ctx->block_size); in atmel_tdes_crypt_start()
517 if (sg_dma_len(dd->in_sg) != sg_dma_len(dd->out_sg)) in atmel_tdes_crypt_start()
523 count = min(dd->total, sg_dma_len(dd->in_sg)); in atmel_tdes_crypt_start()
524 count = min(count, sg_dma_len(dd->out_sg)); in atmel_tdes_crypt_start()
526 err = dma_map_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_start()
528 dev_err(dd->dev, "dma_map_sg() error\n"); in atmel_tdes_crypt_start()
532 err = dma_map_sg(dd->dev, dd->out_sg, 1, in atmel_tdes_crypt_start()
535 dev_err(dd->dev, "dma_map_sg() error\n"); in atmel_tdes_crypt_start()
536 dma_unmap_sg(dd->dev, dd->in_sg, 1, in atmel_tdes_crypt_start()
541 addr_in = sg_dma_address(dd->in_sg); in atmel_tdes_crypt_start()
542 addr_out = sg_dma_address(dd->out_sg); in atmel_tdes_crypt_start()
544 dd->flags |= TDES_FLAGS_FAST; in atmel_tdes_crypt_start()
548 count = atmel_tdes_sg_copy(&dd->in_sg, &dd->in_offset, in atmel_tdes_crypt_start()
549 dd->buf_in, dd->buflen, dd->total, 0); in atmel_tdes_crypt_start()
551 addr_in = dd->dma_addr_in; in atmel_tdes_crypt_start()
552 addr_out = dd->dma_addr_out; in atmel_tdes_crypt_start()
554 dd->flags &= ~TDES_FLAGS_FAST; in atmel_tdes_crypt_start()
557 dd->total -= count; in atmel_tdes_crypt_start()
559 if (dd->caps.has_dma) in atmel_tdes_crypt_start()
564 if (err && (dd->flags & TDES_FLAGS_FAST)) { in atmel_tdes_crypt_start()
565 dma_unmap_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_start()
566 dma_unmap_sg(dd->dev, dd->out_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_start()
572 static void atmel_tdes_finish_req(struct atmel_tdes_dev *dd, int err) in atmel_tdes_finish_req() argument
574 struct ablkcipher_request *req = dd->req; in atmel_tdes_finish_req()
576 clk_disable_unprepare(dd->iclk); in atmel_tdes_finish_req()
578 dd->flags &= ~TDES_FLAGS_BUSY; in atmel_tdes_finish_req()
583 static int atmel_tdes_handle_queue(struct atmel_tdes_dev *dd, in atmel_tdes_handle_queue() argument
592 spin_lock_irqsave(&dd->lock, flags); in atmel_tdes_handle_queue()
594 ret = ablkcipher_enqueue_request(&dd->queue, req); in atmel_tdes_handle_queue()
595 if (dd->flags & TDES_FLAGS_BUSY) { in atmel_tdes_handle_queue()
596 spin_unlock_irqrestore(&dd->lock, flags); in atmel_tdes_handle_queue()
599 backlog = crypto_get_backlog(&dd->queue); in atmel_tdes_handle_queue()
600 async_req = crypto_dequeue_request(&dd->queue); in atmel_tdes_handle_queue()
602 dd->flags |= TDES_FLAGS_BUSY; in atmel_tdes_handle_queue()
603 spin_unlock_irqrestore(&dd->lock, flags); in atmel_tdes_handle_queue()
614 dd->req = req; in atmel_tdes_handle_queue()
615 dd->total = req->nbytes; in atmel_tdes_handle_queue()
616 dd->in_offset = 0; in atmel_tdes_handle_queue()
617 dd->in_sg = req->src; in atmel_tdes_handle_queue()
618 dd->out_offset = 0; in atmel_tdes_handle_queue()
619 dd->out_sg = req->dst; in atmel_tdes_handle_queue()
624 dd->flags = (dd->flags & ~TDES_FLAGS_MODE_MASK) | rctx->mode; in atmel_tdes_handle_queue()
625 dd->ctx = ctx; in atmel_tdes_handle_queue()
626 ctx->dd = dd; in atmel_tdes_handle_queue()
628 err = atmel_tdes_write_ctrl(dd); in atmel_tdes_handle_queue()
630 err = atmel_tdes_crypt_start(dd); in atmel_tdes_handle_queue()
633 atmel_tdes_finish_req(dd, err); in atmel_tdes_handle_queue()
634 tasklet_schedule(&dd->queue_task); in atmel_tdes_handle_queue()
640 static int atmel_tdes_crypt_dma_stop(struct atmel_tdes_dev *dd) in atmel_tdes_crypt_dma_stop() argument
645 if (dd->flags & TDES_FLAGS_DMA) { in atmel_tdes_crypt_dma_stop()
647 if (dd->flags & TDES_FLAGS_FAST) { in atmel_tdes_crypt_dma_stop()
648 dma_unmap_sg(dd->dev, dd->out_sg, 1, DMA_FROM_DEVICE); in atmel_tdes_crypt_dma_stop()
649 dma_unmap_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_dma_stop()
651 dma_sync_single_for_device(dd->dev, dd->dma_addr_out, in atmel_tdes_crypt_dma_stop()
652 dd->dma_size, DMA_FROM_DEVICE); in atmel_tdes_crypt_dma_stop()
655 count = atmel_tdes_sg_copy(&dd->out_sg, &dd->out_offset, in atmel_tdes_crypt_dma_stop()
656 dd->buf_out, dd->buflen, dd->dma_size, 1); in atmel_tdes_crypt_dma_stop()
657 if (count != dd->dma_size) { in atmel_tdes_crypt_dma_stop()
700 return atmel_tdes_handle_queue(ctx->dd, req); in atmel_tdes_crypt()
715 static int atmel_tdes_dma_init(struct atmel_tdes_dev *dd, in atmel_tdes_dma_init() argument
728 dd->dma_lch_in.chan = dma_request_channel(mask_in, in atmel_tdes_dma_init()
731 if (!dd->dma_lch_in.chan) in atmel_tdes_dma_init()
734 dd->dma_lch_in.dma_conf.direction = DMA_MEM_TO_DEV; in atmel_tdes_dma_init()
735 dd->dma_lch_in.dma_conf.dst_addr = dd->phys_base + in atmel_tdes_dma_init()
737 dd->dma_lch_in.dma_conf.src_maxburst = 1; in atmel_tdes_dma_init()
738 dd->dma_lch_in.dma_conf.src_addr_width = in atmel_tdes_dma_init()
740 dd->dma_lch_in.dma_conf.dst_maxburst = 1; in atmel_tdes_dma_init()
741 dd->dma_lch_in.dma_conf.dst_addr_width = in atmel_tdes_dma_init()
743 dd->dma_lch_in.dma_conf.device_fc = false; in atmel_tdes_dma_init()
747 dd->dma_lch_out.chan = dma_request_channel(mask_out, in atmel_tdes_dma_init()
750 if (!dd->dma_lch_out.chan) in atmel_tdes_dma_init()
753 dd->dma_lch_out.dma_conf.direction = DMA_DEV_TO_MEM; in atmel_tdes_dma_init()
754 dd->dma_lch_out.dma_conf.src_addr = dd->phys_base + in atmel_tdes_dma_init()
756 dd->dma_lch_out.dma_conf.src_maxburst = 1; in atmel_tdes_dma_init()
757 dd->dma_lch_out.dma_conf.src_addr_width = in atmel_tdes_dma_init()
759 dd->dma_lch_out.dma_conf.dst_maxburst = 1; in atmel_tdes_dma_init()
760 dd->dma_lch_out.dma_conf.dst_addr_width = in atmel_tdes_dma_init()
762 dd->dma_lch_out.dma_conf.device_fc = false; in atmel_tdes_dma_init()
770 dma_release_channel(dd->dma_lch_in.chan); in atmel_tdes_dma_init()
775 static void atmel_tdes_dma_cleanup(struct atmel_tdes_dev *dd) in atmel_tdes_dma_cleanup() argument
777 dma_release_channel(dd->dma_lch_in.chan); in atmel_tdes_dma_cleanup()
778 dma_release_channel(dd->dma_lch_out.chan); in atmel_tdes_dma_cleanup()
818 if (!ctx->dd->caps.has_cfb_3keys && strstr(alg_name, "cfb") in atmel_tdes_setkey()
908 struct atmel_tdes_dev *dd; in atmel_tdes_cra_init() local
912 dd = atmel_tdes_find_dev(ctx); in atmel_tdes_cra_init()
913 if (!dd) in atmel_tdes_cra_init()
1220 struct atmel_tdes_dev *dd = (struct atmel_tdes_dev *)data; in atmel_tdes_queue_task() local
1222 atmel_tdes_handle_queue(dd, NULL); in atmel_tdes_queue_task()
1227 struct atmel_tdes_dev *dd = (struct atmel_tdes_dev *) data; in atmel_tdes_done_task() local
1230 if (!(dd->flags & TDES_FLAGS_DMA)) in atmel_tdes_done_task()
1231 err = atmel_tdes_crypt_pdc_stop(dd); in atmel_tdes_done_task()
1233 err = atmel_tdes_crypt_dma_stop(dd); in atmel_tdes_done_task()
1235 err = dd->err ? : err; in atmel_tdes_done_task()
1237 if (dd->total && !err) { in atmel_tdes_done_task()
1238 if (dd->flags & TDES_FLAGS_FAST) { in atmel_tdes_done_task()
1239 dd->in_sg = sg_next(dd->in_sg); in atmel_tdes_done_task()
1240 dd->out_sg = sg_next(dd->out_sg); in atmel_tdes_done_task()
1241 if (!dd->in_sg || !dd->out_sg) in atmel_tdes_done_task()
1245 err = atmel_tdes_crypt_start(dd); in atmel_tdes_done_task()
1250 atmel_tdes_finish_req(dd, err); in atmel_tdes_done_task()
1251 atmel_tdes_handle_queue(dd, NULL); in atmel_tdes_done_task()
1272 static void atmel_tdes_unregister_algs(struct atmel_tdes_dev *dd) in atmel_tdes_unregister_algs() argument
1280 static int atmel_tdes_register_algs(struct atmel_tdes_dev *dd) in atmel_tdes_register_algs() argument
1299 static void atmel_tdes_get_cap(struct atmel_tdes_dev *dd) in atmel_tdes_get_cap() argument
1302 dd->caps.has_dma = 0; in atmel_tdes_get_cap()
1303 dd->caps.has_cfb_3keys = 0; in atmel_tdes_get_cap()
1306 switch (dd->hw_version & 0xf00) { in atmel_tdes_get_cap()
1308 dd->caps.has_dma = 1; in atmel_tdes_get_cap()
1309 dd->caps.has_cfb_3keys = 1; in atmel_tdes_get_cap()
1314 dev_warn(dd->dev, in atmel_tdes_get_cap()