root / hw / qdev.h @ 3de1c3e8
History | View | Annotate | Download (18.8 kB)
1 |
#ifndef QDEV_H
|
---|---|
2 |
#define QDEV_H
|
3 |
|
4 |
#include "hw.h" |
5 |
#include "qemu-queue.h" |
6 |
#include "qemu-char.h" |
7 |
#include "qemu-option.h" |
8 |
#include "qapi/qapi-visit-core.h" |
9 |
|
10 |
typedef struct Property Property; |
11 |
|
12 |
typedef struct PropertyInfo PropertyInfo; |
13 |
|
14 |
typedef struct CompatProperty CompatProperty; |
15 |
|
16 |
typedef struct DeviceInfo DeviceInfo; |
17 |
|
18 |
typedef struct BusState BusState; |
19 |
|
20 |
typedef struct BusInfo BusInfo; |
21 |
|
22 |
enum DevState {
|
23 |
DEV_STATE_CREATED = 1,
|
24 |
DEV_STATE_INITIALIZED, |
25 |
}; |
26 |
|
27 |
enum {
|
28 |
DEV_NVECTORS_UNSPECIFIED = -1,
|
29 |
}; |
30 |
|
31 |
/**
|
32 |
* @DevicePropertyAccessor - called when trying to get/set a property
|
33 |
*
|
34 |
* @dev the device that owns the property
|
35 |
* @v the visitor that contains the property data
|
36 |
* @opaque the device property opaque
|
37 |
* @name the name of the property
|
38 |
* @errp a pointer to an Error that is filled if getting/setting fails.
|
39 |
*/
|
40 |
typedef void (DevicePropertyAccessor)(DeviceState *dev, |
41 |
Visitor *v, |
42 |
void *opaque,
|
43 |
const char *name, |
44 |
Error **errp); |
45 |
|
46 |
/**
|
47 |
* @DevicePropertyRelease - called when a property is removed from a device
|
48 |
*
|
49 |
* @dev the device that owns the property
|
50 |
* @name the name of the property
|
51 |
* @opaque the opaque registered with the property
|
52 |
*/
|
53 |
typedef void (DevicePropertyRelease)(DeviceState *dev, |
54 |
const char *name, |
55 |
void *opaque);
|
56 |
|
57 |
typedef struct DeviceProperty |
58 |
{ |
59 |
gchar *name; |
60 |
gchar *type; |
61 |
DevicePropertyAccessor *get; |
62 |
DevicePropertyAccessor *set; |
63 |
DevicePropertyRelease *release; |
64 |
void *opaque;
|
65 |
|
66 |
QTAILQ_ENTRY(DeviceProperty) node; |
67 |
} DeviceProperty; |
68 |
|
69 |
/* This structure should not be accessed directly. We declare it here
|
70 |
so that it can be embedded in individual device state structures. */
|
71 |
struct DeviceState {
|
72 |
const char *id; |
73 |
enum DevState state;
|
74 |
QemuOpts *opts; |
75 |
int hotplugged;
|
76 |
DeviceInfo *info; |
77 |
BusState *parent_bus; |
78 |
int num_gpio_out;
|
79 |
qemu_irq *gpio_out; |
80 |
int num_gpio_in;
|
81 |
qemu_irq *gpio_in; |
82 |
QLIST_HEAD(, BusState) child_bus; |
83 |
int num_child_bus;
|
84 |
QTAILQ_ENTRY(DeviceState) sibling; |
85 |
int instance_id_alias;
|
86 |
int alias_required_for_version;
|
87 |
|
88 |
/**
|
89 |
* This tracks the number of references between devices. See @qdev_ref for
|
90 |
* more information.
|
91 |
*/
|
92 |
uint32_t ref; |
93 |
|
94 |
QTAILQ_HEAD(, DeviceProperty) properties; |
95 |
}; |
96 |
|
97 |
typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent); |
98 |
typedef char *(*bus_get_dev_path)(DeviceState *dev); |
99 |
/*
|
100 |
* This callback is used to create Open Firmware device path in accordance with
|
101 |
* OF spec http://forthworks.com/standards/of1275.pdf. Indicidual bus bindings
|
102 |
* can be found here http://playground.sun.com/1275/bindings/.
|
103 |
*/
|
104 |
typedef char *(*bus_get_fw_dev_path)(DeviceState *dev); |
105 |
typedef int (qbus_resetfn)(BusState *bus); |
106 |
|
107 |
struct BusInfo {
|
108 |
const char *name; |
109 |
size_t size; |
110 |
bus_dev_printfn print_dev; |
111 |
bus_get_dev_path get_dev_path; |
112 |
bus_get_fw_dev_path get_fw_dev_path; |
113 |
qbus_resetfn *reset; |
114 |
Property *props; |
115 |
}; |
116 |
|
117 |
struct BusState {
|
118 |
DeviceState *parent; |
119 |
BusInfo *info; |
120 |
const char *name; |
121 |
int allow_hotplug;
|
122 |
int qdev_allocated;
|
123 |
QTAILQ_HEAD(ChildrenHead, DeviceState) children; |
124 |
QLIST_ENTRY(BusState) sibling; |
125 |
}; |
126 |
|
127 |
struct Property {
|
128 |
const char *name; |
129 |
PropertyInfo *info; |
130 |
int offset;
|
131 |
int bitnr;
|
132 |
void *defval;
|
133 |
}; |
134 |
|
135 |
enum PropertyType {
|
136 |
PROP_TYPE_UNSPEC = 0,
|
137 |
PROP_TYPE_UINT8, |
138 |
PROP_TYPE_UINT16, |
139 |
PROP_TYPE_UINT32, |
140 |
PROP_TYPE_INT32, |
141 |
PROP_TYPE_UINT64, |
142 |
PROP_TYPE_TADDR, |
143 |
PROP_TYPE_MACADDR, |
144 |
PROP_TYPE_DRIVE, |
145 |
PROP_TYPE_CHR, |
146 |
PROP_TYPE_STRING, |
147 |
PROP_TYPE_NETDEV, |
148 |
PROP_TYPE_VLAN, |
149 |
PROP_TYPE_PTR, |
150 |
PROP_TYPE_BIT, |
151 |
}; |
152 |
|
153 |
struct PropertyInfo {
|
154 |
const char *name; |
155 |
size_t size; |
156 |
enum PropertyType type;
|
157 |
int (*parse)(DeviceState *dev, Property *prop, const char *str); |
158 |
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); |
159 |
void (*free)(DeviceState *dev, Property *prop);
|
160 |
}; |
161 |
|
162 |
typedef struct GlobalProperty { |
163 |
const char *driver; |
164 |
const char *property; |
165 |
const char *value; |
166 |
QTAILQ_ENTRY(GlobalProperty) next; |
167 |
} GlobalProperty; |
168 |
|
169 |
/*** Board API. This should go away once we have a machine config file. ***/
|
170 |
|
171 |
DeviceState *qdev_create(BusState *bus, const char *name); |
172 |
DeviceState *qdev_try_create(BusState *bus, const char *name); |
173 |
int qdev_device_help(QemuOpts *opts);
|
174 |
DeviceState *qdev_device_add(QemuOpts *opts); |
175 |
int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT;
|
176 |
void qdev_init_nofail(DeviceState *dev);
|
177 |
void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, |
178 |
int required_for_version);
|
179 |
int qdev_unplug(DeviceState *dev);
|
180 |
void qdev_free(DeviceState *dev);
|
181 |
int qdev_simple_unplug_cb(DeviceState *dev);
|
182 |
void qdev_machine_creation_done(void); |
183 |
bool qdev_machine_modified(void); |
184 |
|
185 |
qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
|
186 |
void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); |
187 |
|
188 |
BusState *qdev_get_child_bus(DeviceState *dev, const char *name); |
189 |
|
190 |
/*** Device API. ***/
|
191 |
|
192 |
typedef int (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); |
193 |
typedef int (*qdev_event)(DeviceState *dev); |
194 |
typedef void (*qdev_resetfn)(DeviceState *dev); |
195 |
|
196 |
struct DeviceInfo {
|
197 |
const char *name; |
198 |
const char *fw_name; |
199 |
const char *alias; |
200 |
const char *desc; |
201 |
size_t size; |
202 |
Property *props; |
203 |
int no_user;
|
204 |
|
205 |
/* callbacks */
|
206 |
qdev_resetfn reset; |
207 |
|
208 |
/* device state */
|
209 |
const VMStateDescription *vmsd;
|
210 |
|
211 |
/* Private to qdev / bus. */
|
212 |
qdev_initfn init; |
213 |
qdev_event unplug; |
214 |
qdev_event exit; |
215 |
BusInfo *bus_info; |
216 |
struct DeviceInfo *next;
|
217 |
}; |
218 |
extern DeviceInfo *device_info_list;
|
219 |
|
220 |
void qdev_register(DeviceInfo *info);
|
221 |
|
222 |
/* Register device properties. */
|
223 |
/* GPIO inputs also double as IRQ sinks. */
|
224 |
void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n); |
225 |
void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n); |
226 |
|
227 |
CharDriverState *qdev_init_chardev(DeviceState *dev); |
228 |
|
229 |
BusState *qdev_get_parent_bus(DeviceState *dev); |
230 |
|
231 |
/*** BUS API. ***/
|
232 |
|
233 |
DeviceState *qdev_find_recursive(BusState *bus, const char *id); |
234 |
|
235 |
/* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */
|
236 |
typedef int (qbus_walkerfn)(BusState *bus, void *opaque); |
237 |
typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); |
238 |
|
239 |
void qbus_create_inplace(BusState *bus, BusInfo *info,
|
240 |
DeviceState *parent, const char *name); |
241 |
BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name); |
242 |
/* Returns > 0 if either devfn or busfn skip walk somewhere in cursion,
|
243 |
* < 0 if either devfn or busfn terminate walk somewhere in cursion,
|
244 |
* 0 otherwise. */
|
245 |
int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
|
246 |
qbus_walkerfn *busfn, void *opaque);
|
247 |
int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
|
248 |
qbus_walkerfn *busfn, void *opaque);
|
249 |
void qdev_reset_all(DeviceState *dev);
|
250 |
void qbus_reset_all_fn(void *opaque); |
251 |
|
252 |
void qbus_free(BusState *bus);
|
253 |
|
254 |
#define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev)
|
255 |
|
256 |
/* This should go away once we get rid of the NULL bus hack */
|
257 |
BusState *sysbus_get_default(void);
|
258 |
|
259 |
/*** monitor commands ***/
|
260 |
|
261 |
void do_info_qtree(Monitor *mon);
|
262 |
void do_info_qdm(Monitor *mon);
|
263 |
int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data); |
264 |
int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data); |
265 |
|
266 |
/*** qdev-properties.c ***/
|
267 |
|
268 |
extern PropertyInfo qdev_prop_bit;
|
269 |
extern PropertyInfo qdev_prop_uint8;
|
270 |
extern PropertyInfo qdev_prop_uint16;
|
271 |
extern PropertyInfo qdev_prop_uint32;
|
272 |
extern PropertyInfo qdev_prop_int32;
|
273 |
extern PropertyInfo qdev_prop_uint64;
|
274 |
extern PropertyInfo qdev_prop_hex8;
|
275 |
extern PropertyInfo qdev_prop_hex32;
|
276 |
extern PropertyInfo qdev_prop_hex64;
|
277 |
extern PropertyInfo qdev_prop_string;
|
278 |
extern PropertyInfo qdev_prop_chr;
|
279 |
extern PropertyInfo qdev_prop_ptr;
|
280 |
extern PropertyInfo qdev_prop_macaddr;
|
281 |
extern PropertyInfo qdev_prop_drive;
|
282 |
extern PropertyInfo qdev_prop_netdev;
|
283 |
extern PropertyInfo qdev_prop_vlan;
|
284 |
extern PropertyInfo qdev_prop_pci_devfn;
|
285 |
|
286 |
#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
|
287 |
.name = (_name), \ |
288 |
.info = &(_prop), \ |
289 |
.offset = offsetof(_state, _field) \ |
290 |
+ type_check(_type,typeof_field(_state, _field)), \ |
291 |
} |
292 |
#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \
|
293 |
.name = (_name), \ |
294 |
.info = &(_prop), \ |
295 |
.offset = offsetof(_state, _field) \ |
296 |
+ type_check(_type,typeof_field(_state, _field)), \ |
297 |
.defval = (_type[]) { _defval }, \ |
298 |
} |
299 |
#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
|
300 |
.name = (_name), \ |
301 |
.info = &(qdev_prop_bit), \ |
302 |
.bitnr = (_bit), \ |
303 |
.offset = offsetof(_state, _field) \ |
304 |
+ type_check(uint32_t,typeof_field(_state, _field)), \ |
305 |
.defval = (bool[]) { (_defval) }, \
|
306 |
} |
307 |
|
308 |
#define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
|
309 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t) |
310 |
#define DEFINE_PROP_UINT16(_n, _s, _f, _d) \
|
311 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t) |
312 |
#define DEFINE_PROP_UINT32(_n, _s, _f, _d) \
|
313 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t) |
314 |
#define DEFINE_PROP_INT32(_n, _s, _f, _d) \
|
315 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t) |
316 |
#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
|
317 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t) |
318 |
#define DEFINE_PROP_HEX8(_n, _s, _f, _d) \
|
319 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex8, uint8_t) |
320 |
#define DEFINE_PROP_HEX32(_n, _s, _f, _d) \
|
321 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t) |
322 |
#define DEFINE_PROP_HEX64(_n, _s, _f, _d) \
|
323 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t) |
324 |
#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \
|
325 |
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t) |
326 |
|
327 |
#define DEFINE_PROP_PTR(_n, _s, _f) \
|
328 |
DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
|
329 |
#define DEFINE_PROP_CHR(_n, _s, _f) \
|
330 |
DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*) |
331 |
#define DEFINE_PROP_STRING(_n, _s, _f) \
|
332 |
DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
|
333 |
#define DEFINE_PROP_NETDEV(_n, _s, _f) \
|
334 |
DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*) |
335 |
#define DEFINE_PROP_VLAN(_n, _s, _f) \
|
336 |
DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, VLANState*) |
337 |
#define DEFINE_PROP_DRIVE(_n, _s, _f) \
|
338 |
DEFINE_PROP(_n, _s, _f, qdev_prop_drive, BlockDriverState *) |
339 |
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
|
340 |
DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr) |
341 |
|
342 |
#define DEFINE_PROP_END_OF_LIST() \
|
343 |
{} |
344 |
|
345 |
/* Set properties between creation and init. */
|
346 |
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
|
347 |
int qdev_prop_exists(DeviceState *dev, const char *name); |
348 |
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value); |
349 |
void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type); |
350 |
void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value); |
351 |
void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value); |
352 |
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value); |
353 |
void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value); |
354 |
void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value); |
355 |
void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value); |
356 |
void qdev_prop_set_string(DeviceState *dev, const char *name, char *value); |
357 |
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value); |
358 |
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value); |
359 |
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value); |
360 |
int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value) QEMU_WARN_UNUSED_RESULT; |
361 |
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value); |
362 |
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value); |
363 |
/* FIXME: Remove opaque pointer properties. */
|
364 |
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); |
365 |
void qdev_prop_set_defaults(DeviceState *dev, Property *props);
|
366 |
|
367 |
void qdev_prop_register_global_list(GlobalProperty *props);
|
368 |
void qdev_prop_set_globals(DeviceState *dev);
|
369 |
|
370 |
static inline const char *qdev_fw_name(DeviceState *dev) |
371 |
{ |
372 |
return dev->info->fw_name ? : dev->info->alias ? : dev->info->name;
|
373 |
} |
374 |
|
375 |
char *qdev_get_fw_dev_path(DeviceState *dev);
|
376 |
/* This is a nasty hack to allow passing a NULL bus to qdev_create. */
|
377 |
extern struct BusInfo system_bus_info; |
378 |
|
379 |
/**
|
380 |
* @qdev_ref
|
381 |
*
|
382 |
* Increase the reference count of a device. A device cannot be freed as long
|
383 |
* as its reference count is greater than zero.
|
384 |
*
|
385 |
* @dev - the device
|
386 |
*/
|
387 |
void qdev_ref(DeviceState *dev);
|
388 |
|
389 |
/**
|
390 |
* @qdef_unref
|
391 |
*
|
392 |
* Decrease the reference count of a device. A device cannot be freed as long
|
393 |
* as its reference count is greater than zero.
|
394 |
*
|
395 |
* @dev - the device
|
396 |
*/
|
397 |
void qdev_unref(DeviceState *dev);
|
398 |
|
399 |
/**
|
400 |
* @qdev_property_add - add a new property to a device
|
401 |
*
|
402 |
* @dev - the device to add a property to
|
403 |
*
|
404 |
* @name - the name of the property. This can contain any character except for
|
405 |
* a forward slash. In general, you should use hyphens '-' instead of
|
406 |
* underscores '_' when naming properties.
|
407 |
*
|
408 |
* @type - the type name of the property. This namespace is pretty loosely
|
409 |
* defined. Sub namespaces are constructed by using a prefix and then
|
410 |
* to angle brackets. For instance, the type 'virtio-net-pci' in the
|
411 |
* 'link' namespace would be 'link<virtio-net-pci>'.
|
412 |
*
|
413 |
* @get - the getter to be called to read a property. If this is NULL, then
|
414 |
* the property cannot be read.
|
415 |
*
|
416 |
* @set - the setter to be called to write a property. If this is NULL,
|
417 |
* then the property cannot be written.
|
418 |
*
|
419 |
* @release - called when the property is removed from the device. This is
|
420 |
* meant to allow a property to free its opaque upon device
|
421 |
* destruction. This may be NULL.
|
422 |
*
|
423 |
* @opaque - an opaque pointer to pass to the callbacks for the property
|
424 |
*
|
425 |
* @errp - returns an error if this function fails
|
426 |
*/
|
427 |
void qdev_property_add(DeviceState *dev, const char *name, const char *type, |
428 |
DevicePropertyAccessor *get, DevicePropertyAccessor *set, |
429 |
DevicePropertyRelease *release, |
430 |
void *opaque, Error **errp);
|
431 |
|
432 |
/**
|
433 |
* @qdev_property_get - reads a property from a device
|
434 |
*
|
435 |
* @dev - the device
|
436 |
*
|
437 |
* @v - the visitor that will receive the property value. This should be an
|
438 |
* Output visitor and the data will be written with @name as the name.
|
439 |
*
|
440 |
* @name - the name of the property
|
441 |
*
|
442 |
* @errp - returns an error if this function fails
|
443 |
*/
|
444 |
void qdev_property_get(DeviceState *dev, Visitor *v, const char *name, |
445 |
Error **errp); |
446 |
|
447 |
/**
|
448 |
* @qdev_property_set - writes a property to a device
|
449 |
*
|
450 |
* @dev - the device
|
451 |
*
|
452 |
* @v - the visitor that will be used to write the property value. This should
|
453 |
* be an Input visitor and the data will be first read with @name as the
|
454 |
* name and then written as the property value.
|
455 |
*
|
456 |
* @name - the name of the property
|
457 |
*
|
458 |
* @errp - returns an error if this function fails
|
459 |
*/
|
460 |
void qdev_property_set(DeviceState *dev, Visitor *v, const char *name, |
461 |
Error **errp); |
462 |
|
463 |
/**
|
464 |
* @qdev_property_get_type - returns the type of a property
|
465 |
*
|
466 |
* @dev - the device
|
467 |
*
|
468 |
* @name - the name of the property
|
469 |
*
|
470 |
* @errp - returns an error if this function fails
|
471 |
*
|
472 |
* Returns:
|
473 |
* The type name of the property.
|
474 |
*/
|
475 |
const char *qdev_property_get_type(DeviceState *dev, const char *name, |
476 |
Error **errp); |
477 |
|
478 |
/**
|
479 |
* @qdev_property_add_legacy - add a legacy @Property to a device
|
480 |
*
|
481 |
* DO NOT USE THIS IN NEW CODE!
|
482 |
*/
|
483 |
void qdev_property_add_legacy(DeviceState *dev, Property *prop, Error **errp);
|
484 |
|
485 |
/**
|
486 |
* @qdev_get_root - returns the root device of the composition tree
|
487 |
*
|
488 |
* Returns:
|
489 |
* The root of the composition tree.
|
490 |
*/
|
491 |
DeviceState *qdev_get_root(void);
|
492 |
|
493 |
/**
|
494 |
* @qdev_get_canonical_path - returns the canonical path for a device. This
|
495 |
* is the path within the composition tree starting from the root.
|
496 |
*
|
497 |
* Returns:
|
498 |
* The canonical path in the composition tree.
|
499 |
*/
|
500 |
gchar *qdev_get_canonical_path(DeviceState *dev); |
501 |
|
502 |
/**
|
503 |
* @qdev_resolve_path - resolves a path returning a device
|
504 |
*
|
505 |
* There are two types of supported paths--absolute paths and partial paths.
|
506 |
*
|
507 |
* Absolute paths are derived from the root device and can follow child<> or
|
508 |
* link<> properties. Since they can follow link<> properties, they can be
|
509 |
* arbitrarily long. Absolute paths look like absolute filenames and are
|
510 |
* prefixed with a leading slash.
|
511 |
*
|
512 |
* Partial paths look like relative filenames. They do not begin with a
|
513 |
* prefix. The matching rules for partial paths are subtle but designed to make
|
514 |
* specifying devices easy. At each level of the composition tree, the partial
|
515 |
* path is matched as an absolute path. The first match is not returned. At
|
516 |
* least two matches are searched for. A successful result is only returned if
|
517 |
* only one match is founded. If more than one match is found, a flag is
|
518 |
* return to indicate that the match was ambiguous.
|
519 |
*
|
520 |
* @path - the path to resolve
|
521 |
*
|
522 |
* @ambiguous - returns true if the path resolution failed because of an
|
523 |
* ambiguous match
|
524 |
*
|
525 |
* Returns:
|
526 |
* The matched device or NULL on path lookup failure.
|
527 |
*/
|
528 |
DeviceState *qdev_resolve_path(const char *path, bool *ambiguous); |
529 |
|
530 |
/**
|
531 |
* @qdev_property_add_child - Add a child property to a device
|
532 |
*
|
533 |
* Child properties form the composition tree. All devices need to be a child
|
534 |
* of another device. Devices can only be a child of one device.
|
535 |
*
|
536 |
* There is no way for a child to determine what its parent is. It is not
|
537 |
* a bidirectional relationship. This is by design.
|
538 |
*
|
539 |
* @dev - the device to add a property to
|
540 |
*
|
541 |
* @name - the name of the property
|
542 |
*
|
543 |
* @child - the child device
|
544 |
*
|
545 |
* @errp - if an error occurs, a pointer to an area to store the area
|
546 |
*/
|
547 |
void qdev_property_add_child(DeviceState *dev, const char *name, |
548 |
DeviceState *child, Error **errp); |
549 |
|
550 |
#endif
|