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>,
Conor Dooley <conor+dt@kernel.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 v12 06/11] remoteproc: mediatek: Probe multi-core SCP
Date: Wed, 17 May 2023 11:36:55 -0600 [thread overview]
Message-ID: <ZGUQt2EN59yDo8JA@p14s> (raw)
In-Reply-To: <20230517043449.26352-7-tinghan.shen@mediatek.com>
On Wed, May 17, 2023 at 12:34:44PM +0800, Tinghan Shen wrote:
> The difference of single-core SCP and multi-core SCP device tree is
> the presence of child device nodes described SCP cores. The SCP
> driver populates the platform device and checks the child nodes
> to identify whether it's a single-core SCP or a multi-core SCP.
>
> Add the remoteproc instances of multi-core SCP to the SCP cluster list.
> When the SCP driver is removed, it cleanup resources by walking
> through the cluster list.
>
> Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
> ---
> drivers/remoteproc/mtk_scp.c | 115 +++++++++++++++++++++++++++++++++--
> 1 file changed, 111 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
> index c8fc6b46f82b..d644e232dfec 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -864,7 +864,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
> }
>
> static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
> - struct mtk_scp_of_cluster *scp_cluster)
> + struct mtk_scp_of_cluster *scp_cluster,
> + const struct mtk_scp_of_data *of_data)
> {
> struct device *dev = &pdev->dev;
> struct device_node *np = dev->of_node;
> @@ -887,7 +888,7 @@ static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
> scp = rproc->priv;
> scp->rproc = rproc;
> scp->dev = dev;
> - scp->data = of_device_get_match_data(dev);
> + scp->data = of_data;
> platform_device_add_data(pdev, &scp, sizeof(scp));
>
> scp->reg_base = scp_cluster->reg_base;
> @@ -964,14 +965,15 @@ static void scp_free(struct mtk_scp *scp)
> mutex_destroy(&scp->send_lock);
> }
>
> -static int scp_cluster_init(struct platform_device *pdev)
> +static int scp_add_single_core(struct platform_device *pdev)
> {
> + struct device *dev = &pdev->dev;
> struct mtk_scp_of_cluster *scp_cluster = platform_get_drvdata(pdev);
> struct list_head *cluster = &scp_cluster->mtk_scp_list;
> struct mtk_scp *scp;
> int ret;
>
> - scp = scp_rproc_init(pdev, scp_cluster);
> + scp = scp_rproc_init(pdev, scp_cluster, of_device_get_match_data(dev));
> if (IS_ERR(scp))
> return PTR_ERR(scp);
>
> @@ -987,6 +989,100 @@ static int scp_cluster_init(struct platform_device *pdev)
> return 0;
> }
>
> +static int scp_add_multi_core(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct device_node *np = dev_of_node(dev);
> + struct platform_device *cpdev;
> + struct device_node *child;
> + struct mtk_scp_of_cluster *scp_cluster = platform_get_drvdata(pdev);
> + struct list_head *cluster = &scp_cluster->mtk_scp_list;
> + const struct mtk_scp_of_data **cluster_of_data;
> + struct mtk_scp *scp, *temp;
> + int core_id = 0;
> + int ret;
> +
> + cluster_of_data = (const struct mtk_scp_of_data **)of_device_get_match_data(dev);
> +
> + for_each_available_child_of_node(np, child) {
> + if (!cluster_of_data[core_id]) {
> + ret = -EINVAL;
> + dev_err(dev, "Not support core %d\n", core_id);
> + of_node_put(child);
> + goto init_fail;
> + }
> +
> + cpdev = of_find_device_by_node(child);
> + if (!cpdev) {
> + ret = -ENODEV;
> + dev_err(dev, "Not found platform device for core %d\n", core_id);
> + of_node_put(child);
> + goto init_fail;
> + }
> +
> + scp = scp_rproc_init(cpdev, scp_cluster, cluster_of_data[core_id]);
> + put_device(&cpdev->dev);
> + if (IS_ERR(scp)) {
> + ret = PTR_ERR(scp);
> + dev_err(dev, "Failed to initialize core %d rproc\n", core_id);
> + of_node_put(child);
> + goto init_fail;
> + }
> +
> + ret = rproc_add(scp->rproc);
> + if (ret) {
> + dev_err(dev, "Failed to add rproc of core %d\n", core_id);
> + of_node_put(child);
> + scp_free(scp);
> + goto init_fail;
> + }
> +
> + list_add_tail(&scp->elem, cluster);
> + core_id++;
> + }
> +
> + return 0;
> +
> +init_fail:
> + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) {
> + list_del(&scp->elem);
> + rproc_del(scp->rproc);
> + scp_free(scp);
> + }
> +
> + return ret;
> +}
> +
> +static int scp_is_single_core(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct device_node *np = dev_of_node(dev);
> + struct device_node *child;
> +
> + child = of_get_next_available_child(np, NULL);
> + if (!child)
> + return dev_err_probe(dev, -ENODEV, "No child node\n");
> +
> + of_node_put(child);
> + return of_node_name_eq(child, "cros-ec-rpmsg");
> +}
> +
> +static int scp_cluster_init(struct platform_device *pdev)
> +{
> + int ret;
> +
> + ret = scp_is_single_core(pdev);
> + if (ret < 0)
> + return ret;
> +
> + if (ret)
> + ret = scp_add_single_core(pdev);
> + else
> + ret = scp_add_multi_core(pdev);
> +
> + return ret;
> +}
> +
> static int scp_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -1021,6 +1117,10 @@ static int scp_probe(struct platform_device *pdev)
> INIT_LIST_HEAD(&scp_cluster->mtk_scp_list);
> platform_set_drvdata(pdev, scp_cluster);
>
> + ret = devm_of_platform_populate(dev);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to populate platform devices\n");
> +
> ret = scp_cluster_init(pdev);
> if (ret)
> return ret;
> @@ -1114,12 +1214,19 @@ static const struct mtk_scp_of_data mt8195_of_data_c1 = {
> .host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT,
> };
>
> +static const struct mtk_scp_of_data *mt8195_of_data_cores[] = {
> + &mt8195_of_data,
> + &mt8195_of_data_c1,
> + NULL
> +};
> +
> static const struct of_device_id mtk_scp_of_match[] = {
> { .compatible = "mediatek,mt8183-scp", .data = &mt8183_of_data },
> { .compatible = "mediatek,mt8186-scp", .data = &mt8186_of_data },
> { .compatible = "mediatek,mt8188-scp", .data = &mt8188_of_data },
> { .compatible = "mediatek,mt8192-scp", .data = &mt8192_of_data },
> { .compatible = "mediatek,mt8195-scp", .data = &mt8195_of_data },
> + { .compatible = "mediatek,mt8195-scp-dual", .data = &mt8195_of_data_cores },
I am happy with the refactoring work. Please do not change anything in patches
05 and 06 unless I ask for it.
> {},
> };
> MODULE_DEVICE_TABLE(of, mtk_scp_of_match);
> --
> 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>,
Conor Dooley <conor+dt@kernel.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 v12 06/11] remoteproc: mediatek: Probe multi-core SCP
Date: Wed, 17 May 2023 11:36:55 -0600 [thread overview]
Message-ID: <ZGUQt2EN59yDo8JA@p14s> (raw)
In-Reply-To: <20230517043449.26352-7-tinghan.shen@mediatek.com>
On Wed, May 17, 2023 at 12:34:44PM +0800, Tinghan Shen wrote:
> The difference of single-core SCP and multi-core SCP device tree is
> the presence of child device nodes described SCP cores. The SCP
> driver populates the platform device and checks the child nodes
> to identify whether it's a single-core SCP or a multi-core SCP.
>
> Add the remoteproc instances of multi-core SCP to the SCP cluster list.
> When the SCP driver is removed, it cleanup resources by walking
> through the cluster list.
>
> Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
> ---
> drivers/remoteproc/mtk_scp.c | 115 +++++++++++++++++++++++++++++++++--
> 1 file changed, 111 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
> index c8fc6b46f82b..d644e232dfec 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -864,7 +864,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
> }
>
> static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
> - struct mtk_scp_of_cluster *scp_cluster)
> + struct mtk_scp_of_cluster *scp_cluster,
> + const struct mtk_scp_of_data *of_data)
> {
> struct device *dev = &pdev->dev;
> struct device_node *np = dev->of_node;
> @@ -887,7 +888,7 @@ static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
> scp = rproc->priv;
> scp->rproc = rproc;
> scp->dev = dev;
> - scp->data = of_device_get_match_data(dev);
> + scp->data = of_data;
> platform_device_add_data(pdev, &scp, sizeof(scp));
>
> scp->reg_base = scp_cluster->reg_base;
> @@ -964,14 +965,15 @@ static void scp_free(struct mtk_scp *scp)
> mutex_destroy(&scp->send_lock);
> }
>
> -static int scp_cluster_init(struct platform_device *pdev)
> +static int scp_add_single_core(struct platform_device *pdev)
> {
> + struct device *dev = &pdev->dev;
> struct mtk_scp_of_cluster *scp_cluster = platform_get_drvdata(pdev);
> struct list_head *cluster = &scp_cluster->mtk_scp_list;
> struct mtk_scp *scp;
> int ret;
>
> - scp = scp_rproc_init(pdev, scp_cluster);
> + scp = scp_rproc_init(pdev, scp_cluster, of_device_get_match_data(dev));
> if (IS_ERR(scp))
> return PTR_ERR(scp);
>
> @@ -987,6 +989,100 @@ static int scp_cluster_init(struct platform_device *pdev)
> return 0;
> }
>
> +static int scp_add_multi_core(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct device_node *np = dev_of_node(dev);
> + struct platform_device *cpdev;
> + struct device_node *child;
> + struct mtk_scp_of_cluster *scp_cluster = platform_get_drvdata(pdev);
> + struct list_head *cluster = &scp_cluster->mtk_scp_list;
> + const struct mtk_scp_of_data **cluster_of_data;
> + struct mtk_scp *scp, *temp;
> + int core_id = 0;
> + int ret;
> +
> + cluster_of_data = (const struct mtk_scp_of_data **)of_device_get_match_data(dev);
> +
> + for_each_available_child_of_node(np, child) {
> + if (!cluster_of_data[core_id]) {
> + ret = -EINVAL;
> + dev_err(dev, "Not support core %d\n", core_id);
> + of_node_put(child);
> + goto init_fail;
> + }
> +
> + cpdev = of_find_device_by_node(child);
> + if (!cpdev) {
> + ret = -ENODEV;
> + dev_err(dev, "Not found platform device for core %d\n", core_id);
> + of_node_put(child);
> + goto init_fail;
> + }
> +
> + scp = scp_rproc_init(cpdev, scp_cluster, cluster_of_data[core_id]);
> + put_device(&cpdev->dev);
> + if (IS_ERR(scp)) {
> + ret = PTR_ERR(scp);
> + dev_err(dev, "Failed to initialize core %d rproc\n", core_id);
> + of_node_put(child);
> + goto init_fail;
> + }
> +
> + ret = rproc_add(scp->rproc);
> + if (ret) {
> + dev_err(dev, "Failed to add rproc of core %d\n", core_id);
> + of_node_put(child);
> + scp_free(scp);
> + goto init_fail;
> + }
> +
> + list_add_tail(&scp->elem, cluster);
> + core_id++;
> + }
> +
> + return 0;
> +
> +init_fail:
> + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) {
> + list_del(&scp->elem);
> + rproc_del(scp->rproc);
> + scp_free(scp);
> + }
> +
> + return ret;
> +}
> +
> +static int scp_is_single_core(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct device_node *np = dev_of_node(dev);
> + struct device_node *child;
> +
> + child = of_get_next_available_child(np, NULL);
> + if (!child)
> + return dev_err_probe(dev, -ENODEV, "No child node\n");
> +
> + of_node_put(child);
> + return of_node_name_eq(child, "cros-ec-rpmsg");
> +}
> +
> +static int scp_cluster_init(struct platform_device *pdev)
> +{
> + int ret;
> +
> + ret = scp_is_single_core(pdev);
> + if (ret < 0)
> + return ret;
> +
> + if (ret)
> + ret = scp_add_single_core(pdev);
> + else
> + ret = scp_add_multi_core(pdev);
> +
> + return ret;
> +}
> +
> static int scp_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -1021,6 +1117,10 @@ static int scp_probe(struct platform_device *pdev)
> INIT_LIST_HEAD(&scp_cluster->mtk_scp_list);
> platform_set_drvdata(pdev, scp_cluster);
>
> + ret = devm_of_platform_populate(dev);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to populate platform devices\n");
> +
> ret = scp_cluster_init(pdev);
> if (ret)
> return ret;
> @@ -1114,12 +1214,19 @@ static const struct mtk_scp_of_data mt8195_of_data_c1 = {
> .host_to_scp_int_bit = MT8195_CORE1_HOST_IPC_INT_BIT,
> };
>
> +static const struct mtk_scp_of_data *mt8195_of_data_cores[] = {
> + &mt8195_of_data,
> + &mt8195_of_data_c1,
> + NULL
> +};
> +
> static const struct of_device_id mtk_scp_of_match[] = {
> { .compatible = "mediatek,mt8183-scp", .data = &mt8183_of_data },
> { .compatible = "mediatek,mt8186-scp", .data = &mt8186_of_data },
> { .compatible = "mediatek,mt8188-scp", .data = &mt8188_of_data },
> { .compatible = "mediatek,mt8192-scp", .data = &mt8192_of_data },
> { .compatible = "mediatek,mt8195-scp", .data = &mt8195_of_data },
> + { .compatible = "mediatek,mt8195-scp-dual", .data = &mt8195_of_data_cores },
I am happy with the refactoring work. Please do not change anything in patches
05 and 06 unless I ask for it.
> {},
> };
> MODULE_DEVICE_TABLE(of, mtk_scp_of_match);
> --
> 2.18.0
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-05-17 17:37 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-17 4:34 [PATCH v12 00/11] Add support for MT8195 SCP 2nd core Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 01/11] dt-bindings: remoteproc: mediatek: Improve the rpmsg subnode definition Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 02/11] arm64: dts: mediatek: Update the node name of SCP rpmsg subnode Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 03/11] dt-bindings: remoteproc: mediatek: Support MT8195 dual-core SCP Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-29 14:10 ` Matthias Brugger
2023-05-29 14:10 ` Matthias Brugger
2023-05-17 4:34 ` [PATCH v12 04/11] remoteproc: mediatek: Add MT8195 SCP core 1 operations Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 05/11] remoteproc: mediatek: Introduce cluster on single-core SCP Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 06/11] remoteproc: mediatek: Probe multi-core SCP Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 17:36 ` Mathieu Poirier [this message]
2023-05-17 17:36 ` Mathieu Poirier
2023-05-17 4:34 ` [PATCH v12 07/11] remoteproc: mediatek: Control SCP core 1 by rproc subdevice Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 17:58 ` Mathieu Poirier
2023-05-17 17:58 ` Mathieu Poirier
2023-05-18 11:50 ` Dan Carpenter
2023-05-18 11:50 ` Dan Carpenter
2023-05-17 4:34 ` [PATCH v12 08/11] remoteproc: mediatek: Setup MT8195 SCP core 1 SRAM offset Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 09/11] remoteproc: mediatek: Handle MT8195 SCP core 1 watchdog timeout Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 10/11] remoteproc: mediatek: Refine ipi handler error message Tinghan Shen
2023-05-17 4:34 ` Tinghan Shen
2023-05-17 4:34 ` [PATCH v12 11/11] arm64: dts: mediatek: mt8195: Add SCP 2nd core Tinghan Shen
2023-05-17 4:34 ` 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=ZGUQt2EN59yDo8JA@p14s \
--to=mathieu.poirier@linaro.org \
--cc=Project_Global_Chrome_Upstream_Group@mediatek.com \
--cc=andersson@kernel.org \
--cc=angelogioacchino.delregno@collabora.com \
--cc=conor+dt@kernel.org \
--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.