All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suman Anna <s-anna@ti.com>
To: Mathieu Poirier <mathieu.poirier@linaro.org>
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, 9 Apr 2020 15:55:35 -0500	[thread overview]
Message-ID: <22ad887a-5758-8733-0afc-78dec913827d@ti.com> (raw)
In-Reply-To: <20200401212910.GE17383@xps15>

On 4/1/20 4:29 PM, Mathieu Poirier wrote:
> 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.
> 
> I fail to fully understand the situation you are describing - can you give me
> more information?

The platform driver has auto_boot set to false and sync_states set, so
rproc_trigger_auto_initiate() never gets called in rproc_add(), and
rproc_actuate() doesn't happen either. rproc->state is not RUNNING, and
you will bail out here, and there is no way to start it either.

> 
>>
>>>> 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.
>>
>>>> +		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?
> 
> Once again I fail to grasp the extent of your comment.  Can you be more specific
> about the "new conditions"?

rproc_can_shutdown() has three checks, where the first check is existing
check that got moved, and the other 2 are the new checks that deal with
the sync states. So, I meant these 2 new sync checks.

regards
Suman

> 
> Thanks
> Mathieu
> 
>>
>> regards
>> Suman
>>
>>>
>>> Thank you for taking the time to review this set,
>>> Mathieu
>>>

  reply	other threads:[~2020-04-09 20:55 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 [this message]
2020-04-02 20:42         ` Mathieu Poirier
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=22ad887a-5758-8733-0afc-78dec913827d@ti.com \
    --to=s-anna@ti.com \
    --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=mathieu.poirier@linaro.org \
    --cc=ohad@wizery.com \
    --cc=peng.fan@nxp.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.