remoteproc: Add recovery configuration to the sysfs interface
authorRishabh Bhatnagar <rishabhb@codeaurora.org>
Fri, 2 Oct 2020 18:09:04 +0000 (11:09 -0700)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Wed, 14 Oct 2020 00:22:51 +0000 (19:22 -0500)
Add recovery configuration to the sysfs interface. This will
allow usage of this configuration feature in production
devices where access to debugfs might be limited.

Signed-off-by: Rishabh Bhatnagar <rishabhb@codeaurora.org>
Link: https://lore.kernel.org/r/1601662144-5964-4-git-send-email-rishabhb@codeaurora.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Documentation/ABI/testing/sysfs-class-remoteproc
drivers/remoteproc/remoteproc_sysfs.c

index 050bd25aaa1508d20fa28e701265f4d38e92d586..066b9b6f4924d76b8b116684dd8def5f030d7beb 100644 (file)
@@ -82,3 +82,23 @@ Description: Remote processor coredump configuration
                processor's device memory. Extra buffer will not be used to
                copy the dump. Also recovery process will not proceed until
                all data is read by usersapce.
+
+What:          /sys/class/remoteproc/.../recovery
+Date:          July 2020
+Contact:       Bjorn Andersson <bjorn.andersson@linaro.org>, Ohad Ben-Cohen <ohad@wizery.com>
+Description:   Remote processor recovery mechanism
+
+               Reports the recovery mechanism of the remote processor,
+               which will be one of:
+
+               "enabled"
+               "disabled"
+
+               "enabled" means, the remote processor will be automatically
+               recovered whenever it crashes. Moreover, if the remote
+               processor crashes while recovery is disabled, it will
+               be automatically recovered too as soon as recovery is enabled.
+
+               "disabled" means, a remote processor will remain in a crashed
+               state if it crashes. This is useful for debugging purposes;
+               without it, debugging a crash is substantially harder.
index 85002715c3ea93f1565a9f707529edaf2e600428..d1cf7bf277c446fd94f58799919be93b877c96b9 100644 (file)
 
 #define to_rproc(d) container_of(d, struct rproc, dev)
 
+static ssize_t recovery_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
+{
+       struct rproc *rproc = to_rproc(dev);
+
+       return sprintf(buf, "%s", rproc->recovery_disabled ? "disabled\n" : "enabled\n");
+}
+
+/*
+ * By writing to the 'recovery' sysfs entry, we control the behavior of the
+ * recovery mechanism dynamically. The default value of this entry is "enabled".
+ *
+ * The 'recovery' sysfs entry supports these commands:
+ *
+ * enabled:    When enabled, the remote processor will be automatically
+ *             recovered whenever it crashes. Moreover, if the remote
+ *             processor crashes while recovery is disabled, it will
+ *             be automatically recovered too as soon as recovery is enabled.
+ *
+ * disabled:   When disabled, a remote processor will remain in a crashed
+ *             state if it crashes. This is useful for debugging purposes;
+ *             without it, debugging a crash is substantially harder.
+ *
+ * recover:    This function will trigger an immediate recovery if the
+ *             remote processor is in a crashed state, without changing
+ *             or checking the recovery state (enabled/disabled).
+ *             This is useful during debugging sessions, when one expects
+ *             additional crashes to happen after enabling recovery. In this
+ *             case, enabling recovery will make it hard to debug subsequent
+ *             crashes, so it's recommended to keep recovery disabled, and
+ *             instead use the "recover" command as needed.
+ */
+static ssize_t recovery_store(struct device *dev,
+                             struct device_attribute *attr,
+                             const char *buf, size_t count)
+{
+       struct rproc *rproc = to_rproc(dev);
+
+       if (sysfs_streq(buf, "enabled")) {
+               /* change the flag and begin the recovery process if needed */
+               rproc->recovery_disabled = false;
+               rproc_trigger_recovery(rproc);
+       } else if (sysfs_streq(buf, "disabled")) {
+               rproc->recovery_disabled = true;
+       } else if (sysfs_streq(buf, "recover")) {
+               /* begin the recovery process without changing the flag */
+               rproc_trigger_recovery(rproc);
+       } else {
+               return -EINVAL;
+       }
+
+       return count;
+}
+static DEVICE_ATTR_RW(recovery);
+
 /*
  * A coredump-configuration-to-string lookup table, for exposing a
  * human readable configuration via sysfs. Always keep in sync with
@@ -201,6 +256,7 @@ static DEVICE_ATTR_RO(name);
 
 static struct attribute *rproc_attrs[] = {
        &dev_attr_coredump.attr,
+       &dev_attr_recovery.attr,
        &dev_attr_firmware.attr,
        &dev_attr_state.attr,
        &dev_attr_name.attr,