Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 1 | #ifndef QDEV_H |
| 2 | #define QDEV_H |
| 3 | |
| 4 | #include "hw.h" |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 5 | #include "qemu-queue.h" |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 6 | #include "qemu-char.h" |
Gerd Hoffmann | f31d07d | 2009-07-31 12:25:37 +0200 | [diff] [blame] | 7 | #include "qemu-option.h" |
Anthony Liguori | 44677de | 2011-12-12 14:29:26 -0600 | [diff] [blame] | 8 | #include "qapi/qapi-visit-core.h" |
Anthony Liguori | 32fea40 | 2011-12-16 14:34:46 -0600 | [diff] [blame] | 9 | #include "qemu/object.h" |
Luiz Capitulino | 56f9107 | 2012-03-14 17:37:38 -0300 | [diff] [blame] | 10 | #include "error.h" |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 11 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 12 | typedef struct Property Property; |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 13 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 14 | typedef struct PropertyInfo PropertyInfo; |
| 15 | |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 16 | typedef struct CompatProperty CompatProperty; |
| 17 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 18 | typedef struct BusState BusState; |
Paul Brook | 4d6ae67 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 19 | |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 20 | typedef struct BusClass BusClass; |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 21 | |
Gerd Hoffmann | 131ec1b | 2009-09-25 21:42:34 +0200 | [diff] [blame] | 22 | enum DevState { |
| 23 | DEV_STATE_CREATED = 1, |
| 24 | DEV_STATE_INITIALIZED, |
| 25 | }; |
| 26 | |
Amit Shah | 75422b0 | 2010-02-25 17:24:43 +0530 | [diff] [blame] | 27 | enum { |
| 28 | DEV_NVECTORS_UNSPECIFIED = -1, |
| 29 | }; |
| 30 | |
Anthony Liguori | 32fea40 | 2011-12-16 14:34:46 -0600 | [diff] [blame] | 31 | #define TYPE_DEVICE "device" |
| 32 | #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE) |
Anthony Liguori | 30fbb9f | 2011-12-04 11:08:36 -0600 | [diff] [blame] | 33 | #define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE) |
| 34 | #define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE) |
Anthony Liguori | 32fea40 | 2011-12-16 14:34:46 -0600 | [diff] [blame] | 35 | |
Anthony Liguori | d307af7 | 2011-12-09 15:02:56 -0600 | [diff] [blame] | 36 | typedef int (*qdev_initfn)(DeviceState *dev); |
Anthony Liguori | 6e00858 | 2011-12-09 11:06:57 -0600 | [diff] [blame] | 37 | typedef int (*qdev_event)(DeviceState *dev); |
| 38 | typedef void (*qdev_resetfn)(DeviceState *dev); |
| 39 | |
Anthony Liguori | 32fea40 | 2011-12-16 14:34:46 -0600 | [diff] [blame] | 40 | typedef struct DeviceClass { |
| 41 | ObjectClass parent_class; |
Anthony Liguori | 6e00858 | 2011-12-09 11:06:57 -0600 | [diff] [blame] | 42 | |
| 43 | const char *fw_name; |
Anthony Liguori | 6e00858 | 2011-12-09 11:06:57 -0600 | [diff] [blame] | 44 | const char *desc; |
| 45 | Property *props; |
| 46 | int no_user; |
| 47 | |
| 48 | /* callbacks */ |
Anthony Liguori | 94afdad | 2011-12-04 11:36:01 -0600 | [diff] [blame] | 49 | void (*reset)(DeviceState *dev); |
Anthony Liguori | 6e00858 | 2011-12-09 11:06:57 -0600 | [diff] [blame] | 50 | |
| 51 | /* device state */ |
| 52 | const VMStateDescription *vmsd; |
| 53 | |
| 54 | /* Private to qdev / bus. */ |
| 55 | qdev_initfn init; |
| 56 | qdev_event unplug; |
| 57 | qdev_event exit; |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 58 | const char *bus_type; |
Anthony Liguori | 32fea40 | 2011-12-16 14:34:46 -0600 | [diff] [blame] | 59 | } DeviceClass; |
| 60 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 61 | /* This structure should not be accessed directly. We declare it here |
| 62 | so that it can be embedded in individual device state structures. */ |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 63 | struct DeviceState { |
Anthony Liguori | 32fea40 | 2011-12-16 14:34:46 -0600 | [diff] [blame] | 64 | Object parent_obj; |
| 65 | |
Gerd Hoffmann | f31d07d | 2009-07-31 12:25:37 +0200 | [diff] [blame] | 66 | const char *id; |
Gerd Hoffmann | 131ec1b | 2009-09-25 21:42:34 +0200 | [diff] [blame] | 67 | enum DevState state; |
Gerd Hoffmann | ef80b46 | 2009-09-25 21:42:49 +0200 | [diff] [blame] | 68 | QemuOpts *opts; |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 69 | int hotplugged; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 70 | BusState *parent_bus; |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 71 | int num_gpio_out; |
| 72 | qemu_irq *gpio_out; |
| 73 | int num_gpio_in; |
| 74 | qemu_irq *gpio_in; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 75 | QLIST_HEAD(, BusState) child_bus; |
Gerd Hoffmann | d271de9 | 2009-07-15 13:59:24 +0200 | [diff] [blame] | 76 | int num_child_bus; |
Jan Kiszka | 4d2ffa0 | 2010-05-15 13:32:40 +0200 | [diff] [blame] | 77 | int instance_id_alias; |
| 78 | int alias_required_for_version; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 79 | }; |
| 80 | |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 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); |
Stefan Weil | c578861 | 2012-07-20 23:04:49 +0200 | [diff] [blame] | 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 | */ |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 97 | char *(*get_fw_dev_path)(DeviceState *dev); |
| 98 | int (*reset)(BusState *bus); |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 99 | }; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 100 | |
Anthony Liguori | 0866aca | 2011-12-23 15:34:39 -0600 | [diff] [blame] | 101 | typedef struct BusChild { |
| 102 | DeviceState *child; |
| 103 | int index; |
| 104 | QTAILQ_ENTRY(BusChild) sibling; |
| 105 | } BusChild; |
| 106 | |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 107 | /** |
| 108 | * BusState: |
| 109 | * @qom_allocated: Indicates whether the object was allocated by QOM. |
| 110 | * @glib_allocated: Indicates whether the object was initialized in-place |
| 111 | * yet is expected to be freed with g_free(). |
| 112 | */ |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 113 | struct BusState { |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 114 | Object obj; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 115 | DeviceState *parent; |
| 116 | const char *name; |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 117 | int allow_hotplug; |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 118 | bool qom_allocated; |
| 119 | bool glib_allocated; |
Anthony Liguori | 0866aca | 2011-12-23 15:34:39 -0600 | [diff] [blame] | 120 | int max_index; |
| 121 | QTAILQ_HEAD(ChildrenHead, BusChild) children; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 122 | QLIST_ENTRY(BusState) sibling; |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 123 | }; |
| 124 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 125 | struct Property { |
| 126 | const char *name; |
| 127 | PropertyInfo *info; |
| 128 | int offset; |
Paolo Bonzini | 4f2d3d7 | 2012-02-02 09:43:02 +0100 | [diff] [blame] | 129 | uint8_t bitnr; |
| 130 | uint8_t qtype; |
| 131 | int64_t defval; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 132 | }; |
| 133 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 134 | struct PropertyInfo { |
| 135 | const char *name; |
Paolo Bonzini | cafe5bd | 2011-12-18 17:05:10 +0100 | [diff] [blame] | 136 | const char *legacy_name; |
Paolo Bonzini | 1ce0512 | 2012-02-02 22:09:44 +0100 | [diff] [blame] | 137 | const char **enum_table; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 138 | int (*parse)(DeviceState *dev, Property *prop, const char *str); |
| 139 | int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); |
Anthony Liguori | 57c9faf | 2012-01-30 08:55:55 -0600 | [diff] [blame] | 140 | ObjectPropertyAccessor *get; |
| 141 | ObjectPropertyAccessor *set; |
Paolo Bonzini | dd0ba25 | 2012-02-02 13:08:48 +0100 | [diff] [blame] | 142 | ObjectPropertyRelease *release; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 143 | }; |
| 144 | |
Gerd Hoffmann | 458fb67 | 2009-12-08 13:11:33 +0100 | [diff] [blame] | 145 | typedef struct GlobalProperty { |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 146 | const char *driver; |
| 147 | const char *property; |
| 148 | const char *value; |
Gerd Hoffmann | 458fb67 | 2009-12-08 13:11:33 +0100 | [diff] [blame] | 149 | QTAILQ_ENTRY(GlobalProperty) next; |
| 150 | } GlobalProperty; |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 151 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 152 | /*** Board API. This should go away once we have a machine config file. ***/ |
| 153 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 154 | DeviceState *qdev_create(BusState *bus, const char *name); |
Blue Swirl | 0bcdeda | 2011-02-05 14:34:25 +0000 | [diff] [blame] | 155 | DeviceState *qdev_try_create(BusState *bus, const char *name); |
Blue Swirl | a369da5 | 2011-09-27 19:15:42 +0000 | [diff] [blame] | 156 | bool qdev_exists(const char *name); |
Markus Armbruster | ff952ba | 2010-01-29 19:48:57 +0100 | [diff] [blame] | 157 | int qdev_device_help(QemuOpts *opts); |
Gerd Hoffmann | f31d07d | 2009-07-31 12:25:37 +0200 | [diff] [blame] | 158 | DeviceState *qdev_device_add(QemuOpts *opts); |
Blue Swirl | 747bbdf | 2009-10-18 16:26:06 +0000 | [diff] [blame] | 159 | int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT; |
Markus Armbruster | e23a1b3 | 2009-10-07 01:15:58 +0200 | [diff] [blame] | 160 | void qdev_init_nofail(DeviceState *dev); |
Jan Kiszka | 4d2ffa0 | 2010-05-15 13:32:40 +0200 | [diff] [blame] | 161 | void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, |
| 162 | int required_for_version); |
Luiz Capitulino | 56f9107 | 2012-03-14 17:37:38 -0300 | [diff] [blame] | 163 | void qdev_unplug(DeviceState *dev, Error **errp); |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 164 | void qdev_free(DeviceState *dev); |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 165 | int qdev_simple_unplug_cb(DeviceState *dev); |
| 166 | void qdev_machine_creation_done(void); |
Alex Williamson | 0ac8ef7 | 2011-01-04 12:37:50 -0700 | [diff] [blame] | 167 | bool qdev_machine_modified(void); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 168 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 169 | qemu_irq qdev_get_gpio_in(DeviceState *dev, int n); |
| 170 | void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); |
| 171 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 172 | BusState *qdev_get_child_bus(DeviceState *dev, const char *name); |
Paul Brook | 4d6ae67 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 173 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 174 | /*** Device API. ***/ |
| 175 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 176 | /* Register device properties. */ |
Paul Brook | 067a3dd | 2009-05-26 14:56:11 +0100 | [diff] [blame] | 177 | /* GPIO inputs also double as IRQ sinks. */ |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 178 | void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n); |
| 179 | void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 180 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 181 | BusState *qdev_get_parent_bus(DeviceState *dev); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 182 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 183 | /*** BUS API. ***/ |
| 184 | |
Isaku Yamahata | a2ee6b4 | 2010-12-24 12:14:12 +0900 | [diff] [blame] | 185 | DeviceState *qdev_find_recursive(BusState *bus, const char *id); |
| 186 | |
Anthony Liguori | 81699d8 | 2010-11-19 18:55:58 +0900 | [diff] [blame] | 187 | /* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */ |
| 188 | typedef int (qbus_walkerfn)(BusState *bus, void *opaque); |
| 189 | typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); |
| 190 | |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 191 | void qbus_create_inplace(BusState *bus, const char *typename, |
Gerd Hoffmann | cd739fb | 2009-09-16 22:25:27 +0200 | [diff] [blame] | 192 | DeviceState *parent, const char *name); |
Anthony Liguori | 0d93692 | 2012-05-02 09:00:20 +0200 | [diff] [blame] | 193 | BusState *qbus_create(const char *typename, DeviceState *parent, const char *name); |
Anthony Liguori | 81699d8 | 2010-11-19 18:55:58 +0900 | [diff] [blame] | 194 | /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion, |
| 195 | * < 0 if either devfn or busfn terminate walk somewhere in cursion, |
| 196 | * 0 otherwise. */ |
| 197 | int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn, |
| 198 | qbus_walkerfn *busfn, void *opaque); |
| 199 | int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn, |
| 200 | qbus_walkerfn *busfn, void *opaque); |
Isaku Yamahata | 5af0a04 | 2010-11-19 18:56:01 +0900 | [diff] [blame] | 201 | void qdev_reset_all(DeviceState *dev); |
Isaku Yamahata | 80376c3 | 2010-12-20 14:33:35 +0900 | [diff] [blame] | 202 | void qbus_reset_all_fn(void *opaque); |
| 203 | |
Gerd Hoffmann | 131ec1b | 2009-09-25 21:42:34 +0200 | [diff] [blame] | 204 | void qbus_free(BusState *bus); |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 205 | |
| 206 | #define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev) |
| 207 | |
Anthony Liguori | ec990eb | 2010-11-19 18:55:59 +0900 | [diff] [blame] | 208 | /* This should go away once we get rid of the NULL bus hack */ |
| 209 | BusState *sysbus_get_default(void); |
| 210 | |
Gerd Hoffmann | cae4956 | 2009-06-05 15:53:17 +0100 | [diff] [blame] | 211 | /*** monitor commands ***/ |
| 212 | |
| 213 | void do_info_qtree(Monitor *mon); |
Gerd Hoffmann | f6c64e0 | 2009-08-03 15:03:09 +0200 | [diff] [blame] | 214 | void do_info_qdm(Monitor *mon); |
Markus Armbruster | 8bc2724 | 2010-02-10 20:52:01 +0100 | [diff] [blame] | 215 | int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data); |
Markus Armbruster | 17a38ea | 2010-03-22 11:38:14 +0100 | [diff] [blame] | 216 | int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data); |
Gerd Hoffmann | cae4956 | 2009-06-05 15:53:17 +0100 | [diff] [blame] | 217 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 218 | /*** qdev-properties.c ***/ |
| 219 | |
Michael S. Tsirkin | d2364ee | 2010-01-10 13:52:41 +0200 | [diff] [blame] | 220 | extern PropertyInfo qdev_prop_bit; |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 221 | extern PropertyInfo qdev_prop_uint8; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 222 | extern PropertyInfo qdev_prop_uint16; |
| 223 | extern PropertyInfo qdev_prop_uint32; |
Gerd Hoffmann | 316940b | 2009-09-10 11:43:25 +0200 | [diff] [blame] | 224 | extern PropertyInfo qdev_prop_int32; |
Blue Swirl | 5a053d1 | 2009-07-21 11:10:41 +0000 | [diff] [blame] | 225 | extern PropertyInfo qdev_prop_uint64; |
Jan Kiszka | 6835678 | 2011-10-07 09:19:52 +0200 | [diff] [blame] | 226 | extern PropertyInfo qdev_prop_hex8; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 227 | extern PropertyInfo qdev_prop_hex32; |
Blue Swirl | 5a053d1 | 2009-07-21 11:10:41 +0000 | [diff] [blame] | 228 | extern PropertyInfo qdev_prop_hex64; |
Gerd Hoffmann | 5941966 | 2009-10-12 17:15:47 +0530 | [diff] [blame] | 229 | extern PropertyInfo qdev_prop_string; |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 230 | extern PropertyInfo qdev_prop_chr; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 231 | extern PropertyInfo qdev_prop_ptr; |
| 232 | extern PropertyInfo qdev_prop_macaddr; |
Jan Kiszka | 4e4fa39 | 2012-01-23 20:15:11 +0100 | [diff] [blame] | 233 | extern PropertyInfo qdev_prop_losttickpolicy; |
Markus Armbruster | 8cd4174 | 2012-07-10 11:12:47 +0200 | [diff] [blame] | 234 | extern PropertyInfo qdev_prop_bios_chs_trans; |
Gerd Hoffmann | 14b4187 | 2009-07-31 12:25:40 +0200 | [diff] [blame] | 235 | extern PropertyInfo qdev_prop_drive; |
Gerd Hoffmann | 851bec0 | 2009-10-21 15:25:25 +0200 | [diff] [blame] | 236 | extern PropertyInfo qdev_prop_netdev; |
| 237 | extern PropertyInfo qdev_prop_vlan; |
Gerd Hoffmann | 05cb5fe | 2009-07-15 13:59:22 +0200 | [diff] [blame] | 238 | extern PropertyInfo qdev_prop_pci_devfn; |
Stefan Hajnoczi | 02fda01 | 2012-03-14 15:57:05 +0000 | [diff] [blame] | 239 | extern PropertyInfo qdev_prop_blocksize; |
Anthony PERARD | 679042f | 2012-06-21 15:36:23 +0000 | [diff] [blame] | 240 | extern PropertyInfo qdev_prop_pci_host_devaddr; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 241 | |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 242 | #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ |
| 243 | .name = (_name), \ |
| 244 | .info = &(_prop), \ |
| 245 | .offset = offsetof(_state, _field) \ |
| 246 | + type_check(_type,typeof_field(_state, _field)), \ |
| 247 | } |
| 248 | #define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \ |
| 249 | .name = (_name), \ |
| 250 | .info = &(_prop), \ |
| 251 | .offset = offsetof(_state, _field) \ |
| 252 | + type_check(_type,typeof_field(_state, _field)), \ |
Paolo Bonzini | 4f2d3d7 | 2012-02-02 09:43:02 +0100 | [diff] [blame] | 253 | .qtype = QTYPE_QINT, \ |
| 254 | .defval = (_type)_defval, \ |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 255 | } |
Michael S. Tsirkin | d2364ee | 2010-01-10 13:52:41 +0200 | [diff] [blame] | 256 | #define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \ |
| 257 | .name = (_name), \ |
| 258 | .info = &(qdev_prop_bit), \ |
| 259 | .bitnr = (_bit), \ |
| 260 | .offset = offsetof(_state, _field) \ |
| 261 | + type_check(uint32_t,typeof_field(_state, _field)), \ |
Paolo Bonzini | 4f2d3d7 | 2012-02-02 09:43:02 +0100 | [diff] [blame] | 262 | .qtype = QTYPE_QBOOL, \ |
| 263 | .defval = (bool)_defval, \ |
Michael S. Tsirkin | d2364ee | 2010-01-10 13:52:41 +0200 | [diff] [blame] | 264 | } |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 265 | |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 266 | #define DEFINE_PROP_UINT8(_n, _s, _f, _d) \ |
| 267 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 268 | #define DEFINE_PROP_UINT16(_n, _s, _f, _d) \ |
| 269 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t) |
| 270 | #define DEFINE_PROP_UINT32(_n, _s, _f, _d) \ |
| 271 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t) |
Gerd Hoffmann | 316940b | 2009-09-10 11:43:25 +0200 | [diff] [blame] | 272 | #define DEFINE_PROP_INT32(_n, _s, _f, _d) \ |
| 273 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 274 | #define DEFINE_PROP_UINT64(_n, _s, _f, _d) \ |
| 275 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t) |
Jan Kiszka | 6835678 | 2011-10-07 09:19:52 +0200 | [diff] [blame] | 276 | #define DEFINE_PROP_HEX8(_n, _s, _f, _d) \ |
| 277 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex8, uint8_t) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 278 | #define DEFINE_PROP_HEX32(_n, _s, _f, _d) \ |
| 279 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t) |
| 280 | #define DEFINE_PROP_HEX64(_n, _s, _f, _d) \ |
| 281 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t) |
| 282 | #define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \ |
Michael Roth | 09f1bbc | 2012-03-04 13:38:27 -0600 | [diff] [blame] | 283 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, int32_t) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 284 | |
| 285 | #define DEFINE_PROP_PTR(_n, _s, _f) \ |
| 286 | DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*) |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 287 | #define DEFINE_PROP_CHR(_n, _s, _f) \ |
| 288 | DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*) |
Gerd Hoffmann | 5941966 | 2009-10-12 17:15:47 +0530 | [diff] [blame] | 289 | #define DEFINE_PROP_STRING(_n, _s, _f) \ |
| 290 | DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*) |
Gerd Hoffmann | 2ef924b | 2009-10-21 15:25:24 +0200 | [diff] [blame] | 291 | #define DEFINE_PROP_NETDEV(_n, _s, _f) \ |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 292 | DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, NetClientState*) |
Gerd Hoffmann | 851bec0 | 2009-10-21 15:25:25 +0200 | [diff] [blame] | 293 | #define DEFINE_PROP_VLAN(_n, _s, _f) \ |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 294 | DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, NetClientState*) |
Markus Armbruster | f8b6cc0 | 2010-05-05 16:36:52 +0200 | [diff] [blame] | 295 | #define DEFINE_PROP_DRIVE(_n, _s, _f) \ |
| 296 | DEFINE_PROP(_n, _s, _f, qdev_prop_drive, BlockDriverState *) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 297 | #define DEFINE_PROP_MACADDR(_n, _s, _f) \ |
Gerd Hoffmann | 1503fff | 2009-10-21 15:25:23 +0200 | [diff] [blame] | 298 | DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr) |
Jan Kiszka | 4e4fa39 | 2012-01-23 20:15:11 +0100 | [diff] [blame] | 299 | #define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \ |
| 300 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_losttickpolicy, \ |
| 301 | LostTickPolicy) |
Markus Armbruster | 8cd4174 | 2012-07-10 11:12:47 +0200 | [diff] [blame] | 302 | #define DEFINE_PROP_BIOS_CHS_TRANS(_n, _s, _f, _d) \ |
| 303 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_bios_chs_trans, int) |
Stefan Hajnoczi | 02fda01 | 2012-03-14 15:57:05 +0000 | [diff] [blame] | 304 | #define DEFINE_PROP_BLOCKSIZE(_n, _s, _f, _d) \ |
| 305 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_blocksize, uint16_t) |
Anthony PERARD | 679042f | 2012-06-21 15:36:23 +0000 | [diff] [blame] | 306 | #define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \ |
| 307 | DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 308 | |
| 309 | #define DEFINE_PROP_END_OF_LIST() \ |
| 310 | {} |
| 311 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 312 | /* Set properties between creation and init. */ |
| 313 | void *qdev_get_prop_ptr(DeviceState *dev, Property *prop); |
| 314 | int qdev_prop_parse(DeviceState *dev, const char *name, const char *value); |
Isaku Yamahata | f4594a3 | 2010-06-23 16:15:29 +0900 | [diff] [blame] | 315 | void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value); |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 316 | void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value); |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 317 | void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value); |
| 318 | void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value); |
Gerd Hoffmann | 316940b | 2009-09-10 11:43:25 +0200 | [diff] [blame] | 319 | void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value); |
Blue Swirl | 5a053d1 | 2009-07-21 11:10:41 +0000 | [diff] [blame] | 320 | void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value); |
Christian Borntraeger | 3b25597 | 2012-07-17 15:26:17 +0200 | [diff] [blame] | 321 | void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value); |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 322 | void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value); |
Stefan Hajnoczi | 4e68f7a | 2012-07-24 16:35:13 +0100 | [diff] [blame] | 323 | void qdev_prop_set_netdev(DeviceState *dev, const char *name, NetClientState *value); |
Markus Armbruster | 18846de | 2010-06-29 16:58:30 +0200 | [diff] [blame] | 324 | int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value) QEMU_WARN_UNUSED_RESULT; |
| 325 | void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value); |
Gerd Hoffmann | 1503fff | 2009-10-21 15:25:23 +0200 | [diff] [blame] | 326 | void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value); |
Paolo Bonzini | 9b170e6 | 2012-02-02 12:51:44 +0100 | [diff] [blame] | 327 | void qdev_prop_set_enum(DeviceState *dev, const char *name, int value); |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 328 | /* FIXME: Remove opaque pointer properties. */ |
| 329 | void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 330 | |
Gerd Hoffmann | 458fb67 | 2009-12-08 13:11:33 +0100 | [diff] [blame] | 331 | void qdev_prop_register_global_list(GlobalProperty *props); |
| 332 | void qdev_prop_set_globals(DeviceState *dev); |
Paolo Bonzini | 7db4c4e | 2011-12-18 17:05:07 +0100 | [diff] [blame] | 333 | void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, |
| 334 | Property *prop, const char *value); |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 335 | |
Gleb Natapov | 1ca4d09 | 2010-12-08 13:35:05 +0200 | [diff] [blame] | 336 | char *qdev_get_fw_dev_path(DeviceState *dev); |
Anthony Liguori | 4be9f0d | 2011-12-09 10:51:49 -0600 | [diff] [blame] | 337 | |
Anthony Liguori | 85ed303 | 2011-12-12 14:29:25 -0600 | [diff] [blame] | 338 | /** |
Paolo Bonzini | ca2cc78 | 2011-12-18 17:05:11 +0100 | [diff] [blame] | 339 | * @qdev_property_add_static - add a @Property to a device referencing a |
| 340 | * field in a struct. |
Anthony Liguori | a5296ca | 2011-12-12 14:29:27 -0600 | [diff] [blame] | 341 | */ |
Paolo Bonzini | ca2cc78 | 2011-12-18 17:05:11 +0100 | [diff] [blame] | 342 | void qdev_property_add_static(DeviceState *dev, Property *prop, Error **errp); |
Anthony Liguori | a5296ca | 2011-12-12 14:29:27 -0600 | [diff] [blame] | 343 | |
Anthony Liguori | a10f07a | 2011-12-12 14:29:28 -0600 | [diff] [blame] | 344 | /** |
Anthony Liguori | 1de81d2 | 2011-12-19 16:37:46 -0600 | [diff] [blame] | 345 | * @qdev_machine_init |
| 346 | * |
| 347 | * Initialize platform devices before machine init. This is a hack until full |
| 348 | * support for composition is added. |
| 349 | */ |
| 350 | void qdev_machine_init(void); |
| 351 | |
Anthony Liguori | 94afdad | 2011-12-04 11:36:01 -0600 | [diff] [blame] | 352 | /** |
| 353 | * @device_reset |
| 354 | * |
| 355 | * Reset a single device (by calling the reset method). |
| 356 | */ |
| 357 | void device_reset(DeviceState *dev); |
| 358 | |
Anthony Liguori | 4be9f0d | 2011-12-09 10:51:49 -0600 | [diff] [blame] | 359 | const VMStateDescription *qdev_get_vmsd(DeviceState *dev); |
| 360 | |
| 361 | const char *qdev_fw_name(DeviceState *dev); |
| 362 | |
Paolo Bonzini | f05f6b4 | 2012-03-28 16:34:12 +0200 | [diff] [blame] | 363 | Object *qdev_get_machine(void); |
| 364 | |
Anthony Liguori | 9fbe612 | 2011-12-22 15:14:27 -0600 | [diff] [blame] | 365 | /* FIXME: make this a link<> */ |
| 366 | void qdev_set_parent_bus(DeviceState *dev, BusState *bus); |
| 367 | |
Anthony Liguori | ee46d8a | 2011-12-22 15:24:20 -0600 | [diff] [blame] | 368 | extern int qdev_hotplug; |
| 369 | |
Anthony Liguori | 09e5ab6 | 2012-02-03 12:28:43 -0600 | [diff] [blame] | 370 | char *qdev_get_dev_path(DeviceState *dev); |
| 371 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 372 | #endif |