Lines Matching refs:hcu_dev
169 static int ocs_hcu_wait_busy(struct ocs_hcu_dev *hcu_dev) in ocs_hcu_wait_busy() argument
173 return readl_poll_timeout(hcu_dev->io_base + OCS_HCU_STATUS, val, in ocs_hcu_wait_busy()
179 static void ocs_hcu_done_irq_en(struct ocs_hcu_dev *hcu_dev) in ocs_hcu_done_irq_en() argument
182 writel(0xFFFFFFFF, hcu_dev->io_base + OCS_HCU_ISR); in ocs_hcu_done_irq_en()
183 hcu_dev->irq_err = false; in ocs_hcu_done_irq_en()
186 hcu_dev->io_base + OCS_HCU_IER); in ocs_hcu_done_irq_en()
189 static void ocs_hcu_dma_irq_en(struct ocs_hcu_dev *hcu_dev) in ocs_hcu_dma_irq_en() argument
192 writel(0xFFFFFFFF, hcu_dev->io_base + OCS_HCU_DMA_MSI_ISR); in ocs_hcu_dma_irq_en()
193 hcu_dev->irq_err = false; in ocs_hcu_dma_irq_en()
196 hcu_dev->io_base + OCS_HCU_DMA_MSI_IER); in ocs_hcu_dma_irq_en()
198 writel(HCU_DMA_MSI_UNMASK, hcu_dev->io_base + OCS_HCU_DMA_MSI_MASK); in ocs_hcu_dma_irq_en()
201 static void ocs_hcu_irq_dis(struct ocs_hcu_dev *hcu_dev) in ocs_hcu_irq_dis() argument
203 writel(HCU_IRQ_DISABLE, hcu_dev->io_base + OCS_HCU_IER); in ocs_hcu_irq_dis()
204 writel(HCU_DMA_MSI_DISABLE, hcu_dev->io_base + OCS_HCU_DMA_MSI_IER); in ocs_hcu_irq_dis()
207 static int ocs_hcu_wait_and_disable_irq(struct ocs_hcu_dev *hcu_dev) in ocs_hcu_wait_and_disable_irq() argument
211 rc = wait_for_completion_interruptible(&hcu_dev->irq_done); in ocs_hcu_wait_and_disable_irq()
215 if (hcu_dev->irq_err) { in ocs_hcu_wait_and_disable_irq()
217 hcu_dev->irq_err = false; in ocs_hcu_wait_and_disable_irq()
223 ocs_hcu_irq_dis(hcu_dev); in ocs_hcu_wait_and_disable_irq()
243 static int ocs_hcu_get_intermediate_data(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_get_intermediate_data() argument
259 rc = ocs_hcu_wait_busy(hcu_dev); in ocs_hcu_get_intermediate_data()
270 chain[i] = readl(hcu_dev->io_base + OCS_HCU_CHAIN); in ocs_hcu_get_intermediate_data()
272 data->msg_len_lo = readl(hcu_dev->io_base + OCS_HCU_MSG_LEN_LO); in ocs_hcu_get_intermediate_data()
273 data->msg_len_hi = readl(hcu_dev->io_base + OCS_HCU_MSG_LEN_HI); in ocs_hcu_get_intermediate_data()
286 static void ocs_hcu_set_intermediate_data(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_set_intermediate_data() argument
301 writel(chain[i], hcu_dev->io_base + OCS_HCU_CHAIN); in ocs_hcu_set_intermediate_data()
303 writel(data->msg_len_lo, hcu_dev->io_base + OCS_HCU_MSG_LEN_LO); in ocs_hcu_set_intermediate_data()
304 writel(data->msg_len_hi, hcu_dev->io_base + OCS_HCU_MSG_LEN_HI); in ocs_hcu_set_intermediate_data()
307 static int ocs_hcu_get_digest(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_get_digest() argument
322 rc = ocs_hcu_wait_busy(hcu_dev); in ocs_hcu_get_digest()
328 chain[i] = readl(hcu_dev->io_base + OCS_HCU_CHAIN); in ocs_hcu_get_digest()
341 static int ocs_hcu_hw_cfg(struct ocs_hcu_dev *hcu_dev, enum ocs_hcu_algo algo, in ocs_hcu_hw_cfg() argument
352 rc = ocs_hcu_wait_busy(hcu_dev); in ocs_hcu_hw_cfg()
357 ocs_hcu_irq_dis(hcu_dev); in ocs_hcu_hw_cfg()
365 writel(cfg, hcu_dev->io_base + OCS_HCU_MODE); in ocs_hcu_hw_cfg()
374 static void ocs_hcu_clear_key(struct ocs_hcu_dev *hcu_dev) in ocs_hcu_clear_key() argument
380 writel(0, hcu_dev->io_base + OCS_HCU_KEY_0 + reg_off); in ocs_hcu_clear_key()
391 static int ocs_hcu_write_key(struct ocs_hcu_dev *hcu_dev, const u8 *key, size_t len) in ocs_hcu_write_key() argument
419 hcu_dev->io_base + OCS_HCU_KEY_BYTE_ORDER_CFG); in ocs_hcu_write_key()
426 hcu_dev->io_base + OCS_HCU_KEY_0 + (sizeof(u32) * i)); in ocs_hcu_write_key()
443 static int ocs_hcu_ll_dma_start(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_ll_dma_start() argument
466 ocs_hcu_done_irq_en(hcu_dev); in ocs_hcu_ll_dma_start()
468 ocs_hcu_dma_irq_en(hcu_dev); in ocs_hcu_ll_dma_start()
470 reinit_completion(&hcu_dev->irq_done); in ocs_hcu_ll_dma_start()
471 writel(dma_list->dma_addr, hcu_dev->io_base + OCS_HCU_DMA_NEXT_SRC_DESCR); in ocs_hcu_ll_dma_start()
472 writel(0, hcu_dev->io_base + OCS_HCU_DMA_SRC_SIZE); in ocs_hcu_ll_dma_start()
473 writel(0, hcu_dev->io_base + OCS_HCU_DMA_DST_SIZE); in ocs_hcu_ll_dma_start()
475 writel(OCS_HCU_START, hcu_dev->io_base + OCS_HCU_OPERATION); in ocs_hcu_ll_dma_start()
477 writel(cfg, hcu_dev->io_base + OCS_HCU_DMA_DMA_MODE); in ocs_hcu_ll_dma_start()
480 writel(OCS_HCU_TERMINATE, hcu_dev->io_base + OCS_HCU_OPERATION); in ocs_hcu_ll_dma_start()
482 rc = ocs_hcu_wait_and_disable_irq(hcu_dev); in ocs_hcu_ll_dma_start()
489 struct ocs_hcu_dma_list *ocs_hcu_dma_list_alloc(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_dma_list_alloc() argument
499 dma_list->head = dma_alloc_coherent(hcu_dev->dev, in ocs_hcu_dma_list_alloc()
512 void ocs_hcu_dma_list_free(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_dma_list_free() argument
518 dma_free_coherent(hcu_dev->dev, in ocs_hcu_dma_list_free()
526 int ocs_hcu_dma_list_add_tail(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_dma_list_add_tail() argument
530 struct device *dev = hcu_dev->dev; in ocs_hcu_dma_list_add_tail()
607 int ocs_hcu_hash_update(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_hash_update() argument
613 if (!hcu_dev || !ctx) in ocs_hcu_hash_update()
617 rc = ocs_hcu_hw_cfg(hcu_dev, ctx->algo, false); in ocs_hcu_hash_update()
623 ocs_hcu_set_intermediate_data(hcu_dev, &ctx->idata, ctx->algo); in ocs_hcu_hash_update()
626 rc = ocs_hcu_ll_dma_start(hcu_dev, dma_list, false); in ocs_hcu_hash_update()
631 return ocs_hcu_get_intermediate_data(hcu_dev, &ctx->idata, ctx->algo); in ocs_hcu_hash_update()
644 int ocs_hcu_hash_finup(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_hash_finup() argument
651 if (!hcu_dev || !ctx) in ocs_hcu_hash_finup()
655 rc = ocs_hcu_hw_cfg(hcu_dev, ctx->algo, false); in ocs_hcu_hash_finup()
661 ocs_hcu_set_intermediate_data(hcu_dev, &ctx->idata, ctx->algo); in ocs_hcu_hash_finup()
664 rc = ocs_hcu_ll_dma_start(hcu_dev, dma_list, true); in ocs_hcu_hash_finup()
669 return ocs_hcu_get_digest(hcu_dev, ctx->algo, dgst, dgst_len); in ocs_hcu_hash_finup()
681 int ocs_hcu_hash_final(struct ocs_hcu_dev *hcu_dev, in ocs_hcu_hash_final() argument
687 if (!hcu_dev || !ctx) in ocs_hcu_hash_final()
691 rc = ocs_hcu_hw_cfg(hcu_dev, ctx->algo, false); in ocs_hcu_hash_final()
697 ocs_hcu_set_intermediate_data(hcu_dev, &ctx->idata, ctx->algo); in ocs_hcu_hash_final()
703 ocs_hcu_done_irq_en(hcu_dev); in ocs_hcu_hash_final()
704 reinit_completion(&hcu_dev->irq_done); in ocs_hcu_hash_final()
705 writel(OCS_HCU_TERMINATE, hcu_dev->io_base + OCS_HCU_OPERATION); in ocs_hcu_hash_final()
707 rc = ocs_hcu_wait_and_disable_irq(hcu_dev); in ocs_hcu_hash_final()
712 return ocs_hcu_get_digest(hcu_dev, ctx->algo, dgst, dgst_len); in ocs_hcu_hash_final()
726 int ocs_hcu_digest(struct ocs_hcu_dev *hcu_dev, enum ocs_hcu_algo algo, in ocs_hcu_digest() argument
729 struct device *dev = hcu_dev->dev; in ocs_hcu_digest()
735 rc = ocs_hcu_hw_cfg(hcu_dev, algo, false); in ocs_hcu_digest()
745 ocs_hcu_done_irq_en(hcu_dev); in ocs_hcu_digest()
747 reinit_completion(&hcu_dev->irq_done); in ocs_hcu_digest()
749 writel(dma_handle, hcu_dev->io_base + OCS_HCU_DMA_SRC_ADDR); in ocs_hcu_digest()
750 writel(data_len, hcu_dev->io_base + OCS_HCU_DMA_SRC_SIZE); in ocs_hcu_digest()
751 writel(OCS_HCU_START, hcu_dev->io_base + OCS_HCU_OPERATION); in ocs_hcu_digest()
752 writel(reg, hcu_dev->io_base + OCS_HCU_DMA_DMA_MODE); in ocs_hcu_digest()
754 writel(OCS_HCU_TERMINATE, hcu_dev->io_base + OCS_HCU_OPERATION); in ocs_hcu_digest()
756 rc = ocs_hcu_wait_and_disable_irq(hcu_dev); in ocs_hcu_digest()
762 return ocs_hcu_get_digest(hcu_dev, algo, dgst, dgst_len); in ocs_hcu_digest()
777 int ocs_hcu_hmac(struct ocs_hcu_dev *hcu_dev, enum ocs_hcu_algo algo, in ocs_hcu_hmac() argument
789 rc = ocs_hcu_hw_cfg(hcu_dev, algo, true); in ocs_hcu_hmac()
793 rc = ocs_hcu_write_key(hcu_dev, key, key_len); in ocs_hcu_hmac()
797 rc = ocs_hcu_ll_dma_start(hcu_dev, dma_list, true); in ocs_hcu_hmac()
800 ocs_hcu_clear_key(hcu_dev); in ocs_hcu_hmac()
805 return ocs_hcu_get_digest(hcu_dev, algo, dgst, dgst_len); in ocs_hcu_hmac()
810 struct ocs_hcu_dev *hcu_dev = dev_id; in ocs_hcu_irq_handler() local
815 hcu_irq = readl(hcu_dev->io_base + OCS_HCU_ISR); in ocs_hcu_irq_handler()
816 writel(hcu_irq, hcu_dev->io_base + OCS_HCU_ISR); in ocs_hcu_irq_handler()
819 dma_irq = readl(hcu_dev->io_base + OCS_HCU_DMA_MSI_ISR); in ocs_hcu_irq_handler()
820 writel(dma_irq, hcu_dev->io_base + OCS_HCU_DMA_MSI_ISR); in ocs_hcu_irq_handler()
824 hcu_dev->irq_err = true; in ocs_hcu_irq_handler()
835 complete(&hcu_dev->irq_done); in ocs_hcu_irq_handler()