All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Tinghan Shen <tinghan.shen@mediatek.com>
Cc: Bjorn Andersson <andersson@kernel.org>,
	Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	AngeloGioacchino Del Regno
	<angelogioacchino.delregno@collabora.com>,
	linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	Project_Global_Chrome_Upstream_Group@mediatek.com
Subject: Re: [PATCH v10 05/11] remoteproc: mediatek: Extract remoteproc initialization flow
Date: Mon, 1 May 2023 16:04:44 -0600	[thread overview]
Message-ID: <ZFA3fAeBV7T35Fkx@p14s> (raw)
In-Reply-To: <20230426091211.21557-6-tinghan.shen@mediatek.com>

Hi Tinghan,

On Wed, Apr 26, 2023 at 05:12:05PM +0800, Tinghan Shen wrote:
> This is the preparation for probing multi-core SCP. The remoteproc
> initialization flow is similar on cores and is reused to avoid
> redundant code.
> 
> The registers of config and l1tcm are shared for multi-core
> SCP. Reuse the mapped addresses for all cores.
> 
> Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>  drivers/remoteproc/mtk_scp.c | 69 ++++++++++++++++++++++++++----------
>  1 file changed, 50 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
> index 2bf66b1a8d80..5e4982f4d5dc 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -23,6 +23,13 @@
>  #define MAX_CODE_SIZE 0x500000
>  #define SECTION_NAME_IPI_BUFFER ".ipi_buffer"
>  
> +struct mtk_scp_of_cluster {
> +	void __iomem *reg_base;
> +	void __iomem *l1tcm_base;
> +	size_t l1tcm_size;
> +	phys_addr_t l1tcm_phys;
> +};

This is a good start.

> +
>  /**
>   * scp_get() - get a reference to SCP.
>   *
> @@ -855,10 +862,11 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
>  	}
>  }
>  
> -static int scp_probe(struct platform_device *pdev)
> +static int scp_rproc_init(struct platform_device *pdev)
>  {
>  	struct device *dev = &pdev->dev;
>  	struct device_node *np = dev->of_node;
> +	struct mtk_scp_of_cluster *of_cluster = platform_get_drvdata(pdev);

1) Because of the work done in the next patch, I think a "struct
mtk_scp_of_cluster *" should be given as a parameter to scp_rproc_init().

2) I would rename of_cluster to scp_cluster.

>  	struct mtk_scp *scp;
>  	struct rproc *rproc;
>  	struct resource *res;
> @@ -879,6 +887,11 @@ static int scp_probe(struct platform_device *pdev)
>  	scp->data = of_device_get_match_data(dev);
>  	platform_set_drvdata(pdev, scp);
>  
> +	scp->reg_base = of_cluster->reg_base;
> +	scp->l1tcm_base = of_cluster->l1tcm_base;
> +	scp->l1tcm_size = of_cluster->l1tcm_size;
> +	scp->l1tcm_phys = of_cluster->l1tcm_phys;
> +
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
>  	scp->sram_base = devm_ioremap_resource(dev, res);
>  	if (IS_ERR(scp->sram_base))
> @@ -888,24 +901,6 @@ static int scp_probe(struct platform_device *pdev)
>  	scp->sram_size = resource_size(res);
>  	scp->sram_phys = res->start;
>  
> -	/* l1tcm is an optional memory region */
> -	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
> -	scp->l1tcm_base = devm_ioremap_resource(dev, res);
> -	if (IS_ERR(scp->l1tcm_base)) {
> -		ret = PTR_ERR(scp->l1tcm_base);
> -		if (ret != -EINVAL) {
> -			return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
> -		}
> -	} else {
> -		scp->l1tcm_size = resource_size(res);
> -		scp->l1tcm_phys = res->start;
> -	}
> -
> -	scp->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
> -	if (IS_ERR(scp->reg_base))
> -		return dev_err_probe(dev, PTR_ERR(scp->reg_base),
> -				     "Failed to parse and map cfg memory\n");
> -
>  	ret = scp->data->scp_clk_get(scp);
>  	if (ret)
>  		return ret;
> @@ -957,6 +952,42 @@ static int scp_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> +static int scp_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct mtk_scp_of_cluster *of_cluster;
> +	struct resource *res;
> +	int ret;
> +
> +	of_cluster = devm_kzalloc(&pdev->dev, sizeof(*of_cluster), GFP_KERNEL);
> +	if (!of_cluster)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
> +	of_cluster->reg_base = devm_ioremap_resource(dev, res);
> +	if (IS_ERR(of_cluster->reg_base))
> +		return dev_err_probe(dev, PTR_ERR(of_cluster->reg_base),
> +				     "Failed to parse and map cfg memory\n");
> +
> +	/* l1tcm is an optional memory region */
> +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
> +	of_cluster->l1tcm_base = devm_ioremap_resource(dev, res);
> +	if (IS_ERR(of_cluster->l1tcm_base)) {
> +		ret = PTR_ERR(of_cluster->l1tcm_base);
> +		if (ret != -EINVAL)
> +			return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
> +
> +		of_cluster->l1tcm_base = NULL;
> +	} else {
> +		of_cluster->l1tcm_size = resource_size(res);
> +		of_cluster->l1tcm_phys = res->start;
> +	}
> +
> +	platform_set_drvdata(pdev, of_cluster);
> +

In scp_rproc_init() pdev->dev->driver_data is set to a *scp, which
defeats the purpose of setting here.  Once the driver data for @pdev is set, it
doesn't change after that.

> +	return scp_rproc_init(pdev);

Function scp_rproc_init() needs to return an *scp and that scp needs to be added
to the list of SCPs in scp_cluster.

> +}
> +
>  static int scp_remove(struct platform_device *pdev)
>  {
>  	struct mtk_scp *scp = platform_get_drvdata(pdev);

This should be:

        struct mtk_scp_of_cluster *scp_cluster = platform_get_drvdata(pdev);

And then iterate over the list of SCPs to remove each scp.  That way things work
the same way regardless of the amount of scp in the system.


> -- 
> 2.18.0
> 


WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Tinghan Shen <tinghan.shen@mediatek.com>
Cc: Bjorn Andersson <andersson@kernel.org>,
	Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	AngeloGioacchino Del Regno
	<angelogioacchino.delregno@collabora.com>,
	linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	Project_Global_Chrome_Upstream_Group@mediatek.com
Subject: Re: [PATCH v10 05/11] remoteproc: mediatek: Extract remoteproc initialization flow
Date: Mon, 1 May 2023 16:04:44 -0600	[thread overview]
Message-ID: <ZFA3fAeBV7T35Fkx@p14s> (raw)
In-Reply-To: <20230426091211.21557-6-tinghan.shen@mediatek.com>

Hi Tinghan,

On Wed, Apr 26, 2023 at 05:12:05PM +0800, Tinghan Shen wrote:
> This is the preparation for probing multi-core SCP. The remoteproc
> initialization flow is similar on cores and is reused to avoid
> redundant code.
> 
> The registers of config and l1tcm are shared for multi-core
> SCP. Reuse the mapped addresses for all cores.
> 
> Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>  drivers/remoteproc/mtk_scp.c | 69 ++++++++++++++++++++++++++----------
>  1 file changed, 50 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
> index 2bf66b1a8d80..5e4982f4d5dc 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -23,6 +23,13 @@
>  #define MAX_CODE_SIZE 0x500000
>  #define SECTION_NAME_IPI_BUFFER ".ipi_buffer"
>  
> +struct mtk_scp_of_cluster {
> +	void __iomem *reg_base;
> +	void __iomem *l1tcm_base;
> +	size_t l1tcm_size;
> +	phys_addr_t l1tcm_phys;
> +};

This is a good start.

> +
>  /**
>   * scp_get() - get a reference to SCP.
>   *
> @@ -855,10 +862,11 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
>  	}
>  }
>  
> -static int scp_probe(struct platform_device *pdev)
> +static int scp_rproc_init(struct platform_device *pdev)
>  {
>  	struct device *dev = &pdev->dev;
>  	struct device_node *np = dev->of_node;
> +	struct mtk_scp_of_cluster *of_cluster = platform_get_drvdata(pdev);

1) Because of the work done in the next patch, I think a "struct
mtk_scp_of_cluster *" should be given as a parameter to scp_rproc_init().

2) I would rename of_cluster to scp_cluster.

>  	struct mtk_scp *scp;
>  	struct rproc *rproc;
>  	struct resource *res;
> @@ -879,6 +887,11 @@ static int scp_probe(struct platform_device *pdev)
>  	scp->data = of_device_get_match_data(dev);
>  	platform_set_drvdata(pdev, scp);
>  
> +	scp->reg_base = of_cluster->reg_base;
> +	scp->l1tcm_base = of_cluster->l1tcm_base;
> +	scp->l1tcm_size = of_cluster->l1tcm_size;
> +	scp->l1tcm_phys = of_cluster->l1tcm_phys;
> +
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
>  	scp->sram_base = devm_ioremap_resource(dev, res);
>  	if (IS_ERR(scp->sram_base))
> @@ -888,24 +901,6 @@ static int scp_probe(struct platform_device *pdev)
>  	scp->sram_size = resource_size(res);
>  	scp->sram_phys = res->start;
>  
> -	/* l1tcm is an optional memory region */
> -	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
> -	scp->l1tcm_base = devm_ioremap_resource(dev, res);
> -	if (IS_ERR(scp->l1tcm_base)) {
> -		ret = PTR_ERR(scp->l1tcm_base);
> -		if (ret != -EINVAL) {
> -			return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
> -		}
> -	} else {
> -		scp->l1tcm_size = resource_size(res);
> -		scp->l1tcm_phys = res->start;
> -	}
> -
> -	scp->reg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
> -	if (IS_ERR(scp->reg_base))
> -		return dev_err_probe(dev, PTR_ERR(scp->reg_base),
> -				     "Failed to parse and map cfg memory\n");
> -
>  	ret = scp->data->scp_clk_get(scp);
>  	if (ret)
>  		return ret;
> @@ -957,6 +952,42 @@ static int scp_probe(struct platform_device *pdev)
>  	return ret;
>  }
>  
> +static int scp_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct mtk_scp_of_cluster *of_cluster;
> +	struct resource *res;
> +	int ret;
> +
> +	of_cluster = devm_kzalloc(&pdev->dev, sizeof(*of_cluster), GFP_KERNEL);
> +	if (!of_cluster)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
> +	of_cluster->reg_base = devm_ioremap_resource(dev, res);
> +	if (IS_ERR(of_cluster->reg_base))
> +		return dev_err_probe(dev, PTR_ERR(of_cluster->reg_base),
> +				     "Failed to parse and map cfg memory\n");
> +
> +	/* l1tcm is an optional memory region */
> +	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "l1tcm");
> +	of_cluster->l1tcm_base = devm_ioremap_resource(dev, res);
> +	if (IS_ERR(of_cluster->l1tcm_base)) {
> +		ret = PTR_ERR(of_cluster->l1tcm_base);
> +		if (ret != -EINVAL)
> +			return dev_err_probe(dev, ret, "Failed to map l1tcm memory\n");
> +
> +		of_cluster->l1tcm_base = NULL;
> +	} else {
> +		of_cluster->l1tcm_size = resource_size(res);
> +		of_cluster->l1tcm_phys = res->start;
> +	}
> +
> +	platform_set_drvdata(pdev, of_cluster);
> +

In scp_rproc_init() pdev->dev->driver_data is set to a *scp, which
defeats the purpose of setting here.  Once the driver data for @pdev is set, it
doesn't change after that.

> +	return scp_rproc_init(pdev);

Function scp_rproc_init() needs to return an *scp and that scp needs to be added
to the list of SCPs in scp_cluster.

> +}
> +
>  static int scp_remove(struct platform_device *pdev)
>  {
>  	struct mtk_scp *scp = platform_get_drvdata(pdev);

This should be:

        struct mtk_scp_of_cluster *scp_cluster = platform_get_drvdata(pdev);

And then iterate over the list of SCPs to remove each scp.  That way things work
the same way regardless of the amount of scp in the system.


> -- 
> 2.18.0
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2023-05-01 22:05 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-26  9:12 [PATCH v10 00/11] Add support for MT8195 SCP 2nd core Tinghan Shen
2023-04-26  9:12 ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 01/11] dt-bindings: remoteproc: mediatek: Improve the rpmsg subnode definition Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 02/11] arm64: dts: mediatek: Update the node name of SCP rpmsg subnode Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 03/11] dt-bindings: remoteproc: mediatek: Support MT8195 dual-core SCP Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 04/11] remoteproc: mediatek: Add MT8195 SCP core 1 operations Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 05/11] remoteproc: mediatek: Extract remoteproc initialization flow Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-05-01 22:04   ` Mathieu Poirier [this message]
2023-05-01 22:04     ` Mathieu Poirier
2023-04-26  9:12 ` [PATCH v10 06/11] remoteproc: mediatek: Probe multi-core SCP Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-05-01 22:31   ` Mathieu Poirier
2023-05-01 22:31     ` Mathieu Poirier
2023-05-02  8:57     ` TingHan Shen (沈廷翰)
2023-05-02  8:57       ` TingHan Shen (沈廷翰)
2023-04-26  9:12 ` [PATCH v10 07/11] remoteproc: mediatek: Control SCP core 1 by rproc subdevice Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 08/11] remoteproc: mediatek: Setup MT8195 SCP core 1 SRAM offset Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 09/11] remoteproc: mediatek: Handle MT8195 SCP core 1 watchdog timeout Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 10/11] remoteproc: mediatek: Refine ipi handler error message Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen
2023-04-26  9:12 ` [PATCH v10 11/11] arm64: dts: mediatek: mt8195: Add SCP 2nd core Tinghan Shen
2023-04-26  9:12   ` Tinghan Shen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZFA3fAeBV7T35Fkx@p14s \
    --to=mathieu.poirier@linaro.org \
    --cc=Project_Global_Chrome_Upstream_Group@mediatek.com \
    --cc=andersson@kernel.org \
    --cc=angelogioacchino.delregno@collabora.com \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=matthias.bgg@gmail.com \
    --cc=robh+dt@kernel.org \
    --cc=tinghan.shen@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.