[PATCH v5 4/7] remoteproc: core introduce rproc_set_rsc_table_on_start function

From: Arnaud Pouliquen
Date: Tue May 21 2024 - 04:12:22 EST


Split rproc_start()to prepare the update of the management of
the cache table on start, for the support of the firmware loading
by the TEE interface.
- create rproc_set_rsc_table_on_start() to address the management of
the cache table in a specific function, as done in
rproc_reset_rsc_table_on_stop().
- rename rproc_set_rsc_table in rproc_set_rsc_table_on_attach()
- move rproc_reset_rsc_table_on_stop() to be close to the
rproc_set_rsc_table_on_start() function

Suggested-by: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx>
Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@xxxxxxxxxxx>
---
drivers/remoteproc/remoteproc_core.c | 116 ++++++++++++++-------------
1 file changed, 62 insertions(+), 54 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index f276956f2c5c..42bca01f3bde 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1264,18 +1264,9 @@ void rproc_resource_cleanup(struct rproc *rproc)
}
EXPORT_SYMBOL(rproc_resource_cleanup);

-static int rproc_start(struct rproc *rproc, const struct firmware *fw)
+static int rproc_set_rsc_table_on_start(struct rproc *rproc, const struct firmware *fw)
{
struct resource_table *loaded_table;
- struct device *dev = &rproc->dev;
- int ret;
-
- /* load the ELF segments to memory */
- ret = rproc_load_segments(rproc, fw);
- if (ret) {
- dev_err(dev, "Failed to load program segments: %d\n", ret);
- return ret;
- }

/*
* The starting device has been given the rproc->cached_table as the
@@ -1291,6 +1282,64 @@ static int rproc_start(struct rproc *rproc, const struct firmware *fw)
rproc->table_ptr = loaded_table;
}

+ return 0;
+}
+
+static int rproc_reset_rsc_table_on_stop(struct rproc *rproc)
+{
+ /* A resource table was never retrieved, nothing to do here */
+ if (!rproc->table_ptr)
+ return 0;
+
+ /*
+ * If a cache table exists the remote processor was started by
+ * the remoteproc core. That cache table should be used for
+ * the rest of the shutdown process.
+ */
+ if (rproc->cached_table)
+ goto out;
+
+ /*
+ * If we made it here the remote processor was started by another
+ * entity and a cache table doesn't exist. As such make a copy of
+ * the resource table currently used by the remote processor and
+ * use that for the rest of the shutdown process. The memory
+ * allocated here is free'd in rproc_shutdown().
+ */
+ rproc->cached_table = kmemdup(rproc->table_ptr,
+ rproc->table_sz, GFP_KERNEL);
+ if (!rproc->cached_table)
+ return -ENOMEM;
+
+ /*
+ * Since the remote processor is being switched off the clean table
+ * won't be needed. Allocated in rproc_set_rsc_table_on_start().
+ */
+ kfree(rproc->clean_table);
+
+out:
+ /*
+ * Use a copy of the resource table for the remainder of the
+ * shutdown process.
+ */
+ rproc->table_ptr = rproc->cached_table;
+ return 0;
+}
+
+static int rproc_start(struct rproc *rproc, const struct firmware *fw)
+{
+ struct device *dev = &rproc->dev;
+ int ret;
+
+ /* load the ELF segments to memory */
+ ret = rproc_load_segments(rproc, fw);
+ if (ret) {
+ dev_err(dev, "Failed to load program segments: %d\n", ret);
+ return ret;
+ }
+
+ rproc_set_rsc_table_on_start(rproc, fw);
+
ret = rproc_prepare_subdevices(rproc);
if (ret) {
dev_err(dev, "failed to prepare subdevices for %s: %d\n",
@@ -1450,7 +1499,7 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
return ret;
}

-static int rproc_set_rsc_table(struct rproc *rproc)
+static int rproc_set_rsc_table_on_attach(struct rproc *rproc)
{
struct resource_table *table_ptr;
struct device *dev = &rproc->dev;
@@ -1540,54 +1589,13 @@ static int rproc_reset_rsc_table_on_detach(struct rproc *rproc)

/*
* The clean resource table is no longer needed. Allocated in
- * rproc_set_rsc_table().
+ * rproc_set_rsc_table_on_attach().
*/
kfree(rproc->clean_table);

return 0;
}

-static int rproc_reset_rsc_table_on_stop(struct rproc *rproc)
-{
- /* A resource table was never retrieved, nothing to do here */
- if (!rproc->table_ptr)
- return 0;
-
- /*
- * If a cache table exists the remote processor was started by
- * the remoteproc core. That cache table should be used for
- * the rest of the shutdown process.
- */
- if (rproc->cached_table)
- goto out;
-
- /*
- * If we made it here the remote processor was started by another
- * entity and a cache table doesn't exist. As such make a copy of
- * the resource table currently used by the remote processor and
- * use that for the rest of the shutdown process. The memory
- * allocated here is free'd in rproc_shutdown().
- */
- rproc->cached_table = kmemdup(rproc->table_ptr,
- rproc->table_sz, GFP_KERNEL);
- if (!rproc->cached_table)
- return -ENOMEM;
-
- /*
- * Since the remote processor is being switched off the clean table
- * won't be needed. Allocated in rproc_set_rsc_table().
- */
- kfree(rproc->clean_table);
-
-out:
- /*
- * Use a copy of the resource table for the remainder of the
- * shutdown process.
- */
- rproc->table_ptr = rproc->cached_table;
- return 0;
-}
-
/*
* Attach to remote processor - similar to rproc_fw_boot() but without
* the steps that deal with the firmware image.
@@ -1614,7 +1622,7 @@ static int rproc_attach(struct rproc *rproc)
goto disable_iommu;
}

- ret = rproc_set_rsc_table(rproc);
+ ret = rproc_set_rsc_table_on_attach(rproc);
if (ret) {
dev_err(dev, "can't load resource table: %d\n", ret);
goto unprepare_device;
--
2.25.1