Skip to content

Commit eaf5b89

Browse files
tinghan-shenmathieupoirier
authored andcommitted
remoteproc: mediatek: Probe SCP cluster on single-core SCP
This is the 3rd preliminary step for probing multi-core SCP. Rewrite the probing flow of single-core SCP to adapt with the 'cluster' concept needed by the multi-core SCP. The SCP core object(s) is maintained at the cluster list. Signed-off-by: Tinghan Shen <[email protected]> Reviewed-by: AngeloGioacchino Del Regno <[email protected]> Tested-by: AngeloGioacchino Del Regno <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mathieu Poirier <[email protected]>
1 parent fcc14c9 commit eaf5b89

File tree

2 files changed

+63
-25
lines changed

2 files changed

+63
-25
lines changed

drivers/remoteproc/mtk_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ struct mtk_scp_of_cluster {
105105
void __iomem *l1tcm_base;
106106
size_t l1tcm_size;
107107
phys_addr_t l1tcm_phys;
108+
struct list_head mtk_scp_list;
108109
};
109110

110111
struct mtk_scp {
@@ -132,6 +133,7 @@ struct mtk_scp {
132133

133134
struct rproc_subdev *rpmsg_subdev;
134135

136+
struct list_head elem;
135137
struct mtk_scp_of_cluster *cluster;
136138
};
137139

drivers/remoteproc/mtk_scp.c

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,8 @@ static void scp_remove_rpmsg_subdev(struct mtk_scp *scp)
854854
}
855855
}
856856

857-
static int scp_rproc_init(struct platform_device *pdev,
858-
struct mtk_scp_of_cluster *scp_cluster)
857+
static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
858+
struct mtk_scp_of_cluster *scp_cluster)
859859
{
860860
struct device *dev = &pdev->dev;
861861
struct device_node *np = dev->of_node;
@@ -867,11 +867,13 @@ static int scp_rproc_init(struct platform_device *pdev,
867867

868868
ret = rproc_of_parse_firmware(dev, 0, &fw_name);
869869
if (ret < 0 && ret != -EINVAL)
870-
return ret;
870+
return ERR_PTR(ret);
871871

872872
rproc = devm_rproc_alloc(dev, np->name, &scp_ops, fw_name, sizeof(*scp));
873-
if (!rproc)
874-
return dev_err_probe(dev, -ENOMEM, "unable to allocate remoteproc\n");
873+
if (!rproc) {
874+
dev_err(dev, "unable to allocate remoteproc\n");
875+
return ERR_PTR(-ENOMEM);
876+
}
875877

876878
scp = rproc->priv;
877879
scp->rproc = rproc;
@@ -882,20 +884,21 @@ static int scp_rproc_init(struct platform_device *pdev,
882884

883885
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
884886
scp->sram_base = devm_ioremap_resource(dev, res);
885-
if (IS_ERR(scp->sram_base))
886-
return dev_err_probe(dev, PTR_ERR(scp->sram_base),
887-
"Failed to parse and map sram memory\n");
887+
if (IS_ERR(scp->sram_base)) {
888+
dev_err(dev, "Failed to parse and map sram memory\n");
889+
return ERR_CAST(scp->sram_base);
890+
}
888891

889892
scp->sram_size = resource_size(res);
890893
scp->sram_phys = res->start;
891894

892895
ret = scp->data->scp_clk_get(scp);
893896
if (ret)
894-
return ret;
897+
return ERR_PTR(ret);
895898

896899
ret = scp_map_memory_region(scp);
897900
if (ret)
898-
return ret;
901+
return ERR_PTR(ret);
899902

900903
mutex_init(&scp->send_lock);
901904
for (i = 0; i < SCP_IPI_MAX; i++)
@@ -922,11 +925,7 @@ static int scp_rproc_init(struct platform_device *pdev,
922925
goto remove_subdev;
923926
}
924927

925-
ret = rproc_add(rproc);
926-
if (ret)
927-
goto remove_subdev;
928-
929-
return 0;
928+
return scp;
930929

931930
remove_subdev:
932931
scp_remove_rpmsg_subdev(scp);
@@ -937,7 +936,43 @@ static int scp_rproc_init(struct platform_device *pdev,
937936
mutex_destroy(&scp->ipi_desc[i].lock);
938937
mutex_destroy(&scp->send_lock);
939938

940-
return ret;
939+
return ERR_PTR(ret);
940+
}
941+
942+
static void scp_free(struct mtk_scp *scp)
943+
{
944+
int i;
945+
946+
scp_remove_rpmsg_subdev(scp);
947+
scp_ipi_unregister(scp, SCP_IPI_INIT);
948+
scp_unmap_memory_region(scp);
949+
for (i = 0; i < SCP_IPI_MAX; i++)
950+
mutex_destroy(&scp->ipi_desc[i].lock);
951+
mutex_destroy(&scp->send_lock);
952+
}
953+
954+
static int scp_cluster_init(struct platform_device *pdev,
955+
struct mtk_scp_of_cluster *scp_cluster)
956+
{
957+
struct device *dev = &pdev->dev;
958+
struct list_head *scp_list = &scp_cluster->mtk_scp_list;
959+
struct mtk_scp *scp;
960+
int ret;
961+
962+
scp = scp_rproc_init(pdev, scp_cluster);
963+
if (IS_ERR(scp))
964+
return PTR_ERR(scp);
965+
966+
ret = rproc_add(scp->rproc);
967+
if (ret) {
968+
dev_err(dev, "Failed to add rproc\n");
969+
scp_free(scp);
970+
return ret;
971+
}
972+
973+
list_add_tail(&scp->elem, scp_list);
974+
975+
return 0;
941976
}
942977

943978
static int scp_probe(struct platform_device *pdev)
@@ -970,7 +1005,9 @@ static int scp_probe(struct platform_device *pdev)
9701005
scp_cluster->l1tcm_phys = res->start;
9711006
}
9721007

973-
ret = scp_rproc_init(pdev, scp_cluster);
1008+
INIT_LIST_HEAD(&scp_cluster->mtk_scp_list);
1009+
1010+
ret = scp_cluster_init(pdev, scp_cluster);
9741011
if (ret)
9751012
return ret;
9761013

@@ -980,15 +1017,14 @@ static int scp_probe(struct platform_device *pdev)
9801017
static void scp_remove(struct platform_device *pdev)
9811018
{
9821019
struct mtk_scp *scp = platform_get_drvdata(pdev);
983-
int i;
1020+
struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
1021+
struct mtk_scp *temp;
9841022

985-
rproc_del(scp->rproc);
986-
scp_remove_rpmsg_subdev(scp);
987-
scp_ipi_unregister(scp, SCP_IPI_INIT);
988-
scp_unmap_memory_region(scp);
989-
for (i = 0; i < SCP_IPI_MAX; i++)
990-
mutex_destroy(&scp->ipi_desc[i].lock);
991-
mutex_destroy(&scp->send_lock);
1023+
list_for_each_entry_safe_reverse(scp, temp, &scp_cluster->mtk_scp_list, elem) {
1024+
list_del(&scp->elem);
1025+
rproc_del(scp->rproc);
1026+
scp_free(scp);
1027+
}
9921028
}
9931029

9941030
static const struct mtk_scp_of_data mt8183_of_data = {

0 commit comments

Comments
 (0)