L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
device.h
1#pragma once
2
3#include <stdint.h>
4
5struct l4re_device_spec_dt_ids
6{
7 const char *compatible;
8};
9
10struct l4re_device_spec_pcidev_pciids
11{
12 uint16_t vendor;
13 uint16_t function;
14};
15
16struct l4re_device_spec_pcidev_ids
17{
18 struct l4re_device_spec_pcidev_pciids *pcidevs;
19};
20
21struct l4re_device_ids
22{
23 struct l4re_device_spec_dt_ids *dt = nullptr;
24 struct l4re_device_spec_pcidev_ids *pcidev = nullptr;
25};
26
27// ---- Internal device
28namespace L4 {
29
30 class Dev_obj
31 {
32 };
33
34}
35
36struct l4re_device_type_base
37{
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;
41};
42
43#include <stdio.h>
44#include <string.h>
45
46static inline
47L4::Dev_obj *
48l4re_dev_create_by_dt_compatible(const char *dt_compatible,
49 void *obj_store, unsigned obj_store_size,
50 unsigned arg1)
51{
52 l4re_device_type_base *device = nullptr;
53
54 extern l4re_device_type_base *__L4RE_DEVICE_BEGIN[];
55 extern l4re_device_type_base *__L4RE_DEVICE_END[];
56
57 for (auto const *d = __L4RE_DEVICE_BEGIN; d < __L4RE_DEVICE_END; ++d)
58 {
59 const l4re_device_ids *ids = (*d)->ids();
60 if (ids->dt)
61 for (l4re_device_spec_dt_ids *dt_id = ids->dt; dt_id->compatible; ++dt_id)
62 if (!strcmp(dt_compatible, dt_id->compatible))
63 {
64 device = *d;
65 break;
66 }
67 }
68
69 if (!device)
70 return nullptr;
71
72 if (device->obj_size() > obj_store_size)
73 return nullptr;
74
75 return device->create(reinterpret_cast<void *>(obj_store), arg1);
76}
77
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 \
82 { \
83 Device_class_base *create(void *objmem, unsigned arg1) override \
84 { return new (objmem) Device_class(arg1); } \
85 \
86 unsigned obj_size() override { return sizeof(Device_class); } \
87 const l4re_device_ids *ids() override { return &__ids; } \
88 }; \
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.
String.