All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: ohad@wizery.com, bjorn.andersson@linaro.org, robh+dt@kernel.org
Cc: linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, arnaud.pouliquen@st.com
Subject: [PATCH v3 15/15] remoteproc: Refactor rproc delete and cdev release path
Date: Thu, 26 Nov 2020 14:06:42 -0700	[thread overview]
Message-ID: <20201126210642.897302-16-mathieu.poirier@linaro.org> (raw)
In-Reply-To: <20201126210642.897302-1-mathieu.poirier@linaro.org>

Refactor function rproc_del() and rproc_cdev_release() to take
into account the policy specified in the device tree.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
 drivers/remoteproc/remoteproc_cdev.c | 13 +++++++++++-
 drivers/remoteproc/remoteproc_core.c | 30 ++++++++++++++++++++++++++--
 include/linux/remoteproc.h           |  4 ++++
 3 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_cdev.c b/drivers/remoteproc/remoteproc_cdev.c
index f7645f289563..3dfe555dfc07 100644
--- a/drivers/remoteproc/remoteproc_cdev.c
+++ b/drivers/remoteproc/remoteproc_cdev.c
@@ -88,7 +88,18 @@ static int rproc_cdev_release(struct inode *inode, struct file *filp)
 {
 	struct rproc *rproc = container_of(inode->i_cdev, struct rproc, cdev);
 
-	if (rproc->cdev_put_on_release && rproc->state == RPROC_RUNNING)
+	if (!rproc->cdev_put_on_release)
+		return 0;
+
+	/*
+	 * The application has crashed or is releasing its file handle.  Detach
+	 * or shutdown the remote processor based on the policy specified in the
+	 * DT.  No need to check rproc->state right away, it will be done
+	 * in either rproc_detach() or rproc_shutdown().
+	 */
+	if (rproc->autonomous_on_core_shutdown)
+		rproc_detach(rproc);
+	else
 		rproc_shutdown(rproc);
 
 	return 0;
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 3d7d245edc4e..1a170103bf27 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -2294,6 +2294,22 @@ 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_shutdown;
+
+	/*
+	 * 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-shutdown is specified
+	 * in the DT.
+	 */
+	core_shutdown = of_property_read_bool(np, "autonomous-on-core-shutdown");
+	rproc->autonomous_on_core_shutdown = core_shutdown;
+}
+
 /**
  * rproc_alloc() - allocate a remote processor handle
  * @dev: the underlying device
@@ -2352,6 +2368,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) {
@@ -2435,8 +2453,16 @@ int rproc_del(struct rproc *rproc)
 	if (!rproc)
 		return -EINVAL;
 
-	/* TODO: make sure this works with rproc->power > 1 */
-	rproc_shutdown(rproc);
+	/*
+	 * TODO: make sure this works with rproc->power > 1
+	 *
+	 * No need to check rproc->state right away, it will be done in either
+	 * rproc_detach() or rproc_shutdown().
+	 */
+	if (rproc->autonomous_on_core_shutdown)
+		rproc_detach(rproc);
+	else
+		rproc_shutdown(rproc);
 
 	mutex_lock(&rproc->lock);
 	rproc->state = RPROC_DELETED;
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 02312096d59f..5702f630d810 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_shutdown: 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,7 @@ struct rproc {
 	u16 elf_machine;
 	struct cdev cdev;
 	bool cdev_put_on_release;
+	bool autonomous_on_core_shutdown;
 };
 
 /**
-- 
2.25.1


  parent reply	other threads:[~2020-11-26 21:07 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-26 21:06 [PATCH v3 00/15] remoteproc: Add support for detaching from rproc Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 01/15] dt-bindings: remoteproc: Add bindind to support autonomous processors Mathieu Poirier
2020-11-30 17:23   ` Rob Herring
2020-11-30 17:33   ` Rob Herring
2020-12-01 23:43     ` Mathieu Poirier
2020-12-10 23:10       ` Rob Herring
2020-11-26 21:06 ` [PATCH v3 02/15] remoteproc: Re-check state in rproc_shutdown() Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 03/15] remoteproc: Remove useless check in rproc_del() Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 04/15] remoteproc: Add new RPROC_ATTACHED state Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 05/15] remoteproc: Properly represent the attached state Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 06/15] remoteproc: Properly deal with a kernel panic when attached Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 07/15] remoteproc: Add new detach() remoteproc operation Mathieu Poirier
2020-12-02 18:13   ` Arnaud POULIQUEN
2020-11-26 21:06 ` [PATCH v3 08/15] remoteproc: Introduce function __rproc_detach() Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 09/15] remoteproc: Introduce function rproc_detach() Mathieu Poirier
2020-12-08 18:35   ` Arnaud POULIQUEN
2020-12-08 20:25     ` Mathieu Poirier
2020-12-09  0:53     ` Mathieu Poirier
2020-12-09  8:45       ` Arnaud POULIQUEN
2020-12-09 21:18         ` Mathieu Poirier
2020-12-10  8:51           ` Arnaud POULIQUEN
2020-11-26 21:06 ` [PATCH v3 10/15] remoteproc: Rename function rproc_actuate() Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 11/15] remoteproc: Add return value to function rproc_shutdown() Mathieu Poirier
2020-12-02 18:14   ` Arnaud POULIQUEN
2020-11-26 21:06 ` [PATCH v3 12/15] remoteproc: Properly deal with a stop request when attached Mathieu Poirier
2020-11-26 21:06 ` [PATCH v3 13/15] remoteproc: Properly deal with a start " Mathieu Poirier
2020-12-02 18:14   ` Arnaud POULIQUEN
2020-11-26 21:06 ` [PATCH v3 14/15] remoteproc: Properly deal with detach request Mathieu Poirier
2020-12-09  8:47   ` Arnaud POULIQUEN
2020-11-26 21:06 ` Mathieu Poirier [this message]
2020-12-09 10:13   ` [PATCH v3 15/15] remoteproc: Refactor rproc delete and cdev release path Arnaud POULIQUEN
2020-12-09 21:34     ` 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=20201126210642.897302-16-mathieu.poirier@linaro.org \
    --to=mathieu.poirier@linaro.org \
    --cc=arnaud.pouliquen@st.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=devicetree@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=ohad@wizery.com \
    --cc=robh+dt@kernel.org \
    /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.