linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Mathieu Poirier <mathieu.poirier@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 05/14] remoteproc: Refactor function rproc_fw_boot()
Date: Wed, 13 May 2020 19:10:55 -0700	[thread overview]
Message-ID: <20200514021055.GF16107@builder.lan> (raw)
In-Reply-To: <20200508212756.GB5650@xps15>

On Fri 08 May 14:27 PDT 2020, Mathieu Poirier wrote:

> On Tue, May 05, 2020 at 05:33:41PM -0700, Bjorn Andersson wrote:
> > On Fri 24 Apr 13:01 PDT 2020, Mathieu Poirier wrote:
> > 
> > > Refactor function rproc_fw_boot() in order to better reflect the work
> > > that is done when supporting scenarios where the remoteproc core is
> > > synchronising with a remote processor.
> > > 
> > > Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> > > ---
> > >  drivers/remoteproc/remoteproc_core.c | 10 ++++++----
> > >  1 file changed, 6 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
> > > index a02593b75bec..e90a21de9de1 100644
> > > --- a/drivers/remoteproc/remoteproc_core.c
> > > +++ b/drivers/remoteproc/remoteproc_core.c
> > > @@ -1370,9 +1370,9 @@ static int rproc_start(struct rproc *rproc, const struct firmware *fw)
> > >  }
> > >  
> > >  /*
> > > - * take a firmware and boot a remote processor with it.
> > > + * boot or synchronise with a remote processor.
> > >   */
> > > -static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
> > > +static int rproc_actuate_device(struct rproc *rproc, const struct firmware *fw)
> > 
> > Per patch 4 this function will if rproc_needs_syncing() be called with
> > fw == NULL, it's not obvious to me that the various operations on "fw"
> > in this function are valid anymore.
> 
> That is right, all firmware related operations in this function are found in
> remoteproc_internal.h where the value of rproc->sync_with_mcu is checked before
> moving forward. That allows us to avoid introducing a new function similar to
> rproc_fw_boot() but without firmware operations or peppering the code with if
> statements.
> 

As I wrote in my other reply, the two mechanisms seems to consist of the
following steps:

boot the core:
1) request firmware
2) prepare device
3) parse fw
4) handle resources
5) allocate carveouts
6) load segments
7) find resource table
8) prepare subdevices
9) power on
10) start subdevices

sync:
1) prepare device (?)
2) handle resources
3) allocate carveouts (?)
4) prepare subdevices
5) attach
6) start subdevices

Rather than relying on the state flag and missing ops will turn the
first list into the second list I conceptually prefer having two
separate functions that are easy to reason about.

But I haven't done any refactoring or implemented this, so in practice
the two might just be a lot of duplication(?)

> > 
> > >  {
> > >  	struct device *dev = &rproc->dev;
> > >  	const char *name = rproc->firmware;
> > > @@ -1382,7 +1382,9 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
> > >  	if (ret)
> > >  		return ret;
> > >  
> > > -	dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size);
> > > +	if (!rproc_needs_syncing(rproc))
> > 
> > Can't we make this check on fw, to make the relationship "if we where
> > passed a firmware object, we're going to load and boot that firmware"?
> 
> It can but I specifically decided to use rproc_needs_syncing() to be consistent
> with the rest of the patchset.  That way all we need to do is grep for
> rproc_needs_syncing to get all the places where a decision about synchronising
> with a remote processor is made.
> 

Conceptually we have a single "to sync or not to sync", but I think
we're invoking rproc_needs_syncing() 8 times during rproc_fw_boot() and
each of those operations may or may not do anything.

There are certain operations where I see it makes sense for a driver to
either implement or not, but I think that e.g. for a rproc in OFFLINE
state we should just require ops->start to be specified - because it
doesn't make sense to enter rproc_start() if ops->start is a nop.

Regards,
Bjorn

> > 
> > Regards,
> > Bjorn
> > 
> > > +		dev_info(dev, "Booting fw image %s, size %zd\n",
> > > +			 name, fw->size);
> > >  
> > >  	/*
> > >  	 * if enabling an IOMMU isn't relevant for this rproc, this is
> > > @@ -1818,7 +1820,7 @@ int rproc_boot(struct rproc *rproc)
> > >  		}
> > >  	}
> > >  
> > > -	ret = rproc_fw_boot(rproc, firmware_p);
> > > +	ret = rproc_actuate_device(rproc, firmware_p);
> > >  
> > >  	release_firmware(firmware_p);
> > >  
> > > -- 
> > > 2.20.1
> > > 

  reply	other threads:[~2020-05-14  2:12 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
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 [this message]
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=20200514021055.GF16107@builder.lan \
    --to=bjorn.andersson@linaro.org \
    --cc=arnaud.pouliquen@st.com \
    --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=mathieu.poirier@linaro.org \
    --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).