aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Zhao <jerryz123@berkeley.edu>2023-06-05 10:28:20 -0700
committerJerry Zhao <jerryz123@berkeley.edu>2023-06-20 12:23:47 -0700
commit0beed2cc22b20093b5ee0fdab343c525503b8a16 (patch)
treeebcad2d518e24e0cd376dce75776f6d331bc0c54
parentb2ab751ce317929a179fdad06ad12bdcc2be42a7 (diff)
downloadspike-0beed2cc22b20093b5ee0fdab343c525503b8a16.zip
spike-0beed2cc22b20093b5ee0fdab343c525503b8a16.tar.gz
spike-0beed2cc22b20093b5ee0fdab343c525503b8a16.tar.bz2
device_t: Add device_factory_t
This class should implement conditional fdt-based device instantiation, as well as adding device nodes to the dts
-rw-r--r--riscv/abstract_device.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/riscv/abstract_device.h b/riscv/abstract_device.h
index f4ccebe..7239b66 100644
--- a/riscv/abstract_device.h
+++ b/riscv/abstract_device.h
@@ -5,6 +5,9 @@
#include "common.h"
#include <cstdint>
#include <cstddef>
+#include <string>
+
+class sim_t;
class abstract_device_t {
public:
@@ -14,4 +17,20 @@ class abstract_device_t {
virtual void tick(reg_t UNUSED rtc_ticks) {}
};
+// factory for devices which should show up in the DTS, and can be
+// parameterized by parsing the DTS
+class device_factory_t {
+public:
+ virtual abstract_device_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) = 0;
+ virtual std::string generate_dts(const sim_t* sim) = 0;
+ virtual ~device_factory_t() {}
+};
+
+#define REGISTER_DEVICE(name, parse, generate) \
+ class name##_factory_t : public device_factory_t { \
+ public: \
+ name##_t* parse_from_fdt(const void* fdt, const sim_t* sim, reg_t* base) override { return parse(fdt, sim, base); } \
+ std::string generate_dts(const sim_t* sim) override { return generate(sim); } \
+ }; device_factory_t *name##_factory = new name##_factory_t();
+
#endif