From: Tinghan Shen <tinghan.shen@mediatek.com> To: Bjorn Andersson <andersson@kernel.org>, Mathieu Poirier <mathieu.poirier@linaro.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>, Tinghan Shen <tinghan.shen@mediatek.com> Cc: <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: [PATCH v10 05/11] remoteproc: mediatek: Extract remoteproc initialization flow Date: Wed, 26 Apr 2023 17:12:05 +0800 [thread overview] Message-ID: <20230426091211.21557-6-tinghan.shen@mediatek.com> (raw) In-Reply-To: <20230426091211.21557-1-tinghan.shen@mediatek.com> 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; +}; + /** * 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); 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); + + return scp_rproc_init(pdev); +} + static int scp_remove(struct platform_device *pdev) { struct mtk_scp *scp = platform_get_drvdata(pdev); -- 2.18.0
WARNING: multiple messages have this Message-ID (diff)
From: Tinghan Shen <tinghan.shen@mediatek.com> To: Bjorn Andersson <andersson@kernel.org>, Mathieu Poirier <mathieu.poirier@linaro.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>, Tinghan Shen <tinghan.shen@mediatek.com> Cc: <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: [PATCH v10 05/11] remoteproc: mediatek: Extract remoteproc initialization flow Date: Wed, 26 Apr 2023 17:12:05 +0800 [thread overview] Message-ID: <20230426091211.21557-6-tinghan.shen@mediatek.com> (raw) In-Reply-To: <20230426091211.21557-1-tinghan.shen@mediatek.com> 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; +}; + /** * 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); 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); + + return scp_rproc_init(pdev); +} + static int scp_remove(struct platform_device *pdev) { struct mtk_scp *scp = platform_get_drvdata(pdev); -- 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-04-26 9:12 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 ` Tinghan Shen [this message] 2023-04-26 9:12 ` [PATCH v10 05/11] remoteproc: mediatek: Extract remoteproc initialization flow Tinghan Shen 2023-05-01 22:04 ` Mathieu Poirier 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=20230426091211.21557-6-tinghan.shen@mediatek.com \ --to=tinghan.shen@mediatek.com \ --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=mathieu.poirier@linaro.org \ --cc=matthias.bgg@gmail.com \ --cc=robh+dt@kernel.org \ /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: linkBe 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.