qdev.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. #ifndef QDEV_H
  2. #define QDEV_H
  3. #include "hw.h"
  4. #include "qemu-queue.h"
  5. #include "qemu-char.h"
  6. #include "qemu-option.h"
  7. #include "qapi/qapi-visit-core.h"
  8. #include "qemu/object.h"
  9. #include "error.h"
  10. typedef struct Property Property;
  11. typedef struct PropertyInfo PropertyInfo;
  12. typedef struct CompatProperty CompatProperty;
  13. typedef struct BusState BusState;
  14. typedef struct BusClass BusClass;
  15. enum DevState {
  16. DEV_STATE_CREATED = 1,
  17. DEV_STATE_INITIALIZED,
  18. };
  19. enum {
  20. DEV_NVECTORS_UNSPECIFIED = -1,
  21. };
  22. #define TYPE_DEVICE "device"
  23. #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE)
  24. #define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE)
  25. #define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE)
  26. typedef int (*qdev_initfn)(DeviceState *dev);
  27. typedef int (*qdev_event)(DeviceState *dev);
  28. typedef void (*qdev_resetfn)(DeviceState *dev);
  29. typedef struct DeviceClass {
  30. ObjectClass parent_class;
  31. const char *fw_name;
  32. const char *desc;
  33. Property *props;
  34. int no_user;
  35. /* callbacks */
  36. void (*reset)(DeviceState *dev);
  37. /* device state */
  38. const VMStateDescription *vmsd;
  39. /* Private to qdev / bus. */
  40. qdev_initfn init;
  41. qdev_event unplug;
  42. qdev_event exit;
  43. const char *bus_type;
  44. } DeviceClass;
  45. /* This structure should not be accessed directly. We declare it here
  46. so that it can be embedded in individual device state structures. */
  47. struct DeviceState {
  48. Object parent_obj;
  49. const char *id;
  50. enum DevState state;
  51. QemuOpts *opts;
  52. int hotplugged;
  53. BusState *parent_bus;
  54. int num_gpio_out;
  55. qemu_irq *gpio_out;
  56. int num_gpio_in;
  57. qemu_irq *gpio_in;
  58. QLIST_HEAD(, BusState) child_bus;
  59. int num_child_bus;
  60. int instance_id_alias;
  61. int alias_required_for_version;
  62. };
  63. #define TYPE_BUS "bus"
  64. #define BUS(obj) OBJECT_CHECK(BusState, (obj), TYPE_BUS)
  65. #define BUS_CLASS(klass) OBJECT_CLASS_CHECK(BusClass, (klass), TYPE_BUS)
  66. #define BUS_GET_CLASS(obj) OBJECT_GET_CLASS(BusClass, (obj), TYPE_BUS)
  67. struct BusClass {
  68. ObjectClass parent_class;
  69. /* FIXME first arg should be BusState */
  70. void (*print_dev)(Monitor *mon, DeviceState *dev, int indent);
  71. char *(*get_dev_path)(DeviceState *dev);
  72. /*
  73. * This callback is used to create Open Firmware device path in accordance
  74. * with OF spec http://forthworks.com/standards/of1275.pdf. Individual bus
  75. * bindings can be found at http://playground.sun.com/1275/bindings/.
  76. */
  77. char *(*get_fw_dev_path)(DeviceState *dev);
  78. int (*reset)(BusState *bus);
  79. };
  80. typedef struct BusChild {
  81. DeviceState *child;
  82. int index;
  83. QTAILQ_ENTRY(BusChild) sibling;
  84. } BusChild;
  85. /**
  86. * BusState:
  87. * @qom_allocated: Indicates whether the object was allocated by QOM.
  88. * @glib_allocated: Indicates whether the object was initialized in-place
  89. * yet is expected to be freed with g_free().
  90. */
  91. struct BusState {
  92. Object obj;
  93. DeviceState *parent;
  94. const char *name;
  95. int allow_hotplug;
  96. bool qom_allocated;
  97. bool glib_allocated;
  98. int max_index;
  99. QTAILQ_HEAD(ChildrenHead, BusChild) children;
  100. QLIST_ENTRY(BusState) sibling;
  101. };
  102. struct Property {
  103. const char *name;
  104. PropertyInfo *info;
  105. int offset;
  106. uint8_t bitnr;
  107. uint8_t qtype;
  108. int64_t defval;
  109. };
  110. struct PropertyInfo {
  111. const char *name;
  112. const char *legacy_name;
  113. const char **enum_table;
  114. int (*parse)(DeviceState *dev, Property *prop, const char *str);
  115. int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
  116. ObjectPropertyAccessor *get;
  117. ObjectPropertyAccessor *set;
  118. ObjectPropertyRelease *release;
  119. };
  120. typedef struct GlobalProperty {
  121. const char *driver;
  122. const char *property;
  123. const char *value;
  124. QTAILQ_ENTRY(GlobalProperty) next;
  125. } GlobalProperty;
  126. /*** Board API. This should go away once we have a machine config file. ***/
  127. DeviceState *qdev_create(BusState *bus, const char *name);
  128. DeviceState *qdev_try_create(BusState *bus, const char *name);
  129. bool qdev_exists(const char *name);
  130. int qdev_device_help(QemuOpts *opts);
  131. DeviceState *qdev_device_add(QemuOpts *opts);
  132. int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT;
  133. void qdev_init_nofail(DeviceState *dev);
  134. void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
  135. int required_for_version);
  136. void qdev_unplug(DeviceState *dev, Error **errp);
  137. void qdev_free(DeviceState *dev);
  138. int qdev_simple_unplug_cb(DeviceState *dev);
  139. void qdev_machine_creation_done(void);
  140. bool qdev_machine_modified(void);
  141. qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
  142. void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);
  143. BusState *qdev_get_child_bus(DeviceState *dev, const char *name);
  144. /*** Device API. ***/
  145. /* Register device properties. */
  146. /* GPIO inputs also double as IRQ sinks. */
  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);
  149. BusState *qdev_get_parent_bus(DeviceState *dev);
  150. /*** BUS API. ***/
  151. DeviceState *qdev_find_recursive(BusState *bus, const char *id);
  152. /* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */
  153. typedef int (qbus_walkerfn)(BusState *bus, void *opaque);
  154. typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque);
  155. void qbus_create_inplace(BusState *bus, const char *typename,
  156. DeviceState *parent, const char *name);
  157. BusState *qbus_create(const char *typename, DeviceState *parent, const char *name);
  158. /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion,
  159. * < 0 if either devfn or busfn terminate walk somewhere in cursion,
  160. * 0 otherwise. */
  161. int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn,
  162. qbus_walkerfn *busfn, void *opaque);
  163. int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn,
  164. qbus_walkerfn *busfn, void *opaque);
  165. void qdev_reset_all(DeviceState *dev);
  166. void qbus_reset_all_fn(void *opaque);
  167. void qbus_free(BusState *bus);
  168. #define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev)
  169. /* This should go away once we get rid of the NULL bus hack */
  170. BusState *sysbus_get_default(void);
  171. /*** monitor commands ***/
  172. void do_info_qtree(Monitor *mon);
  173. void do_info_qdm(Monitor *mon);
  174. int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data);
  175. int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
  176. /*** qdev-properties.c ***/
  177. extern PropertyInfo qdev_prop_bit;
  178. extern PropertyInfo qdev_prop_uint8;
  179. extern PropertyInfo qdev_prop_uint16;
  180. extern PropertyInfo qdev_prop_uint32;
  181. extern PropertyInfo qdev_prop_int32;
  182. extern PropertyInfo qdev_prop_uint64;
  183. extern PropertyInfo qdev_prop_hex8;
  184. extern PropertyInfo qdev_prop_hex32;
  185. extern PropertyInfo qdev_prop_hex64;
  186. extern PropertyInfo qdev_prop_string;
  187. extern PropertyInfo qdev_prop_chr;
  188. extern PropertyInfo qdev_prop_ptr;
  189. extern PropertyInfo qdev_prop_macaddr;
  190. extern PropertyInfo qdev_prop_losttickpolicy;
  191. extern PropertyInfo qdev_prop_bios_chs_trans;
  192. extern PropertyInfo qdev_prop_drive;
  193. extern PropertyInfo qdev_prop_netdev;
  194. extern PropertyInfo qdev_prop_vlan;
  195. extern PropertyInfo qdev_prop_pci_devfn;
  196. extern PropertyInfo qdev_prop_blocksize;
  197. extern PropertyInfo qdev_prop_pci_host_devaddr;
  198. #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
  199. .name = (_name), \
  200. .info = &(_prop), \
  201. .offset = offsetof(_state, _field) \
  202. + type_check(_type,typeof_field(_state, _field)), \
  203. }
  204. #define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \
  205. .name = (_name), \
  206. .info = &(_prop), \
  207. .offset = offsetof(_state, _field) \
  208. + type_check(_type,typeof_field(_state, _field)), \
  209. .qtype = QTYPE_QINT, \
  210. .defval = (_type)_defval, \
  211. }
  212. #define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
  213. .name = (_name), \
  214. .info = &(qdev_prop_bit), \
  215. .bitnr = (_bit), \
  216. .offset = offsetof(_state, _field) \
  217. + type_check(uint32_t,typeof_field(_state, _field)), \
  218. .qtype = QTYPE_QBOOL, \
  219. .defval = (bool)_defval, \
  220. }
  221. #define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
  222. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
  223. #define DEFINE_PROP_UINT16(_n, _s, _f, _d) \
  224. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
  225. #define DEFINE_PROP_UINT32(_n, _s, _f, _d) \
  226. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
  227. #define DEFINE_PROP_INT32(_n, _s, _f, _d) \
  228. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t)
  229. #define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
  230. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
  231. #define DEFINE_PROP_HEX8(_n, _s, _f, _d) \
  232. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex8, uint8_t)
  233. #define DEFINE_PROP_HEX32(_n, _s, _f, _d) \
  234. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t)
  235. #define DEFINE_PROP_HEX64(_n, _s, _f, _d) \
  236. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t)
  237. #define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \
  238. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, int32_t)
  239. #define DEFINE_PROP_PTR(_n, _s, _f) \
  240. DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
  241. #define DEFINE_PROP_CHR(_n, _s, _f) \
  242. DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*)
  243. #define DEFINE_PROP_STRING(_n, _s, _f) \
  244. DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
  245. #define DEFINE_PROP_NETDEV(_n, _s, _f) \
  246. DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, NetClientState*)
  247. #define DEFINE_PROP_VLAN(_n, _s, _f) \
  248. DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, NetClientState*)
  249. #define DEFINE_PROP_DRIVE(_n, _s, _f) \
  250. DEFINE_PROP(_n, _s, _f, qdev_prop_drive, BlockDriverState *)
  251. #define DEFINE_PROP_MACADDR(_n, _s, _f) \
  252. DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
  253. #define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \
  254. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_losttickpolicy, \
  255. LostTickPolicy)
  256. #define DEFINE_PROP_BIOS_CHS_TRANS(_n, _s, _f, _d) \
  257. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_bios_chs_trans, int)
  258. #define DEFINE_PROP_BLOCKSIZE(_n, _s, _f, _d) \
  259. DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_blocksize, uint16_t)
  260. #define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
  261. DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
  262. #define DEFINE_PROP_END_OF_LIST() \
  263. {}
  264. /* Set properties between creation and init. */
  265. void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
  266. int qdev_prop_parse(DeviceState *dev, const char *name, const char *value);
  267. void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value);
  268. void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value);
  269. void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value);
  270. void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value);
  271. void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value);
  272. void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value);
  273. void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value);
  274. void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value);
  275. void qdev_prop_set_netdev(DeviceState *dev, const char *name, NetClientState *value);
  276. int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value) QEMU_WARN_UNUSED_RESULT;
  277. void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value);
  278. void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value);
  279. void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
  280. /* FIXME: Remove opaque pointer properties. */
  281. void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
  282. void qdev_prop_register_global_list(GlobalProperty *props);
  283. void qdev_prop_set_globals(DeviceState *dev);
  284. void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
  285. Property *prop, const char *value);
  286. char *qdev_get_fw_dev_path(DeviceState *dev);
  287. /**
  288. * @qdev_property_add_static - add a @Property to a device referencing a
  289. * field in a struct.
  290. */
  291. void qdev_property_add_static(DeviceState *dev, Property *prop, Error **errp);
  292. /**
  293. * @qdev_machine_init
  294. *
  295. * Initialize platform devices before machine init. This is a hack until full
  296. * support for composition is added.
  297. */
  298. void qdev_machine_init(void);
  299. /**
  300. * @device_reset
  301. *
  302. * Reset a single device (by calling the reset method).
  303. */
  304. void device_reset(DeviceState *dev);
  305. const VMStateDescription *qdev_get_vmsd(DeviceState *dev);
  306. const char *qdev_fw_name(DeviceState *dev);
  307. Object *qdev_get_machine(void);
  308. /* FIXME: make this a link<> */
  309. void qdev_set_parent_bus(DeviceState *dev, BusState *bus);
  310. extern int qdev_hotplug;
  311. char *qdev_get_dev_path(DeviceState *dev);
  312. #endif