All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 3/3] dmaengine: fsl-dpaa2-qdma: Remove the macro of DPDMAI_MAX_QUEUE_NUM
@ 2021-04-22  8:44 Guanhua Gao
  2021-05-31  4:37 ` Vinod Koul
  0 siblings, 1 reply; 2+ messages in thread
From: Guanhua Gao @ 2021-04-22  8:44 UTC (permalink / raw)
  To: Vinod Koul, Yi Zhao; +Cc: dmaengine, linux-kernel, Guanhua Gao

The max number of queue supported by DPAA2 qdma is determined
by the number of CPUs. Due to the number of CPUs are different
in different LS2 platforms, we remove the macro of
DPDMAI_MAX_QUEUE_NUM which is defined 8.

Signed-off-by: Guanhua Gao <guanhua.gao@nxp.com>
---
Change in v2:
 - Add new patch.

 drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c | 43 +++++++++++++++++++++----
 drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h |  4 +--
 drivers/dma/fsl-dpaa2-qdma/dpdmai.h     |  5 ---
 3 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
index 86c7ec5dc74e..3875fbb9fac3 100644
--- a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
+++ b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
@@ -314,6 +314,8 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
 	struct dpaa2_qdma_priv_per_prio *ppriv;
 	struct device *dev = &ls_dev->dev;
 	struct dpaa2_qdma_priv *priv;
+	struct dpdmai_rx_queue_attr *rx_queue_attr;
+	struct dpdmai_tx_queue_attr *tx_queue_attr;
 	int err = -EINVAL;
 	int i;
 
@@ -335,33 +337,51 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
 				    &priv->dpdmai_attr);
 	if (err) {
 		dev_err(dev, "dpdmai_get_attributes() failed\n");
-		goto exit;
+		goto err_get_attr;
 	}
 
 	priv->num_pairs = priv->dpdmai_attr.num_of_queues;
+	rx_queue_attr = kcalloc(priv->num_pairs, sizeof(*rx_queue_attr),
+				GFP_KERNEL);
+	if (!rx_queue_attr) {
+		err = -ENOMEM;
+		goto err_get_attr;
+	}
+	priv->rx_queue_attr = rx_queue_attr;
+
+	tx_queue_attr = kcalloc(priv->num_pairs, sizeof(*tx_queue_attr),
+				GFP_KERNEL);
+	if (!tx_queue_attr) {
+		err = -ENOMEM;
+		goto err_tx_queue;
+	}
+	priv->tx_queue_attr = tx_queue_attr;
+
 	ppriv = kcalloc(priv->num_pairs, sizeof(*ppriv), GFP_KERNEL);
 	if (!ppriv) {
 		err = -ENOMEM;
-		goto exit;
+		goto err_ppriv;
 	}
 	priv->ppriv = ppriv;
 
 	for (i = 0; i < priv->num_pairs; i++) {
 		err = dpdmai_get_rx_queue(priv->mc_io, 0, ls_dev->mc_handle,
-					  i, 0, &priv->rx_queue_attr[i]);
+					  i, 0, priv->rx_queue_attr + i);
 		if (err) {
 			dev_err(dev, "dpdmai_get_rx_queue() failed\n");
 			goto exit;
 		}
-		ppriv->rsp_fqid = priv->rx_queue_attr[i].fqid;
+		ppriv->rsp_fqid = ((struct dpdmai_rx_queue_attr *)
+				   (priv->rx_queue_attr + i))->fqid;
 
 		err = dpdmai_get_tx_queue(priv->mc_io, 0, ls_dev->mc_handle,
-					  i, 0, &priv->tx_queue_attr[i]);
+					  i, 0, priv->tx_queue_attr + i);
 		if (err) {
 			dev_err(dev, "dpdmai_get_tx_queue() failed\n");
 			goto exit;
 		}
-		ppriv->req_fqid = priv->tx_queue_attr[i].fqid;
+		ppriv->req_fqid = ((struct dpdmai_tx_queue_attr *)
+				   (priv->tx_queue_attr + i))->fqid;
 		ppriv->prio = DPAA2_QDMA_DEFAULT_PRIORITY;
 		ppriv->priv = priv;
 		ppriv->chan_id = i;
@@ -370,6 +390,12 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
 
 	return 0;
 exit:
+	kfree(ppriv);
+err_ppriv:
+	kfree(priv->tx_queue_attr);
+err_tx_queue:
+	kfree(priv->rx_queue_attr);
+err_get_attr:
 	dpdmai_close(priv->mc_io, 0, ls_dev->mc_handle);
 	return err;
 }
@@ -733,6 +759,8 @@ static int dpaa2_qdma_probe(struct fsl_mc_device *dpdmai_dev)
 	dpaa2_dpmai_store_free(priv);
 	dpaa2_dpdmai_dpio_free(priv);
 err_dpio_setup:
+	kfree(priv->rx_queue_attr);
+	kfree(priv->tx_queue_attr);
 	kfree(priv->ppriv);
 	dpdmai_close(priv->mc_io, 0, dpdmai_dev->mc_handle);
 err_dpdmai_setup:
@@ -763,6 +791,9 @@ static int dpaa2_qdma_remove(struct fsl_mc_device *ls_dev)
 	dpaa2_dpdmai_free_channels(dpaa2_qdma);
 
 	dma_async_device_unregister(&dpaa2_qdma->dma_dev);
+	kfree(priv->rx_queue_attr);
+	kfree(priv->tx_queue_attr);
+	kfree(priv->ppriv);
 	kfree(priv);
 	kfree(dpaa2_qdma);
 
diff --git a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
index 0a405fb13452..38aed372214e 100644
--- a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
+++ b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
@@ -123,8 +123,8 @@ struct dpaa2_qdma_priv {
 	struct dpaa2_qdma_engine	*dpaa2_qdma;
 	struct dpaa2_qdma_priv_per_prio	*ppriv;
 
-	struct dpdmai_rx_queue_attr rx_queue_attr[DPDMAI_MAX_QUEUE_NUM];
-	struct dpdmai_tx_queue_attr tx_queue_attr[DPDMAI_MAX_QUEUE_NUM];
+	struct dpdmai_rx_queue_attr *rx_queue_attr;
+	struct dpdmai_tx_queue_attr *tx_queue_attr;
 };
 
 struct dpaa2_qdma_priv_per_prio {
diff --git a/drivers/dma/fsl-dpaa2-qdma/dpdmai.h b/drivers/dma/fsl-dpaa2-qdma/dpdmai.h
index 0a87d37f7a92..f3a3eac97400 100644
--- a/drivers/dma/fsl-dpaa2-qdma/dpdmai.h
+++ b/drivers/dma/fsl-dpaa2-qdma/dpdmai.h
@@ -51,11 +51,6 @@
  * Contains initialization APIs and runtime control APIs for DPDMAI
  */
 
-/*
- * Maximum number of Tx/Rx queues per DPDMAI object
- */
-#define DPDMAI_MAX_QUEUE_NUM	8
-
 /**
  * Maximum number of Tx/Rx priorities per DPDMAI object
  */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2 3/3] dmaengine: fsl-dpaa2-qdma: Remove the macro of DPDMAI_MAX_QUEUE_NUM
  2021-04-22  8:44 [PATCH v2 3/3] dmaengine: fsl-dpaa2-qdma: Remove the macro of DPDMAI_MAX_QUEUE_NUM Guanhua Gao
@ 2021-05-31  4:37 ` Vinod Koul
  0 siblings, 0 replies; 2+ messages in thread
From: Vinod Koul @ 2021-05-31  4:37 UTC (permalink / raw)
  To: Guanhua Gao; +Cc: Yi Zhao, dmaengine, linux-kernel

On 22-04-21, 16:44, Guanhua Gao wrote:
> The max number of queue supported by DPAA2 qdma is determined
> by the number of CPUs. Due to the number of CPUs are different
> in different LS2 platforms, we remove the macro of
> DPDMAI_MAX_QUEUE_NUM which is defined 8.
> 
> Signed-off-by: Guanhua Gao <guanhua.gao@nxp.com>
> ---
> Change in v2:
>  - Add new patch.
> 
>  drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c | 43 +++++++++++++++++++++----
>  drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h |  4 +--
>  drivers/dma/fsl-dpaa2-qdma/dpdmai.h     |  5 ---
>  3 files changed, 39 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
> index 86c7ec5dc74e..3875fbb9fac3 100644
> --- a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
> +++ b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
> @@ -314,6 +314,8 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
>  	struct dpaa2_qdma_priv_per_prio *ppriv;
>  	struct device *dev = &ls_dev->dev;
>  	struct dpaa2_qdma_priv *priv;
> +	struct dpdmai_rx_queue_attr *rx_queue_attr;
> +	struct dpdmai_tx_queue_attr *tx_queue_attr;
>  	int err = -EINVAL;
>  	int i;
>  
> @@ -335,33 +337,51 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
>  				    &priv->dpdmai_attr);
>  	if (err) {
>  		dev_err(dev, "dpdmai_get_attributes() failed\n");
> -		goto exit;
> +		goto err_get_attr;
>  	}
>  
>  	priv->num_pairs = priv->dpdmai_attr.num_of_queues;
> +	rx_queue_attr = kcalloc(priv->num_pairs, sizeof(*rx_queue_attr),
> +				GFP_KERNEL);
> +	if (!rx_queue_attr) {
> +		err = -ENOMEM;
> +		goto err_get_attr;
> +	}
> +	priv->rx_queue_attr = rx_queue_attr;
> +
> +	tx_queue_attr = kcalloc(priv->num_pairs, sizeof(*tx_queue_attr),
> +				GFP_KERNEL);
> +	if (!tx_queue_attr) {
> +		err = -ENOMEM;
> +		goto err_tx_queue;
> +	}
> +	priv->tx_queue_attr = tx_queue_attr;

Pointer is set here

> +
>  	ppriv = kcalloc(priv->num_pairs, sizeof(*ppriv), GFP_KERNEL);
>  	if (!ppriv) {
>  		err = -ENOMEM;
> -		goto exit;
> +		goto err_ppriv;
>  	}
>  	priv->ppriv = ppriv;
>  
>  	for (i = 0; i < priv->num_pairs; i++) {
>  		err = dpdmai_get_rx_queue(priv->mc_io, 0, ls_dev->mc_handle,
> -					  i, 0, &priv->rx_queue_attr[i]);
> +					  i, 0, priv->rx_queue_attr + i);
>  		if (err) {
>  			dev_err(dev, "dpdmai_get_rx_queue() failed\n");
>  			goto exit;
>  		}
> -		ppriv->rsp_fqid = priv->rx_queue_attr[i].fqid;
> +		ppriv->rsp_fqid = ((struct dpdmai_rx_queue_attr *)
> +				   (priv->rx_queue_attr + i))->fqid;
>  
>  		err = dpdmai_get_tx_queue(priv->mc_io, 0, ls_dev->mc_handle,
> -					  i, 0, &priv->tx_queue_attr[i]);
> +					  i, 0, priv->tx_queue_attr + i);
>  		if (err) {
>  			dev_err(dev, "dpdmai_get_tx_queue() failed\n");
>  			goto exit;
>  		}
> -		ppriv->req_fqid = priv->tx_queue_attr[i].fqid;
> +		ppriv->req_fqid = ((struct dpdmai_tx_queue_attr *)
> +				   (priv->tx_queue_attr + i))->fqid;
>  		ppriv->prio = DPAA2_QDMA_DEFAULT_PRIORITY;
>  		ppriv->priv = priv;
>  		ppriv->chan_id = i;
> @@ -370,6 +390,12 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
>  
>  	return 0;
>  exit:
> +	kfree(ppriv);
> +err_ppriv:
> +	kfree(priv->tx_queue_attr);
> +err_tx_queue:
> +	kfree(priv->rx_queue_attr);

Freed on error but you still have dangling reference held

> +err_get_attr:
>  	dpdmai_close(priv->mc_io, 0, ls_dev->mc_handle);
>  	return err;
>  }
> @@ -733,6 +759,8 @@ static int dpaa2_qdma_probe(struct fsl_mc_device *dpdmai_dev)
>  	dpaa2_dpmai_store_free(priv);
>  	dpaa2_dpdmai_dpio_free(priv);
>  err_dpio_setup:
> +	kfree(priv->rx_queue_attr);
> +	kfree(priv->tx_queue_attr);
>  	kfree(priv->ppriv);
>  	dpdmai_close(priv->mc_io, 0, dpdmai_dev->mc_handle);
>  err_dpdmai_setup:
> @@ -763,6 +791,9 @@ static int dpaa2_qdma_remove(struct fsl_mc_device *ls_dev)
>  	dpaa2_dpdmai_free_channels(dpaa2_qdma);
>  
>  	dma_async_device_unregister(&dpaa2_qdma->dma_dev);
> +	kfree(priv->rx_queue_attr);
> +	kfree(priv->tx_queue_attr);
> +	kfree(priv->ppriv);
>  	kfree(priv);
>  	kfree(dpaa2_qdma);
>  
> diff --git a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
> index 0a405fb13452..38aed372214e 100644
> --- a/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
> +++ b/drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
> @@ -123,8 +123,8 @@ struct dpaa2_qdma_priv {
>  	struct dpaa2_qdma_engine	*dpaa2_qdma;
>  	struct dpaa2_qdma_priv_per_prio	*ppriv;
>  
> -	struct dpdmai_rx_queue_attr rx_queue_attr[DPDMAI_MAX_QUEUE_NUM];
> -	struct dpdmai_tx_queue_attr tx_queue_attr[DPDMAI_MAX_QUEUE_NUM];
> +	struct dpdmai_rx_queue_attr *rx_queue_attr;
> +	struct dpdmai_tx_queue_attr *tx_queue_attr;
>  };
>  
>  struct dpaa2_qdma_priv_per_prio {
> diff --git a/drivers/dma/fsl-dpaa2-qdma/dpdmai.h b/drivers/dma/fsl-dpaa2-qdma/dpdmai.h
> index 0a87d37f7a92..f3a3eac97400 100644
> --- a/drivers/dma/fsl-dpaa2-qdma/dpdmai.h
> +++ b/drivers/dma/fsl-dpaa2-qdma/dpdmai.h
> @@ -51,11 +51,6 @@
>   * Contains initialization APIs and runtime control APIs for DPDMAI
>   */
>  
> -/*
> - * Maximum number of Tx/Rx queues per DPDMAI object
> - */
> -#define DPDMAI_MAX_QUEUE_NUM	8
> -
>  /**
>   * Maximum number of Tx/Rx priorities per DPDMAI object
>   */
> -- 
> 2.25.1

-- 
~Vinod

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-05-31  4:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-22  8:44 [PATCH v2 3/3] dmaengine: fsl-dpaa2-qdma: Remove the macro of DPDMAI_MAX_QUEUE_NUM Guanhua Gao
2021-05-31  4:37 ` Vinod Koul

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.