linux-remoteproc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaud POULIQUEN <arnaud.pouliquen@st.com>
To: Mathieu Poirier <mathieu.poirier@linaro.org>,
	"ohad@wizery.com" <ohad@wizery.com>,
	"bjorn.andersson@linaro.org" <bjorn.andersson@linaro.org>
Cc: "linux-remoteproc@vger.kernel.org" <linux-remoteproc@vger.kernel.org>
Subject: Re: [RFC v2 13/14] remoteproc: Add automation flags
Date: Thu, 12 Nov 2020 14:56:20 +0100	[thread overview]
Message-ID: <498ebbb1-3a27-fe48-576c-25a0856f82f4@st.com> (raw)
In-Reply-To: <20201030195713.1366341-14-mathieu.poirier@linaro.org>

Hi Mathieu,

Thanks for initiating the discussion!

Waiting feedback from other, please find my feedback on our proposal below.

On 10/30/20 8:57 PM, Mathieu Poirier wrote:
> Adding flags to dictate how to handle a platform driver being removed
> or the remote processor crashing while in RPROC_ATTACHED state.
> 
> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
>  drivers/remoteproc/remoteproc_core.c | 25 +++++++++++++++++++++++++
>  include/linux/remoteproc.h           |  5 +++++
>  2 files changed, 30 insertions(+)
> 
> diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
> index 229fa2cad0bd..d024367c63e5 100644
> --- a/drivers/remoteproc/remoteproc_core.c
> +++ b/drivers/remoteproc/remoteproc_core.c
> @@ -2227,6 +2227,29 @@ static int rproc_alloc_ops(struct rproc *rproc, const struct rproc_ops *ops)
>  	return 0;
>  }
>  
> +static void rproc_set_automation_flags(struct rproc *rproc)
> +{
> +	struct device *dev = rproc->dev.parent;
> +	struct device_node *np = dev->of_node;
> +	bool core_reboot, remote_crash;
> +
> +	/*
> +	 * When function rproc_cdev_release() or rproc_del() are called and
> +	 * the remote processor has been attached to, it will be detached from
> +	 * (rather than turned off) if "autonomous_on_core_reboot" is specified
> +	 * in the DT.
> +	 */
> +	core_reboot = of_property_read_bool(np, "autonomous_on_core_reboot");
> +	rproc->autonomous_on_core_reboot = core_reboot;
> +
> +	/*
> +	 * When the remote processor crashes it will be detached from, and
> +	 * attached to, if "autonomous_on_remote_crash" is specified in the DT.
> +	 */
> +	remote_crash = of_property_read_bool(np, "autonomous_on_remote_crash");
> +	rproc->autonomous_on_core_reboot = core_reboot;
> +}
> +

I wonder if the naming is not too restrictive.

I think here we probably need first to identify the use cases we want to support
to determine which use cases should be addressed and deduce DT fields.

Please find my view below:

1) Attach to a remote processor on boot.
This is the "attach" you introduced in a previous series. I wonder here if a DT
field should not be introduce for platform which are not able to dynamically
determines the remote processor state. Something like "remote-boot-on" or
"autonomous-boot-on".

2) Detach from a remote processor on Linux kernel shutdown
Two possible actions: shutdown the remote processor or detach from it.
A DT field could be used to determine the expected behavior.

3) Linux core reboot on crash
Two possible actions: shutdown and restart the remote processor or
detach/re-attach from/to it.
Is same DT field than 2) can be used for this . Or should be determine by a
new sysfs recovery option [1]?

[1]
https://elixir.bootlin.com/linux/v5.10-rc2/source/drivers/remoteproc/remoteproc_sysfs.c#L45

4) The remote processor need to reboot on crash.
3 possible actions:
 - shutdown and restart the remote processor
 - detach and re-attach from/to it.
 - Just shutdown, as no recovery possible without a system reset.

5) Detach/re-attach on Linux suspend/resume
Perhaps better to manage this in platform drivers without a generic DT field?

If i try to apply this on the remote proc boot and shutdown sequences:

1) on remoteproc device add:
- Need to determine if the remote processor is already running:
   - started by another entity
   - Linux reboot after crash

2) On remoteproc device release.
- Need to determine if the remote processor need to be shutdown or detached:
   - Linux kernel crash
   - Linux kernel graceful shutdown with remote processor keeping ON.

3) On remote processor crash
- Need to determine if the remote processor will be restarted by an external
entity or by the remoteproc framework, or if simply not possible to recover
without a system reset.

Regarding these use cases here is an alternative proposal(inspired by regulator
framework):
- "remote-boot-on": determine on probe if the remoteproc firmware is already
booted. This field is optional, use by a platform driver which can not
determine the state of the remote processor. Could be dynamically updated by the
platform driver to manage Kernel crash...

- "remote-always-on": means that the detach has to be privileged on
shutdown. Need also to be managed by platform driver as it can be
compared to the remote processor current state.

- "remoteproc-crash-recovery": crash recovery mode:
   possible value: "SHUTDOWN", "DETACH", "DISABLED"


Regards,
Arnaud

>  /**
>   * rproc_alloc() - allocate a remote processor handle
>   * @dev: the underlying device
> @@ -2285,6 +2308,8 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,
>  	if (rproc_alloc_ops(rproc, ops))
>  		goto put_device;
>  
> +	rproc_set_automation_flags(rproc);
> +
>  	/* Assign a unique device index and name */
>  	rproc->index = ida_simple_get(&rproc_dev_index, 0, 0, GFP_KERNEL);
>  	if (rproc->index < 0) {
> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> index 71d4d4873164..9a6e79ef35d7 100644
> --- a/include/linux/remoteproc.h
> +++ b/include/linux/remoteproc.h
> @@ -516,6 +516,9 @@ struct rproc_dump_segment {
>   * @nb_vdev: number of vdev currently handled by rproc
>   * @char_dev: character device of the rproc
>   * @cdev_put_on_release: flag to indicate if remoteproc should be shutdown on @char_dev release
> + * @autonomous_on_core_reboot: true if the remote processor should be detached from
> + *			       (rather than turned off) when the remoteproc core
> + *			       goes away.
>   */
>  struct rproc {
>  	struct list_head node;
> @@ -554,6 +557,8 @@ struct rproc {
>  	u16 elf_machine;
>  	struct cdev cdev;
>  	bool cdev_put_on_release;
> +	bool autonomous_on_core_reboot	: 1,
> +	     autonomous_on_remote_crash	: 1;
>  };
>  
>  /**
> 

  parent reply	other threads:[~2020-11-12 13:56 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
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 [this message]
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=498ebbb1-3a27-fe48-576c-25a0856f82f4@st.com \
    --to=arnaud.pouliquen@st.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.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 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).