[v6 08/15] dma/dpaa: refactor driver
Stephen Hemminger
stephen at networkplumber.org
Tue Oct 15 04:59:46 CEST 2024
On Mon, 14 Oct 2024 15:06:32 +0530
Gagandeep Singh <g.singh at nxp.com> wrote:
> @@ -551,7 +485,7 @@ fsl_qdma_reg_init(struct fsl_qdma_engine *fsl_qdma)
>
> /* Initialize the status queue mode. */
> reg = FSL_QDMA_BSQMR_EN;
> - val = ilog2(fsl_qdma->status[j]->n_cq) - 6;
> + val = ilog2_qsize(temp_stat->n_cq);
> reg |= FSL_QDMA_BSQMR_CQ_SIZE(val);
> qdma_writel(reg, block + FSL_QDMA_BSQMR);
> }
> @@ -563,158 +497,389 @@ fsl_qdma_reg_init(struct fsl_qdma_engine *fsl_qdma)
> return 0;
> }
>
> -static void *
> -fsl_qdma_prep_memcpy(void *fsl_chan, dma_addr_t dst,
> - dma_addr_t src, size_t len,
> - void *call_back,
> - void *param)
> +static uint16_t
> +dpaa_qdma_block_dequeue(struct fsl_qdma_engine *fsl_qdma,
> + uint8_t block_id)
> {
> - struct fsl_qdma_comp *fsl_comp;
> + struct fsl_qdma_status_queue *stat_queue;
> + struct fsl_qdma_queue *cmd_queue;
> + struct fsl_qdma_comp_cmd_desc *cq;
> + uint16_t start, count = 0;
> + uint8_t qid = 0;
> + uint32_t reg;
> + int ret;
> + uint8_t *block;
> + uint16_t *dq_complete;
> + struct fsl_qdma_desc *desc[FSL_QDMA_SG_MAX_ENTRY];
>
> - fsl_comp =
> - fsl_qdma_request_enqueue_desc((struct fsl_qdma_chan *)fsl_chan);
> - if (!fsl_comp)
> - return NULL;
> + stat_queue = &fsl_qdma->stat_queues[block_id];
> + cq = stat_queue->cq;
> + start = stat_queue->complete;
> +
> + block = fsl_qdma->block_base +
> + FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, block_id);
>
> - fsl_comp->qchan = fsl_chan;
> - fsl_comp->call_back_func = call_back;
> - fsl_comp->params = param;
> + do {
> + reg = qdma_readl_be(block + FSL_QDMA_BSQSR);
> + if (reg & FSL_QDMA_BSQSR_QE_BE)
> + break;
>
> - fsl_qdma_comp_fill_memcpy(fsl_comp, dst, src, len);
> - return (void *)fsl_comp;
> + qdma_writel_be(FSL_QDMA_BSQMR_DI, block + FSL_QDMA_BSQMR);
> + ret = qdma_ccdf_get_queue(&cq[start], &qid);
> + if (ret == true) {
> + cmd_queue = &fsl_qdma->cmd_queues[block_id][qid];
> +
> + ret = rte_ring_dequeue(cmd_queue->complete_burst,
> + (void **)&dq_complete);
> + if (ret)
> + rte_panic("DQ desc number failed!\n");
Please don't panic here, either recover, log an error or take the device
offline. Killing the whole application is not acceptable.
More information about the dev
mailing list