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 const *dt = nullptr;
24 struct l4re_device_spec_pcidev_ids const *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;
58 device == nullptr && d < __L4RE_DEVICE_END; ++d)
59 {
60 const l4re_device_ids *ids = (*d)->ids();
61 if (ids->dt)
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))
64 {
65 device = *d;
66 break;
67 }
68 }
69
70 if (!device)
71 return nullptr;
72
73 if (device->obj_size() > obj_store_size)
74 return nullptr;
75
76 return device->create(reinterpret_cast<void *>(obj_store), arg1);
77}
78
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 \
83 { \
84 Device_class_base *create(void *obj_mem, unsigned arg1) override \
85 { return new (obj_mem) Device_class(arg1); } \
86 \
87 unsigned obj_size() override { return sizeof(Device_class); } \
88 const l4re_device_ids *ids() override { return &__ids; } \
89 }; \
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.
String.