]>
Commit | Line | Data |
---|---|---|
074a86fc AL |
1 | #ifndef QDEV_CORE_H |
2 | #define QDEV_CORE_H | |
3 | ||
4 | #include "qemu-queue.h" | |
5 | #include "qemu-option.h" | |
6 | #include "qemu/object.h" | |
7 | #include "hw/irq.h" | |
8 | #include "error.h" | |
9 | ||
10 | typedef struct Property Property; | |
11 | ||
12 | typedef struct PropertyInfo PropertyInfo; | |
13 | ||
14 | typedef struct CompatProperty CompatProperty; | |
15 | ||
16 | typedef struct BusState BusState; | |
17 | ||
18 | typedef struct BusClass BusClass; | |
19 | ||
20 | enum DevState { | |
21 | DEV_STATE_CREATED = 1, | |
22 | DEV_STATE_INITIALIZED, | |
23 | }; | |
24 | ||
25 | enum { | |
26 | DEV_NVECTORS_UNSPECIFIED = -1, | |
27 | }; | |
28 | ||
29 | #define TYPE_DEVICE "device" | |
30 | #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE) | |
31 | #define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE) | |
32 | #define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE) | |
33 | ||
34 | typedef int (*qdev_initfn)(DeviceState *dev); | |
35 | typedef int (*qdev_event)(DeviceState *dev); | |
36 | typedef void (*qdev_resetfn)(DeviceState *dev); | |
37 | ||
38 | struct VMStateDescription; | |
39 | ||
40 | typedef struct DeviceClass { | |
41 | ObjectClass parent_class; | |
42 | ||
43 | const char *fw_name; | |
44 | const char *desc; | |
45 | Property *props; | |
46 | int no_user; | |
47 | ||
48 | /* callbacks */ | |
49 | void (*reset)(DeviceState *dev); | |
50 | ||
51 | /* device state */ | |
52 | const struct VMStateDescription *vmsd; | |
53 | ||
54 | /* Private to qdev / bus. */ | |
55 | qdev_initfn init; | |
56 | qdev_event unplug; | |
57 | qdev_event exit; | |
58 | const char *bus_type; | |
59 | } DeviceClass; | |
60 | ||
61 | /* This structure should not be accessed directly. We declare it here | |
62 | so that it can be embedded in individual device state structures. */ | |
63 | struct DeviceState { | |
64 | Object parent_obj; | |
65 | ||
66 | const char *id; | |
67 | enum DevState state; | |
68 | QemuOpts *opts; | |
69 | int hotplugged; | |
70 | BusState *parent_bus; | |
71 | int num_gpio_out; | |
72 | qemu_irq *gpio_out; | |
73 | int num_gpio_in; | |
74 | qemu_irq *gpio_in; | |
75 | QLIST_HEAD(, BusState) child_bus; | |
76 | int num_child_bus; | |
77 | int instance_id_alias; | |
78 | int alias_required_for_version; | |
79 | }; | |
80 | ||
81 | #define TYPE_BUS "bus" | |
82 | #define BUS(obj) OBJECT_CHECK(BusState, (obj), TYPE_BUS) | |
83 | #define BUS_CLASS(klass) OBJECT_CLASS_CHECK(BusClass, (klass), TYPE_BUS) | |
84 | #define BUS_GET_CLASS(obj) OBJECT_GET_CLASS(BusClass, (obj), TYPE_BUS) | |
85 | ||
86 | struct BusClass { | |
87 | ObjectClass parent_class; | |
88 | ||
89 | /* FIXME first arg should be BusState */ | |
90 | void (*print_dev)(Monitor *mon, DeviceState *dev, int indent); | |
91 | char *(*get_dev_path)(DeviceState *dev); | |
92 | /* | |
93 | * This callback is used to create Open Firmware device path in accordance | |
94 | * with OF spec http://forthworks.com/standards/of1275.pdf. Individual bus | |
95 | * bindings can be found at http://playground.sun.com/1275/bindings/. | |
96 | */ | |
97 | char *(*get_fw_dev_path)(DeviceState *dev); | |
98 | int (*reset)(BusState *bus); | |
99 | }; | |
100 | ||
101 | typedef struct BusChild { | |
102 | DeviceState *child; | |
103 | int index; | |
104 | QTAILQ_ENTRY(BusChild) sibling; | |
105 | } BusChild; | |
106 | ||
107 | /** | |
108 | * BusState: | |
074a86fc AL |
109 | */ |
110 | struct BusState { | |
111 | Object obj; | |
112 | DeviceState *parent; | |
113 | const char *name; | |
114 | int allow_hotplug; | |
074a86fc AL |
115 | int max_index; |
116 | QTAILQ_HEAD(ChildrenHead, BusChild) children; | |
117 | QLIST_ENTRY(BusState) sibling; | |
118 | }; | |
119 | ||
120 | struct Property { | |
121 | const char *name; | |
122 | PropertyInfo *info; | |
123 | int offset; | |
124 | uint8_t bitnr; | |
125 | uint8_t qtype; | |
126 | int64_t defval; | |
127 | }; | |
128 | ||
129 | struct PropertyInfo { | |
130 | const char *name; | |
131 | const char *legacy_name; | |
132 | const char **enum_table; | |
133 | int (*parse)(DeviceState *dev, Property *prop, const char *str); | |
134 | int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); | |
135 | ObjectPropertyAccessor *get; | |
136 | ObjectPropertyAccessor *set; | |
137 | ObjectPropertyRelease *release; | |
138 | }; | |
139 | ||
140 | typedef struct GlobalProperty { | |
141 | const char *driver; | |
142 | const char *property; | |
143 | const char *value; | |
144 | QTAILQ_ENTRY(GlobalProperty) next; | |
145 | } GlobalProperty; | |
146 | ||
147 | /*** Board API. This should go away once we have a machine config file. ***/ | |
148 | ||
149 | DeviceState *qdev_create(BusState *bus, const char *name); | |
150 | DeviceState *qdev_try_create(BusState *bus, const char *name); | |
151 | int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT; | |
152 | void qdev_init_nofail(DeviceState *dev); | |
153 | void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, | |
154 | int required_for_version); | |
155 | void qdev_unplug(DeviceState *dev, Error **errp); | |
156 | void qdev_free(DeviceState *dev); | |
157 | int qdev_simple_unplug_cb(DeviceState *dev); | |
158 | void qdev_machine_creation_done(void); | |
159 | bool qdev_machine_modified(void); | |
160 | ||
161 | qemu_irq qdev_get_gpio_in(DeviceState *dev, int n); | |
162 | void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); | |
163 | ||
164 | BusState *qdev_get_child_bus(DeviceState *dev, const char *name); | |
165 | ||
166 | /*** Device API. ***/ | |
167 | ||
168 | /* Register device properties. */ | |
169 | /* GPIO inputs also double as IRQ sinks. */ | |
170 | void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n); | |
171 | void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n); | |
172 | ||
173 | BusState *qdev_get_parent_bus(DeviceState *dev); | |
174 | ||
175 | /*** BUS API. ***/ | |
176 | ||
177 | DeviceState *qdev_find_recursive(BusState *bus, const char *id); | |
178 | ||
179 | /* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */ | |
180 | typedef int (qbus_walkerfn)(BusState *bus, void *opaque); | |
181 | typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); | |
182 | ||
183 | void qbus_create_inplace(BusState *bus, const char *typename, | |
184 | DeviceState *parent, const char *name); | |
185 | BusState *qbus_create(const char *typename, DeviceState *parent, const char *name); | |
186 | /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion, | |
187 | * < 0 if either devfn or busfn terminate walk somewhere in cursion, | |
188 | * 0 otherwise. */ | |
189 | int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn, | |
190 | qbus_walkerfn *busfn, void *opaque); | |
191 | int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn, | |
192 | qbus_walkerfn *busfn, void *opaque); | |
193 | void qdev_reset_all(DeviceState *dev); | |
194 | void qbus_reset_all_fn(void *opaque); | |
195 | ||
196 | void qbus_free(BusState *bus); | |
197 | ||
198 | #define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev) | |
199 | ||
200 | /* This should go away once we get rid of the NULL bus hack */ | |
201 | BusState *sysbus_get_default(void); | |
202 | ||
203 | char *qdev_get_fw_dev_path(DeviceState *dev); | |
204 | ||
205 | /** | |
206 | * @qdev_machine_init | |
207 | * | |
208 | * Initialize platform devices before machine init. This is a hack until full | |
209 | * support for composition is added. | |
210 | */ | |
211 | void qdev_machine_init(void); | |
212 | ||
213 | /** | |
214 | * @device_reset | |
215 | * | |
216 | * Reset a single device (by calling the reset method). | |
217 | */ | |
218 | void device_reset(DeviceState *dev); | |
219 | ||
220 | const struct VMStateDescription *qdev_get_vmsd(DeviceState *dev); | |
221 | ||
222 | const char *qdev_fw_name(DeviceState *dev); | |
223 | ||
224 | Object *qdev_get_machine(void); | |
225 | ||
226 | /* FIXME: make this a link<> */ | |
227 | void qdev_set_parent_bus(DeviceState *dev, BusState *bus); | |
228 | ||
229 | extern int qdev_hotplug; | |
230 | ||
231 | char *qdev_get_dev_path(DeviceState *dev); | |
232 | ||
233 | #endif |