linux-remoteproc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: ohad@wizery.com, loic.pallardy@st.com, arnaud.pouliquen@st.com,
	s-anna@ti.com, linux-remoteproc@vger.kernel.org, corbet@lwn.net,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 03/14] remoteproc: Add new operation and flags for synchronistation
Date: Fri, 8 May 2020 15:01:23 -0600	[thread overview]
Message-ID: <20200508210123.GA5650@xps15> (raw)
In-Reply-To: <20200506002253.GC2329931@builder.lan>

On Tue, May 05, 2020 at 05:22:53PM -0700, Bjorn Andersson wrote:
> On Fri 24 Apr 13:01 PDT 2020, Mathieu Poirier wrote:
> 
> > Add a new sync_ops to support use cases where the remoteproc
> > core is synchronising with the remote processor.  Exactly when to use
> > the synchronisation operations is directed by the flags in structure
> > rproc_sync_flags.
> > 
> 
> I'm sorry, but no matter how many times I read these patches I have to
> translate "synchronising" to "remote controlled", and given the number
> of comments clarifying this makes me feel that we could perhaps come up
> with a better name?

"remote controlled" as in "someone else is managing the remote processor" ?  It
could also mean the remoteproc core is "remote controlling" the remote
processor, exactly what it currently does today...

How about "autonomous", as in the remote processor doesn't need us to boot or
switch it off.  I'm open to any other suggestions.

> 
> > Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> > ---
> >  include/linux/remoteproc.h | 24 ++++++++++++++++++++++++
> >  1 file changed, 24 insertions(+)
> > 
> > diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> > index ac4082f12e8b..ceb3b2bba824 100644
> > --- a/include/linux/remoteproc.h
> > +++ b/include/linux/remoteproc.h
> > @@ -353,6 +353,23 @@ enum rsc_handling_status {
> >  	RSC_IGNORED	= 1,
> >  };
> >  
> > +/**
> > + * struct rproc_sync_flags - platform specific flags indicating which
> > + *			      rproc_ops to use at specific times during
> > + *			      the rproc lifecycle.
> > + * @on_init: true if synchronising with the remote processor at
> > + *	     initialisation time
> > + * @after_stop: true if synchronising with the remote processor after it was
> > + *		stopped from the cmmand line
> > + * @after_crash: true if synchronising with the remote processor after
> > + *		 it has crashed
> > + */
> > +struct rproc_sync_flags {
> > +	bool on_init;
> 
> This indirectly splits the RPROC_OFFLINE state in an "offline" and
> "already-booted" state. Wouldn't it be clearer to represent this with a
> new RPROC_ALREADY_BOOTED state?
> 

I suggested that at some point in the past but it was in a different context.  I
will revisit to see how doing so could apply here.

> > +	bool after_stop;
> 
> What does it mean when this is true? That Linux can shut the remote core
> down, but someone else will start it?

It tells the remoteproc core how to interact with the remote processor after the
latter has been switched off.  For example, we could want to boot the remote
processor from the boot loader so that minimal functionality can be provided
while the kernel boots.  Once the kernel and user space are in place, the remote
processor is explicitly stopped and booted once again, but this time with a
firmware image that offers full functionality.

It could also be that the remoteproc core can stop the remote processor, but the
remote processor will automatically reboot itself.  In that case the remoteproc
core will simply synchronise with the remote processor, as it does when .on_init
== true.

> 
> > +	bool after_crash;
> 
> Similarly what is the expected steps to be taken by the core when this
> is true? Should rproc_report_crash() simply stop/start the subdevices
> and upon one of the ops somehow tell the remote controller that it can
> proceed with the recovery?

The exact same sequence of steps will be carried out as they are today, except
that if after_crash == true, the remoteproc core won't be switching the remote
processor on, exactly as it would do when on_init == true.

These flags are there to indicate how to set rproc::sync_with_rproc after
different events, that is when the remoteproc core boots, when the remoteproc
has been stopped or when it has crashed.

> 
> > +};
> > +
> >  /**
> >   * struct rproc_ops - platform-specific device handlers
> >   * @start:	power on the device and boot it
> > @@ -459,6 +476,9 @@ struct rproc_dump_segment {
> >   * @firmware: name of firmware file to be loaded
> >   * @priv: private data which belongs to the platform-specific rproc module
> >   * @ops: platform-specific start/stop rproc handlers
> > + * @sync_ops: platform-specific start/stop rproc handlers when
> > + *	      synchronising with a remote processor.
> > + * @sync_flags: Determine the rproc_ops to choose in specific states.
> >   * @dev: virtual device for refcounting and common remoteproc behavior
> >   * @power: refcount of users who need this rproc powered up
> >   * @state: state of the device
> > @@ -482,6 +502,7 @@ struct rproc_dump_segment {
> >   * @table_sz: size of @cached_table
> >   * @has_iommu: flag to indicate if remote processor is behind an MMU
> >   * @auto_boot: flag to indicate if remote processor should be auto-started
> > + * @sync_with_rproc: true if currently synchronising with the rproc
> >   * @dump_segments: list of segments in the firmware
> >   * @nb_vdev: number of vdev currently handled by rproc
> >   */
> > @@ -492,6 +513,8 @@ struct rproc {
> >  	const char *firmware;
> >  	void *priv;
> >  	struct rproc_ops *ops;
> > +	struct rproc_ops *sync_ops;
> 
> Do we really need two rproc_ops, given that both are coming from the
> platform driver and the sync_flags will define which one to look at?
> 
> Can't the platform driver just provide an ops table that works with the
> flags it passes?

That is the approach Loic took in a previous patchset [1] and that was rejected.
It also lead to all of the platform drivers testing rproc->flag before carring
different actions, something you indicated could be done in the core.  This
patch does exactly that, i.e move the testing of rproc->flag to the core and
calls the right function based on that.

The end result is the same and I'm happy with one or the other, I will need to
know which one.

The advantage with the approach I'm proposing is that everything is controlled
in the core, i.e what ops is called and when to set rproc->flag based on
different states the remote processor transitions through.

Thanks,
Mathieu


[1]. https://patchwork.kernel.org/patch/11265869/

> 
> Regards,
> Bjorn
> 
> > +	struct rproc_sync_flags sync_flags;
> >  	struct device dev;
> >  	atomic_t power;
> >  	unsigned int state;
> > @@ -515,6 +538,7 @@ struct rproc {
> >  	size_t table_sz;
> >  	bool has_iommu;
> >  	bool auto_boot;
> > +	bool sync_with_rproc;
> >  	struct list_head dump_segments;
> >  	int nb_vdev;
> >  	u8 elf_class;
> > -- 
> > 2.20.1
> > 

  reply	other threads:[~2020-05-08 21:01 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-24 20:01 [PATCH v3 00/14] remoteproc: Add support for synchronisaton with rproc Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 01/14] remoteproc: Make core operations optional Mathieu Poirier
2020-04-28 16:18   ` Arnaud POULIQUEN
2020-04-30 19:39     ` Mathieu Poirier
2020-05-05 22:16   ` Bjorn Andersson
2020-05-08 19:09     ` Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 02/14] remoteproc: Introduce function rproc_alloc_internals() Mathieu Poirier
2020-05-05 22:31   ` Bjorn Andersson
2020-05-08 19:37     ` Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 03/14] remoteproc: Add new operation and flags for synchronistation Mathieu Poirier
2020-04-28 16:38   ` Arnaud POULIQUEN
2020-04-30 19:49     ` Mathieu Poirier
2020-05-06  0:22   ` Bjorn Andersson
2020-05-08 21:01     ` Mathieu Poirier [this message]
2020-05-14  1:32       ` Bjorn Andersson
2020-05-15 19:24         ` Mathieu Poirier
2020-05-19  0:55           ` Bjorn Andersson
2020-05-20 22:06             ` Mathieu Poirier
2020-05-21  5:21               ` Bjorn Andersson
2020-05-21 21:55                 ` Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 04/14] remoteproc: Refactor function rproc_boot() Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 05/14] remoteproc: Refactor function rproc_fw_boot() Mathieu Poirier
2020-05-06  0:33   ` Bjorn Andersson
2020-05-08 21:27     ` Mathieu Poirier
2020-05-14  2:10       ` Bjorn Andersson
2020-05-15 19:46         ` Mathieu Poirier
2020-05-19  0:22           ` Bjorn Andersson
2020-04-24 20:01 ` [PATCH v3 06/14] remoteproc: Refactor function rproc_trigger_auto_boot() Mathieu Poirier
2020-04-28 17:00   ` Arnaud POULIQUEN
2020-04-24 20:01 ` [PATCH v3 07/14] remoteproc: Introducting new start and stop functions Mathieu Poirier
2020-05-06  0:42   ` Bjorn Andersson
2020-04-24 20:01 ` [PATCH v3 08/14] remoteproc: Call core functions based on synchronisation flag Mathieu Poirier
2020-04-28 17:27   ` Arnaud POULIQUEN
2020-04-30 19:57     ` Mathieu Poirier
2020-05-04 11:14       ` Arnaud POULIQUEN
2020-05-05 22:10         ` Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 09/14] remoteproc: Deal with synchronisation when crashing Mathieu Poirier
2020-04-29  7:44   ` Arnaud POULIQUEN
2020-04-30 20:11     ` Mathieu Poirier
2020-05-06  1:01   ` Bjorn Andersson
2020-05-08 21:47     ` Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 10/14] remoteproc: Deal with synchronisation when shutting down Mathieu Poirier
2020-04-29  8:19   ` Arnaud POULIQUEN
2020-04-30 20:23     ` Mathieu Poirier
2020-05-04 11:34       ` Arnaud POULIQUEN
2020-05-05 22:03         ` Mathieu Poirier
2020-05-06  7:51           ` Arnaud POULIQUEN
2020-05-06  1:10   ` Bjorn Andersson
2020-04-24 20:01 ` [PATCH v3 11/14] remoteproc: Deal with synchronisation when changing FW image Mathieu Poirier
2020-04-29  8:52   ` Arnaud POULIQUEN
2020-04-30 20:32     ` Mathieu Poirier
2020-05-06  1:27   ` Bjorn Andersson
2020-04-24 20:01 ` [PATCH v3 12/14] remoteproc: Introducing function rproc_set_state_machine() Mathieu Poirier
2020-04-29  9:22   ` Arnaud POULIQUEN
2020-04-29 14:38     ` Arnaud POULIQUEN
2020-04-30 20:51       ` Mathieu Poirier
2020-05-04 12:00         ` Arnaud POULIQUEN
2020-04-30 20:42     ` Mathieu Poirier
2020-05-04 11:57       ` Arnaud POULIQUEN
2020-05-05 21:43         ` Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 13/14] remoteproc: Document " Mathieu Poirier
2020-04-24 20:01 ` [PATCH v3 14/14] remoteproc: Expose synchronisation flags via debugfs Mathieu Poirier
2020-05-18 13:28 ` [PATCH v3 00/14] remoteproc: Add support for synchronisaton with rproc Peng Fan
2020-05-18 16:29   ` 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=20200508210123.GA5650@xps15 \
    --to=mathieu.poirier@linaro.org \
    --cc=arnaud.pouliquen@st.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=corbet@lwn.net \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=loic.pallardy@st.com \
    --cc=ohad@wizery.com \
    --cc=s-anna@ti.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 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).