lkml.org 
[lkml]   [2020]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 09/15] remoteproc: Introduce function rproc_detach()
    Date
    Introduce function rproc_detach() to enable the remoteproc
    core to release the resources associated with a remote processor
    without stopping its operation.

    Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Reviewed-by: Peng Fan <peng.fan@nxp.com>
    ---
    drivers/remoteproc/remoteproc_core.c | 65 +++++++++++++++++++++++++++-
    include/linux/remoteproc.h | 1 +
    2 files changed, 65 insertions(+), 1 deletion(-)

    diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
    index 928b3f975798..f5adf05762e9 100644
    --- a/drivers/remoteproc/remoteproc_core.c
    +++ b/drivers/remoteproc/remoteproc_core.c
    @@ -1667,7 +1667,7 @@ static int rproc_stop(struct rproc *rproc, bool crashed)
    /*
    * __rproc_detach(): Does the opposite of rproc_attach()
    */
    -static int __maybe_unused __rproc_detach(struct rproc *rproc)
    +static int __rproc_detach(struct rproc *rproc)
    {
    struct device *dev = &rproc->dev;
    int ret;
    @@ -1910,6 +1910,69 @@ void rproc_shutdown(struct rproc *rproc)
    }
    EXPORT_SYMBOL(rproc_shutdown);

    +/**
    + * rproc_detach() - Detach the remote processor from the
    + * remoteproc core
    + *
    + * @rproc: the remote processor
    + *
    + * Detach a remote processor (previously attached to with rproc_actuate()).
    + *
    + * In case @rproc is still being used by an additional user(s), then
    + * this function will just decrement the power refcount and exit,
    + * without disconnecting the device.
    + *
    + * Function rproc_detach() calls __rproc_detach() in order to let a remote
    + * processor know that services provided by the application processor are
    + * no longer available. From there it should be possible to remove the
    + * platform driver and even power cycle the application processor (if the HW
    + * supports it) without needing to switch off the remote processor.
    + */
    +int rproc_detach(struct rproc *rproc)
    +{
    + struct device *dev = &rproc->dev;
    + int ret;
    +
    + ret = mutex_lock_interruptible(&rproc->lock);
    + if (ret) {
    + dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret);
    + return ret;
    + }
    +
    + if (rproc->state != RPROC_RUNNING && rproc->state != RPROC_ATTACHED) {
    + ret = -EPERM;
    + goto out;
    + }
    +
    + /* if the remote proc is still needed, bail out */
    + if (!atomic_dec_and_test(&rproc->power)) {
    + ret = -EBUSY;
    + goto out;
    + }
    +
    + ret = __rproc_detach(rproc);
    + if (ret) {
    + atomic_inc(&rproc->power);
    + goto out;
    + }
    +
    + /* clean up all acquired resources */
    + rproc_resource_cleanup(rproc);
    +
    + rproc_disable_iommu(rproc);
    +
    + /*
    + * Set the remote processor's table pointer to NULL. Since mapping
    + * of the resource table to a virtual address is done in the platform
    + * driver, unmapping should also be done there.
    + */
    + rproc->table_ptr = NULL;
    +out:
    + mutex_unlock(&rproc->lock);
    + return ret;
    +}
    +EXPORT_SYMBOL(rproc_detach);
    +
    /**
    * rproc_get_by_phandle() - find a remote processor by phandle
    * @phandle: phandle to the rproc
    diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
    index da15b77583d3..329c1c071dcf 100644
    --- a/include/linux/remoteproc.h
    +++ b/include/linux/remoteproc.h
    @@ -656,6 +656,7 @@ rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, size_t len,

    int rproc_boot(struct rproc *rproc);
    void rproc_shutdown(struct rproc *rproc);
    +int rproc_detach(struct rproc *rproc);
    int rproc_set_firmware(struct rproc *rproc, const char *fw_name);
    void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
    int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-11-26 22:09    [W:8.859 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site