[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