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" |
Gerd Hoffmann | 14b4187 | 2009-07-31 12:25:40 +0200 | [diff] [blame] | 5 | #include "sysemu.h" |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 6 | #include "qemu-queue.h" |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 7 | #include "qemu-char.h" |
Gerd Hoffmann | f31d07d | 2009-07-31 12:25:37 +0200 | [diff] [blame] | 8 | #include "qemu-option.h" |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 9 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 10 | typedef struct Property Property; |
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 PropertyInfo PropertyInfo; |
| 13 | |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 14 | typedef struct CompatProperty CompatProperty; |
| 15 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 16 | typedef struct DeviceInfo DeviceInfo; |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 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 | |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 20 | typedef struct BusInfo BusInfo; |
| 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 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 27 | /* This structure should not be accessed directly. We declare it here |
| 28 | so that it can be embedded in individual device state structures. */ |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 29 | struct DeviceState { |
Gerd Hoffmann | f31d07d | 2009-07-31 12:25:37 +0200 | [diff] [blame] | 30 | const char *id; |
Gerd Hoffmann | 131ec1b | 2009-09-25 21:42:34 +0200 | [diff] [blame] | 31 | enum DevState state; |
Gerd Hoffmann | ef80b46 | 2009-09-25 21:42:49 +0200 | [diff] [blame] | 32 | QemuOpts *opts; |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 33 | int hotplugged; |
Gerd Hoffmann | 042f84d | 2009-06-30 14:12:09 +0200 | [diff] [blame] | 34 | DeviceInfo *info; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 35 | BusState *parent_bus; |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 36 | int num_gpio_out; |
| 37 | qemu_irq *gpio_out; |
| 38 | int num_gpio_in; |
| 39 | qemu_irq *gpio_in; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 40 | QLIST_HEAD(, BusState) child_bus; |
Gerd Hoffmann | d271de9 | 2009-07-15 13:59:24 +0200 | [diff] [blame] | 41 | int num_child_bus; |
Paul Brook | 9d07d75 | 2009-05-14 22:35:07 +0100 | [diff] [blame] | 42 | NICInfo *nd; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 43 | QLIST_ENTRY(DeviceState) sibling; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 44 | }; |
| 45 | |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 46 | typedef void (*bus_dev_printfn)(Monitor *mon, DeviceState *dev, int indent); |
| 47 | struct BusInfo { |
| 48 | const char *name; |
| 49 | size_t size; |
| 50 | bus_dev_printfn print_dev; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 51 | Property *props; |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 52 | }; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 53 | |
| 54 | struct BusState { |
| 55 | DeviceState *parent; |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 56 | BusInfo *info; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 57 | const char *name; |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 58 | int allow_hotplug; |
Gerd Hoffmann | cd739fb | 2009-09-16 22:25:27 +0200 | [diff] [blame] | 59 | int qdev_allocated; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 60 | QLIST_HEAD(, DeviceState) children; |
| 61 | QLIST_ENTRY(BusState) sibling; |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 62 | }; |
| 63 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 64 | struct Property { |
| 65 | const char *name; |
| 66 | PropertyInfo *info; |
| 67 | int offset; |
| 68 | void *defval; |
| 69 | }; |
| 70 | |
| 71 | enum PropertyType { |
| 72 | PROP_TYPE_UNSPEC = 0, |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 73 | PROP_TYPE_UINT8, |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 74 | PROP_TYPE_UINT16, |
| 75 | PROP_TYPE_UINT32, |
Gerd Hoffmann | 316940b | 2009-09-10 11:43:25 +0200 | [diff] [blame] | 76 | PROP_TYPE_INT32, |
Blue Swirl | 5a053d1 | 2009-07-21 11:10:41 +0000 | [diff] [blame] | 77 | PROP_TYPE_UINT64, |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 78 | PROP_TYPE_TADDR, |
| 79 | PROP_TYPE_MACADDR, |
Gerd Hoffmann | 14b4187 | 2009-07-31 12:25:40 +0200 | [diff] [blame] | 80 | PROP_TYPE_DRIVE, |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 81 | PROP_TYPE_CHR, |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 82 | PROP_TYPE_PTR, |
| 83 | }; |
| 84 | |
| 85 | struct PropertyInfo { |
| 86 | const char *name; |
| 87 | size_t size; |
| 88 | enum PropertyType type; |
| 89 | int (*parse)(DeviceState *dev, Property *prop, const char *str); |
| 90 | int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); |
| 91 | }; |
| 92 | |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 93 | struct CompatProperty { |
| 94 | const char *driver; |
| 95 | const char *property; |
| 96 | const char *value; |
| 97 | }; |
| 98 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 99 | /*** Board API. This should go away once we have a machine config file. ***/ |
| 100 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 101 | DeviceState *qdev_create(BusState *bus, const char *name); |
Gerd Hoffmann | f31d07d | 2009-07-31 12:25:37 +0200 | [diff] [blame] | 102 | DeviceState *qdev_device_add(QemuOpts *opts); |
Markus Armbruster | dde8bbb | 2009-10-07 01:16:00 +0200 | [diff] [blame] | 103 | int qdev_init(DeviceState *dev) __attribute__((warn_unused_result)); |
Markus Armbruster | e23a1b3 | 2009-10-07 01:15:58 +0200 | [diff] [blame] | 104 | void qdev_init_nofail(DeviceState *dev); |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 105 | int qdev_unplug(DeviceState *dev); |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 106 | void qdev_free(DeviceState *dev); |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 107 | int qdev_simple_unplug_cb(DeviceState *dev); |
| 108 | void qdev_machine_creation_done(void); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 109 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 110 | qemu_irq qdev_get_gpio_in(DeviceState *dev, int n); |
| 111 | void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); |
| 112 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 113 | BusState *qdev_get_child_bus(DeviceState *dev, const char *name); |
Paul Brook | 4d6ae67 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 114 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 115 | /*** Device API. ***/ |
| 116 | |
Gerd Hoffmann | 81a322d | 2009-08-14 10:36:05 +0200 | [diff] [blame] | 117 | typedef int (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 118 | typedef int (*qdev_event)(DeviceState *dev); |
Michael S. Tsirkin | 7f23f81 | 2009-09-16 13:40:27 +0300 | [diff] [blame] | 119 | typedef void (*qdev_resetfn)(DeviceState *dev); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 120 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 121 | struct DeviceInfo { |
Gerd Hoffmann | 074f2ff | 2009-06-10 09:41:42 +0200 | [diff] [blame] | 122 | const char *name; |
Gerd Hoffmann | 3320e56 | 2009-07-15 13:43:33 +0200 | [diff] [blame] | 123 | const char *alias; |
| 124 | const char *desc; |
Gerd Hoffmann | 074f2ff | 2009-06-10 09:41:42 +0200 | [diff] [blame] | 125 | size_t size; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 126 | Property *props; |
Gerd Hoffmann | 3320e56 | 2009-07-15 13:43:33 +0200 | [diff] [blame] | 127 | int no_user; |
Gerd Hoffmann | 074f2ff | 2009-06-10 09:41:42 +0200 | [diff] [blame] | 128 | |
Gerd Hoffmann | 959f733 | 2009-09-01 09:56:12 +0200 | [diff] [blame] | 129 | /* callbacks */ |
Michael S. Tsirkin | 7f23f81 | 2009-09-16 13:40:27 +0300 | [diff] [blame] | 130 | qdev_resetfn reset; |
Gerd Hoffmann | 959f733 | 2009-09-01 09:56:12 +0200 | [diff] [blame] | 131 | |
Gerd Hoffmann | 391a079 | 2009-09-01 09:56:14 +0200 | [diff] [blame] | 132 | /* device state */ |
| 133 | const VMStateDescription *vmsd; |
| 134 | |
Gerd Hoffmann | 074f2ff | 2009-06-10 09:41:42 +0200 | [diff] [blame] | 135 | /* Private to qdev / bus. */ |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 136 | qdev_initfn init; |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 137 | qdev_event unplug; |
| 138 | qdev_event exit; |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 139 | BusInfo *bus_info; |
Gerd Hoffmann | 042f84d | 2009-06-30 14:12:09 +0200 | [diff] [blame] | 140 | struct DeviceInfo *next; |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 141 | }; |
| 142 | |
Gerd Hoffmann | 074f2ff | 2009-06-10 09:41:42 +0200 | [diff] [blame] | 143 | void qdev_register(DeviceInfo *info); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 144 | |
| 145 | /* Register device properties. */ |
Paul Brook | 067a3dd | 2009-05-26 14:56:11 +0100 | [diff] [blame] | 146 | /* GPIO inputs also double as IRQ sinks. */ |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 147 | void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n); |
| 148 | void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 149 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 150 | CharDriverState *qdev_init_chardev(DeviceState *dev); |
| 151 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 152 | BusState *qdev_get_parent_bus(DeviceState *dev); |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 153 | |
Stefan Weil | 979ba18 | 2009-09-17 19:06:53 +0200 | [diff] [blame] | 154 | /* Convert from a base type to a parent type, with compile time checking. */ |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 155 | #ifdef __GNUC__ |
| 156 | #define DO_UPCAST(type, field, dev) ( __extension__ ( { \ |
| 157 | char __attribute__((unused)) offset_must_be_zero[ \ |
| 158 | -offsetof(type, field)]; \ |
| 159 | container_of(dev, type, field);})) |
| 160 | #else |
| 161 | #define DO_UPCAST(type, field, dev) container_of(dev, type, field) |
| 162 | #endif |
| 163 | |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 164 | /*** BUS API. ***/ |
| 165 | |
Gerd Hoffmann | cd739fb | 2009-09-16 22:25:27 +0200 | [diff] [blame] | 166 | void qbus_create_inplace(BusState *bus, BusInfo *info, |
| 167 | DeviceState *parent, const char *name); |
Gerd Hoffmann | 10c4c98 | 2009-06-30 14:12:08 +0200 | [diff] [blame] | 168 | BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name); |
Gerd Hoffmann | 131ec1b | 2009-09-25 21:42:34 +0200 | [diff] [blame] | 169 | void qbus_free(BusState *bus); |
Paul Brook | 02e2da4 | 2009-05-23 00:05:19 +0100 | [diff] [blame] | 170 | |
| 171 | #define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev) |
| 172 | |
Gerd Hoffmann | cae4956 | 2009-06-05 15:53:17 +0100 | [diff] [blame] | 173 | /*** monitor commands ***/ |
| 174 | |
| 175 | void do_info_qtree(Monitor *mon); |
Gerd Hoffmann | f6c64e0 | 2009-08-03 15:03:09 +0200 | [diff] [blame] | 176 | void do_info_qdm(Monitor *mon); |
Gerd Hoffmann | 3418bd2 | 2009-09-25 21:42:41 +0200 | [diff] [blame] | 177 | void do_device_add(Monitor *mon, const QDict *qdict); |
| 178 | void do_device_del(Monitor *mon, const QDict *qdict); |
Gerd Hoffmann | cae4956 | 2009-06-05 15:53:17 +0100 | [diff] [blame] | 179 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 180 | /*** qdev-properties.c ***/ |
| 181 | |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 182 | extern PropertyInfo qdev_prop_uint8; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 183 | extern PropertyInfo qdev_prop_uint16; |
| 184 | extern PropertyInfo qdev_prop_uint32; |
Gerd Hoffmann | 316940b | 2009-09-10 11:43:25 +0200 | [diff] [blame] | 185 | extern PropertyInfo qdev_prop_int32; |
Blue Swirl | 5a053d1 | 2009-07-21 11:10:41 +0000 | [diff] [blame] | 186 | extern PropertyInfo qdev_prop_uint64; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 187 | extern PropertyInfo qdev_prop_hex32; |
Blue Swirl | 5a053d1 | 2009-07-21 11:10:41 +0000 | [diff] [blame] | 188 | extern PropertyInfo qdev_prop_hex64; |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 189 | extern PropertyInfo qdev_prop_chr; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 190 | extern PropertyInfo qdev_prop_ptr; |
| 191 | extern PropertyInfo qdev_prop_macaddr; |
Gerd Hoffmann | 14b4187 | 2009-07-31 12:25:40 +0200 | [diff] [blame] | 192 | extern PropertyInfo qdev_prop_drive; |
Gerd Hoffmann | 05cb5fe | 2009-07-15 13:59:22 +0200 | [diff] [blame] | 193 | extern PropertyInfo qdev_prop_pci_devfn; |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 194 | |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 195 | #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ |
| 196 | .name = (_name), \ |
| 197 | .info = &(_prop), \ |
| 198 | .offset = offsetof(_state, _field) \ |
| 199 | + type_check(_type,typeof_field(_state, _field)), \ |
| 200 | } |
| 201 | #define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \ |
| 202 | .name = (_name), \ |
| 203 | .info = &(_prop), \ |
| 204 | .offset = offsetof(_state, _field) \ |
| 205 | + type_check(_type,typeof_field(_state, _field)), \ |
| 206 | .defval = (_type[]) { _defval }, \ |
| 207 | } |
| 208 | |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 209 | #define DEFINE_PROP_UINT8(_n, _s, _f, _d) \ |
| 210 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 211 | #define DEFINE_PROP_UINT16(_n, _s, _f, _d) \ |
| 212 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t) |
| 213 | #define DEFINE_PROP_UINT32(_n, _s, _f, _d) \ |
| 214 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t) |
Gerd Hoffmann | 316940b | 2009-09-10 11:43:25 +0200 | [diff] [blame] | 215 | #define DEFINE_PROP_INT32(_n, _s, _f, _d) \ |
| 216 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 217 | #define DEFINE_PROP_UINT64(_n, _s, _f, _d) \ |
| 218 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t) |
| 219 | #define DEFINE_PROP_HEX32(_n, _s, _f, _d) \ |
| 220 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t) |
| 221 | #define DEFINE_PROP_HEX64(_n, _s, _f, _d) \ |
| 222 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t) |
| 223 | #define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \ |
| 224 | DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t) |
| 225 | |
| 226 | #define DEFINE_PROP_PTR(_n, _s, _f) \ |
| 227 | DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*) |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 228 | #define DEFINE_PROP_CHR(_n, _s, _f) \ |
| 229 | DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*) |
Gerd Hoffmann | f6c64e0 | 2009-08-03 15:03:09 +0200 | [diff] [blame] | 230 | #define DEFINE_PROP_DRIVE(_n, _s, _f) \ |
Anthony Liguori | c981d39 | 2009-08-10 19:27:59 -0500 | [diff] [blame] | 231 | DEFINE_PROP(_n, _s, _f, qdev_prop_drive, DriveInfo*) |
Gerd Hoffmann | cf12b95 | 2009-08-03 17:35:17 +0200 | [diff] [blame] | 232 | #define DEFINE_PROP_MACADDR(_n, _s, _f) \ |
| 233 | DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, uint8_t[6]) |
| 234 | |
| 235 | #define DEFINE_PROP_END_OF_LIST() \ |
| 236 | {} |
| 237 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 238 | /* Set properties between creation and init. */ |
| 239 | void *qdev_get_prop_ptr(DeviceState *dev, Property *prop); |
| 240 | int qdev_prop_parse(DeviceState *dev, const char *name, const char *value); |
| 241 | void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type); |
Juan Quintela | c7cc172 | 2009-09-29 22:48:25 +0200 | [diff] [blame] | 242 | 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] | 243 | void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value); |
| 244 | 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] | 245 | 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] | 246 | void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value); |
Gerd Hoffmann | 313feaa | 2009-08-03 17:35:18 +0200 | [diff] [blame] | 247 | void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value); |
Gerd Hoffmann | 14b4187 | 2009-07-31 12:25:40 +0200 | [diff] [blame] | 248 | void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value); |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 249 | /* FIXME: Remove opaque pointer properties. */ |
| 250 | void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); |
| 251 | void qdev_prop_set_defaults(DeviceState *dev, Property *props); |
| 252 | |
Gerd Hoffmann | b6b6114 | 2009-07-15 13:48:21 +0200 | [diff] [blame] | 253 | void qdev_prop_register_compat(CompatProperty *props); |
| 254 | void qdev_prop_set_compat(DeviceState *dev); |
| 255 | |
Blue Swirl | a9ff9df | 2009-07-17 11:18:53 +0000 | [diff] [blame] | 256 | /* This is a nasty hack to allow passing a NULL bus to qdev_create. */ |
| 257 | extern struct BusInfo system_bus_info; |
| 258 | |
Paul Brook | aae9460 | 2009-05-14 22:35:06 +0100 | [diff] [blame] | 259 | #endif |