// SPDX-License-Identifier: GPL-2.0-only /* * Remote Processor Framework */ #include <linux/remoteproc.h> #include <linux/slab.h> #include "remoteproc_internal.h" #define to_rproc(d) … static ssize_t recovery_show(struct device *dev, struct device_attribute *attr, char *buf) { … } /* * 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) { … } 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 * enum rproc_coredump_mechanism */ static const char * const rproc_coredump_str[] = …; /* Expose the current coredump configuration via debugfs */ static ssize_t coredump_show(struct device *dev, struct device_attribute *attr, char *buf) { … } /* * By writing to the 'coredump' sysfs entry, we control the behavior of the * coredump mechanism dynamically. The default value of this entry is "default". * * The 'coredump' sysfs entry supports these commands: * * disabled: This is the default coredump mechanism. Recovery will proceed * without collecting any dump. * * default: When the remoteproc crashes the entire coredump will be * copied to a separate buffer and exposed to userspace. * * inline: The coredump will not be copied to a separate buffer and the * recovery process will have to wait until data is read by * userspace. But this avoid usage of extra memory. */ static ssize_t coredump_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { … } static DEVICE_ATTR_RW(coredump); /* Expose the loaded / running firmware name via sysfs */ static ssize_t firmware_show(struct device *dev, struct device_attribute *attr, char *buf) { … } /* Change firmware name via sysfs */ static ssize_t firmware_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { … } static DEVICE_ATTR_RW(firmware); /* * A state-to-string lookup table, for exposing a human readable state * via sysfs. Always keep in sync with enum rproc_state */ static const char * const rproc_state_string[] = …; /* Expose the state of the remote processor via sysfs */ static ssize_t state_show(struct device *dev, struct device_attribute *attr, char *buf) { … } /* Change remote processor state via sysfs */ static ssize_t state_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { … } static DEVICE_ATTR_RW(state); /* Expose the name of the remote processor via sysfs */ static ssize_t name_show(struct device *dev, struct device_attribute *attr, char *buf) { … } static DEVICE_ATTR_RO(name); static umode_t rproc_is_visible(struct kobject *kobj, struct attribute *attr, int n) { … } static struct attribute *rproc_attrs[] = …; static const struct attribute_group rproc_devgroup = …; static const struct attribute_group *rproc_devgroups[] = …; const struct class rproc_class = …; int __init rproc_init_sysfs(void) { … } void __exit rproc_exit_sysfs(void) { … }