linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4
@ 2020-06-01 17:55 Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 01/11] remoteproc: stm32: Decouple rproc from memory translation Mathieu Poirier
                   ` (10 more replies)
  0 siblings, 11 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

This set applies on top of [1] and refactors the STM32 platform code in
order to attach to the M4 remote processor when it has been started by the
boot loader.

It carries the same functionatlity as the previeous revision but account
for changes in the remoteproc core to support attaching scenarios.  More
specifically patches 6 to 10 should be given special consideration.

Note that I skipped over v3 and went directly to v4 in order to synchronise
with the remoterproc core patchset[1] that is set at v4.

Tested on ST's mp157c development board.

Thanks,
Mathieu

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=296713

Mathieu Poirier (11):
  remoteproc: stm32: Decouple rproc from memory translation
  remoteproc: stm32: Request IRQ with platform device
  remoteproc: stm32: Decouple rproc from DT parsing
  remoteproc: stm32: Remove memory translation from DT parsing
  remoteproc: stm32: Parse syscon that will manage M4 synchronisation
  remoteproc: stm32: Properly set co-processor state when attaching
  remoteproc: Make function rproc_resource_cleanup() public
  remoteproc: stm32: Split function stm32_rproc_parse_fw()
  remoteproc: stm32: Properly handle the resource table when attaching
  remoteproc: stm32: Introduce new attach() operation
  remoteproc: stm32: Update M4 state in stm32_rproc_stop()

 drivers/remoteproc/remoteproc_core.c |   3 +-
 drivers/remoteproc/stm32_rproc.c     | 214 ++++++++++++++++++++++++---
 include/linux/remoteproc.h           |   1 +
 3 files changed, 198 insertions(+), 20 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v4 01/11] remoteproc: stm32: Decouple rproc from memory translation
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 02/11] remoteproc: stm32: Request IRQ with platform device Mathieu Poirier
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Remove the remote processor from the process of parsing the memory
ranges since there is no correlation between them.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Loic Pallardy <loic.pallardy@st.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index f45b8d597da0..a80733fb08e7 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -127,10 +127,10 @@ static int stm32_rproc_mem_release(struct rproc *rproc,
 	return 0;
 }
 
-static int stm32_rproc_of_memory_translations(struct rproc *rproc)
+static int stm32_rproc_of_memory_translations(struct platform_device *pdev,
+					      struct stm32_rproc *ddata)
 {
-	struct device *parent, *dev = rproc->dev.parent;
-	struct stm32_rproc *ddata = rproc->priv;
+	struct device *parent, *dev = &pdev->dev;
 	struct device_node *np;
 	struct stm32_rproc_mem *p_mems;
 	struct stm32_rproc_mem_ranges *mem_range;
@@ -606,7 +606,7 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev)
 
 	rproc->auto_boot = of_property_read_bool(np, "st,auto-boot");
 
-	return stm32_rproc_of_memory_translations(rproc);
+	return stm32_rproc_of_memory_translations(pdev, ddata);
 }
 
 static int stm32_rproc_probe(struct platform_device *pdev)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 02/11] remoteproc: stm32: Request IRQ with platform device
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 01/11] remoteproc: stm32: Decouple rproc from memory translation Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 03/11] remoteproc: stm32: Decouple rproc from DT parsing Mathieu Poirier
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Request IRQ with platform device rather than remote proc in order to
call stm32_rproc_parse_dt() before rproc_alloc().  That way we can
know whether we need to synchronise with the MCU or not.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Loic Pallardy <loic.pallardy@st.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index a80733fb08e7..94fd687fb5b2 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -261,7 +261,8 @@ static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
 
 static irqreturn_t stm32_rproc_wdg(int irq, void *data)
 {
-	struct rproc *rproc = data;
+	struct platform_device *pdev = data;
+	struct rproc *rproc = platform_get_drvdata(pdev);
 
 	rproc_report_crash(rproc, RPROC_WATCHDOG);
 
@@ -553,7 +554,7 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev)
 
 	if (irq > 0) {
 		err = devm_request_irq(dev, irq, stm32_rproc_wdg, 0,
-				       dev_name(dev), rproc);
+				       dev_name(dev), pdev);
 		if (err) {
 			dev_err(dev, "failed to request wdg irq\n");
 			return err;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 03/11] remoteproc: stm32: Decouple rproc from DT parsing
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 01/11] remoteproc: stm32: Decouple rproc from memory translation Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 02/11] remoteproc: stm32: Request IRQ with platform device Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 04/11] remoteproc: stm32: Remove memory translation " Mathieu Poirier
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Remove the remote processor from the process of parsing the device tree
since (1) there is no correlation between them and (2) to use the
information that was gathered to make a decision on whether to
synchronise with the M4 or not.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 94fd687fb5b2..1e512ddf2591 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -538,12 +538,11 @@ static int stm32_rproc_get_syscon(struct device_node *np, const char *prop,
 	return err;
 }
 
-static int stm32_rproc_parse_dt(struct platform_device *pdev)
+static int stm32_rproc_parse_dt(struct platform_device *pdev,
+				struct stm32_rproc *ddata, bool *auto_boot)
 {
 	struct device *dev = &pdev->dev;
 	struct device_node *np = dev->of_node;
-	struct rproc *rproc = platform_get_drvdata(pdev);
-	struct stm32_rproc *ddata = rproc->priv;
 	struct stm32_syscon tz;
 	unsigned int tzen;
 	int err, irq;
@@ -589,7 +588,7 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev)
 
 	err = regmap_read(tz.map, tz.reg, &tzen);
 	if (err) {
-		dev_err(&rproc->dev, "failed to read tzen\n");
+		dev_err(dev, "failed to read tzen\n");
 		return err;
 	}
 	ddata->secured_soc = tzen & tz.mask;
@@ -605,7 +604,7 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev)
 	if (err)
 		dev_info(dev, "failed to get pdds\n");
 
-	rproc->auto_boot = of_property_read_bool(np, "st,auto-boot");
+	*auto_boot = of_property_read_bool(np, "st,auto-boot");
 
 	return stm32_rproc_of_memory_translations(pdev, ddata);
 }
@@ -626,9 +625,15 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 	if (!rproc)
 		return -ENOMEM;
 
+	ddata = rproc->priv;
+
 	rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE);
+
+	ret = stm32_rproc_parse_dt(pdev, ddata, &rproc->auto_boot);
+	if (ret)
+		goto free_rproc;
+
 	rproc->has_iommu = false;
-	ddata = rproc->priv;
 	ddata->workqueue = create_workqueue(dev_name(dev));
 	if (!ddata->workqueue) {
 		dev_err(dev, "cannot create workqueue\n");
@@ -638,13 +643,9 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, rproc);
 
-	ret = stm32_rproc_parse_dt(pdev);
-	if (ret)
-		goto free_wkq;
-
 	ret = stm32_rproc_request_mbox(rproc);
 	if (ret)
-		goto free_rproc;
+		goto free_wkq;
 
 	ret = rproc_add(rproc);
 	if (ret)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 04/11] remoteproc: stm32: Remove memory translation from DT parsing
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (2 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 03/11] remoteproc: stm32: Decouple rproc from DT parsing Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 05/11] remoteproc: stm32: Parse syscon that will manage M4 synchronisation Mathieu Poirier
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Other than one has to be done after the other, there is no correlation
between memory translation and DT parsing.  As such move function
stm32_rproc_of_memory_translations() to stm32_rproc_probe() so that
stm32_rproc_parse_dt() can be extended to look for attach bindings
in a clean way.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Loic Pallardy <loic.pallardy@st.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 1e512ddf2591..3e3b199a02c1 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -606,7 +606,7 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
 
 	*auto_boot = of_property_read_bool(np, "st,auto-boot");
 
-	return stm32_rproc_of_memory_translations(pdev, ddata);
+	return 0;
 }
 
 static int stm32_rproc_probe(struct platform_device *pdev)
@@ -633,6 +633,10 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 	if (ret)
 		goto free_rproc;
 
+	ret = stm32_rproc_of_memory_translations(pdev, ddata);
+	if (ret)
+		goto free_rproc;
+
 	rproc->has_iommu = false;
 	ddata->workqueue = create_workqueue(dev_name(dev));
 	if (!ddata->workqueue) {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 05/11] remoteproc: stm32: Parse syscon that will manage M4 synchronisation
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (3 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 04/11] remoteproc: stm32: Remove memory translation " Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 06/11] remoteproc: stm32: Properly set co-processor state when attaching Mathieu Poirier
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Get from the DT the syncon to probe the state of the remote processor
and the location of the resource table.

Mainly based on the work published by Arnaud Pouliquen [1].

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Loic Pallardy <loic.pallardy@st.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 3e3b199a02c1..80fd8fd831da 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -70,6 +70,8 @@ struct stm32_rproc {
 	struct reset_control *rst;
 	struct stm32_syscon hold_boot;
 	struct stm32_syscon pdds;
+	struct stm32_syscon m4_state;
+	struct stm32_syscon rsctbl;
 	int wdg_irq;
 	u32 nb_rmems;
 	struct stm32_rproc_mem *rmems;
@@ -606,6 +608,30 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
 
 	*auto_boot = of_property_read_bool(np, "st,auto-boot");
 
+	/*
+	 * See if we can check the M4 status, i.e if it was started
+	 * from the boot loader or not.
+	 */
+	err = stm32_rproc_get_syscon(np, "st,syscfg-m4-state",
+				     &ddata->m4_state);
+	if (err) {
+		/* remember this */
+		ddata->m4_state.map = NULL;
+		/* no coprocessor state syscon (optional) */
+		dev_warn(dev, "m4 state not supported\n");
+
+		/* no need to go further */
+		return 0;
+	}
+
+	/* See if we can get the resource table */
+	err = stm32_rproc_get_syscon(np, "st,syscfg-rsc-tbl",
+				     &ddata->rsctbl);
+	if (err) {
+		/* no rsc table syscon (optional) */
+		dev_warn(dev, "rsc tbl syscon not supported\n");
+	}
+
 	return 0;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 06/11] remoteproc: stm32: Properly set co-processor state when attaching
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (4 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 05/11] remoteproc: stm32: Parse syscon that will manage M4 synchronisation Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-22 18:05   ` Bjorn Andersson
  2020-06-01 17:55 ` [PATCH v4 07/11] remoteproc: Make function rproc_resource_cleanup() public Mathieu Poirier
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Introduce the required mechanic to set the state of the M4 in order
to properly deal with scenarios where the co-processor has been
stated by another entity.

Mainly based on the work published by Arnaud Pouliquen [1].

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 80fd8fd831da..2154c8b90a2a 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -38,6 +38,13 @@
 #define STM32_MBX_VQ1_ID	1
 #define STM32_MBX_SHUTDOWN	"shutdown"
 
+#define M4_STATE_OFF		0
+#define M4_STATE_INI		1
+#define M4_STATE_CRUN		2
+#define M4_STATE_CSTOP		3
+#define M4_STATE_STANDBY	4
+#define M4_STATE_CRASH		5
+
 struct stm32_syscon {
 	struct regmap *map;
 	u32 reg;
@@ -635,12 +642,30 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
 	return 0;
 }
 
+static int stm32_rproc_get_m4_status(struct stm32_rproc *ddata,
+				     unsigned int *state)
+{
+	/* See stm32_rproc_parse_dt() */
+	if (!ddata->m4_state.map) {
+		/*
+		 * We couldn't get the coprocessor's state, assume
+		 * it is not running.
+		 */
+		state = M4_STATE_OFF;
+		return 0;
+	}
+
+	return regmap_read(ddata->m4_state.map, ddata->m4_state.reg, state);
+}
+
+
 static int stm32_rproc_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct stm32_rproc *ddata;
 	struct device_node *np = dev->of_node;
 	struct rproc *rproc;
+	unsigned int state;
 	int ret;
 
 	ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
@@ -663,6 +688,13 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 	if (ret)
 		goto free_rproc;
 
+	ret = stm32_rproc_get_m4_status(ddata, &state);
+	if (ret)
+		goto free_rproc;
+
+	if (state == M4_STATE_CRUN)
+		rproc->state = RPROC_DETACHED;
+
 	rproc->has_iommu = false;
 	ddata->workqueue = create_workqueue(dev_name(dev));
 	if (!ddata->workqueue) {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 07/11] remoteproc: Make function rproc_resource_cleanup() public
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (5 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 06/11] remoteproc: stm32: Properly set co-processor state when attaching Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 08/11] remoteproc: stm32: Split function stm32_rproc_parse_fw() Mathieu Poirier
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Make function rproc_resource_cleanup() public so that it can be
used by platform drivers when allocating resources to be used by
a detached remote processor.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 drivers/remoteproc/remoteproc_core.c | 3 ++-
 include/linux/remoteproc.h           | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index a8adc712e7f6..6b0ded714beb 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1272,7 +1272,7 @@ static void rproc_coredump_cleanup(struct rproc *rproc)
  * This function will free all resources acquired for @rproc, and it
  * is called whenever @rproc either shuts down or fails to boot.
  */
-static void rproc_resource_cleanup(struct rproc *rproc)
+void rproc_resource_cleanup(struct rproc *rproc)
 {
 	struct rproc_mem_entry *entry, *tmp;
 	struct rproc_debug_trace *trace, *ttmp;
@@ -1316,6 +1316,7 @@ static void rproc_resource_cleanup(struct rproc *rproc)
 
 	rproc_coredump_cleanup(rproc);
 }
+EXPORT_SYMBOL(rproc_resource_cleanup);
 
 static int rproc_start(struct rproc *rproc, const struct firmware *fw)
 {
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index cf5e31556780..7c0567029f7c 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -610,6 +610,7 @@ void rproc_put(struct rproc *rproc);
 int rproc_add(struct rproc *rproc);
 int rproc_del(struct rproc *rproc);
 void rproc_free(struct rproc *rproc);
+void rproc_resource_cleanup(struct rproc *rproc);
 
 struct rproc *devm_rproc_alloc(struct device *dev, const char *name,
 			       const struct rproc_ops *ops,
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 08/11] remoteproc: stm32: Split function stm32_rproc_parse_fw()
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (6 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 07/11] remoteproc: Make function rproc_resource_cleanup() public Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 09/11] remoteproc: stm32: Properly handle the resource table when attaching Mathieu Poirier
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Split function stm32_rproc_parse_fw() in two parts, the first one
to parse the memory regions and the second one to load the
resource table.  That way parsing of the memory regions can be
re-used when attaching to the remote processor.

Mainly based on the work published by Arnaud Pouliquen [1].

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Loic Pallardy <loic.pallardy@st.com>
---
 drivers/remoteproc/stm32_rproc.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 2154c8b90a2a..9316ce3b03c2 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -212,7 +212,7 @@ static int stm32_rproc_elf_load_rsc_table(struct rproc *rproc,
 	return 0;
 }
 
-static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
+static int stm32_rproc_parse_memory_regions(struct rproc *rproc)
 {
 	struct device *dev = rproc->dev.parent;
 	struct device_node *np = dev->of_node;
@@ -265,6 +265,16 @@ static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
 		index++;
 	}
 
+	return 0;
+}
+
+static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
+{
+	int ret = stm32_rproc_parse_memory_regions(rproc);
+
+	if (ret)
+		return ret;
+
 	return stm32_rproc_elf_load_rsc_table(rproc, fw);
 }
 
@@ -692,15 +702,20 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 	if (ret)
 		goto free_rproc;
 
-	if (state == M4_STATE_CRUN)
+	if (state == M4_STATE_CRUN) {
 		rproc->state = RPROC_DETACHED;
 
+		ret = stm32_rproc_parse_memory_regions(rproc);
+		if (ret)
+			goto free_resources;
+	}
+
 	rproc->has_iommu = false;
 	ddata->workqueue = create_workqueue(dev_name(dev));
 	if (!ddata->workqueue) {
 		dev_err(dev, "cannot create workqueue\n");
 		ret = -ENOMEM;
-		goto free_rproc;
+		goto free_resources;
 	}
 
 	platform_set_drvdata(pdev, rproc);
@@ -719,6 +734,8 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 	stm32_rproc_free_mbox(rproc);
 free_wkq:
 	destroy_workqueue(ddata->workqueue);
+free_resources:
+	rproc_resource_cleanup(rproc);
 free_rproc:
 	if (device_may_wakeup(dev)) {
 		dev_pm_clear_wake_irq(dev);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 09/11] remoteproc: stm32: Properly handle the resource table when attaching
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (7 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 08/11] remoteproc: stm32: Split function stm32_rproc_parse_fw() Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 10/11] remoteproc: stm32: Introduce new attach() operation Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 11/11] remoteproc: stm32: Update M4 state in stm32_rproc_stop() Mathieu Poirier
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Properly set the remote processor's resource table based on where it was
loaded by the external entity when attaching to a remote processor.

Mainly based on the work published by Arnaud Pouliquen [1].

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 75 ++++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 9316ce3b03c2..7c8789164af7 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -38,6 +38,8 @@
 #define STM32_MBX_VQ1_ID	1
 #define STM32_MBX_SHUTDOWN	"shutdown"
 
+#define RSC_TBL_SIZE		1024
+
 #define M4_STATE_OFF		0
 #define M4_STATE_INI		1
 #define M4_STATE_CRUN		2
@@ -85,6 +87,7 @@ struct stm32_rproc {
 	struct stm32_mbox mb[MBOX_NB_MBX];
 	struct workqueue_struct *workqueue;
 	bool secured_soc;
+	void __iomem *rsc_va;
 };
 
 static int stm32_rproc_pa_to_da(struct rproc *rproc, phys_addr_t pa, u64 *da)
@@ -668,6 +671,74 @@ static int stm32_rproc_get_m4_status(struct stm32_rproc *ddata,
 	return regmap_read(ddata->m4_state.map, ddata->m4_state.reg, state);
 }
 
+static int stm32_rproc_da_to_pa(struct platform_device *pdev,
+				struct stm32_rproc *ddata,
+				u64 da, phys_addr_t *pa)
+{
+	struct device *dev = &pdev->dev;
+	struct stm32_rproc_mem *p_mem;
+	unsigned int i;
+
+	for (i = 0; i < ddata->nb_rmems; i++) {
+		p_mem = &ddata->rmems[i];
+
+		if (da < p_mem->dev_addr ||
+		    da >= p_mem->dev_addr + p_mem->size)
+			continue;
+
+		*pa = da - p_mem->dev_addr + p_mem->bus_addr;
+		dev_dbg(dev, "da %llx to pa %#x\n", da, *pa);
+
+		return 0;
+	}
+
+	dev_err(dev, "can't translate da %llx\n", da);
+
+	return -EINVAL;
+}
+
+static int stm32_rproc_get_loaded_rsc_table(struct platform_device *pdev,
+					    struct rproc *rproc,
+					    struct stm32_rproc *ddata)
+{
+	struct device *dev = &pdev->dev;
+	phys_addr_t rsc_pa;
+	u32 rsc_da;
+	int err;
+
+	err = regmap_read(ddata->rsctbl.map, ddata->rsctbl.reg, &rsc_da);
+	if (err) {
+		dev_err(dev, "failed to read rsc tbl addr\n");
+		return err;
+	}
+
+	if (!rsc_da)
+		/* no rsc table */
+		return 0;
+
+	err = stm32_rproc_da_to_pa(pdev, ddata, rsc_da, &rsc_pa);
+	if (err)
+		return err;
+
+	ddata->rsc_va = devm_ioremap_wc(dev, rsc_pa, RSC_TBL_SIZE);
+	if (IS_ERR_OR_NULL(ddata->rsc_va)) {
+		dev_err(dev, "Unable to map memory region: %pa+%zx\n",
+			&rsc_pa, RSC_TBL_SIZE);
+		ddata->rsc_va = NULL;
+		return -ENOMEM;
+	}
+
+	/*
+	 * The resource table is already loaded in device memory, no need
+	 * to work with a cached table.
+	 */
+	rproc->cached_table = NULL;
+	/* Assuming the resource table fits in 1kB is fair */
+	rproc->table_sz = RSC_TBL_SIZE;
+	rproc->table_ptr = (struct resource_table *)ddata->rsc_va;
+
+	return 0;
+}
 
 static int stm32_rproc_probe(struct platform_device *pdev)
 {
@@ -708,6 +779,10 @@ static int stm32_rproc_probe(struct platform_device *pdev)
 		ret = stm32_rproc_parse_memory_regions(rproc);
 		if (ret)
 			goto free_resources;
+
+		ret = stm32_rproc_get_loaded_rsc_table(pdev, rproc, ddata);
+		if (ret)
+			goto free_resources;
 	}
 
 	rproc->has_iommu = false;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 10/11] remoteproc: stm32: Introduce new attach() operation
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (8 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 09/11] remoteproc: stm32: Properly handle the resource table when attaching Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  2020-06-01 17:55 ` [PATCH v4 11/11] remoteproc: stm32: Update M4 state in stm32_rproc_stop() Mathieu Poirier
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Introduce new attach function to be used when attaching to a
remote processor.

Mainly based on the work published by Arnaud Pouliquen [1].

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 drivers/remoteproc/stm32_rproc.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 7c8789164af7..77a20a638e0c 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -459,6 +459,13 @@ static int stm32_rproc_start(struct rproc *rproc)
 	return stm32_rproc_set_hold_boot(rproc, true);
 }
 
+static int stm32_rproc_attach(struct rproc *rproc)
+{
+	stm32_rproc_add_coredump_trace(rproc);
+
+	return stm32_rproc_set_hold_boot(rproc, true);
+}
+
 static int stm32_rproc_stop(struct rproc *rproc)
 {
 	struct stm32_rproc *ddata = rproc->priv;
@@ -524,6 +531,7 @@ static void stm32_rproc_kick(struct rproc *rproc, int vqid)
 static struct rproc_ops st_rproc_ops = {
 	.start		= stm32_rproc_start,
 	.stop		= stm32_rproc_stop,
+	.attach		= stm32_rproc_attach,
 	.kick		= stm32_rproc_kick,
 	.load		= rproc_elf_load_segments,
 	.parse_fw	= stm32_rproc_parse_fw,
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v4 11/11] remoteproc: stm32: Update M4 state in stm32_rproc_stop()
  2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
                   ` (9 preceding siblings ...)
  2020-06-01 17:55 ` [PATCH v4 10/11] remoteproc: stm32: Introduce new attach() operation Mathieu Poirier
@ 2020-06-01 17:55 ` Mathieu Poirier
  10 siblings, 0 replies; 13+ messages in thread
From: Mathieu Poirier @ 2020-06-01 17:55 UTC (permalink / raw)
  To: bjorn.andersson, ohad, mcoquelin.stm32, alexandre.torgue
  Cc: loic.pallardy, arnaud.pouliquen, linux-remoteproc, linux-kernel,
	linux-stm32, linux-arm-kernel

Update the co-processor state in function stm32_rproc_stop() so that
it can be used in scenarios where the remoteproc core is attaching
to the M4.

Mainly based on the work published by Arnaud Pouliquen [1].

[1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Arnaud Pouliquen <arnaud.pouliquen@st.com>
---
 drivers/remoteproc/stm32_rproc.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 77a20a638e0c..ad0307aaf3d5 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -503,6 +503,18 @@ static int stm32_rproc_stop(struct rproc *rproc)
 		}
 	}
 
+	/* update coprocessor state to OFF if available */
+	if (ddata->m4_state.map) {
+		err = regmap_update_bits(ddata->m4_state.map,
+					 ddata->m4_state.reg,
+					 ddata->m4_state.mask,
+					 M4_STATE_OFF);
+		if (err) {
+			dev_err(&rproc->dev, "failed to set copro state\n");
+			return err;
+		}
+	}
+
 	return 0;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v4 06/11] remoteproc: stm32: Properly set co-processor state when attaching
  2020-06-01 17:55 ` [PATCH v4 06/11] remoteproc: stm32: Properly set co-processor state when attaching Mathieu Poirier
@ 2020-06-22 18:05   ` Bjorn Andersson
  0 siblings, 0 replies; 13+ messages in thread
From: Bjorn Andersson @ 2020-06-22 18:05 UTC (permalink / raw)
  To: Mathieu Poirier
  Cc: ohad, mcoquelin.stm32, alexandre.torgue, loic.pallardy,
	arnaud.pouliquen, linux-remoteproc, linux-kernel, linux-stm32,
	linux-arm-kernel

On Mon 01 Jun 10:55 PDT 2020, Mathieu Poirier wrote:

> Introduce the required mechanic to set the state of the M4 in order
> to properly deal with scenarios where the co-processor has been
> stated by another entity.
> 
> Mainly based on the work published by Arnaud Pouliquen [1].
> 
> [1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877
> 
> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>

Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>

> ---
>  drivers/remoteproc/stm32_rproc.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
> 
> diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
> index 80fd8fd831da..2154c8b90a2a 100644
> --- a/drivers/remoteproc/stm32_rproc.c
> +++ b/drivers/remoteproc/stm32_rproc.c
> @@ -38,6 +38,13 @@
>  #define STM32_MBX_VQ1_ID	1
>  #define STM32_MBX_SHUTDOWN	"shutdown"
>  
> +#define M4_STATE_OFF		0
> +#define M4_STATE_INI		1
> +#define M4_STATE_CRUN		2
> +#define M4_STATE_CSTOP		3
> +#define M4_STATE_STANDBY	4
> +#define M4_STATE_CRASH		5
> +
>  struct stm32_syscon {
>  	struct regmap *map;
>  	u32 reg;
> @@ -635,12 +642,30 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
>  	return 0;
>  }
>  
> +static int stm32_rproc_get_m4_status(struct stm32_rproc *ddata,
> +				     unsigned int *state)
> +{
> +	/* See stm32_rproc_parse_dt() */
> +	if (!ddata->m4_state.map) {
> +		/*
> +		 * We couldn't get the coprocessor's state, assume
> +		 * it is not running.
> +		 */
> +		state = M4_STATE_OFF;
> +		return 0;
> +	}
> +
> +	return regmap_read(ddata->m4_state.map, ddata->m4_state.reg, state);
> +}
> +
> +
>  static int stm32_rproc_probe(struct platform_device *pdev)
>  {
>  	struct device *dev = &pdev->dev;
>  	struct stm32_rproc *ddata;
>  	struct device_node *np = dev->of_node;
>  	struct rproc *rproc;
> +	unsigned int state;
>  	int ret;
>  
>  	ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
> @@ -663,6 +688,13 @@ static int stm32_rproc_probe(struct platform_device *pdev)
>  	if (ret)
>  		goto free_rproc;
>  
> +	ret = stm32_rproc_get_m4_status(ddata, &state);
> +	if (ret)
> +		goto free_rproc;
> +
> +	if (state == M4_STATE_CRUN)

I presume this won't ever be e.g. M4_STATE_CRASH or M4_STATE_STANDBY?

Regards,
Bjorn

> +		rproc->state = RPROC_DETACHED;
> +
>  	rproc->has_iommu = false;
>  	ddata->workqueue = create_workqueue(dev_name(dev));
>  	if (!ddata->workqueue) {
> -- 
> 2.20.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2020-06-22 18:08 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-01 17:55 [PATCH v4 00/11] remoteproc: stm32: Add support for attaching to M4 Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 01/11] remoteproc: stm32: Decouple rproc from memory translation Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 02/11] remoteproc: stm32: Request IRQ with platform device Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 03/11] remoteproc: stm32: Decouple rproc from DT parsing Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 04/11] remoteproc: stm32: Remove memory translation " Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 05/11] remoteproc: stm32: Parse syscon that will manage M4 synchronisation Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 06/11] remoteproc: stm32: Properly set co-processor state when attaching Mathieu Poirier
2020-06-22 18:05   ` Bjorn Andersson
2020-06-01 17:55 ` [PATCH v4 07/11] remoteproc: Make function rproc_resource_cleanup() public Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 08/11] remoteproc: stm32: Split function stm32_rproc_parse_fw() Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 09/11] remoteproc: stm32: Properly handle the resource table when attaching Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 10/11] remoteproc: stm32: Introduce new attach() operation Mathieu Poirier
2020-06-01 17:55 ` [PATCH v4 11/11] remoteproc: stm32: Update M4 state in stm32_rproc_stop() Mathieu Poirier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).