From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Suman Anna <s-anna@ti.com>
Cc: Loic PALLARDY <loic.pallardy@st.com>,
"bjorn.andersson@linaro.org" <bjorn.andersson@linaro.org>,
"ohad@wizery.com" <ohad@wizery.com>,
"peng.fan@nxp.com" <peng.fan@nxp.com>,
Arnaud POULIQUEN <arnaud.pouliquen@st.com>,
Fabien DESSENNE <fabien.dessenne@st.com>,
"linux-remoteproc@vger.kernel.org"
<linux-remoteproc@vger.kernel.org>
Subject: Re: [PATCH v2 16/17] remoteproc: Correctly deal with MCU synchronisation when changing state
Date: Thu, 2 Apr 2020 14:42:31 -0600 [thread overview]
Message-ID: <20200402204231.GC9160@xps15> (raw)
In-Reply-To: <5223cca7-5409-a113-8a7f-9f6923231353@ti.com>
Hi Suman,
On Tue, Mar 31, 2020 at 05:35:58PM -0500, Suman Anna wrote:
> Hi Mathieu,
>
> On 3/30/20 6:49 PM, Mathieu Poirier wrote:
> > On Fri, Mar 27, 2020 at 02:04:36PM +0000, Loic PALLARDY wrote:
> >>
> >>
> >>> -----Original Message-----
> >>> From: Mathieu Poirier <mathieu.poirier@linaro.org>
> >>> Sent: mardi 24 mars 2020 22:46
> >>> To: bjorn.andersson@linaro.org
> >>> Cc: ohad@wizery.com; Loic PALLARDY <loic.pallardy@st.com>; s-
> >>> anna@ti.com; peng.fan@nxp.com; Arnaud POULIQUEN
> >>> <arnaud.pouliquen@st.com>; Fabien DESSENNE
> >>> <fabien.dessenne@st.com>; linux-remoteproc@vger.kernel.org
> >>> Subject: [PATCH v2 16/17] remoteproc: Correctly deal with MCU
> >>> synchronisation when changing state
> >>>
> >>> This patch deals with state changes when synchronising with an MCU. More
> >>> specifically it prevents the MCU from being started if it already has been
> >>> started by another entity. Similarly it prevents the AP from stopping the
> >>> MCU if it hasn't been given the capability by platform firmware.
> >>>
> >>> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> >>> ---
> >>> drivers/remoteproc/remoteproc_sysfs.c | 32
> >>> ++++++++++++++++++++++++++-
> >>> 1 file changed, 31 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/drivers/remoteproc/remoteproc_sysfs.c
> >>> b/drivers/remoteproc/remoteproc_sysfs.c
> >>> index 4956577ad4b4..741a3c152b82 100644
> >>> --- a/drivers/remoteproc/remoteproc_sysfs.c
> >>> +++ b/drivers/remoteproc/remoteproc_sysfs.c
> >>> @@ -108,6 +108,29 @@ static ssize_t state_show(struct device *dev, struct
> >>> device_attribute *attr,
> >>> return sprintf(buf, "%s\n", rproc_state_string[state]);
> >>> }
> >>>
> >>> +static int rproc_can_shutdown(struct rproc *rproc)
> >>> +{
> >>> + /* The MCU is not running, obviously an invalid operation. */
> >>> + if (rproc->state != RPROC_RUNNING)
> >>> + return false;
> >>> +
> >>> + /*
> >>> + * The MCU is not running (see above) and the remoteproc core is
> >>> the
> >>> + * lifecycle manager, no problem calling for a shutdown.
> >>> + */
> >>> + if (!rproc_sync_with_mcu(rproc))
> >>> + return true;
> >>> +
> >>> + /*
> >>> + * The MCU has been loaded by another entity (see above) and the
> >>> + * platform code has _not_ given us the capability of stopping it.
> >>> + */
> >>> + if (!rproc->sync_ops->stop)
> >>> + return false;
> >>
> >> Test could be simplified
> >> if (rproc_sync_with_mcu(rproc)) && !rproc->sync_ops->stop)
> >> return false;
> >
> > I laid out the test individually on purpose. That way there is no coupling
> > between conditions, it is plane to see what is going on and remains maintainable
> > as we add new tests.
> >
> >>
> >>> +
> >>> + return true;
> >>> +}
> >>> +
> >>> /* Change remote processor state via sysfs */
> >>> static ssize_t state_store(struct device *dev,
> >>> struct device_attribute *attr,
> >>> @@ -120,11 +143,18 @@ static ssize_t state_store(struct device *dev,
> >>> if (rproc->state == RPROC_RUNNING)
> >>> return -EBUSY;
> >>>
> >>> + /*
> >>> + * In synchronisation mode, booting the MCU is the
> >>> + * responsibility of an external entity.
> >>> + */
> >>> + if (rproc_sync_with_mcu(rproc))
> >>> + return -EINVAL;
> >>> +
> >> I don't understand this restriction, simply because it is preventing to resynchronize with a
> >> coprocessor after a "stop".
>
> There's actually one more scenario even without "stop". If auto_boot is
> set to false, then rproc_actuate will never get called.
>
> >> In the following configuration which can be configuration for coprocessor with romed/flashed
> >> firmware (no reload needed):
> >> on_init = true
> >> after_stop = true
> >> after_crash = true
> >> Once you stop it via sysfs interface, you can't anymore restart/resync to it.
> >
> > Very true. The MCU will get restarted by another entity but the AP won't
> > synchronise with it. I need more time to think about the best way to deal with
> > this and may have to get back to you for further discussions.
> >
> >>
> >> I think it will be better to modify rproc_boot() to take into account rproc_sync_with_mcu()
> >> as below:
> >>
> >> int rproc_boot(struct rproc *rproc)
> >> {
> >> - const struct firmware *firmware_p;
> >> + const struct firmware *firmware_p = NULL;
> >> struct device *dev = &rproc->dev;
> >> int ret;
> >>
> >> if (!rproc) {
> >> pr_err("invalid rproc handle\n");
> >> return -EINVAL;
> >> }
> >>
> >> /* load firmware */
> >> - ret = request_firmware(&firmware_p, rproc->firmware, dev);
> >> - if (ret < 0) {
> >> - dev_err(dev, "request_firmware failed: %d\n", ret);
> >> - return ret;
> >> + if (!rproc_sync_with_mcu(rproc)) {
>
> I guess this is what the original skip_fw_load was doing. And with the
> current series, the userspace loading support usecase I have cannot be
> achieved. If this is added back, I can try if that works for my usecases.
I didn't notice this comment upon first read... Can you give me more details on
what your usecase is order to see how best to deal with it?
Thanks,
Mathieu
>
> >> + ret = request_firmware(&firmware_p, rproc->firmware, dev);
> >> + if (ret < 0) {
> >> + dev_err(dev, "request_firmware failed: %d\n", ret);
> >> + return ret;
> >> + }
> >> }
> >>
> >> ret = rproc_actuate(rproc, firmware_p);
> >>
> >> - release_firmware(firmware_p);
> >> + if (firmware_p)
> >> + release_firmware(firmware_p);
> >>
> >> return ret;
> >> }
> >>
> >> Thanks to these modifications, I'm able to resync after a stop with coprocessor without reloading firmware.
> >>
> >>> ret = rproc_boot(rproc);
> >>> if (ret)
> >>> dev_err(&rproc->dev, "Boot failed: %d\n", ret);
> >>> } else if (sysfs_streq(buf, "stop")) {
> >>> - if (rproc->state != RPROC_RUNNING)
> >>> + if (!rproc_can_shutdown(rproc))
> >>> return -EINVAL;
> >>>
> >>> rproc_shutdown(rproc);
> >> As rproc shutdown is also accessible as kernel API, I propose to move
> >> rproc_can_shutdown() check inside rproc_shutdown() and to test
> >> returned error
> >
> > Ah yes, it is public... As you point out, I think we'll need to move
> > rproc_can_shutdown() in rproc_shutdown().
>
> I am assuming only the new conditions, right?
>
> regards
> Suman
>
> >
> > Thank you for taking the time to review this set,
> > Mathieu
> >
next prev parent reply other threads:[~2020-04-02 20:42 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-24 21:45 [PATCH v2 00/17] remoteproc: Add support for synchronisation with MCU Mathieu Poirier
2020-03-24 21:45 ` [PATCH v2 01/17] remoteproc: Add new operation and state machine for MCU synchronisation Mathieu Poirier
2020-03-30 22:46 ` Suman Anna
2020-03-30 22:49 ` Suman Anna
2020-04-01 21:53 ` Mathieu Poirier
2020-04-09 21:38 ` Suman Anna
2020-04-09 21:38 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 02/17] remoteproc: Introduce function rproc_set_mcu_sync_state() Mathieu Poirier
2020-03-30 22:55 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 03/17] remoteproc: Split firmware name allocation from rproc_alloc() Mathieu Poirier
2020-03-27 11:05 ` Loic PALLARDY
2020-03-30 19:47 ` Suman Anna
2020-04-01 21:58 ` Mathieu Poirier
2020-03-24 21:45 ` [PATCH v2 04/17] remoteproc: Split rproc_ops " Mathieu Poirier
2020-03-30 19:54 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 05/17] remoteproc: Get rid of tedious error path Mathieu Poirier
2020-03-30 20:31 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 06/17] remoteproc: Introduce function rproc_alloc_internals() Mathieu Poirier
2020-03-27 11:10 ` Loic PALLARDY
2020-03-30 20:38 ` Suman Anna
2020-04-01 20:29 ` Mathieu Poirier
2020-04-09 21:53 ` Suman Anna
2020-03-30 23:07 ` Mathieu Poirier
2020-03-24 21:45 ` [PATCH v2 07/17] remoteproc: Introduce function rproc_alloc_state_machine() Mathieu Poirier
2020-03-27 13:12 ` Loic PALLARDY
2020-03-30 23:10 ` Suman Anna
2020-04-01 20:41 ` Mathieu Poirier
2020-04-09 18:35 ` Suman Anna
2020-03-30 23:13 ` Mathieu Poirier
2020-03-24 21:45 ` [PATCH v2 08/17] remoteproc: Allocate synchronisation state machine Mathieu Poirier
2020-03-27 13:47 ` Loic PALLARDY
2020-03-30 23:16 ` Mathieu Poirier
2020-03-30 23:20 ` Suman Anna
2020-04-01 20:46 ` Mathieu Poirier
2020-03-24 21:45 ` [PATCH v2 09/17] remoteproc: Call the right core function based on synchronisation state Mathieu Poirier
2020-03-31 15:10 ` Suman Anna
2020-04-02 20:16 ` Mathieu Poirier
2020-04-09 18:48 ` Suman Anna
2020-04-09 18:48 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 10/17] remoteproc: Decouple firmware load and remoteproc booting Mathieu Poirier
2020-03-31 21:27 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 11/17] remoteproc: Repurpose function rproc_trigger_auto_boot() Mathieu Poirier
2020-03-31 21:32 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 12/17] remoteproc: Rename function rproc_fw_boot() Mathieu Poirier
2020-03-31 21:42 ` Suman Anna
2020-03-24 21:45 ` [PATCH v2 13/17] remoteproc: Introducting new functions to start and stop an MCU Mathieu Poirier
2020-03-31 18:08 ` Suman Anna
2020-03-31 21:46 ` Suman Anna
2020-04-01 21:55 ` Mathieu Poirier
2020-03-24 21:46 ` [PATCH v2 14/17] remoteproc: Refactor function rproc_trigger_recovery() Mathieu Poirier
2020-03-31 21:52 ` Suman Anna
2020-04-02 20:35 ` Mathieu Poirier
2020-04-09 19:02 ` Suman Anna
2020-04-09 19:02 ` Suman Anna
2020-03-24 21:46 ` [PATCH v2 15/17] remoteproc: Correctly deal with MCU synchronisation when changing FW image Mathieu Poirier
2020-03-27 13:50 ` Loic PALLARDY
2020-03-30 23:21 ` Mathieu Poirier
2020-03-31 22:14 ` Suman Anna
2020-04-01 20:55 ` Mathieu Poirier
2020-04-22 21:29 ` Mathieu Poirier
2020-04-22 22:56 ` Suman Anna
2020-03-24 21:46 ` [PATCH v2 16/17] remoteproc: Correctly deal with MCU synchronisation when changing state Mathieu Poirier
2020-03-27 14:04 ` Loic PALLARDY
2020-03-30 23:49 ` Mathieu Poirier
2020-03-31 22:35 ` Suman Anna
2020-04-01 21:29 ` Mathieu Poirier
2020-04-09 20:55 ` Suman Anna
2020-04-02 20:42 ` Mathieu Poirier [this message]
2020-04-09 20:40 ` Suman Anna
2020-03-24 21:46 ` [PATCH v2 17/17] remoteproc: Make MCU synchronisation state changes on stop and crashed Mathieu Poirier
2020-03-27 17:20 ` [PATCH v2 00/17] remoteproc: Add support for synchronisation with MCU Loic PALLARDY
2020-03-31 22:51 ` Suman Anna
2020-04-01 21:39 ` 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=20200402204231.GC9160@xps15 \
--to=mathieu.poirier@linaro.org \
--cc=arnaud.pouliquen@st.com \
--cc=bjorn.andersson@linaro.org \
--cc=fabien.dessenne@st.com \
--cc=linux-remoteproc@vger.kernel.org \
--cc=loic.pallardy@st.com \
--cc=ohad@wizery.com \
--cc=peng.fan@nxp.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 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.