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 06/11] remoteproc: mediatek: Probe multi-core SCP Date: Wed, 26 Apr 2023 17:12:06 +0800 [thread overview] Message-ID: <20230426091211.21557-7-tinghan.shen@mediatek.com> (raw) In-Reply-To: <20230426091211.21557-1-tinghan.shen@mediatek.com> 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 for single-core SCP and multi-core SCP to the new added 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_common.h | 3 + drivers/remoteproc/mtk_scp.c | 188 ++++++++++++++++++++++++++++---- 2 files changed, 172 insertions(+), 19 deletions(-) diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h index c0905aec3b4b..b73b60c22ea1 100644 --- a/drivers/remoteproc/mtk_common.h +++ b/drivers/remoteproc/mtk_common.h @@ -128,6 +128,9 @@ struct mtk_scp { size_t dram_size; struct rproc_subdev *rpmsg_subdev; + + struct list_head elem; + struct list_head *cluster; }; /** diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c index 5e4982f4d5dc..0b052b0acf2e 100644 --- a/drivers/remoteproc/mtk_scp.c +++ b/drivers/remoteproc/mtk_scp.c @@ -28,6 +28,7 @@ struct mtk_scp_of_cluster { void __iomem *l1tcm_base; size_t l1tcm_size; phys_addr_t l1tcm_phys; + struct list_head mtk_scp_cluster; }; /** @@ -862,21 +863,31 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp) } } -static int scp_rproc_init(struct platform_device *pdev) +static int scp_rproc_init(struct platform_device *cluster_pdev, + struct platform_device *core_pdev, + const struct mtk_scp_of_data *of_data) { - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - struct mtk_scp_of_cluster *of_cluster = platform_get_drvdata(pdev); + struct platform_device *pdev; + struct device *dev; + struct device_node *np; + struct mtk_scp_of_cluster *of_cluster = platform_get_drvdata(cluster_pdev); struct mtk_scp *scp; struct rproc *rproc; struct resource *res; const char *fw_name = "scp.img"; int ret, i; + if (core_pdev) + pdev = core_pdev; + else + pdev = cluster_pdev; + + dev = &pdev->dev; ret = rproc_of_parse_firmware(dev, 0, &fw_name); if (ret < 0 && ret != -EINVAL) return ret; + np = dev->of_node; rproc = devm_rproc_alloc(dev, np->name, &scp_ops, fw_name, sizeof(*scp)); if (!rproc) return dev_err_probe(dev, -ENOMEM, "unable to allocate remoteproc\n"); @@ -884,7 +895,7 @@ static int 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_set_drvdata(pdev, scp); scp->reg_base = of_cluster->reg_base; @@ -934,10 +945,6 @@ static int scp_rproc_init(struct platform_device *pdev) goto remove_subdev; } - ret = rproc_add(rproc); - if (ret) - goto remove_subdev; - return 0; remove_subdev: @@ -952,6 +959,121 @@ static int scp_rproc_init(struct platform_device *pdev) return ret; } +static void scp_rproc_free(struct mtk_scp *scp) +{ + int i; + + scp_remove_rpmsg_subdev(scp); + scp_ipi_unregister(scp, SCP_IPI_INIT); + scp_unmap_memory_region(scp); + for (i = 0; i < SCP_IPI_MAX; i++) + mutex_destroy(&scp->ipi_desc[i].lock); + mutex_destroy(&scp->send_lock); +} + +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) +{ + 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 *of_cluster = platform_get_drvdata(pdev); + const struct mtk_scp_of_data **cluster_of_data; + struct list_head *cluster = &of_cluster->mtk_scp_cluster; + struct mtk_scp *scp, *temp; + int core_id = 0; + int ret; + + ret = scp_is_single_core(pdev); + if (ret < 0) + return ret; + + if (ret) { + dev_dbg(dev, "single-core scp\n"); + + /* When using the SCP node phandle on exported SCP APIs, the drvdata + * is expected to be the mtk_scp object, and as a result, it is intended + * to be overwritten for single-core SCP usage. + */ + ret = scp_rproc_init(pdev, NULL, of_device_get_match_data(dev)); + if (ret) + return dev_err_probe(dev, ret, "Failed to initialize single-core scp\n"); + + scp = platform_get_drvdata(pdev); + list_add_tail(&scp->elem, cluster); + scp->cluster = cluster; + } else { + dev_dbg(dev, "multi-core scp\n"); + + 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; + } + + ret = scp_rproc_init(pdev, cpdev, cluster_of_data[core_id]); + if (ret) { + dev_err(dev, "Failed to initialize core %d rproc\n", core_id); + put_device(&cpdev->dev); + of_node_put(child); + goto init_fail; + } + scp = platform_get_drvdata(cpdev); + list_add_tail(&scp->elem, cluster); + scp->cluster = cluster; + put_device(&cpdev->dev); + + core_id++; + } + } + + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) { + ret = rproc_add(scp->rproc); + if (ret) + goto add_fail; + } + + return 0; + +add_fail: + list_for_each_entry_continue(scp, cluster, elem) { + rproc_del(scp->rproc); + } +init_fail: + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) { + list_del(&scp->elem); + scp_rproc_free(scp); + } + + return ret; +} + static int scp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -983,23 +1105,44 @@ static int scp_probe(struct platform_device *pdev) of_cluster->l1tcm_phys = res->start; } + INIT_LIST_HEAD(&of_cluster->mtk_scp_cluster); platform_set_drvdata(pdev, of_cluster); - return scp_rproc_init(pdev); + 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 dev_err_probe(dev, ret, "Failed to initialize scp cluster\n"); + + return 0; } static int scp_remove(struct platform_device *pdev) { - struct mtk_scp *scp = platform_get_drvdata(pdev); - int i; + struct mtk_scp *scp, *temp; + struct mtk_scp_of_cluster *of_cluster; + struct list_head *cluster; + int ret; - rproc_del(scp->rproc); - scp_remove_rpmsg_subdev(scp); - scp_ipi_unregister(scp, SCP_IPI_INIT); - scp_unmap_memory_region(scp); - for (i = 0; i < SCP_IPI_MAX; i++) - mutex_destroy(&scp->ipi_desc[i].lock); - mutex_destroy(&scp->send_lock); + ret = scp_is_single_core(pdev); + if (ret < 0) + return ret; + + if (ret) { + scp = platform_get_drvdata(pdev); + cluster = scp->cluster; + } else { + of_cluster = platform_get_drvdata(pdev); + cluster = &of_cluster->mtk_scp_cluster; + } + + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) { + list_del(&scp->elem); + rproc_del(scp->rproc); + scp_rproc_free(scp); + } return 0; } @@ -1078,12 +1221,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 }, {}, }; MODULE_DEVICE_TABLE(of, mtk_scp_of_match); -- 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 06/11] remoteproc: mediatek: Probe multi-core SCP Date: Wed, 26 Apr 2023 17:12:06 +0800 [thread overview] Message-ID: <20230426091211.21557-7-tinghan.shen@mediatek.com> (raw) In-Reply-To: <20230426091211.21557-1-tinghan.shen@mediatek.com> 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 for single-core SCP and multi-core SCP to the new added 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_common.h | 3 + drivers/remoteproc/mtk_scp.c | 188 ++++++++++++++++++++++++++++---- 2 files changed, 172 insertions(+), 19 deletions(-) diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h index c0905aec3b4b..b73b60c22ea1 100644 --- a/drivers/remoteproc/mtk_common.h +++ b/drivers/remoteproc/mtk_common.h @@ -128,6 +128,9 @@ struct mtk_scp { size_t dram_size; struct rproc_subdev *rpmsg_subdev; + + struct list_head elem; + struct list_head *cluster; }; /** diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c index 5e4982f4d5dc..0b052b0acf2e 100644 --- a/drivers/remoteproc/mtk_scp.c +++ b/drivers/remoteproc/mtk_scp.c @@ -28,6 +28,7 @@ struct mtk_scp_of_cluster { void __iomem *l1tcm_base; size_t l1tcm_size; phys_addr_t l1tcm_phys; + struct list_head mtk_scp_cluster; }; /** @@ -862,21 +863,31 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp) } } -static int scp_rproc_init(struct platform_device *pdev) +static int scp_rproc_init(struct platform_device *cluster_pdev, + struct platform_device *core_pdev, + const struct mtk_scp_of_data *of_data) { - struct device *dev = &pdev->dev; - struct device_node *np = dev->of_node; - struct mtk_scp_of_cluster *of_cluster = platform_get_drvdata(pdev); + struct platform_device *pdev; + struct device *dev; + struct device_node *np; + struct mtk_scp_of_cluster *of_cluster = platform_get_drvdata(cluster_pdev); struct mtk_scp *scp; struct rproc *rproc; struct resource *res; const char *fw_name = "scp.img"; int ret, i; + if (core_pdev) + pdev = core_pdev; + else + pdev = cluster_pdev; + + dev = &pdev->dev; ret = rproc_of_parse_firmware(dev, 0, &fw_name); if (ret < 0 && ret != -EINVAL) return ret; + np = dev->of_node; rproc = devm_rproc_alloc(dev, np->name, &scp_ops, fw_name, sizeof(*scp)); if (!rproc) return dev_err_probe(dev, -ENOMEM, "unable to allocate remoteproc\n"); @@ -884,7 +895,7 @@ static int 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_set_drvdata(pdev, scp); scp->reg_base = of_cluster->reg_base; @@ -934,10 +945,6 @@ static int scp_rproc_init(struct platform_device *pdev) goto remove_subdev; } - ret = rproc_add(rproc); - if (ret) - goto remove_subdev; - return 0; remove_subdev: @@ -952,6 +959,121 @@ static int scp_rproc_init(struct platform_device *pdev) return ret; } +static void scp_rproc_free(struct mtk_scp *scp) +{ + int i; + + scp_remove_rpmsg_subdev(scp); + scp_ipi_unregister(scp, SCP_IPI_INIT); + scp_unmap_memory_region(scp); + for (i = 0; i < SCP_IPI_MAX; i++) + mutex_destroy(&scp->ipi_desc[i].lock); + mutex_destroy(&scp->send_lock); +} + +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) +{ + 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 *of_cluster = platform_get_drvdata(pdev); + const struct mtk_scp_of_data **cluster_of_data; + struct list_head *cluster = &of_cluster->mtk_scp_cluster; + struct mtk_scp *scp, *temp; + int core_id = 0; + int ret; + + ret = scp_is_single_core(pdev); + if (ret < 0) + return ret; + + if (ret) { + dev_dbg(dev, "single-core scp\n"); + + /* When using the SCP node phandle on exported SCP APIs, the drvdata + * is expected to be the mtk_scp object, and as a result, it is intended + * to be overwritten for single-core SCP usage. + */ + ret = scp_rproc_init(pdev, NULL, of_device_get_match_data(dev)); + if (ret) + return dev_err_probe(dev, ret, "Failed to initialize single-core scp\n"); + + scp = platform_get_drvdata(pdev); + list_add_tail(&scp->elem, cluster); + scp->cluster = cluster; + } else { + dev_dbg(dev, "multi-core scp\n"); + + 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; + } + + ret = scp_rproc_init(pdev, cpdev, cluster_of_data[core_id]); + if (ret) { + dev_err(dev, "Failed to initialize core %d rproc\n", core_id); + put_device(&cpdev->dev); + of_node_put(child); + goto init_fail; + } + scp = platform_get_drvdata(cpdev); + list_add_tail(&scp->elem, cluster); + scp->cluster = cluster; + put_device(&cpdev->dev); + + core_id++; + } + } + + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) { + ret = rproc_add(scp->rproc); + if (ret) + goto add_fail; + } + + return 0; + +add_fail: + list_for_each_entry_continue(scp, cluster, elem) { + rproc_del(scp->rproc); + } +init_fail: + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) { + list_del(&scp->elem); + scp_rproc_free(scp); + } + + return ret; +} + static int scp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -983,23 +1105,44 @@ static int scp_probe(struct platform_device *pdev) of_cluster->l1tcm_phys = res->start; } + INIT_LIST_HEAD(&of_cluster->mtk_scp_cluster); platform_set_drvdata(pdev, of_cluster); - return scp_rproc_init(pdev); + 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 dev_err_probe(dev, ret, "Failed to initialize scp cluster\n"); + + return 0; } static int scp_remove(struct platform_device *pdev) { - struct mtk_scp *scp = platform_get_drvdata(pdev); - int i; + struct mtk_scp *scp, *temp; + struct mtk_scp_of_cluster *of_cluster; + struct list_head *cluster; + int ret; - rproc_del(scp->rproc); - scp_remove_rpmsg_subdev(scp); - scp_ipi_unregister(scp, SCP_IPI_INIT); - scp_unmap_memory_region(scp); - for (i = 0; i < SCP_IPI_MAX; i++) - mutex_destroy(&scp->ipi_desc[i].lock); - mutex_destroy(&scp->send_lock); + ret = scp_is_single_core(pdev); + if (ret < 0) + return ret; + + if (ret) { + scp = platform_get_drvdata(pdev); + cluster = scp->cluster; + } else { + of_cluster = platform_get_drvdata(pdev); + cluster = &of_cluster->mtk_scp_cluster; + } + + list_for_each_entry_safe_reverse(scp, temp, cluster, elem) { + list_del(&scp->elem); + rproc_del(scp->rproc); + scp_rproc_free(scp); + } return 0; } @@ -1078,12 +1221,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 }, {}, }; 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-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 ` [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 2023-05-01 22:04 ` Mathieu Poirier 2023-04-26 9:12 ` Tinghan Shen [this message] 2023-04-26 9:12 ` [PATCH v10 06/11] remoteproc: mediatek: Probe multi-core SCP 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-7-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.