5struct l4re_device_spec_dt_ids
7 const char *compatible;
10struct l4re_device_spec_pcidev_pciids
16struct l4re_device_spec_pcidev_ids
18 struct l4re_device_spec_pcidev_pciids *pcidevs;
23 struct l4re_device_spec_dt_ids *dt =
nullptr;
24 struct l4re_device_spec_pcidev_ids *pcidev =
nullptr;
36struct l4re_device_type_base
38 virtual L4::Dev_obj *create(
void *obj_mem,
unsigned arg1) = 0;
39 virtual unsigned obj_size() = 0;
40 virtual const l4re_device_ids *ids() = 0;
48l4re_dev_create_by_dt_compatible(
const char *dt_compatible,
49 void *obj_store,
unsigned obj_store_size,
52 l4re_device_type_base *device =
nullptr;
54 extern l4re_device_type_base *__L4RE_DEVICE_BEGIN[];
55 extern l4re_device_type_base *__L4RE_DEVICE_END[];
57 for (
auto const *d = __L4RE_DEVICE_BEGIN; d < __L4RE_DEVICE_END; ++d)
59 const l4re_device_ids *ids = (*d)->ids();
61 for (l4re_device_spec_dt_ids *dt_id = ids->dt; dt_id->compatible; ++dt_id)
62 if (!strcmp(dt_compatible, dt_id->compatible))
72 if (device->obj_size() > obj_store_size)
75 return device->create(
reinterpret_cast<void *
>(obj_store), arg1);
78#define l4re_register_device(Device_class_base, Device_class, \
79 instance_name, __ids) \
80 struct l4re_device_type_##instance_name \
81 : public l4re_device_type_base \
83 Device_class_base *create(void *objmem, unsigned arg1) override \
84 { return new (objmem) Device_class(arg1); } \
86 unsigned obj_size() override { return sizeof(Device_class); } \
87 const l4re_device_ids *ids() override { return &__ids; } \
89 static const l4re_device_type_##instance_name \
90 l4re_device_inst_##instance_name; \
91 static const l4re_device_type_base * const \
92 __attribute__((section(".data.l4redevice"),used)) \
93 l4re_device_inst_p_##instance_name \
94 = &l4re_device_inst_##instance_name
L4 low-level kernel interface.