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 const *dt =
nullptr;
24 struct l4re_device_spec_pcidev_ids const *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;
58 device ==
nullptr && d < __L4RE_DEVICE_END; ++d)
60 const l4re_device_ids *ids = (*d)->ids();
62 for (l4re_device_spec_dt_ids
const *dt_id = ids->dt; dt_id->compatible; ++dt_id)
63 if (!strcmp(dt_compatible, dt_id->compatible))
73 if (device->obj_size() > obj_store_size)
76 return device->create(
reinterpret_cast<void *
>(obj_store), arg1);
79#define l4re_register_device(Device_class_base, Device_class, \
80 instance_name, __ids) \
81 struct l4re_device_type_##instance_name \
82 : public l4re_device_type_base \
84 Device_class_base *create(void *obj_mem, unsigned arg1) override \
85 { return new (obj_mem) Device_class(arg1); } \
87 unsigned obj_size() override { return sizeof(Device_class); } \
88 const l4re_device_ids *ids() override { return &__ids; } \
90 static const l4re_device_type_##instance_name \
91 l4re_device_inst_##instance_name; \
92 static const l4re_device_type_base * const \
93 __attribute__((section(".data.l4redevice"),used)) \
94 l4re_device_inst_p_##instance_name \
95 = &l4re_device_inst_##instance_name
L4 low-level kernel interface.