Lines Matching refs:dd

65 	struct atmel_tdes_dev *dd;  member
171 static inline u32 atmel_tdes_read(struct atmel_tdes_dev *dd, u32 offset) in atmel_tdes_read() argument
173 return readl_relaxed(dd->io_base + offset); in atmel_tdes_read()
176 static inline void atmel_tdes_write(struct atmel_tdes_dev *dd, in atmel_tdes_write() argument
179 writel_relaxed(value, dd->io_base + offset); in atmel_tdes_write()
182 static void atmel_tdes_write_n(struct atmel_tdes_dev *dd, u32 offset, in atmel_tdes_write_n() argument
186 atmel_tdes_write(dd, offset, *value); in atmel_tdes_write_n()
201 static int atmel_tdes_hw_init(struct atmel_tdes_dev *dd) in atmel_tdes_hw_init() argument
205 err = clk_prepare_enable(dd->iclk); in atmel_tdes_hw_init()
209 if (!(dd->flags & TDES_FLAGS_INIT)) { in atmel_tdes_hw_init()
210 atmel_tdes_write(dd, TDES_CR, TDES_CR_SWRST); in atmel_tdes_hw_init()
211 dd->flags |= TDES_FLAGS_INIT; in atmel_tdes_hw_init()
217 static inline unsigned int atmel_tdes_get_version(struct atmel_tdes_dev *dd) in atmel_tdes_get_version() argument
219 return atmel_tdes_read(dd, TDES_HW_VERSION) & 0x00000fff; in atmel_tdes_get_version()
222 static int atmel_tdes_hw_version_init(struct atmel_tdes_dev *dd) in atmel_tdes_hw_version_init() argument
226 err = atmel_tdes_hw_init(dd); in atmel_tdes_hw_version_init()
230 dd->hw_version = atmel_tdes_get_version(dd); in atmel_tdes_hw_version_init()
232 dev_info(dd->dev, in atmel_tdes_hw_version_init()
233 "version: 0x%x\n", dd->hw_version); in atmel_tdes_hw_version_init()
235 clk_disable_unprepare(dd->iclk); in atmel_tdes_hw_version_init()
242 struct atmel_tdes_dev *dd = data; in atmel_tdes_dma_callback() local
245 tasklet_schedule(&dd->done_task); in atmel_tdes_dma_callback()
248 static int atmel_tdes_write_ctrl(struct atmel_tdes_dev *dd) in atmel_tdes_write_ctrl() argument
253 err = atmel_tdes_hw_init(dd); in atmel_tdes_write_ctrl()
258 if (!dd->caps.has_dma) in atmel_tdes_write_ctrl()
259 atmel_tdes_write(dd, TDES_PTCR, in atmel_tdes_write_ctrl()
263 if (dd->ctx->keylen > (DES_KEY_SIZE << 1)) { in atmel_tdes_write_ctrl()
266 } else if (dd->ctx->keylen > DES_KEY_SIZE) { in atmel_tdes_write_ctrl()
273 valmr |= dd->flags & TDES_FLAGS_MODE_MASK; in atmel_tdes_write_ctrl()
275 atmel_tdes_write(dd, TDES_MR, valmr); in atmel_tdes_write_ctrl()
277 atmel_tdes_write_n(dd, TDES_KEY1W1R, dd->ctx->key, in atmel_tdes_write_ctrl()
278 dd->ctx->keylen >> 2); in atmel_tdes_write_ctrl()
280 if (dd->req->iv && (valmr & TDES_MR_OPMOD_MASK) != TDES_MR_OPMOD_ECB) in atmel_tdes_write_ctrl()
281 atmel_tdes_write_n(dd, TDES_IV1R, (void *)dd->req->iv, 2); in atmel_tdes_write_ctrl()
286 static int atmel_tdes_crypt_pdc_stop(struct atmel_tdes_dev *dd) in atmel_tdes_crypt_pdc_stop() argument
291 atmel_tdes_write(dd, TDES_PTCR, TDES_PTCR_TXTDIS|TDES_PTCR_RXTDIS); in atmel_tdes_crypt_pdc_stop()
293 if (dd->flags & TDES_FLAGS_FAST) { in atmel_tdes_crypt_pdc_stop()
294 dma_unmap_sg(dd->dev, dd->out_sg, 1, DMA_FROM_DEVICE); in atmel_tdes_crypt_pdc_stop()
295 dma_unmap_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_pdc_stop()
297 dma_sync_single_for_device(dd->dev, dd->dma_addr_out, in atmel_tdes_crypt_pdc_stop()
298 dd->dma_size, DMA_FROM_DEVICE); in atmel_tdes_crypt_pdc_stop()
301 count = atmel_tdes_sg_copy(&dd->out_sg, &dd->out_offset, in atmel_tdes_crypt_pdc_stop()
302 dd->buf_out, dd->buflen, dd->dma_size, 1); in atmel_tdes_crypt_pdc_stop()
303 if (count != dd->dma_size) { in atmel_tdes_crypt_pdc_stop()
305 dev_dbg(dd->dev, "not all data converted: %zu\n", count); in atmel_tdes_crypt_pdc_stop()
312 static int atmel_tdes_buff_init(struct atmel_tdes_dev *dd) in atmel_tdes_buff_init() argument
316 dd->buf_in = (void *)__get_free_pages(GFP_KERNEL, 0); in atmel_tdes_buff_init()
317 dd->buf_out = (void *)__get_free_pages(GFP_KERNEL, 0); in atmel_tdes_buff_init()
318 dd->buflen = PAGE_SIZE; in atmel_tdes_buff_init()
319 dd->buflen &= ~(DES_BLOCK_SIZE - 1); in atmel_tdes_buff_init()
321 if (!dd->buf_in || !dd->buf_out) { in atmel_tdes_buff_init()
322 dev_dbg(dd->dev, "unable to alloc pages.\n"); in atmel_tdes_buff_init()
327 dd->dma_addr_in = dma_map_single(dd->dev, dd->buf_in, in atmel_tdes_buff_init()
328 dd->buflen, DMA_TO_DEVICE); in atmel_tdes_buff_init()
329 err = dma_mapping_error(dd->dev, dd->dma_addr_in); in atmel_tdes_buff_init()
331 dev_dbg(dd->dev, "dma %zd bytes error\n", dd->buflen); in atmel_tdes_buff_init()
335 dd->dma_addr_out = dma_map_single(dd->dev, dd->buf_out, in atmel_tdes_buff_init()
336 dd->buflen, DMA_FROM_DEVICE); in atmel_tdes_buff_init()
337 err = dma_mapping_error(dd->dev, dd->dma_addr_out); in atmel_tdes_buff_init()
339 dev_dbg(dd->dev, "dma %zd bytes error\n", dd->buflen); in atmel_tdes_buff_init()
346 dma_unmap_single(dd->dev, dd->dma_addr_in, dd->buflen, in atmel_tdes_buff_init()
350 free_page((unsigned long)dd->buf_out); in atmel_tdes_buff_init()
351 free_page((unsigned long)dd->buf_in); in atmel_tdes_buff_init()
355 static void atmel_tdes_buff_cleanup(struct atmel_tdes_dev *dd) in atmel_tdes_buff_cleanup() argument
357 dma_unmap_single(dd->dev, dd->dma_addr_out, dd->buflen, in atmel_tdes_buff_cleanup()
359 dma_unmap_single(dd->dev, dd->dma_addr_in, dd->buflen, in atmel_tdes_buff_cleanup()
361 free_page((unsigned long)dd->buf_out); in atmel_tdes_buff_cleanup()
362 free_page((unsigned long)dd->buf_in); in atmel_tdes_buff_cleanup()
365 static int atmel_tdes_crypt_pdc(struct atmel_tdes_dev *dd, in atmel_tdes_crypt_pdc() argument
371 dd->dma_size = length; in atmel_tdes_crypt_pdc()
373 if (!(dd->flags & TDES_FLAGS_FAST)) { in atmel_tdes_crypt_pdc()
374 dma_sync_single_for_device(dd->dev, dma_addr_in, length, in atmel_tdes_crypt_pdc()
380 atmel_tdes_write(dd, TDES_PTCR, TDES_PTCR_TXTDIS|TDES_PTCR_RXTDIS); in atmel_tdes_crypt_pdc()
381 atmel_tdes_write(dd, TDES_TPR, dma_addr_in); in atmel_tdes_crypt_pdc()
382 atmel_tdes_write(dd, TDES_TCR, len32); in atmel_tdes_crypt_pdc()
383 atmel_tdes_write(dd, TDES_RPR, dma_addr_out); in atmel_tdes_crypt_pdc()
384 atmel_tdes_write(dd, TDES_RCR, len32); in atmel_tdes_crypt_pdc()
387 atmel_tdes_write(dd, TDES_IER, TDES_INT_ENDRX); in atmel_tdes_crypt_pdc()
390 atmel_tdes_write(dd, TDES_PTCR, TDES_PTCR_TXTEN | TDES_PTCR_RXTEN); in atmel_tdes_crypt_pdc()
395 static int atmel_tdes_crypt_dma(struct atmel_tdes_dev *dd, in atmel_tdes_crypt_dma() argument
403 dd->dma_size = length; in atmel_tdes_crypt_dma()
405 if (!(dd->flags & TDES_FLAGS_FAST)) { in atmel_tdes_crypt_dma()
406 dma_sync_single_for_device(dd->dev, dma_addr_in, length, in atmel_tdes_crypt_dma()
412 dd->dma_lch_in.dma_conf.dst_addr_width = addr_width; in atmel_tdes_crypt_dma()
413 dd->dma_lch_out.dma_conf.src_addr_width = addr_width; in atmel_tdes_crypt_dma()
415 dmaengine_slave_config(dd->dma_lch_in.chan, &dd->dma_lch_in.dma_conf); in atmel_tdes_crypt_dma()
416 dmaengine_slave_config(dd->dma_lch_out.chan, &dd->dma_lch_out.dma_conf); in atmel_tdes_crypt_dma()
418 dd->flags |= TDES_FLAGS_DMA; in atmel_tdes_crypt_dma()
428 in_desc = dmaengine_prep_slave_sg(dd->dma_lch_in.chan, &sg[0], in atmel_tdes_crypt_dma()
434 out_desc = dmaengine_prep_slave_sg(dd->dma_lch_out.chan, &sg[1], in atmel_tdes_crypt_dma()
441 out_desc->callback_param = dd; in atmel_tdes_crypt_dma()
444 dma_async_issue_pending(dd->dma_lch_out.chan); in atmel_tdes_crypt_dma()
447 dma_async_issue_pending(dd->dma_lch_in.chan); in atmel_tdes_crypt_dma()
452 static int atmel_tdes_crypt_start(struct atmel_tdes_dev *dd) in atmel_tdes_crypt_start() argument
458 if ((!dd->in_offset) && (!dd->out_offset)) { in atmel_tdes_crypt_start()
460 in = IS_ALIGNED((u32)dd->in_sg->offset, sizeof(u32)) && in atmel_tdes_crypt_start()
461 IS_ALIGNED(dd->in_sg->length, dd->ctx->block_size); in atmel_tdes_crypt_start()
462 out = IS_ALIGNED((u32)dd->out_sg->offset, sizeof(u32)) && in atmel_tdes_crypt_start()
463 IS_ALIGNED(dd->out_sg->length, dd->ctx->block_size); in atmel_tdes_crypt_start()
466 if (sg_dma_len(dd->in_sg) != sg_dma_len(dd->out_sg)) in atmel_tdes_crypt_start()
472 count = min_t(size_t, dd->total, sg_dma_len(dd->in_sg)); in atmel_tdes_crypt_start()
473 count = min_t(size_t, count, sg_dma_len(dd->out_sg)); in atmel_tdes_crypt_start()
475 err = dma_map_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_start()
477 dev_dbg(dd->dev, "dma_map_sg() error\n"); in atmel_tdes_crypt_start()
481 err = dma_map_sg(dd->dev, dd->out_sg, 1, in atmel_tdes_crypt_start()
484 dev_dbg(dd->dev, "dma_map_sg() error\n"); in atmel_tdes_crypt_start()
485 dma_unmap_sg(dd->dev, dd->in_sg, 1, in atmel_tdes_crypt_start()
490 addr_in = sg_dma_address(dd->in_sg); in atmel_tdes_crypt_start()
491 addr_out = sg_dma_address(dd->out_sg); in atmel_tdes_crypt_start()
493 dd->flags |= TDES_FLAGS_FAST; in atmel_tdes_crypt_start()
497 count = atmel_tdes_sg_copy(&dd->in_sg, &dd->in_offset, in atmel_tdes_crypt_start()
498 dd->buf_in, dd->buflen, dd->total, 0); in atmel_tdes_crypt_start()
500 addr_in = dd->dma_addr_in; in atmel_tdes_crypt_start()
501 addr_out = dd->dma_addr_out; in atmel_tdes_crypt_start()
503 dd->flags &= ~TDES_FLAGS_FAST; in atmel_tdes_crypt_start()
506 dd->total -= count; in atmel_tdes_crypt_start()
508 if (dd->caps.has_dma) in atmel_tdes_crypt_start()
509 err = atmel_tdes_crypt_dma(dd, addr_in, addr_out, count); in atmel_tdes_crypt_start()
511 err = atmel_tdes_crypt_pdc(dd, addr_in, addr_out, count); in atmel_tdes_crypt_start()
513 if (err && (dd->flags & TDES_FLAGS_FAST)) { in atmel_tdes_crypt_start()
514 dma_unmap_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_start()
515 dma_unmap_sg(dd->dev, dd->out_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_start()
522 atmel_tdes_set_iv_as_last_ciphertext_block(struct atmel_tdes_dev *dd) in atmel_tdes_set_iv_as_last_ciphertext_block() argument
524 struct skcipher_request *req = dd->req; in atmel_tdes_set_iv_as_last_ciphertext_block()
540 static void atmel_tdes_finish_req(struct atmel_tdes_dev *dd, int err) in atmel_tdes_finish_req() argument
542 struct skcipher_request *req = dd->req; in atmel_tdes_finish_req()
545 clk_disable_unprepare(dd->iclk); in atmel_tdes_finish_req()
547 dd->flags &= ~TDES_FLAGS_BUSY; in atmel_tdes_finish_req()
550 atmel_tdes_set_iv_as_last_ciphertext_block(dd); in atmel_tdes_finish_req()
555 static int atmel_tdes_handle_queue(struct atmel_tdes_dev *dd, in atmel_tdes_handle_queue() argument
564 spin_lock_irqsave(&dd->lock, flags); in atmel_tdes_handle_queue()
566 ret = crypto_enqueue_request(&dd->queue, &req->base); in atmel_tdes_handle_queue()
567 if (dd->flags & TDES_FLAGS_BUSY) { in atmel_tdes_handle_queue()
568 spin_unlock_irqrestore(&dd->lock, flags); in atmel_tdes_handle_queue()
571 backlog = crypto_get_backlog(&dd->queue); in atmel_tdes_handle_queue()
572 async_req = crypto_dequeue_request(&dd->queue); in atmel_tdes_handle_queue()
574 dd->flags |= TDES_FLAGS_BUSY; in atmel_tdes_handle_queue()
575 spin_unlock_irqrestore(&dd->lock, flags); in atmel_tdes_handle_queue()
586 dd->req = req; in atmel_tdes_handle_queue()
587 dd->total = req->cryptlen; in atmel_tdes_handle_queue()
588 dd->in_offset = 0; in atmel_tdes_handle_queue()
589 dd->in_sg = req->src; in atmel_tdes_handle_queue()
590 dd->out_offset = 0; in atmel_tdes_handle_queue()
591 dd->out_sg = req->dst; in atmel_tdes_handle_queue()
596 dd->flags = (dd->flags & ~TDES_FLAGS_MODE_MASK) | rctx->mode; in atmel_tdes_handle_queue()
597 dd->ctx = ctx; in atmel_tdes_handle_queue()
599 err = atmel_tdes_write_ctrl(dd); in atmel_tdes_handle_queue()
601 err = atmel_tdes_crypt_start(dd); in atmel_tdes_handle_queue()
604 atmel_tdes_finish_req(dd, err); in atmel_tdes_handle_queue()
605 tasklet_schedule(&dd->queue_task); in atmel_tdes_handle_queue()
611 static int atmel_tdes_crypt_dma_stop(struct atmel_tdes_dev *dd) in atmel_tdes_crypt_dma_stop() argument
616 if (dd->flags & TDES_FLAGS_DMA) { in atmel_tdes_crypt_dma_stop()
618 if (dd->flags & TDES_FLAGS_FAST) { in atmel_tdes_crypt_dma_stop()
619 dma_unmap_sg(dd->dev, dd->out_sg, 1, DMA_FROM_DEVICE); in atmel_tdes_crypt_dma_stop()
620 dma_unmap_sg(dd->dev, dd->in_sg, 1, DMA_TO_DEVICE); in atmel_tdes_crypt_dma_stop()
622 dma_sync_single_for_device(dd->dev, dd->dma_addr_out, in atmel_tdes_crypt_dma_stop()
623 dd->dma_size, DMA_FROM_DEVICE); in atmel_tdes_crypt_dma_stop()
626 count = atmel_tdes_sg_copy(&dd->out_sg, &dd->out_offset, in atmel_tdes_crypt_dma_stop()
627 dd->buf_out, dd->buflen, dd->dma_size, 1); in atmel_tdes_crypt_dma_stop()
628 if (count != dd->dma_size) { in atmel_tdes_crypt_dma_stop()
630 dev_dbg(dd->dev, "not all data converted: %zu\n", count); in atmel_tdes_crypt_dma_stop()
642 struct device *dev = ctx->dd->dev; in atmel_tdes_crypt()
665 return atmel_tdes_handle_queue(ctx->dd, req); in atmel_tdes_crypt()
668 static int atmel_tdes_dma_init(struct atmel_tdes_dev *dd) in atmel_tdes_dma_init() argument
673 dd->dma_lch_in.chan = dma_request_chan(dd->dev, "tx"); in atmel_tdes_dma_init()
674 if (IS_ERR(dd->dma_lch_in.chan)) { in atmel_tdes_dma_init()
675 ret = PTR_ERR(dd->dma_lch_in.chan); in atmel_tdes_dma_init()
679 dd->dma_lch_in.dma_conf.dst_addr = dd->phys_base + in atmel_tdes_dma_init()
681 dd->dma_lch_in.dma_conf.src_maxburst = 1; in atmel_tdes_dma_init()
682 dd->dma_lch_in.dma_conf.src_addr_width = in atmel_tdes_dma_init()
684 dd->dma_lch_in.dma_conf.dst_maxburst = 1; in atmel_tdes_dma_init()
685 dd->dma_lch_in.dma_conf.dst_addr_width = in atmel_tdes_dma_init()
687 dd->dma_lch_in.dma_conf.device_fc = false; in atmel_tdes_dma_init()
689 dd->dma_lch_out.chan = dma_request_chan(dd->dev, "rx"); in atmel_tdes_dma_init()
690 if (IS_ERR(dd->dma_lch_out.chan)) { in atmel_tdes_dma_init()
691 ret = PTR_ERR(dd->dma_lch_out.chan); in atmel_tdes_dma_init()
695 dd->dma_lch_out.dma_conf.src_addr = dd->phys_base + in atmel_tdes_dma_init()
697 dd->dma_lch_out.dma_conf.src_maxburst = 1; in atmel_tdes_dma_init()
698 dd->dma_lch_out.dma_conf.src_addr_width = in atmel_tdes_dma_init()
700 dd->dma_lch_out.dma_conf.dst_maxburst = 1; in atmel_tdes_dma_init()
701 dd->dma_lch_out.dma_conf.dst_addr_width = in atmel_tdes_dma_init()
703 dd->dma_lch_out.dma_conf.device_fc = false; in atmel_tdes_dma_init()
708 dma_release_channel(dd->dma_lch_in.chan); in atmel_tdes_dma_init()
710 dev_err(dd->dev, "no DMA channel available\n"); in atmel_tdes_dma_init()
714 static void atmel_tdes_dma_cleanup(struct atmel_tdes_dev *dd) in atmel_tdes_dma_cleanup() argument
716 dma_release_channel(dd->dma_lch_in.chan); in atmel_tdes_dma_cleanup()
717 dma_release_channel(dd->dma_lch_out.chan); in atmel_tdes_dma_cleanup()
776 ctx->dd = atmel_tdes_dev_alloc(); in atmel_tdes_init_tfm()
777 if (!ctx->dd) in atmel_tdes_init_tfm()
850 struct atmel_tdes_dev *dd = (struct atmel_tdes_dev *)data; in atmel_tdes_queue_task() local
852 atmel_tdes_handle_queue(dd, NULL); in atmel_tdes_queue_task()
857 struct atmel_tdes_dev *dd = (struct atmel_tdes_dev *) data; in atmel_tdes_done_task() local
860 if (!(dd->flags & TDES_FLAGS_DMA)) in atmel_tdes_done_task()
861 err = atmel_tdes_crypt_pdc_stop(dd); in atmel_tdes_done_task()
863 err = atmel_tdes_crypt_dma_stop(dd); in atmel_tdes_done_task()
865 if (dd->total && !err) { in atmel_tdes_done_task()
866 if (dd->flags & TDES_FLAGS_FAST) { in atmel_tdes_done_task()
867 dd->in_sg = sg_next(dd->in_sg); in atmel_tdes_done_task()
868 dd->out_sg = sg_next(dd->out_sg); in atmel_tdes_done_task()
869 if (!dd->in_sg || !dd->out_sg) in atmel_tdes_done_task()
873 err = atmel_tdes_crypt_start(dd); in atmel_tdes_done_task()
878 atmel_tdes_finish_req(dd, err); in atmel_tdes_done_task()
879 atmel_tdes_handle_queue(dd, NULL); in atmel_tdes_done_task()
900 static void atmel_tdes_unregister_algs(struct atmel_tdes_dev *dd) in atmel_tdes_unregister_algs() argument
908 static int atmel_tdes_register_algs(struct atmel_tdes_dev *dd) in atmel_tdes_register_algs() argument
929 static void atmel_tdes_get_cap(struct atmel_tdes_dev *dd) in atmel_tdes_get_cap() argument
932 dd->caps.has_dma = 0; in atmel_tdes_get_cap()
935 switch (dd->hw_version & 0xf00) { in atmel_tdes_get_cap()
938 dd->caps.has_dma = 1; in atmel_tdes_get_cap()
943 dev_warn(dd->dev, in atmel_tdes_get_cap()