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