qdev.h 18.8 KB
Newer Older
P
Paul Brook 已提交
1 2 3 4
#ifndef QDEV_H
#define QDEV_H

#include "hw.h"
B
Blue Swirl 已提交
5
#include "qemu-queue.h"
6
#include "qemu-char.h"
G
Gerd Hoffmann 已提交
7
#include "qemu-option.h"
8
#include "qapi/qapi-visit-core.h"
P
Paul Brook 已提交
9

G
Gerd Hoffmann 已提交
10 11 12
typedef struct Property Property;

typedef struct PropertyInfo PropertyInfo;
P
Paul Brook 已提交
13

14 15
typedef struct CompatProperty CompatProperty;

G
Gerd Hoffmann 已提交
16
typedef struct DeviceInfo DeviceInfo;
P
Paul Brook 已提交
17

P
Paul Brook 已提交
18
typedef struct BusState BusState;
P
Paul Brook 已提交
19

20 21
typedef struct BusInfo BusInfo;

G
Gerd Hoffmann 已提交
22 23 24 25 26
enum DevState {
    DEV_STATE_CREATED = 1,
    DEV_STATE_INITIALIZED,
};

27 28 29 30
enum {
    DEV_NVECTORS_UNSPECIFIED = -1,
};

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
/**
 * @DevicePropertyAccessor - called when trying to get/set a property
 *
 * @dev the device that owns the property
 * @v the visitor that contains the property data
 * @opaque the device property opaque
 * @name the name of the property
 * @errp a pointer to an Error that is filled if getting/setting fails.
 */
typedef void (DevicePropertyAccessor)(DeviceState *dev,
                                      Visitor *v,
                                      void *opaque,
                                      const char *name,
                                      Error **errp);

/**
 * @DevicePropertyRelease - called when a property is removed from a device
 *
 * @dev the device that owns the property
 * @name the name of the property
 * @opaque the opaque registered with the property
 */
typedef void (DevicePropertyRelease)(DeviceState *dev,
                                     const char *name,
                                     void *opaque);

typedef struct DeviceProperty
{
    gchar *name;
    gchar *type;
    DevicePropertyAccessor *get;
    DevicePropertyAccessor *set;
    DevicePropertyRelease *release;
    void *opaque;

    QTAILQ_ENTRY(DeviceProperty) node;
} DeviceProperty;

P
Paul Brook 已提交
69 70
/* This structure should not be accessed directly.  We declare it here
   so that it can be embedded in individual device state structures.  */
P
Paul Brook 已提交
71
struct DeviceState {
G
Gerd Hoffmann 已提交
72
    const char *id;
G
Gerd Hoffmann 已提交
73
    enum DevState state;
74
    QemuOpts *opts;
75
    int hotplugged;
G
Gerd Hoffmann 已提交
76
    DeviceInfo *info;
P
Paul Brook 已提交
77
    BusState *parent_bus;
P
Paul Brook 已提交
78 79 80 81
    int num_gpio_out;
    qemu_irq *gpio_out;
    int num_gpio_in;
    qemu_irq *gpio_in;
B
Blue Swirl 已提交
82
    QLIST_HEAD(, BusState) child_bus;
G
Gerd Hoffmann 已提交
83
    int num_child_bus;
84
    QTAILQ_ENTRY(DeviceState) sibling;
J
Jan Kiszka 已提交
85 86
    int instance_id_alias;
    int alias_required_for_version;
87 88 89 90 91 92

    /**
     * This tracks the number of references between devices.  See @qdev_ref for
     * more information.
     */
    uint32_t ref;
93 94

    QTAILQ_HEAD(, DeviceProperty) properties;
P
Paul Brook 已提交
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 101 102 103 104
/*
 * This callback is used to create Open Firmware device path in accordance with
 * OF spec http://forthworks.com/standards/of1275.pdf. Indicidual bus bindings
 * can be found here http://playground.sun.com/1275/bindings/.
 */
typedef char *(*bus_get_fw_dev_path)(DeviceState *dev);
105
typedef int (qbus_resetfn)(BusState *bus);
106

107 108 109 110
struct BusInfo {
    const char *name;
    size_t size;
    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;
G
Gerd Hoffmann 已提交
114
    Property *props;
115
};
P
Paul Brook 已提交
116 117 118

struct BusState {
    DeviceState *parent;
119
    BusInfo *info;
P
Paul Brook 已提交
120
    const char *name;
121
    int allow_hotplug;
122
    int qdev_allocated;
123
    QTAILQ_HEAD(ChildrenHead, DeviceState) children;
B
Blue Swirl 已提交
124
    QLIST_ENTRY(BusState) sibling;
P
Paul Brook 已提交
125 126
};

G
Gerd Hoffmann 已提交
127 128 129 130
struct Property {
    const char   *name;
    PropertyInfo *info;
    int          offset;
M
Michael S. Tsirkin 已提交
131
    int          bitnr;
G
Gerd Hoffmann 已提交
132 133 134 135 136
    void         *defval;
};

enum PropertyType {
    PROP_TYPE_UNSPEC = 0,
J
Juan Quintela 已提交
137
    PROP_TYPE_UINT8,
G
Gerd Hoffmann 已提交
138 139
    PROP_TYPE_UINT16,
    PROP_TYPE_UINT32,
140
    PROP_TYPE_INT32,
B
Blue Swirl 已提交
141
    PROP_TYPE_UINT64,
G
Gerd Hoffmann 已提交
142 143
    PROP_TYPE_TADDR,
    PROP_TYPE_MACADDR,
G
Gerd Hoffmann 已提交
144
    PROP_TYPE_DRIVE,
145
    PROP_TYPE_CHR,
G
Gerd Hoffmann 已提交
146
    PROP_TYPE_STRING,
G
Gerd Hoffmann 已提交
147
    PROP_TYPE_NETDEV,
G
Gerd Hoffmann 已提交
148
    PROP_TYPE_VLAN,
G
Gerd Hoffmann 已提交
149
    PROP_TYPE_PTR,
M
Michael S. Tsirkin 已提交
150
    PROP_TYPE_BIT,
G
Gerd Hoffmann 已提交
151 152 153 154 155 156 157 158
};

struct PropertyInfo {
    const char *name;
    size_t size;
    enum PropertyType type;
    int (*parse)(DeviceState *dev, Property *prop, const char *str);
    int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
159
    void (*free)(DeviceState *dev, Property *prop);
G
Gerd Hoffmann 已提交
160 161
};

162
typedef struct GlobalProperty {
163 164 165
    const char *driver;
    const char *property;
    const char *value;
166 167
    QTAILQ_ENTRY(GlobalProperty) next;
} GlobalProperty;
168

P
Paul Brook 已提交
169 170
/*** Board API.  This should go away once we have a machine config file.  ***/

P
Paul Brook 已提交
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);
G
Gerd Hoffmann 已提交
174
DeviceState *qdev_device_add(QemuOpts *opts);
175
int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT;
M
Markus Armbruster 已提交
176
void qdev_init_nofail(DeviceState *dev);
J
Jan Kiszka 已提交
177 178
void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
                                 int required_for_version);
179
int qdev_unplug(DeviceState *dev);
P
Paul Brook 已提交
180
void qdev_free(DeviceState *dev);
181 182
int qdev_simple_unplug_cb(DeviceState *dev);
void qdev_machine_creation_done(void);
183
bool qdev_machine_modified(void);
P
Paul Brook 已提交
184 185 186 187

qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);

P
Paul Brook 已提交
188
BusState *qdev_get_child_bus(DeviceState *dev, const char *name);
P
Paul Brook 已提交
189

P
Paul Brook 已提交
190 191
/*** Device API.  ***/

192
typedef int (*qdev_initfn)(DeviceState *dev, DeviceInfo *info);
193
typedef int (*qdev_event)(DeviceState *dev);
194
typedef void (*qdev_resetfn)(DeviceState *dev);
P
Paul Brook 已提交
195

P
Paul Brook 已提交
196
struct DeviceInfo {
197
    const char *name;
198
    const char *fw_name;
199 200
    const char *alias;
    const char *desc;
201
    size_t size;
G
Gerd Hoffmann 已提交
202
    Property *props;
203
    int no_user;
204

G
Gerd Hoffmann 已提交
205
    /* callbacks */
206
    qdev_resetfn reset;
G
Gerd Hoffmann 已提交
207

G
Gerd Hoffmann 已提交
208 209 210
    /* device state */
    const VMStateDescription *vmsd;

211
    /* Private to qdev / bus.  */
P
Paul Brook 已提交
212
    qdev_initfn init;
213 214
    qdev_event unplug;
    qdev_event exit;
215
    BusInfo *bus_info;
G
Gerd Hoffmann 已提交
216
    struct DeviceInfo *next;
P
Paul Brook 已提交
217
};
G
Gerd Hoffmann 已提交
218
extern DeviceInfo *device_info_list;
P
Paul Brook 已提交
219

220
void qdev_register(DeviceInfo *info);
P
Paul Brook 已提交
221 222

/* Register device properties.  */
P
Paul Brook 已提交
223
/* GPIO inputs also double as IRQ sinks.  */
P
Paul Brook 已提交
224 225 226 227 228
void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n);
void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n);

CharDriverState *qdev_init_chardev(DeviceState *dev);

P
Paul Brook 已提交
229
BusState *qdev_get_parent_bus(DeviceState *dev);
P
Paul Brook 已提交
230

P
Paul Brook 已提交
231 232
/*** BUS API. ***/

233 234
DeviceState *qdev_find_recursive(BusState *bus, const char *id);

235 236 237 238
/* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */
typedef int (qbus_walkerfn)(BusState *bus, void *opaque);
typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque);

239 240
void qbus_create_inplace(BusState *bus, BusInfo *info,
                         DeviceState *parent, const char *name);
241
BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name);
242 243 244 245 246 247 248
/* Returns > 0 if either devfn or busfn skip walk somewhere in cursion,
 *         < 0 if either devfn or busfn terminate walk somewhere in cursion,
 *           0 otherwise. */
int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
                       qbus_walkerfn *busfn, void *opaque);
int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
                       qbus_walkerfn *busfn, void *opaque);
249
void qdev_reset_all(DeviceState *dev);
250 251
void qbus_reset_all_fn(void *opaque);

G
Gerd Hoffmann 已提交
252
void qbus_free(BusState *bus);
P
Paul Brook 已提交
253 254 255

#define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev)

256 257 258
/* This should go away once we get rid of the NULL bus hack */
BusState *sysbus_get_default(void);

259 260 261
/*** monitor commands ***/

void do_info_qtree(Monitor *mon);
G
Gerd Hoffmann 已提交
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

G
Gerd Hoffmann 已提交
266 267
/*** qdev-properties.c ***/

M
Michael S. Tsirkin 已提交
268
extern PropertyInfo qdev_prop_bit;
J
Juan Quintela 已提交
269
extern PropertyInfo qdev_prop_uint8;
G
Gerd Hoffmann 已提交
270 271
extern PropertyInfo qdev_prop_uint16;
extern PropertyInfo qdev_prop_uint32;
272
extern PropertyInfo qdev_prop_int32;
B
Blue Swirl 已提交
273
extern PropertyInfo qdev_prop_uint64;
J
Jan Kiszka 已提交
274
extern PropertyInfo qdev_prop_hex8;
G
Gerd Hoffmann 已提交
275
extern PropertyInfo qdev_prop_hex32;
B
Blue Swirl 已提交
276
extern PropertyInfo qdev_prop_hex64;
G
Gerd Hoffmann 已提交
277
extern PropertyInfo qdev_prop_string;
278
extern PropertyInfo qdev_prop_chr;
G
Gerd Hoffmann 已提交
279 280
extern PropertyInfo qdev_prop_ptr;
extern PropertyInfo qdev_prop_macaddr;
G
Gerd Hoffmann 已提交
281
extern PropertyInfo qdev_prop_drive;
G
Gerd Hoffmann 已提交
282 283
extern PropertyInfo qdev_prop_netdev;
extern PropertyInfo qdev_prop_vlan;
284
extern PropertyInfo qdev_prop_pci_devfn;
G
Gerd Hoffmann 已提交
285

286 287 288 289 290 291 292 293 294 295 296 297 298
#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
        .name      = (_name),                                    \
        .info      = &(_prop),                                   \
        .offset    = offsetof(_state, _field)                    \
            + type_check(_type,typeof_field(_state, _field)),    \
        }
#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \
        .name      = (_name),                                           \
        .info      = &(_prop),                                          \
        .offset    = offsetof(_state, _field)                           \
            + type_check(_type,typeof_field(_state, _field)),           \
        .defval    = (_type[]) { _defval },                             \
        }
M
Michael S. Tsirkin 已提交
299 300 301 302 303 304 305 306
#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) {  \
        .name      = (_name),                                    \
        .info      = &(qdev_prop_bit),                           \
        .bitnr    = (_bit),                                      \
        .offset    = offsetof(_state, _field)                    \
            + type_check(uint32_t,typeof_field(_state, _field)), \
        .defval    = (bool[]) { (_defval) },                     \
        }
307

J
Juan Quintela 已提交
308 309
#define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
310 311 312 313
#define DEFINE_PROP_UINT16(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
#define DEFINE_PROP_UINT32(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
314 315
#define DEFINE_PROP_INT32(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t)
316 317
#define DEFINE_PROP_UINT64(_n, _s, _f, _d)                      \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
J
Jan Kiszka 已提交
318 319
#define DEFINE_PROP_HEX8(_n, _s, _f, _d)                       \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex8, uint8_t)
320 321 322 323 324 325 326 327 328
#define DEFINE_PROP_HEX32(_n, _s, _f, _d)                       \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t)
#define DEFINE_PROP_HEX64(_n, _s, _f, _d)                       \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t)
#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d)                   \
    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t)

#define DEFINE_PROP_PTR(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
329 330
#define DEFINE_PROP_CHR(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*)
G
Gerd Hoffmann 已提交
331 332
#define DEFINE_PROP_STRING(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
G
Gerd Hoffmann 已提交
333 334
#define DEFINE_PROP_NETDEV(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*)
G
Gerd Hoffmann 已提交
335 336
#define DEFINE_PROP_VLAN(_n, _s, _f)             \
    DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, VLANState*)
337 338
#define DEFINE_PROP_DRIVE(_n, _s, _f) \
    DEFINE_PROP(_n, _s, _f, qdev_prop_drive, BlockDriverState *)
339
#define DEFINE_PROP_MACADDR(_n, _s, _f)         \
G
Gerd Hoffmann 已提交
340
    DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
341 342 343 344

#define DEFINE_PROP_END_OF_LIST()               \
    {}

G
Gerd Hoffmann 已提交
345 346
/* Set properties between creation and init.  */
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
G
Gerd Hoffmann 已提交
347
int qdev_prop_exists(DeviceState *dev, const char *name);
G
Gerd Hoffmann 已提交
348 349
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value);
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);
J
Juan Quintela 已提交
351
void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value);
G
Gerd Hoffmann 已提交
352 353
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value);
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);
B
Blue Swirl 已提交
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);
G
Gerd Hoffmann 已提交
358
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value);
G
Gerd Hoffmann 已提交
359
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value);
360 361
int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value) QEMU_WARN_UNUSED_RESULT;
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value);
G
Gerd Hoffmann 已提交
362
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value);
G
Gerd Hoffmann 已提交
363 364 365 366
/* FIXME: Remove opaque pointer properties.  */
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
void qdev_prop_set_defaults(DeviceState *dev, Property *props);

367 368
void qdev_prop_register_global_list(GlobalProperty *props);
void qdev_prop_set_globals(DeviceState *dev);
369

370 371 372 373 374
static inline const char *qdev_fw_name(DeviceState *dev)
{
    return dev->info->fw_name ? : dev->info->alias ? : dev->info->name;
}

375
char *qdev_get_fw_dev_path(DeviceState *dev);
B
Blue Swirl 已提交
376 377 378
/* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
extern struct BusInfo system_bus_info;

379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
/**
 * @qdev_ref
 *
 * Increase the reference count of a device.  A device cannot be freed as long
 * as its reference count is greater than zero.
 *
 * @dev - the device
 */
void qdev_ref(DeviceState *dev);

/**
 * @qdef_unref
 *
 * Decrease the reference count of a device.  A device cannot be freed as long
 * as its reference count is greater than zero.
 *
 * @dev - the device
 */
void qdev_unref(DeviceState *dev);

399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
/**
 * @qdev_property_add - add a new property to a device
 *
 * @dev - the device to add a property to
 *
 * @name - the name of the property.  This can contain any character except for
 *         a forward slash.  In general, you should use hyphens '-' instead of
 *         underscores '_' when naming properties.
 *
 * @type - the type name of the property.  This namespace is pretty loosely
 *         defined.  Sub namespaces are constructed by using a prefix and then
 *         to angle brackets.  For instance, the type 'virtio-net-pci' in the
 *         'link' namespace would be 'link<virtio-net-pci>'.
 *
 * @get - the getter to be called to read a property.  If this is NULL, then
 *        the property cannot be read.
 *
 * @set - the setter to be called to write a property.  If this is NULL,
 *        then the property cannot be written.
 *
 * @release - called when the property is removed from the device.  This is
 *            meant to allow a property to free its opaque upon device
 *            destruction.  This may be NULL.
 *
 * @opaque - an opaque pointer to pass to the callbacks for the property
 *
 * @errp - returns an error if this function fails
 */
void qdev_property_add(DeviceState *dev, const char *name, const char *type,
                       DevicePropertyAccessor *get, DevicePropertyAccessor *set,
                       DevicePropertyRelease *release,
                       void *opaque, Error **errp);

/**
 * @qdev_property_get - reads a property from a device
 *
 * @dev - the device
 *
 * @v - the visitor that will receive the property value.  This should be an
 *      Output visitor and the data will be written with @name as the name.
 *
 * @name - the name of the property
 *
 * @errp - returns an error if this function fails
 */
void qdev_property_get(DeviceState *dev, Visitor *v, const char *name,
                       Error **errp);

/**
 * @qdev_property_set - writes a property to a device
 *
 * @dev - the device
 *
 * @v - the visitor that will be used to write the property value.  This should
 *      be an Input visitor and the data will be first read with @name as the
 *      name and then written as the property value.
 *
 * @name - the name of the property
 *
 * @errp - returns an error if this function fails
 */
void qdev_property_set(DeviceState *dev, Visitor *v, const char *name,
                       Error **errp);

/**
 * @qdev_property_get_type - returns the type of a property
 *
 * @dev - the device
 *
 * @name - the name of the property
 *
 * @errp - returns an error if this function fails
 *
 * Returns:
 *   The type name of the property.
 */
const char *qdev_property_get_type(DeviceState *dev, const char *name,
                                   Error **errp);

478 479 480 481 482 483 484
/**
 * @qdev_property_add_legacy - add a legacy @Property to a device
 *
 * DO NOT USE THIS IN NEW CODE!
 */
void qdev_property_add_legacy(DeviceState *dev, Property *prop, Error **errp);

A
Anthony Liguori 已提交
485 486 487 488 489 490 491 492
/**
 * @qdev_get_root - returns the root device of the composition tree
 *
 * Returns:
 *   The root of the composition tree.
 */
DeviceState *qdev_get_root(void);

493 494 495 496 497 498 499 500 501
/**
 * @qdev_get_canonical_path - returns the canonical path for a device.  This
 * is the path within the composition tree starting from the root.
 *
 * Returns:
 *   The canonical path in the composition tree.
 */
gchar *qdev_get_canonical_path(DeviceState *dev);

502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
/**
 * @qdev_resolve_path - resolves a path returning a device
 *
 * There are two types of supported paths--absolute paths and partial paths.
 * 
 * Absolute paths are derived from the root device and can follow child<> or
 * link<> properties.  Since they can follow link<> properties, they can be
 * arbitrarily long.  Absolute paths look like absolute filenames and are
 * prefixed with a leading slash.
 * 
 * Partial paths look like relative filenames.  They do not begin with a
 * prefix.  The matching rules for partial paths are subtle but designed to make
 * specifying devices easy.  At each level of the composition tree, the partial
 * path is matched as an absolute path.  The first match is not returned.  At
 * least two matches are searched for.  A successful result is only returned if
 * only one match is founded.  If more than one match is found, a flag is
 * return to indicate that the match was ambiguous.
 *
 * @path - the path to resolve
 *
 * @ambiguous - returns true if the path resolution failed because of an
 *              ambiguous match
 *
 * Returns:
 *   The matched device or NULL on path lookup failure.
 */
DeviceState *qdev_resolve_path(const char *path, bool *ambiguous);

530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
/**
 * @qdev_property_add_child - Add a child property to a device
 *
 * Child properties form the composition tree.  All devices need to be a child
 * of another device.  Devices can only be a child of one device.
 *
 * There is no way for a child to determine what its parent is.  It is not
 * a bidirectional relationship.  This is by design.
 *
 * @dev - the device to add a property to
 *
 * @name - the name of the property
 *
 * @child - the child device
 *
 * @errp - if an error occurs, a pointer to an area to store the area
 */
void qdev_property_add_child(DeviceState *dev, const char *name,
                             DeviceState *child, Error **errp);

P
Paul Brook 已提交
550
#endif