All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Richard Genoud <richard.genoud@bootlin.com>
Cc: "Bjorn Andersson" <andersson@kernel.org>,
	"Philipp Zabel" <p.zabel@pengutronix.de>,
	"Suman Anna" <s-anna@ti.com>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
	"Udit Kumar" <u-kumar1@ti.com>,
	"Thomas Richard" <thomas.richard@bootlin.com>,
	"Gregory CLEMENT" <gregory.clement@bootlin.com>,
	"Hari Nagalla" <hnagalla@ti.com>,
	"Théo Lebrun" <theo.lebrun@bootlin.com>,
	linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 4/4] remoteproc: k3-r5: support for graceful stop of remote cores
Date: Fri, 28 Jun 2024 15:20:20 -0600	[thread overview]
Message-ID: <Zn8pFIGu2mYNP8vO@p14s> (raw)
In-Reply-To: <20240621150058.319524-5-richard.genoud@bootlin.com>

On Fri, Jun 21, 2024 at 05:00:58PM +0200, Richard Genoud wrote:
> Introduce software IPC handshake between the K3-R5 remote proc driver
> and the R5 MCU to gracefully stop/reset the remote core.
> 
> Upon a stop request, K3-R5 remote proc driver sends a RP_MBOX_SHUTDOWN
> mailbox message to the remote R5 core.
> The remote core is expected to:
> - relinquish all the resources acquired through Device Manager (DM)
> - disable its interrupts
> - send back a mailbox acknowledgment RP_MBOX_SHUDOWN_ACK
> - enter WFI state.
> 
> Meanwhile, the K3-R5 remote proc driver does:
> - wait for the RP_MBOX_SHUTDOWN_ACK from the remote core
> - wait for the remote proc to enter WFI state
> - reset the remote core through device manager
> 
> Based on work from: Hari Nagalla <hnagalla@ti.com>
>

Why is this needed now and what happens to system with a new kernel driver and
an older K3R5 firmware?

Thanks,
Mathieu

> Signed-off-by: Richard Genoud <richard.genoud@bootlin.com>
> ---
>  drivers/remoteproc/omap_remoteproc.h     |  9 +++++-
>  drivers/remoteproc/ti_k3_r5_remoteproc.c | 40 ++++++++++++++++++++++++
>  2 files changed, 48 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/remoteproc/omap_remoteproc.h b/drivers/remoteproc/omap_remoteproc.h
> index 828e13256c02..c008f11fa2a4 100644
> --- a/drivers/remoteproc/omap_remoteproc.h
> +++ b/drivers/remoteproc/omap_remoteproc.h
> @@ -42,6 +42,11 @@
>   * @RP_MBOX_SUSPEND_CANCEL: a cancel suspend response from a remote processor
>   * on a suspend request
>   *
> + * @RP_MBOX_SHUTDOWN: shutdown request for the remote processor
> + *
> + * @RP_MBOX_SHUTDOWN_ACK: successful response from remote processor for a
> + * shutdown request. The remote processor should be in WFI state short after.
> + *
>   * Introduce new message definitions if any here.
>   *
>   * @RP_MBOX_END_MSG: Indicates end of known/defined messages from remote core
> @@ -59,7 +64,9 @@ enum omap_rp_mbox_messages {
>  	RP_MBOX_SUSPEND_SYSTEM	= 0xFFFFFF11,
>  	RP_MBOX_SUSPEND_ACK	= 0xFFFFFF12,
>  	RP_MBOX_SUSPEND_CANCEL	= 0xFFFFFF13,
> -	RP_MBOX_END_MSG		= 0xFFFFFF14,
> +	RP_MBOX_SHUTDOWN	= 0xFFFFFF14,
> +	RP_MBOX_SHUTDOWN_ACK	= 0xFFFFFF15,
> +	RP_MBOX_END_MSG		= 0xFFFFFF16,
>  };
>  
>  #endif /* _OMAP_RPMSG_H */
> diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c
> index a2ead87952c7..918a15e1dd9a 100644
> --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c
> +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c
> @@ -21,6 +21,7 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/remoteproc.h>
>  #include <linux/suspend.h>
> +#include <linux/iopoll.h>
>  #include <linux/reset.h>
>  #include <linux/slab.h>
>  
> @@ -172,8 +173,23 @@ struct k3_r5_rproc {
>  	struct k3_r5_core *core;
>  	struct k3_r5_mem *rmem;
>  	int num_rmems;
> +	struct completion shutdown_complete;
>  };
>  
> +/*
> + * This will return true if the remote core is in Wait For Interrupt state.
> + */
> +static bool k3_r5_is_core_in_wfi(struct k3_r5_core *core)
> +{
> +	int ret;
> +	u64 boot_vec;
> +	u32 cfg, ctrl, stat;
> +
> +	ret = ti_sci_proc_get_status(core->tsp, &boot_vec, &cfg, &ctrl, &stat);
> +
> +	return !ret ? !!(stat & PROC_BOOT_STATUS_FLAG_R5_WFI) : false;
> +}
> +
>  /**
>   * k3_r5_rproc_mbox_callback() - inbound mailbox message handler
>   * @client: mailbox client pointer used for requesting the mailbox channel
> @@ -209,6 +225,10 @@ static void k3_r5_rproc_mbox_callback(struct mbox_client *client, void *data)
>  	case RP_MBOX_ECHO_REPLY:
>  		dev_info(dev, "received echo reply from %s\n", name);
>  		break;
> +	case RP_MBOX_SHUTDOWN_ACK:
> +		dev_dbg(dev, "received shutdown_ack from %s\n", name);
> +		complete(&kproc->shutdown_complete);
> +		break;
>  	default:
>  		/* silently handle all other valid messages */
>  		if (msg >= RP_MBOX_READY && msg < RP_MBOX_END_MSG)
> @@ -634,6 +654,7 @@ static int k3_r5_rproc_stop(struct rproc *rproc)
>  	struct k3_r5_cluster *cluster = kproc->cluster;
>  	struct device *dev = kproc->dev;
>  	struct k3_r5_core *core1, *core = kproc->core;
> +	bool wfi;
>  	int ret;
>  
>  
> @@ -650,6 +671,24 @@ static int k3_r5_rproc_stop(struct rproc *rproc)
>  		}
>  	}
>  
> +	/* Send SHUTDOWN message to remote proc */
> +	reinit_completion(&kproc->shutdown_complete);
> +	ret = mbox_send_message(kproc->mbox, (void *)RP_MBOX_SHUTDOWN);
> +	if (ret < 0) {
> +		dev_err(dev, "Sending SHUTDOWN message failed: %d. Halting core anyway.\n", ret);
> +	} else {
> +		ret = wait_for_completion_timeout(&kproc->shutdown_complete,
> +						  msecs_to_jiffies(1000));
> +		if (ret == 0) {
> +			dev_err(dev, "Timeout waiting SHUTDOWN_ACK message. Halting core anyway.\n");
> +		} else {
> +			ret = readx_poll_timeout(k3_r5_is_core_in_wfi, core,
> +						 wfi, wfi, 200, 2000);
> +			if (ret)
> +				dev_err(dev, "Timeout waiting for remote proc to be in WFI state. Halting core anyway.\n");
> +		}
> +	}
> +
>  	/* halt all applicable cores */
>  	if (cluster->mode == CLUSTER_MODE_LOCKSTEP) {
>  		list_for_each_entry(core, &cluster->cores, elem) {
> @@ -1410,6 +1449,7 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)
>  			goto err_config;
>  		}
>  
> +		init_completion(&kproc->shutdown_complete);
>  init_rmem:
>  		k3_r5_adjust_tcm_sizes(kproc);
>  

  reply	other threads:[~2024-06-28 21:20 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-21 15:00 [PATCH 0/4] remoteproc: k3-r5: Introduce suspend to ram support Richard Genoud
2024-06-21 15:00 ` [PATCH 1/4] remoteproc: k3-r5: Fix IPC-only mode detection Richard Genoud
2024-06-28 19:53   ` Mathieu Poirier
2024-06-28 19:58     ` Mathieu Poirier
2024-07-01  9:13       ` Hari Nagalla
2024-07-01 16:38         ` Mathieu Poirier
2024-06-21 15:00 ` [PATCH 2/4] remoteproc: k3-r5: Introduce PM suspend/resume handlers Richard Genoud
2024-06-28 20:48   ` Mathieu Poirier
2024-07-01  7:30     ` Richard GENOUD
2024-07-01 19:02   ` kernel test robot
2024-06-21 15:00 ` [PATCH 3/4] remoteproc: k3-r5: k3_r5_rproc_stop: code reorder Richard Genoud
2024-06-28 21:18   ` Mathieu Poirier
2024-07-01  8:03     ` Richard GENOUD
2024-07-01 16:35       ` Mathieu Poirier
2024-07-01 16:49         ` Richard GENOUD
2024-06-21 15:00 ` [PATCH 4/4] remoteproc: k3-r5: support for graceful stop of remote cores Richard Genoud
2024-06-28 21:20   ` Mathieu Poirier [this message]
2024-07-01 16:38     ` Richard GENOUD
2024-06-28 22:50   ` Andrew Davis
2024-07-01 16:48     ` Richard GENOUD
2024-07-01 21:55   ` kernel test robot
2024-06-28 21:23 ` [PATCH 0/4] remoteproc: k3-r5: Introduce suspend to ram support Mathieu Poirier
2024-07-01  9:59 ` Hari Nagalla
2024-07-08  7:33   ` Richard GENOUD

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=Zn8pFIGu2mYNP8vO@p14s \
    --to=mathieu.poirier@linaro.org \
    --cc=alexandre.belloni@bootlin.com \
    --cc=andersson@kernel.org \
    --cc=gregory.clement@bootlin.com \
    --cc=hnagalla@ti.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=p.zabel@pengutronix.de \
    --cc=richard.genoud@bootlin.com \
    --cc=s-anna@ti.com \
    --cc=theo.lebrun@bootlin.com \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=thomas.richard@bootlin.com \
    --cc=u-kumar1@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.