All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Arnaud POULIQUEN <arnaud.pouliquen@st.com>
Cc: "ohad@wizery.com" <ohad@wizery.com>,
	"bjorn.andersson@linaro.org" <bjorn.andersson@linaro.org>,
	"linux-remoteproc@vger.kernel.org"
	<linux-remoteproc@vger.kernel.org>
Subject: Re: [PATCH v2 08/14] remoteproc: Introduce function rproc_detach()
Date: Thu, 19 Nov 2020 16:40:42 -0700	[thread overview]
Message-ID: <20201119234042.GC4137289@xps15> (raw)
In-Reply-To: <807cebaa-2d64-401a-d673-8f40b919924e@st.com>

On Mon, Nov 09, 2020 at 10:05:35AM +0100, Arnaud POULIQUEN wrote:
> Hi Mathieu,
> 
> On 10/30/20 8:57 PM, Mathieu Poirier wrote:
> > 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 62e88ff65009..6b33a83960d2 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);
> 
> I'm not an IOMMU expert,so maybe this remark is not relevant...
> As IOMMU manage the access of the remote device to its memory,
> could this lead to a remote device crash?

Right - that is the kind of thing that tormented me when I wrote this set.  On
some system it might cause a crash but on others it is needed.  As such I
decided to include it in the detach() process and let people implement the
functionality should they need to.  We can remove it but it is guaranteed that
someone will post a patch to add it again.

Based on the scenario it may have to be something like rproc_detach_iommu().
Since we have no clue on what the requirements will be I decided to simply keep
the current call.  Let me know if you really disagree with my approach.

> 
> Regards,
> Arnaud
> 
> > +
> > +	/*
> > +	 * 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 3faff9bb4fb8..6713faab6959 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);
> >  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);
> >  int rproc_coredump_add_custom_segment(struct rproc *rproc,
> > 

  reply	other threads:[~2020-11-19 23:41 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-30 19:56 [PATCH v2 00/14] remoteproc: Add support for detaching from rproc Mathieu Poirier
2020-10-30 19:57 ` [PATCH v2 01/14] remoteproc: Re-check state in rproc_shutdown() Mathieu Poirier
2020-11-09  9:40   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 02/14] remoteproc: Remove useless check in rproc_del() Mathieu Poirier
2020-11-09  9:40   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 03/14] remoteproc: Add new RPROC_ATTACHED state Mathieu Poirier
2020-11-09  9:41   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 04/14] remoteproc: Properly represent the attached state Mathieu Poirier
2020-11-09  9:41   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 05/14] remoteproc: Properly deal with a kernel panic when attached Mathieu Poirier
2020-11-09  9:41   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 06/14] remoteproc: Add new detach() remoteproc operation Mathieu Poirier
2020-11-06 17:31   ` Arnaud POULIQUEN
2020-11-19 23:06     ` Mathieu Poirier
2020-10-30 19:57 ` [PATCH v2 07/14] remoteproc: Introduce function __rproc_detach() Mathieu Poirier
2020-11-06 17:43   ` Arnaud POULIQUEN
2020-11-19 23:27     ` Mathieu Poirier
2020-10-30 19:57 ` [PATCH v2 08/14] remoteproc: Introduce function rproc_detach() Mathieu Poirier
2020-11-09  9:05   ` Arnaud POULIQUEN
2020-11-19 23:40     ` Mathieu Poirier [this message]
2020-10-30 19:57 ` [PATCH v2 09/14] remoteproc: Rename function rproc_actuate() Mathieu Poirier
2020-11-09  9:41   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 10/14] remoteproc: Add return value to function rproc_shutdown() Mathieu Poirier
2020-11-09  9:14   ` Arnaud POULIQUEN
2020-11-19 23:46     ` Mathieu Poirier
2020-10-30 19:57 ` [PATCH v2 11/14] remoteproc: Properly deal with a stop request when attached Mathieu Poirier
2020-11-09  9:42   ` Arnaud POULIQUEN
2020-11-12 17:36   ` Arnaud POULIQUEN
2020-10-30 19:57 ` [PATCH v2 12/14] remoteproc: Properly deal with detach request Mathieu Poirier
2020-10-30 19:57 ` [RFC v2 13/14] remoteproc: Add automation flags Mathieu Poirier
2020-11-06 14:38   ` Arnaud POULIQUEN
2020-11-06 17:20     ` Mathieu Poirier
2020-11-12 13:56   ` Arnaud POULIQUEN
2020-11-13 21:27     ` Mathieu Poirier
2020-11-16 10:21       ` Arnaud POULIQUEN
2020-11-20 20:40         ` Mathieu Poirier
2020-10-30 19:57 ` [RFC v2 14/14] remoteproc: Refactor rproc delete and cdev release path Mathieu Poirier
2020-11-12 18:20 ` [PATCH v2 00/14] remoteproc: Add support for detaching from rproc Arnaud POULIQUEN
2020-11-12 18:41   ` Mathieu Poirier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201119234042.GC4137289@xps15 \
    --to=mathieu.poirier@linaro.org \
    --cc=arnaud.pouliquen@st.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=ohad@wizery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.