Lines Matching refs:cmd_q
31 static u32 ccp_lsb_alloc(struct ccp_cmd_queue *cmd_q, unsigned int count) in ccp_lsb_alloc() argument
37 if (cmd_q->lsb >= 0) { in ccp_lsb_alloc()
38 start = (u32)bitmap_find_next_zero_area(cmd_q->lsbmap, in ccp_lsb_alloc()
42 bitmap_set(cmd_q->lsbmap, start, count); in ccp_lsb_alloc()
43 return start + cmd_q->lsb * LSB_SIZE; in ccp_lsb_alloc()
48 ccp = cmd_q->ccp; in ccp_lsb_alloc()
76 static void ccp_lsb_free(struct ccp_cmd_queue *cmd_q, unsigned int start, in ccp_lsb_free() argument
82 if (cmd_q->lsb == start) { in ccp_lsb_free()
84 bitmap_clear(cmd_q->lsbmap, start, count); in ccp_lsb_free()
87 struct ccp_device *ccp = cmd_q->ccp; in ccp_lsb_free()
213 static unsigned int ccp5_get_free_slots(struct ccp_cmd_queue *cmd_q) in ccp5_get_free_slots() argument
218 queue_start = low_address(cmd_q->qdma_tail); in ccp5_get_free_slots()
219 head_lo = ioread32(cmd_q->reg_head_lo); in ccp5_get_free_slots()
222 n = head_idx + COMMANDS_PER_QUEUE - cmd_q->qidx - 1; in ccp5_get_free_slots()
228 struct ccp_cmd_queue *cmd_q) in ccp5_do_cmd() argument
236 cmd_q->total_ops++; in ccp5_do_cmd()
242 mutex_lock(&cmd_q->q_mutex); in ccp5_do_cmd()
244 mP = (u32 *) &cmd_q->qbase[cmd_q->qidx]; in ccp5_do_cmd()
249 cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE; in ccp5_do_cmd()
255 tail = low_address(cmd_q->qdma_tail + cmd_q->qidx * Q_DESC_SIZE); in ccp5_do_cmd()
256 iowrite32(tail, cmd_q->reg_tail_lo); in ccp5_do_cmd()
259 iowrite32(cmd_q->qcontrol | CMD5_Q_RUN, cmd_q->reg_control); in ccp5_do_cmd()
260 mutex_unlock(&cmd_q->q_mutex); in ccp5_do_cmd()
264 ret = wait_event_interruptible(cmd_q->int_queue, in ccp5_do_cmd()
265 cmd_q->int_rcvd); in ccp5_do_cmd()
266 if (ret || cmd_q->cmd_error) { in ccp5_do_cmd()
270 if (cmd_q->cmd_error) in ccp5_do_cmd()
271 ccp_log_error(cmd_q->ccp, in ccp5_do_cmd()
272 cmd_q->cmd_error); in ccp5_do_cmd()
273 iowrite32(tail, cmd_q->reg_head_lo); in ccp5_do_cmd()
277 cmd_q->int_rcvd = 0; in ccp5_do_cmd()
289 op->cmd_q->total_aes_ops++; in ccp5_perform_aes()
325 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_aes()
334 op->cmd_q->total_xts_aes_ops++; in ccp5_perform_xts_aes()
368 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_xts_aes()
376 op->cmd_q->total_sha_ops++; in ccp5_perform_sha()
409 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_sha()
418 op->cmd_q->total_3des_ops++; in ccp5_perform_des3()
452 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_des3()
460 op->cmd_q->total_rsa_ops++; in ccp5_perform_rsa()
494 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_rsa()
505 op->cmd_q->total_pt_ops++; in ccp5_perform_passthru()
555 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_passthru()
563 op->cmd_q->total_ecc_ops++; in ccp5_perform_ecc()
590 return ccp5_do_cmd(&desc, op->cmd_q); in ccp5_perform_ecc()
593 static int ccp_find_lsb_regions(struct ccp_cmd_queue *cmd_q, u64 status) in ccp_find_lsb_regions() argument
595 int q_mask = 1 << cmd_q->id; in ccp_find_lsb_regions()
604 bitmap_set(cmd_q->lsbmask, j, 1); in ccp_find_lsb_regions()
607 queues = bitmap_weight(cmd_q->lsbmask, MAX_LSB_CNT); in ccp_find_lsb_regions()
608 dev_dbg(cmd_q->ccp->dev, "Queue %d can access %d LSB regions\n", in ccp_find_lsb_regions()
609 cmd_q->id, queues); in ccp_find_lsb_regions()
634 struct ccp_cmd_queue *cmd_q = &ccp->cmd_q[i]; in ccp_find_and_assign_lsb_to_q() local
636 qlsb_wgt = bitmap_weight(cmd_q->lsbmask, MAX_LSB_CNT); in ccp_find_and_assign_lsb_to_q()
639 bitmap_copy(qlsb, cmd_q->lsbmask, MAX_LSB_CNT); in ccp_find_and_assign_lsb_to_q()
647 cmd_q->lsb = bitno; in ccp_find_and_assign_lsb_to_q()
685 lsb_pub, ccp->cmd_q[i].lsbmask, in ccp_assign_lsbs()
731 iowrite32(0x0, ccp->cmd_q[i].reg_int_enable); in ccp5_disable_queue_interrupts()
739 iowrite32(SUPPORTED_INTERRUPTS, ccp->cmd_q[i].reg_int_enable); in ccp5_enable_queue_interrupts()
749 struct ccp_cmd_queue *cmd_q = &ccp->cmd_q[i]; in ccp5_irq_bh() local
751 status = ioread32(cmd_q->reg_interrupt_status); in ccp5_irq_bh()
754 cmd_q->int_status = status; in ccp5_irq_bh()
755 cmd_q->q_status = ioread32(cmd_q->reg_status); in ccp5_irq_bh()
756 cmd_q->q_int_status = ioread32(cmd_q->reg_int_status); in ccp5_irq_bh()
759 if ((status & INT_ERROR) && !cmd_q->cmd_error) in ccp5_irq_bh()
760 cmd_q->cmd_error = CMD_Q_ERROR(cmd_q->q_status); in ccp5_irq_bh()
762 cmd_q->int_rcvd = 1; in ccp5_irq_bh()
765 iowrite32(status, cmd_q->reg_interrupt_status); in ccp5_irq_bh()
766 wake_up_interruptible(&cmd_q->int_queue); in ccp5_irq_bh()
788 struct ccp_cmd_queue *cmd_q; in ccp5_init() local
815 cmd_q = &ccp->cmd_q[ccp->cmd_q_count]; in ccp5_init()
818 cmd_q->ccp = ccp; in ccp5_init()
819 cmd_q->id = i; in ccp5_init()
820 cmd_q->dma_pool = dma_pool; in ccp5_init()
821 mutex_init(&cmd_q->q_mutex); in ccp5_init()
825 cmd_q->qsize = Q_SIZE(Q_DESC_SIZE); in ccp5_init()
826 cmd_q->qbase = dma_zalloc_coherent(dev, cmd_q->qsize, in ccp5_init()
827 &cmd_q->qbase_dma, in ccp5_init()
829 if (!cmd_q->qbase) { in ccp5_init()
835 cmd_q->qidx = 0; in ccp5_init()
839 cmd_q->reg_control = ccp->io_regs + in ccp5_init()
841 cmd_q->reg_tail_lo = cmd_q->reg_control + CMD5_Q_TAIL_LO_BASE; in ccp5_init()
842 cmd_q->reg_head_lo = cmd_q->reg_control + CMD5_Q_HEAD_LO_BASE; in ccp5_init()
843 cmd_q->reg_int_enable = cmd_q->reg_control + in ccp5_init()
845 cmd_q->reg_interrupt_status = cmd_q->reg_control + in ccp5_init()
847 cmd_q->reg_status = cmd_q->reg_control + CMD5_Q_STATUS_BASE; in ccp5_init()
848 cmd_q->reg_int_status = cmd_q->reg_control + in ccp5_init()
850 cmd_q->reg_dma_status = cmd_q->reg_control + in ccp5_init()
852 cmd_q->reg_dma_read_status = cmd_q->reg_control + in ccp5_init()
854 cmd_q->reg_dma_write_status = cmd_q->reg_control + in ccp5_init()
857 init_waitqueue_head(&cmd_q->int_queue); in ccp5_init()
871 cmd_q = &ccp->cmd_q[i]; in ccp5_init()
873 cmd_q->qcontrol = 0; /* Start with nothing */ in ccp5_init()
874 iowrite32(cmd_q->qcontrol, cmd_q->reg_control); in ccp5_init()
876 ioread32(cmd_q->reg_int_status); in ccp5_init()
877 ioread32(cmd_q->reg_status); in ccp5_init()
880 iowrite32(SUPPORTED_INTERRUPTS, cmd_q->reg_interrupt_status); in ccp5_init()
909 cmd_q = &ccp->cmd_q[i]; in ccp5_init()
911 cmd_q->qcontrol &= ~(CMD5_Q_SIZE << CMD5_Q_SHIFT); in ccp5_init()
912 cmd_q->qcontrol |= QUEUE_SIZE_VAL << CMD5_Q_SHIFT; in ccp5_init()
914 cmd_q->qdma_tail = cmd_q->qbase_dma; in ccp5_init()
915 dma_addr_lo = low_address(cmd_q->qdma_tail); in ccp5_init()
916 iowrite32((u32)dma_addr_lo, cmd_q->reg_tail_lo); in ccp5_init()
917 iowrite32((u32)dma_addr_lo, cmd_q->reg_head_lo); in ccp5_init()
919 dma_addr_hi = high_address(cmd_q->qdma_tail); in ccp5_init()
920 cmd_q->qcontrol |= (dma_addr_hi << 16); in ccp5_init()
921 iowrite32(cmd_q->qcontrol, cmd_q->reg_control); in ccp5_init()
924 ccp_find_lsb_regions(cmd_q, status); in ccp5_init()
925 cmd_q->lsb = -1; /* Unassigned value */ in ccp5_init()
937 ccp->cmd_q[i].sb_key = ccp_lsb_alloc(&ccp->cmd_q[i], 2); in ccp5_init()
938 ccp->cmd_q[i].sb_ctx = ccp_lsb_alloc(&ccp->cmd_q[i], 2); in ccp5_init()
946 cmd_q = &ccp->cmd_q[i]; in ccp5_init()
948 kthread = kthread_create(ccp_cmd_queue_thread, cmd_q, in ccp5_init()
949 "%s-q%u", ccp->name, cmd_q->id); in ccp5_init()
957 cmd_q->kthread = kthread; in ccp5_init()
987 if (ccp->cmd_q[i].kthread) in ccp5_init()
988 kthread_stop(ccp->cmd_q[i].kthread); in ccp5_init()
995 dma_pool_destroy(ccp->cmd_q[i].dma_pool); in ccp5_init()
1003 struct ccp_cmd_queue *cmd_q; in ccp5_destroy() local
1025 cmd_q = &ccp->cmd_q[i]; in ccp5_destroy()
1028 iowrite32(cmd_q->qcontrol & ~CMD5_Q_RUN, cmd_q->reg_control); in ccp5_destroy()
1031 iowrite32(SUPPORTED_INTERRUPTS, cmd_q->reg_interrupt_status); in ccp5_destroy()
1032 ioread32(cmd_q->reg_int_status); in ccp5_destroy()
1033 ioread32(cmd_q->reg_status); in ccp5_destroy()
1038 if (ccp->cmd_q[i].kthread) in ccp5_destroy()
1039 kthread_stop(ccp->cmd_q[i].kthread); in ccp5_destroy()
1044 cmd_q = &ccp->cmd_q[i]; in ccp5_destroy()
1045 dma_free_coherent(dev, cmd_q->qsize, cmd_q->qbase, in ccp5_destroy()
1046 cmd_q->qbase_dma); in ccp5_destroy()