remoteproc: Introduce rproc features
authorPeng Fan <peng.fan@nxp.com>
Wed, 28 Sep 2022 06:47:55 +0000 (14:47 +0800)
committerMathieu Poirier <mathieu.poirier@linaro.org>
Wed, 28 Sep 2022 16:46:21 +0000 (10:46 -0600)
remote processor may support:
 - boot recovery with help from main processor
 - self recovery without help from main processor
 - iommu
 - etc

Introduce rproc features could simplify code to avoid adding more bool
flags

Acked-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Link: https://lore.kernel.org/r/20220928064756.4059662-2-peng.fan@oss.nxp.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
drivers/remoteproc/remoteproc_internal.h
include/linux/remoteproc.h

index bf1fb7bba1a319c5fbd73d3191487b0e46569127..d4dbb8d1d80cc9b2735f315b67723f1c13b6e8ee 100644 (file)
@@ -39,6 +39,21 @@ struct rproc_vdev_data {
        struct fw_rsc_vdev *rsc;
 };
 
+static inline bool rproc_has_feature(struct rproc *rproc, unsigned int feature)
+{
+       return test_bit(feature, rproc->features);
+}
+
+static inline int rproc_set_feature(struct rproc *rproc, unsigned int feature)
+{
+       if (feature >= RPROC_MAX_FEATURES)
+               return -EINVAL;
+
+       set_bit(feature, rproc->features);
+
+       return 0;
+}
+
 /* from remoteproc_core.c */
 void rproc_release(struct kref *kref);
 int rproc_of_parse_firmware(struct device *dev, int index,
index 1abf56ad02dacce70226e05a118ad56d92e5fd9d..fe8978eb69f1c7688c85ba4ecd67cf5e8f306a4e 100644 (file)
@@ -489,6 +489,20 @@ struct rproc_dump_segment {
        loff_t offset;
 };
 
+/**
+ * enum rproc_features - features supported
+ *
+ * @RPROC_FEAT_ATTACH_ON_RECOVERY: The remote processor does not need help
+ *                                from Linux to recover, such as firmware
+ *                                loading. Linux just needs to attach after
+ *                                recovery.
+ */
+
+enum rproc_features {
+       RPROC_FEAT_ATTACH_ON_RECOVERY,
+       RPROC_MAX_FEATURES,
+};
+
 /**
  * struct rproc - represents a physical remote processor device
  * @node: list node of this rproc object
@@ -530,6 +544,7 @@ struct rproc_dump_segment {
  * @elf_machine: firmware ELF machine
  * @cdev: character device of the rproc
  * @cdev_put_on_release: flag to indicate if remoteproc should be shutdown on @char_dev release
+ * @features: indicate remoteproc features
  */
 struct rproc {
        struct list_head node;
@@ -570,6 +585,7 @@ struct rproc {
        u16 elf_machine;
        struct cdev cdev;
        bool cdev_put_on_release;
+       DECLARE_BITMAP(features, RPROC_MAX_FEATURES);
 };
 
 /**