Lines Matching defs:admin_queue

129 static int ena_com_admin_init_sq(struct ena_com_admin_queue *admin_queue)
131 struct ena_com_dev *ena_dev = admin_queue->ena_dev;
132 struct ena_com_admin_sq *sq = &admin_queue->sq;
133 u16 size = ADMIN_SQ_SIZE(admin_queue->q_depth);
135 ENA_MEM_ALLOC_COHERENT(admin_queue->q_dmadev, size, sq->entries, sq->dma_addr,
152 static int ena_com_admin_init_cq(struct ena_com_admin_queue *admin_queue)
154 struct ena_com_dev *ena_dev = admin_queue->ena_dev;
155 struct ena_com_admin_cq *cq = &admin_queue->cq;
156 u16 size = ADMIN_CQ_SIZE(admin_queue->q_depth);
158 ENA_MEM_ALLOC_COHERENT(admin_queue->q_dmadev, size, cq->entries, cq->dma_addr,
225 static struct ena_comp_ctx *get_comp_ctxt(struct ena_com_admin_queue *admin_queue,
228 if (unlikely(command_id >= admin_queue->q_depth)) {
229 ena_trc_err(admin_queue->ena_dev,
231 command_id, admin_queue->q_depth);
235 if (unlikely(!admin_queue->comp_ctx)) {
236 ena_trc_err(admin_queue->ena_dev,
241 if (unlikely(admin_queue->comp_ctx[command_id].occupied && capture)) {
242 ena_trc_err(admin_queue->ena_dev,
248 ATOMIC32_INC(&admin_queue->outstanding_cmds);
249 admin_queue->comp_ctx[command_id].occupied = true;
252 return &admin_queue->comp_ctx[command_id];
255 static struct ena_comp_ctx *__ena_com_submit_admin_cmd(struct ena_com_admin_queue *admin_queue,
266 queue_size_mask = admin_queue->q_depth - 1;
268 tail_masked = admin_queue->sq.tail & queue_size_mask;
271 cnt = (u16)ATOMIC32_READ(&admin_queue->outstanding_cmds);
272 if (unlikely(cnt >= admin_queue->q_depth)) {
273 ena_trc_dbg(admin_queue->ena_dev, "Admin queue is full.\n");
274 admin_queue->stats.out_of_space++;
278 cmd_id = admin_queue->curr_cmd_id;
280 cmd->aq_common_descriptor.flags |= admin_queue->sq.phase &
286 comp_ctx = get_comp_ctxt(admin_queue, cmd_id, true);
297 memcpy(&admin_queue->sq.entries[tail_masked], cmd, cmd_size_in_bytes);
299 admin_queue->curr_cmd_id = (admin_queue->curr_cmd_id + 1) &
302 admin_queue->sq.tail++;
303 admin_queue->stats.submitted_cmd++;
305 if (unlikely((admin_queue->sq.tail & queue_size_mask) == 0))
306 admin_queue->sq.phase = !admin_queue->sq.phase;
308 ENA_DB_SYNC(&admin_queue->sq.mem_handle);
309 ENA_REG_WRITE32(admin_queue->bus, admin_queue->sq.tail,
310 admin_queue->sq.db_addr);
315 static int ena_com_init_comp_ctxt(struct ena_com_admin_queue *admin_queue)
317 struct ena_com_dev *ena_dev = admin_queue->ena_dev;
318 size_t size = admin_queue->q_depth * sizeof(struct ena_comp_ctx);
322 admin_queue->comp_ctx = ENA_MEM_ALLOC(admin_queue->q_dmadev, size);
323 if (unlikely(!admin_queue->comp_ctx)) {
328 for (i = 0; i < admin_queue->q_depth; i++) {
329 comp_ctx = get_comp_ctxt(admin_queue, i, false);
337 static struct ena_comp_ctx *ena_com_submit_admin_cmd(struct ena_com_admin_queue *admin_queue,
346 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
347 if (unlikely(!admin_queue->running_state)) {
348 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
351 comp_ctx = __ena_com_submit_admin_cmd(admin_queue, cmd,
356 admin_queue->running_state = false;
357 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
497 static void ena_com_handle_single_admin_completion(struct ena_com_admin_queue *admin_queue,
506 comp_ctx = get_comp_ctxt(admin_queue, cmd_id, false);
508 ena_trc_err(admin_queue->ena_dev,
510 admin_queue->running_state = false;
523 if (!admin_queue->polling)
527 static void ena_com_handle_admin_completion(struct ena_com_admin_queue *admin_queue)
534 head_masked = admin_queue->cq.head & (admin_queue->q_depth - 1);
535 phase = admin_queue->cq.phase;
537 cqe = &admin_queue->cq.entries[head_masked];
546 ena_com_handle_single_admin_completion(admin_queue, cqe);
550 if (unlikely(head_masked == admin_queue->q_depth)) {
555 cqe = &admin_queue->cq.entries[head_masked];
558 admin_queue->cq.head += comp_num;
559 admin_queue->cq.phase = phase;
560 admin_queue->sq.head += comp_num;
561 admin_queue->stats.completed_cmd += comp_num;
564 static int ena_com_comp_status_to_errno(struct ena_com_admin_queue *admin_queue,
568 ena_trc_err(admin_queue->ena_dev,
599 struct ena_com_admin_queue *admin_queue)
606 timeout = ENA_GET_SYSTEM_TIMEOUT(admin_queue->completion_timeout);
609 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
610 ena_com_handle_admin_completion(admin_queue);
611 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
617 ena_trc_err(admin_queue->ena_dev,
620 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
621 admin_queue->stats.no_completion++;
622 admin_queue->running_state = false;
623 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
630 admin_queue->ena_dev->ena_min_poll_delay_us);
634 ena_trc_err(admin_queue->ena_dev, "Command was aborted\n");
635 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
636 admin_queue->stats.aborted_cmd++;
637 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
643 admin_queue->ena_dev, "Invalid comp status %d\n",
646 ret = ena_com_comp_status_to_errno(admin_queue, comp_ctx->comp_status);
648 comp_ctxt_release(admin_queue, comp_ctx);
660 struct ena_com_admin_queue *admin_queue;
667 admin_queue = &ena_dev->admin_queue;
681 ret = ena_com_execute_admin_command(admin_queue,
822 struct ena_com_admin_queue *admin_queue)
828 admin_queue->completion_timeout);
836 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
837 ena_com_handle_admin_completion(admin_queue);
838 admin_queue->stats.no_completion++;
839 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
842 admin_queue->is_missing_admin_interrupt = true;
843 ena_trc_err(admin_queue->ena_dev,
845 comp_ctx->cmd_opcode, admin_queue->auto_polling ? "ON" : "OFF");
847 if (admin_queue->auto_polling)
848 admin_queue->polling = true;
850 ena_trc_err(admin_queue->ena_dev,
858 if (!admin_queue->polling) {
859 admin_queue->running_state = false;
864 ena_trc_err(admin_queue->ena_dev, "Command was aborted\n");
865 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
866 admin_queue->stats.aborted_cmd++;
867 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
873 admin_queue->ena_dev, "Invalid comp status %d\n",
876 ret = ena_com_comp_status_to_errno(admin_queue, comp_ctx->comp_status);
878 comp_ctxt_release(admin_queue, comp_ctx);
953 struct ena_com_admin_queue *admin_queue)
955 if (admin_queue->polling)
957 admin_queue);
960 admin_queue);
966 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
986 ret = ena_com_execute_admin_command(admin_queue,
1084 struct ena_com_admin_queue *admin_queue;
1094 admin_queue = &ena_dev->admin_queue;
1116 ret = ena_com_execute_admin_command(admin_queue,
1304 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1346 ret = ena_com_execute_admin_command(admin_queue,
1424 int ena_com_execute_admin_command(struct ena_com_admin_queue *admin_queue,
1433 comp_ctx = ena_com_submit_admin_cmd(admin_queue, cmd, cmd_size,
1438 ena_trc_dbg(admin_queue->ena_dev,
1442 ena_trc_err(admin_queue->ena_dev,
1449 ret = ena_com_wait_and_process_admin_cq(comp_ctx, admin_queue);
1451 if (admin_queue->running_state)
1452 ena_trc_err(admin_queue->ena_dev,
1455 ena_trc_dbg(admin_queue->ena_dev,
1464 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1489 ret = ena_com_execute_admin_command(admin_queue,
1532 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1536 if (!admin_queue->comp_ctx)
1539 for (i = 0; i < admin_queue->q_depth; i++) {
1540 comp_ctx = get_comp_ctxt(admin_queue, i, false);
1552 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1556 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
1557 while (ATOMIC32_READ(&admin_queue->outstanding_cmds) != 0) {
1558 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
1560 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
1562 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
1568 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1578 ret = ena_com_execute_admin_command(admin_queue,
1592 return ena_dev->admin_queue.running_state;
1597 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1600 ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
1601 ena_dev->admin_queue.running_state = state;
1602 ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
1619 struct ena_com_admin_queue *admin_queue;
1639 admin_queue = &ena_dev->admin_queue;
1646 ret = ena_com_execute_admin_command(admin_queue,
1732 struct ena_com_admin_queue *admin_queue)
1735 if (!admin_queue->comp_ctx)
1738 ENA_WAIT_EVENTS_DESTROY(admin_queue);
1740 admin_queue->comp_ctx,
1741 (admin_queue->q_depth * sizeof(struct ena_comp_ctx)));
1743 admin_queue->comp_ctx = NULL;
1748 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
1749 struct ena_com_admin_cq *cq = &admin_queue->cq;
1750 struct ena_com_admin_sq *sq = &admin_queue->sq;
1754 ena_com_free_ena_admin_queue_comp_ctx(ena_dev, admin_queue);
1756 size = ADMIN_SQ_SIZE(admin_queue->q_depth);
1762 size = ADMIN_CQ_SIZE(admin_queue->q_depth);
1773 ENA_SPINLOCK_DESTROY(admin_queue->q_lock);
1785 ena_dev->admin_queue.polling = polling;
1790 return ena_dev->admin_queue.polling;
1796 ena_dev->admin_queue.auto_polling = polling;
1882 ret = ena_com_execute_admin_command(&ena_dev->admin_queue,
2115 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
2131 admin_queue->q_depth = ENA_ADMIN_QUEUE_DEPTH;
2133 admin_queue->bus = ena_dev->bus;
2134 admin_queue->q_dmadev = ena_dev->dmadev;
2135 admin_queue->polling = false;
2136 admin_queue->curr_cmd_id = 0;
2138 ATOMIC32_SET(&admin_queue->outstanding_cmds, 0);
2140 ENA_SPINLOCK_INIT(admin_queue->q_lock);
2142 ret = ena_com_init_comp_ctxt(admin_queue);
2146 ret = ena_com_admin_init_sq(admin_queue);
2150 ret = ena_com_admin_init_cq(admin_queue);
2154 admin_queue->sq.db_addr = (u32 __iomem *)((uintptr_t)ena_dev->reg_bar +
2157 addr_low = ENA_DMA_ADDR_TO_UINT32_LOW(admin_queue->sq.dma_addr);
2158 addr_high = ENA_DMA_ADDR_TO_UINT32_HIGH(admin_queue->sq.dma_addr);
2163 addr_low = ENA_DMA_ADDR_TO_UINT32_LOW(admin_queue->cq.dma_addr);
2164 addr_high = ENA_DMA_ADDR_TO_UINT32_HIGH(admin_queue->cq.dma_addr);
2170 aq_caps |= admin_queue->q_depth & ENA_REGS_AQ_CAPS_AQ_DEPTH_MASK;
2176 acq_caps |= admin_queue->q_depth & ENA_REGS_ACQ_CAPS_ACQ_DEPTH_MASK;
2187 admin_queue->ena_dev = ena_dev;
2188 admin_queue->running_state = true;
2189 admin_queue->is_missing_admin_interrupt = false;
2291 struct ena_com_admin_queue *admin_queue;
2294 admin_queue = &ena_dev->admin_queue;
2300 ret = ena_com_execute_admin_command(admin_queue,
2423 ena_com_handle_admin_completion(&ena_dev->admin_queue);
2642 ena_dev->admin_queue.completion_timeout = timeout * 100000;
2644 ena_dev->admin_queue.completion_timeout = ADMIN_CMD_TIMEOUT_US;
2793 struct ena_com_admin_queue *admin_queue;
2804 admin_queue = &ena_dev->admin_queue;
2811 ret = ena_com_execute_admin_command(admin_queue,
2843 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
2888 ret = ena_com_execute_admin_command(admin_queue,
3014 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
3047 ret = ena_com_execute_admin_command(admin_queue,
3174 struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue;
3213 ret = ena_com_execute_admin_command(admin_queue,
3395 struct ena_com_admin_queue *admin_queue;
3406 admin_queue = &ena_dev->admin_queue;
3429 ret = ena_com_execute_admin_command(admin_queue,