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 v9 06/11] remoteproc: mediatek: Probe multi-core SCP
Date: Fri, 31 Mar 2023 11:53:29 -0600	[thread overview]
Message-ID: <20230331175329.GB3504605@p14s> (raw)
In-Reply-To: <20230328022733.29910-7-tinghan.shen@mediatek.com>

On Tue, Mar 28, 2023 at 10:27:28AM +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 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    | 150 ++++++++++++++++++++++++++++----
>  2 files changed, 137 insertions(+), 16 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 32ecd1450c6f..71882ed31e16 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -30,6 +30,8 @@ struct mtk_scp_of_regs {
>  	phys_addr_t l1tcm_phys;
>  };
>  
> +static struct list_head cluster_cores;
> +

See my comment in the previous patch about this.

>  /**
>   * scp_get() - get a reference to SCP.
>   *
> @@ -863,7 +865,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
>  }
>  
>  static int scp_rproc_init(struct platform_device *pdev,
> -			  struct mtk_scp_of_regs *of_regs)
> +			  struct mtk_scp_of_regs *of_regs,
> +			  const struct mtk_scp_of_data *of_data)
>  {
>  	struct device *dev = &pdev->dev;
>  	struct device_node *np = dev->of_node;
> @@ -884,7 +887,7 @@ static int scp_rproc_init(struct platform_device *pdev,
>  	scp = (struct mtk_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_regs->reg_base;
> @@ -934,10 +937,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 +951,109 @@ 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_cluster_init(struct platform_device *pdev,
> +			    struct mtk_scp_of_regs *of_regs)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *np = dev_of_node(dev);
> +	struct platform_device *cpdev;
> +	struct device_node *child;
> +	const struct mtk_scp_of_data **cluster_of_data;
> +	struct list_head *cluster = &cluster_cores;
> +	struct mtk_scp *scp, *temp;
> +	int core_id = 0, num_cores;
> +	int ret;
> +
> +	child = of_get_next_available_child(np, NULL);
> +	if (!child)
> +		return dev_err_probe(dev, -ENODEV, "No child node\n");
> +
> +	of_node_put(child);
> +	if (of_node_name_eq(child, "cros-ec-rpmsg")) {
> +		dev_dbg(dev, "single-core scp\n");
> +
> +		ret = scp_rproc_init(pdev, of_regs, of_device_get_match_data(dev));
> +		if (ret)
> +			return dev_err_probe(dev, ret, "Failed to initialize single-core scp\n");
> +
> +		/* the single-core drvdata is intended to be the mtk_scp object.
> +		 * the mtk_scp object is used by APIs in mtk_scp_rpmsg_info.
> +		 */
> +		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);
> +
> +		num_cores = of_get_available_child_count(np);
> +
> +		for_each_available_child_of_node(np, child) {
> +			if (core_id >= num_cores || !cluster_of_data[core_id]) {

The first part of the if() condition is not needed - please remove.

> +				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(cpdev, of_regs, 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;
> @@ -980,21 +1082,30 @@ static int scp_probe(struct platform_device *pdev)
>  		scp_regs.l1tcm_phys = res->start;
>  	}
>  
> -	return scp_rproc_init(pdev, &scp_regs);
> +	ret = devm_of_platform_populate(dev);
> +	if (ret)
> +		return dev_err_probe(dev, ret, "Failed to populate platform devices\n");
> +
> +	INIT_LIST_HEAD(&cluster_cores);
> +	platform_set_drvdata(pdev, &cluster_cores);

Why is this needed when @cluster_cores is a global variable???

The drvdata should be the cluster I talked about in the previous patch.  Doing
this will greatly simplify this patchset.

I will stop here for this revision.

Thanks,
Mathieu

> +
> +	ret = scp_cluster_init(pdev, &scp_regs);
> +	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 list_head *cluster = &cluster_cores;
> +	struct mtk_scp *scp, *temp;
>  
> -	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);
> +	list_for_each_entry_safe_reverse(scp, temp, cluster, elem) {
> +		list_del(&scp->elem);
> +		rproc_del(scp->rproc);
> +		scp_rproc_free(scp);
> +	}
>  
>  	return 0;
>  }
> @@ -1073,12 +1184,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: 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 v9 06/11] remoteproc: mediatek: Probe multi-core SCP
Date: Fri, 31 Mar 2023 11:53:29 -0600	[thread overview]
Message-ID: <20230331175329.GB3504605@p14s> (raw)
In-Reply-To: <20230328022733.29910-7-tinghan.shen@mediatek.com>

On Tue, Mar 28, 2023 at 10:27:28AM +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 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    | 150 ++++++++++++++++++++++++++++----
>  2 files changed, 137 insertions(+), 16 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 32ecd1450c6f..71882ed31e16 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -30,6 +30,8 @@ struct mtk_scp_of_regs {
>  	phys_addr_t l1tcm_phys;
>  };
>  
> +static struct list_head cluster_cores;
> +

See my comment in the previous patch about this.

>  /**
>   * scp_get() - get a reference to SCP.
>   *
> @@ -863,7 +865,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
>  }
>  
>  static int scp_rproc_init(struct platform_device *pdev,
> -			  struct mtk_scp_of_regs *of_regs)
> +			  struct mtk_scp_of_regs *of_regs,
> +			  const struct mtk_scp_of_data *of_data)
>  {
>  	struct device *dev = &pdev->dev;
>  	struct device_node *np = dev->of_node;
> @@ -884,7 +887,7 @@ static int scp_rproc_init(struct platform_device *pdev,
>  	scp = (struct mtk_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_regs->reg_base;
> @@ -934,10 +937,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 +951,109 @@ 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_cluster_init(struct platform_device *pdev,
> +			    struct mtk_scp_of_regs *of_regs)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *np = dev_of_node(dev);
> +	struct platform_device *cpdev;
> +	struct device_node *child;
> +	const struct mtk_scp_of_data **cluster_of_data;
> +	struct list_head *cluster = &cluster_cores;
> +	struct mtk_scp *scp, *temp;
> +	int core_id = 0, num_cores;
> +	int ret;
> +
> +	child = of_get_next_available_child(np, NULL);
> +	if (!child)
> +		return dev_err_probe(dev, -ENODEV, "No child node\n");
> +
> +	of_node_put(child);
> +	if (of_node_name_eq(child, "cros-ec-rpmsg")) {
> +		dev_dbg(dev, "single-core scp\n");
> +
> +		ret = scp_rproc_init(pdev, of_regs, of_device_get_match_data(dev));
> +		if (ret)
> +			return dev_err_probe(dev, ret, "Failed to initialize single-core scp\n");
> +
> +		/* the single-core drvdata is intended to be the mtk_scp object.
> +		 * the mtk_scp object is used by APIs in mtk_scp_rpmsg_info.
> +		 */
> +		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);
> +
> +		num_cores = of_get_available_child_count(np);
> +
> +		for_each_available_child_of_node(np, child) {
> +			if (core_id >= num_cores || !cluster_of_data[core_id]) {

The first part of the if() condition is not needed - please remove.

> +				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(cpdev, of_regs, 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;
> @@ -980,21 +1082,30 @@ static int scp_probe(struct platform_device *pdev)
>  		scp_regs.l1tcm_phys = res->start;
>  	}
>  
> -	return scp_rproc_init(pdev, &scp_regs);
> +	ret = devm_of_platform_populate(dev);
> +	if (ret)
> +		return dev_err_probe(dev, ret, "Failed to populate platform devices\n");
> +
> +	INIT_LIST_HEAD(&cluster_cores);
> +	platform_set_drvdata(pdev, &cluster_cores);

Why is this needed when @cluster_cores is a global variable???

The drvdata should be the cluster I talked about in the previous patch.  Doing
this will greatly simplify this patchset.

I will stop here for this revision.

Thanks,
Mathieu

> +
> +	ret = scp_cluster_init(pdev, &scp_regs);
> +	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 list_head *cluster = &cluster_cores;
> +	struct mtk_scp *scp, *temp;
>  
> -	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);
> +	list_for_each_entry_safe_reverse(scp, temp, cluster, elem) {
> +		list_del(&scp->elem);
> +		rproc_del(scp->rproc);
> +		scp_rproc_free(scp);
> +	}
>  
>  	return 0;
>  }
> @@ -1073,12 +1184,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

  reply	other threads:[~2023-03-31 17:53 UTC|newest]

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

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=20230331175329.GB3504605@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.