Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 1 | #ifndef QDEV_CORE_H |
| 2 | #define QDEV_CORE_H |
| 3 | |
Stefan Hajnoczi | 26462a7 | 2023-05-16 15:02:20 -0400 | [diff] [blame] | 4 | #include "qemu/atomic.h" |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 5 | #include "qemu/queue.h" |
Marcel Apfelbaum | 949fc82 | 2013-07-29 17:17:43 +0300 | [diff] [blame] | 6 | #include "qemu/bitmap.h" |
Maxim Levitsky | 2d24a64 | 2020-10-06 15:38:59 +0300 | [diff] [blame] | 7 | #include "qemu/rcu.h" |
| 8 | #include "qemu/rcu_queue.h" |
Paolo Bonzini | 14cccb6 | 2012-12-17 18:19:50 +0100 | [diff] [blame] | 9 | #include "qom/object.h" |
Igor Mammedov | 0ee4de6 | 2014-02-05 16:36:45 +0100 | [diff] [blame] | 10 | #include "hw/hotplug.h" |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 11 | #include "hw/resettable.h" |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 12 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 13 | enum { |
| 14 | DEV_NVECTORS_UNSPECIFIED = -1, |
| 15 | }; |
| 16 | |
| 17 | #define TYPE_DEVICE "device" |
Eduardo Habkost | a489d19 | 2020-09-16 14:25:18 -0400 | [diff] [blame] | 18 | OBJECT_DECLARE_TYPE(DeviceState, DeviceClass, DEVICE) |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 19 | |
Marcel Apfelbaum | 3d1237f | 2013-07-29 17:17:44 +0300 | [diff] [blame] | 20 | typedef enum DeviceCategory { |
| 21 | DEVICE_CATEGORY_BRIDGE, |
| 22 | DEVICE_CATEGORY_USB, |
| 23 | DEVICE_CATEGORY_STORAGE, |
| 24 | DEVICE_CATEGORY_NETWORK, |
| 25 | DEVICE_CATEGORY_INPUT, |
| 26 | DEVICE_CATEGORY_DISPLAY, |
| 27 | DEVICE_CATEGORY_SOUND, |
| 28 | DEVICE_CATEGORY_MISC, |
Thomas Huth | ba31cc7 | 2017-01-20 14:01:16 +0100 | [diff] [blame] | 29 | DEVICE_CATEGORY_CPU, |
Paolo Bonzini | b10cb62 | 2021-10-27 14:34:53 +0200 | [diff] [blame] | 30 | DEVICE_CATEGORY_WATCHDOG, |
Marcel Apfelbaum | 3d1237f | 2013-07-29 17:17:44 +0300 | [diff] [blame] | 31 | DEVICE_CATEGORY_MAX |
| 32 | } DeviceCategory; |
| 33 | |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 34 | typedef void (*DeviceRealize)(DeviceState *dev, Error **errp); |
Markus Armbruster | b69c3c2 | 2020-05-05 17:29:24 +0200 | [diff] [blame] | 35 | typedef void (*DeviceUnrealize)(DeviceState *dev); |
Philippe Mathieu-Daudé | b850f66 | 2018-01-13 23:04:10 -0300 | [diff] [blame] | 36 | typedef void (*DeviceReset)(DeviceState *dev); |
Bandan Das | 02e7f85 | 2013-11-25 17:48:40 -0500 | [diff] [blame] | 37 | typedef void (*BusRealize)(BusState *bus, Error **errp); |
Markus Armbruster | b69c3c2 | 2020-05-05 17:29:24 +0200 | [diff] [blame] | 38 | typedef void (*BusUnrealize)(BusState *bus); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 39 | |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 40 | /** |
| 41 | * DeviceClass: |
| 42 | * @props: Properties accessing state fields. |
| 43 | * @realize: Callback function invoked when the #DeviceState:realized |
Philippe Mathieu-Daudé | ff46d9d | 2018-05-28 16:45:09 +0200 | [diff] [blame] | 44 | * property is changed to %true. |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 45 | * @unrealize: Callback function invoked when the #DeviceState:realized |
| 46 | * property is changed to %false. |
Igor Mammedov | 1a37eca | 2014-02-05 16:36:46 +0100 | [diff] [blame] | 47 | * @hotpluggable: indicates if #DeviceClass is hotpluggable, available |
| 48 | * as readonly "hotpluggable" property of #DeviceState instance |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 49 | * |
| 50 | * # Realization # |
| 51 | * Devices are constructed in two stages, |
| 52 | * 1) object instantiation via object_initialize() and |
| 53 | * 2) device realization via #DeviceState:realized property. |
Thomas Huth | 6038f98 | 2018-09-10 09:46:26 +0200 | [diff] [blame] | 54 | * The former may not fail (and must not abort or exit, since it is called |
| 55 | * during device introspection already), and the latter may return error |
| 56 | * information to the caller and must be re-entrant. |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 57 | * Trivial field initializations should go into #TypeInfo.instance_init. |
| 58 | * Operations depending on @props static properties should go into @realize. |
| 59 | * After successful realization, setting static properties will fail. |
| 60 | * |
Markus Armbruster | daeba96 | 2015-06-19 16:17:23 +0200 | [diff] [blame] | 61 | * As an interim step, the #DeviceState:realized property can also be |
Markus Armbruster | c835fac | 2020-06-10 07:32:46 +0200 | [diff] [blame] | 62 | * set with qdev_realize(). |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 63 | * In the future, devices will propagate this state change to their children |
| 64 | * and along busses they expose. |
| 65 | * The point in time will be deferred to machine creation, so that values |
| 66 | * set in @realize will not be introspectable beforehand. Therefore devices |
| 67 | * must not create children during @realize; they should initialize them via |
| 68 | * object_initialize() in their own #TypeInfo.instance_init and forward the |
| 69 | * realization events appropriately. |
| 70 | * |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 71 | * Any type may override the @realize and/or @unrealize callbacks but needs |
Andreas Färber | 782beb5 | 2013-01-17 08:31:50 +0100 | [diff] [blame] | 72 | * to call the parent type's implementation if keeping their functionality |
| 73 | * is desired. Refer to QOM documentation for further discussion and examples. |
| 74 | * |
| 75 | * <note> |
| 76 | * <para> |
Philippe Mathieu-Daudé | ff46d9d | 2018-05-28 16:45:09 +0200 | [diff] [blame] | 77 | * Since TYPE_DEVICE doesn't implement @realize and @unrealize, types |
| 78 | * derived directly from it need not call their parent's @realize and |
| 79 | * @unrealize. |
Andreas Färber | 782beb5 | 2013-01-17 08:31:50 +0100 | [diff] [blame] | 80 | * For other types consult the documentation and implementation of the |
| 81 | * respective parent types. |
| 82 | * </para> |
| 83 | * </note> |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 84 | * |
| 85 | * # Hiding a device # |
Juan Quintela | b91ad98 | 2020-11-18 09:37:37 +0100 | [diff] [blame] | 86 | * To hide a device, a DeviceListener function hide_device() needs to |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 87 | * be registered. |
Juan Quintela | b91ad98 | 2020-11-18 09:37:37 +0100 | [diff] [blame] | 88 | * It can be used to defer adding a device and therefore hide it from |
| 89 | * the guest. The handler registering to this DeviceListener can save |
| 90 | * the QOpts passed to it for re-using it later. It must return if it |
| 91 | * wants the device to be hidden or visible. When the handler function |
| 92 | * decides the device shall be visible it will be added with |
| 93 | * qdev_device_add() and realized as any other device. Otherwise |
| 94 | * qdev_device_add() will return early without adding the device. The |
| 95 | * guest will not see a "hidden" device until it was marked visible |
| 96 | * and qdev_device_add called again. |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 97 | * |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 98 | */ |
Eduardo Habkost | db1015e | 2020-09-03 16:43:22 -0400 | [diff] [blame] | 99 | struct DeviceClass { |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 100 | /*< private >*/ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 101 | ObjectClass parent_class; |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 102 | /*< public >*/ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 103 | |
Marcel Apfelbaum | 3d1237f | 2013-07-29 17:17:44 +0300 | [diff] [blame] | 104 | DECLARE_BITMAP(categories, DEVICE_CATEGORY_MAX); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 105 | const char *fw_name; |
| 106 | const char *desc; |
Paolo Bonzini | 385d8f2 | 2020-01-23 12:11:38 +0100 | [diff] [blame] | 107 | |
| 108 | /* |
| 109 | * The underscore at the end ensures a compile-time error if someone |
| 110 | * assigns to dc->props instead of using device_class_set_props. |
| 111 | */ |
| 112 | Property *props_; |
Markus Armbruster | efec3dd | 2013-11-28 17:26:54 +0100 | [diff] [blame] | 113 | |
| 114 | /* |
Eduardo Habkost | e90f2a8 | 2017-05-03 17:35:44 -0300 | [diff] [blame] | 115 | * Can this device be instantiated with -device / device_add? |
Markus Armbruster | efec3dd | 2013-11-28 17:26:54 +0100 | [diff] [blame] | 116 | * All devices should support instantiation with device_add, and |
| 117 | * this flag should not exist. But we're not there, yet. Some |
| 118 | * devices fail to instantiate with cryptic error messages. |
| 119 | * Others instantiate, but don't work. Exposing users to such |
Eduardo Habkost | e90f2a8 | 2017-05-03 17:35:44 -0300 | [diff] [blame] | 120 | * behavior would be cruel; clearing this flag will protect them. |
| 121 | * It should never be cleared without a comment explaining why it |
| 122 | * is cleared. |
Markus Armbruster | efec3dd | 2013-11-28 17:26:54 +0100 | [diff] [blame] | 123 | * TODO remove once we're there |
| 124 | */ |
Eduardo Habkost | e90f2a8 | 2017-05-03 17:35:44 -0300 | [diff] [blame] | 125 | bool user_creatable; |
Igor Mammedov | 1a37eca | 2014-02-05 16:36:46 +0100 | [diff] [blame] | 126 | bool hotpluggable; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 127 | |
| 128 | /* callbacks */ |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 129 | /* |
| 130 | * Reset method here is deprecated and replaced by methods in the |
| 131 | * resettable class interface to implement a multi-phase reset. |
| 132 | * TODO: remove once every reset callback is unused |
| 133 | */ |
Philippe Mathieu-Daudé | b850f66 | 2018-01-13 23:04:10 -0300 | [diff] [blame] | 134 | DeviceReset reset; |
Andreas Färber | 249d417 | 2013-01-09 03:58:11 +0100 | [diff] [blame] | 135 | DeviceRealize realize; |
| 136 | DeviceUnrealize unrealize; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 137 | |
| 138 | /* device state */ |
Markus Armbruster | 8a9358c | 2019-08-12 07:23:44 +0200 | [diff] [blame] | 139 | const VMStateDescription *vmsd; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 140 | |
| 141 | /* Private to qdev / bus. */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 142 | const char *bus_type; |
Eduardo Habkost | db1015e | 2020-09-03 16:43:22 -0400 | [diff] [blame] | 143 | }; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 144 | |
Peter Crosthwaite | a5f5429 | 2014-05-19 23:30:58 -0700 | [diff] [blame] | 145 | typedef struct NamedGPIOList NamedGPIOList; |
| 146 | |
| 147 | struct NamedGPIOList { |
| 148 | char *name; |
| 149 | qemu_irq *in; |
| 150 | int num_in; |
Peter Crosthwaite | a5f5429 | 2014-05-19 23:30:58 -0700 | [diff] [blame] | 151 | int num_out; |
| 152 | QLIST_ENTRY(NamedGPIOList) node; |
| 153 | }; |
| 154 | |
Damien Hedde | 0e6934f | 2020-04-06 15:52:45 +0200 | [diff] [blame] | 155 | typedef struct Clock Clock; |
| 156 | typedef struct NamedClockList NamedClockList; |
| 157 | |
| 158 | struct NamedClockList { |
| 159 | char *name; |
| 160 | Clock *clock; |
| 161 | bool output; |
| 162 | bool alias; |
| 163 | QLIST_ENTRY(NamedClockList) node; |
| 164 | }; |
| 165 | |
Alexander Bulekov | a2e1753 | 2023-04-27 17:10:06 -0400 | [diff] [blame] | 166 | typedef struct { |
| 167 | bool engaged_in_io; |
| 168 | } MemReentrancyGuard; |
| 169 | |
Andreas Färber | 7983c8a | 2013-01-09 03:58:10 +0100 | [diff] [blame] | 170 | /** |
| 171 | * DeviceState: |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 172 | * @reset: ResettableState for the device; handled by Resettable interface. |
Andreas Färber | 7983c8a | 2013-01-09 03:58:10 +0100 | [diff] [blame] | 173 | * |
| 174 | * This structure should not be accessed directly. We declare it here |
| 175 | * so that it can be embedded in individual device state structures. |
| 176 | */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 177 | struct DeviceState { |
Andreas Färber | 7983c8a | 2013-01-09 03:58:10 +0100 | [diff] [blame] | 178 | /*< private >*/ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 179 | Object parent_obj; |
Andreas Färber | 7983c8a | 2013-01-09 03:58:10 +0100 | [diff] [blame] | 180 | /*< public >*/ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 181 | |
Kevin Wolf | 163f384 | 2021-10-08 15:34:35 +0200 | [diff] [blame] | 182 | char *id; |
Michael Roth | 04162f8 | 2017-10-16 17:23:13 -0500 | [diff] [blame] | 183 | char *canonical_path; |
Andreas Färber | 7983c8a | 2013-01-09 03:58:10 +0100 | [diff] [blame] | 184 | bool realized; |
Paolo Bonzini | 352e8da | 2014-06-26 15:10:03 +0200 | [diff] [blame] | 185 | bool pending_deleted_event; |
Gerd Hoffmann | 18416c6 | 2021-11-11 14:08:59 +0100 | [diff] [blame] | 186 | int64_t pending_deleted_expires_ms; |
Kevin Wolf | f3558b1 | 2021-10-08 15:34:41 +0200 | [diff] [blame] | 187 | QDict *opts; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 188 | int hotplugged; |
Jens Freimann | a1190ab | 2019-10-29 12:49:01 +0100 | [diff] [blame] | 189 | bool allow_unplug_during_migration; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 190 | BusState *parent_bus; |
Peter Crosthwaite | a5f5429 | 2014-05-19 23:30:58 -0700 | [diff] [blame] | 191 | QLIST_HEAD(, NamedGPIOList) gpios; |
Damien Hedde | 0e6934f | 2020-04-06 15:52:45 +0200 | [diff] [blame] | 192 | QLIST_HEAD(, NamedClockList) clocks; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 193 | QLIST_HEAD(, BusState) child_bus; |
| 194 | int num_child_bus; |
| 195 | int instance_id_alias; |
| 196 | int alias_required_for_version; |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 197 | ResettableState reset; |
Jagannathan Raman | 217c7f0 | 2022-06-13 16:26:21 -0400 | [diff] [blame] | 198 | GSList *unplug_blockers; |
Alexander Bulekov | a2e1753 | 2023-04-27 17:10:06 -0400 | [diff] [blame] | 199 | |
| 200 | /* Is the device currently in mmio/pio/dma? Used to prevent re-entrancy */ |
| 201 | MemReentrancyGuard mem_reentrancy_guard; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 202 | }; |
| 203 | |
Paul Durrant | 707ff80 | 2015-01-20 11:05:07 +0000 | [diff] [blame] | 204 | struct DeviceListener { |
| 205 | void (*realize)(DeviceListener *listener, DeviceState *dev); |
| 206 | void (*unrealize)(DeviceListener *listener, DeviceState *dev); |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 207 | /* |
Juan Quintela | b91ad98 | 2020-11-18 09:37:37 +0100 | [diff] [blame] | 208 | * This callback is called upon init of the DeviceState and |
| 209 | * informs qdev if a device should be visible or hidden. We can |
| 210 | * hide a failover device depending for example on the device |
| 211 | * opts. |
Kevin Wolf | 7d61808 | 2021-10-08 15:34:38 +0200 | [diff] [blame] | 212 | * |
| 213 | * On errors, it returns false and errp is set. Device creation |
| 214 | * should fail in this case. |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 215 | */ |
Kevin Wolf | f3558b1 | 2021-10-08 15:34:41 +0200 | [diff] [blame] | 216 | bool (*hide_device)(DeviceListener *listener, const QDict *device_opts, |
| 217 | bool from_json, Error **errp); |
Paul Durrant | 707ff80 | 2015-01-20 11:05:07 +0000 | [diff] [blame] | 218 | QTAILQ_ENTRY(DeviceListener) link; |
| 219 | }; |
| 220 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 221 | #define TYPE_BUS "bus" |
Eduardo Habkost | 8110fa1 | 2020-08-31 17:07:33 -0400 | [diff] [blame] | 222 | DECLARE_OBJ_CHECKERS(BusState, BusClass, |
| 223 | BUS, TYPE_BUS) |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 224 | |
| 225 | struct BusClass { |
| 226 | ObjectClass parent_class; |
| 227 | |
| 228 | /* FIXME first arg should be BusState */ |
| 229 | void (*print_dev)(Monitor *mon, DeviceState *dev, int indent); |
| 230 | char *(*get_dev_path)(DeviceState *dev); |
Paolo Bonzini | bb755ba | 2020-10-06 15:38:55 +0300 | [diff] [blame] | 231 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 232 | /* |
| 233 | * This callback is used to create Open Firmware device path in accordance |
| 234 | * with OF spec http://forthworks.com/standards/of1275.pdf. Individual bus |
| 235 | * bindings can be found at http://playground.sun.com/1275/bindings/. |
| 236 | */ |
| 237 | char *(*get_fw_dev_path)(DeviceState *dev); |
Paolo Bonzini | bb755ba | 2020-10-06 15:38:55 +0300 | [diff] [blame] | 238 | |
Paolo Bonzini | dcc2093 | 2013-12-06 17:54:27 +0100 | [diff] [blame] | 239 | void (*reset)(BusState *bus); |
Paolo Bonzini | bb755ba | 2020-10-06 15:38:55 +0300 | [diff] [blame] | 240 | |
| 241 | /* |
| 242 | * Return whether the device can be added to @bus, |
| 243 | * based on the address that was set (via device properties) |
| 244 | * before realize. If not, on return @errp contains the |
| 245 | * human-readable error message. |
| 246 | */ |
| 247 | bool (*check_address)(BusState *bus, DeviceState *dev, Error **errp); |
| 248 | |
Bandan Das | 02e7f85 | 2013-11-25 17:48:40 -0500 | [diff] [blame] | 249 | BusRealize realize; |
| 250 | BusUnrealize unrealize; |
| 251 | |
KONRAD Frederic | 1395af6 | 2013-01-15 00:08:00 +0100 | [diff] [blame] | 252 | /* maximum devices allowed on the bus, 0: no limit. */ |
| 253 | int max_dev; |
Alexander Graf | 61de367 | 2014-02-06 16:08:15 +0100 | [diff] [blame] | 254 | /* number of automatically allocated bus ids (e.g. ide.0) */ |
| 255 | int automatic_ids; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 256 | }; |
| 257 | |
| 258 | typedef struct BusChild { |
Maxim Levitsky | 2d24a64 | 2020-10-06 15:38:59 +0300 | [diff] [blame] | 259 | struct rcu_head rcu; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 260 | DeviceState *child; |
| 261 | int index; |
| 262 | QTAILQ_ENTRY(BusChild) sibling; |
| 263 | } BusChild; |
| 264 | |
Igor Mammedov | 0ee4de6 | 2014-02-05 16:36:45 +0100 | [diff] [blame] | 265 | #define QDEV_HOTPLUG_HANDLER_PROPERTY "hotplug-handler" |
| 266 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 267 | /** |
| 268 | * BusState: |
Li Qiang | 27c6ef1 | 2018-10-30 08:16:37 -0700 | [diff] [blame] | 269 | * @hotplug_handler: link to a hotplug handler associated with bus. |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 270 | * @reset: ResettableState for the bus; handled by Resettable interface. |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 271 | */ |
| 272 | struct BusState { |
| 273 | Object obj; |
| 274 | DeviceState *parent; |
Marc-André Lureau | f73480c | 2016-07-15 12:04:49 +0200 | [diff] [blame] | 275 | char *name; |
Igor Mammedov | 0ee4de6 | 2014-02-05 16:36:45 +0100 | [diff] [blame] | 276 | HotplugHandler *hotplug_handler; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 277 | int max_index; |
Bandan Das | 02e7f85 | 2013-11-25 17:48:40 -0500 | [diff] [blame] | 278 | bool realized; |
Peter Maydell | 1518562 | 2021-09-13 16:07:25 +0100 | [diff] [blame] | 279 | bool full; |
Tony Krowiak | 12b2e9f | 2018-12-17 10:57:30 -0500 | [diff] [blame] | 280 | int num_children; |
Maxim Levitsky | 2d24a64 | 2020-10-06 15:38:59 +0300 | [diff] [blame] | 281 | |
| 282 | /* |
| 283 | * children is a RCU QTAILQ, thus readers must use RCU to access it, |
| 284 | * and writers must hold the big qemu lock |
| 285 | */ |
| 286 | |
Paolo Bonzini | eae3eb3 | 2018-12-06 13:10:34 +0100 | [diff] [blame] | 287 | QTAILQ_HEAD(, BusChild) children; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 288 | QLIST_ENTRY(BusState) sibling; |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 289 | ResettableState reset; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 290 | }; |
| 291 | |
Peter Maydell | 5cc56cc | 2017-07-17 13:36:06 +0100 | [diff] [blame] | 292 | /** |
Don Slutz | 9f9260a | 2014-05-05 14:03:06 -0400 | [diff] [blame] | 293 | * GlobalProperty: |
Eduardo Habkost | b3ce84f | 2014-08-08 16:03:31 -0300 | [diff] [blame] | 294 | * @used: Set to true if property was used when initializing a device. |
Dr. David Alan Gilbert | 92fd453 | 2019-07-29 17:29:02 +0100 | [diff] [blame] | 295 | * @optional: If set to true, GlobalProperty will be skipped without errors |
| 296 | * if the property doesn't exist. |
Marc-André Lureau | cff8b71 | 2018-11-07 15:25:58 +0400 | [diff] [blame] | 297 | * |
| 298 | * An error is fatal for non-hotplugged devices, when the global is applied. |
Don Slutz | 9f9260a | 2014-05-05 14:03:06 -0400 | [diff] [blame] | 299 | */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 300 | typedef struct GlobalProperty { |
| 301 | const char *driver; |
| 302 | const char *property; |
| 303 | const char *value; |
Eduardo Habkost | b3ce84f | 2014-08-08 16:03:31 -0300 | [diff] [blame] | 304 | bool used; |
Dr. David Alan Gilbert | 92fd453 | 2019-07-29 17:29:02 +0100 | [diff] [blame] | 305 | bool optional; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 306 | } GlobalProperty; |
| 307 | |
Marc-André Lureau | ea9ce89 | 2018-11-26 22:04:32 +0400 | [diff] [blame] | 308 | static inline void |
| 309 | compat_props_add(GPtrArray *arr, |
| 310 | GlobalProperty props[], size_t nelem) |
| 311 | { |
| 312 | int i; |
| 313 | for (i = 0; i < nelem; i++) { |
| 314 | g_ptr_array_add(arr, (void *)&props[i]); |
| 315 | } |
| 316 | } |
| 317 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 318 | /*** Board API. This should go away once we have a machine config file. ***/ |
| 319 | |
Peter Maydell | b51238e | 2020-07-11 15:24:23 +0100 | [diff] [blame] | 320 | /** |
| 321 | * qdev_new: Create a device on the heap |
| 322 | * @name: device type to create (we assert() that this type exists) |
| 323 | * |
| 324 | * This only allocates the memory and initializes the device state |
| 325 | * structure, ready for the caller to set properties if they wish. |
| 326 | * The device still needs to be realized. |
| 327 | * The returned object has a reference count of 1. |
| 328 | */ |
Markus Armbruster | 9940b2c | 2020-06-10 07:31:53 +0200 | [diff] [blame] | 329 | DeviceState *qdev_new(const char *name); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 330 | |
Peter Maydell | b51238e | 2020-07-11 15:24:23 +0100 | [diff] [blame] | 331 | /** |
| 332 | * qdev_try_new: Try to create a device on the heap |
| 333 | * @name: device type to create |
| 334 | * |
| 335 | * This is like qdev_new(), except it returns %NULL when type @name |
| 336 | * does not exist, rather than asserting. |
| 337 | */ |
Markus Armbruster | 9940b2c | 2020-06-10 07:31:53 +0200 | [diff] [blame] | 338 | DeviceState *qdev_try_new(const char *name); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 339 | |
Peter Maydell | b51238e | 2020-07-11 15:24:23 +0100 | [diff] [blame] | 340 | /** |
Stefan Hajnoczi | 26462a7 | 2023-05-16 15:02:20 -0400 | [diff] [blame] | 341 | * qdev_is_realized: |
| 342 | * @dev: The device to check. |
| 343 | * |
| 344 | * May be called outside big qemu lock. |
| 345 | * |
| 346 | * Returns: %true% if the device has been fully constructed, %false% otherwise. |
| 347 | */ |
| 348 | static inline bool qdev_is_realized(DeviceState *dev) |
| 349 | { |
| 350 | return qatomic_load_acquire(&dev->realized); |
| 351 | } |
| 352 | |
| 353 | /** |
Peter Maydell | b51238e | 2020-07-11 15:24:23 +0100 | [diff] [blame] | 354 | * qdev_realize: Realize @dev. |
| 355 | * @dev: device to realize |
| 356 | * @bus: bus to plug it into (may be NULL) |
| 357 | * @errp: pointer to error object |
| 358 | * |
| 359 | * "Realize" the device, i.e. perform the second phase of device |
| 360 | * initialization. |
| 361 | * @dev must not be plugged into a bus already. |
| 362 | * If @bus, plug @dev into @bus. This takes a reference to @dev. |
| 363 | * If @dev has no QOM parent, make one up, taking another reference. |
| 364 | * On success, return true. |
| 365 | * On failure, store an error through @errp and return false. |
| 366 | * |
| 367 | * If you created @dev using qdev_new(), you probably want to use |
| 368 | * qdev_realize_and_unref() instead. |
| 369 | */ |
Markus Armbruster | 9940b2c | 2020-06-10 07:31:53 +0200 | [diff] [blame] | 370 | bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 371 | |
Peter Maydell | b51238e | 2020-07-11 15:24:23 +0100 | [diff] [blame] | 372 | /** |
| 373 | * qdev_realize_and_unref: Realize @dev and drop a reference |
| 374 | * @dev: device to realize |
| 375 | * @bus: bus to plug it into (may be NULL) |
| 376 | * @errp: pointer to error object |
| 377 | * |
| 378 | * Realize @dev and drop a reference. |
| 379 | * This is like qdev_realize(), except the caller must hold a |
| 380 | * (private) reference, which is dropped on return regardless of |
| 381 | * success or failure. Intended use:: |
| 382 | * |
| 383 | * dev = qdev_new(); |
| 384 | * [...] |
| 385 | * qdev_realize_and_unref(dev, bus, errp); |
| 386 | * |
| 387 | * Now @dev can go away without further ado. |
| 388 | * |
| 389 | * If you are embedding the device into some other QOM device and |
| 390 | * initialized it via some variant on object_initialize_child() then |
| 391 | * do not use this function, because that family of functions arrange |
| 392 | * for the only reference to the child device to be held by the parent |
| 393 | * via the child<> property, and so the reference-count-drop done here |
| 394 | * would be incorrect. For that use case you want qdev_realize(). |
| 395 | */ |
Markus Armbruster | 9940b2c | 2020-06-10 07:31:53 +0200 | [diff] [blame] | 396 | bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 397 | |
Peter Maydell | 46ea1be | 2020-07-11 15:24:24 +0100 | [diff] [blame] | 398 | /** |
| 399 | * qdev_unrealize: Unrealize a device |
| 400 | * @dev: device to unrealize |
| 401 | * |
| 402 | * This function will "unrealize" a device, which is the first phase |
| 403 | * of correctly destroying a device that has been realized. It will: |
| 404 | * |
| 405 | * - unrealize any child buses by calling qbus_unrealize() |
| 406 | * (this will recursively unrealize any devices on those buses) |
Daniel P. Berrangé | 7a21bee | 2022-07-07 17:37:15 +0100 | [diff] [blame] | 407 | * - call the unrealize method of @dev |
Peter Maydell | 46ea1be | 2020-07-11 15:24:24 +0100 | [diff] [blame] | 408 | * |
| 409 | * The device can then be freed by causing its reference count to go |
| 410 | * to zero. |
| 411 | * |
| 412 | * Warning: most devices in QEMU do not expect to be unrealized. Only |
| 413 | * devices which are hot-unpluggable should be unrealized (as part of |
| 414 | * the unplugging process); all other devices are expected to last for |
| 415 | * the life of the simulation and should not be unrealized and freed. |
| 416 | */ |
Markus Armbruster | 9940b2c | 2020-06-10 07:31:53 +0200 | [diff] [blame] | 417 | void qdev_unrealize(DeviceState *dev); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 418 | void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, |
| 419 | int required_for_version); |
David Hildenbrand | 14405c2 | 2019-02-28 13:28:49 +0100 | [diff] [blame] | 420 | HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev); |
Thomas Huth | 03fcbd9 | 2017-11-02 11:10:06 +0100 | [diff] [blame] | 421 | HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev); |
Peter Xu | d2321d3 | 2019-09-16 16:07:16 +0800 | [diff] [blame] | 422 | bool qdev_hotplug_allowed(DeviceState *dev, Error **errp); |
Igor Mammedov | 17cc012 | 2019-02-28 13:28:48 +0100 | [diff] [blame] | 423 | /** |
| 424 | * qdev_get_hotplug_handler: Get handler responsible for device wiring |
| 425 | * |
| 426 | * Find HOTPLUG_HANDLER for @dev that provides [pre|un]plug callbacks for it. |
| 427 | * |
| 428 | * Note: in case @dev has a parent bus, it will be returned as handler unless |
| 429 | * machine handler overrides it. |
| 430 | * |
| 431 | * Returns: pointer to object that implements TYPE_HOTPLUG_HANDLER interface |
| 432 | * or NULL if there aren't any. |
| 433 | */ |
Zhu Guihua | c06b2ff | 2015-04-27 16:47:21 +0800 | [diff] [blame] | 434 | HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 435 | void qdev_unplug(DeviceState *dev, Error **errp); |
Igor Mammedov | 014176f | 2014-09-26 09:28:21 +0000 | [diff] [blame] | 436 | void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, |
| 437 | DeviceState *dev, Error **errp); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 438 | void qdev_machine_creation_done(void); |
| 439 | bool qdev_machine_modified(void); |
| 440 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 441 | /** |
Jagannathan Raman | 217c7f0 | 2022-06-13 16:26:21 -0400 | [diff] [blame] | 442 | * qdev_add_unplug_blocker: Add an unplug blocker to a device |
| 443 | * |
| 444 | * @dev: Device to be blocked from unplug |
| 445 | * @reason: Reason for blocking |
| 446 | */ |
| 447 | void qdev_add_unplug_blocker(DeviceState *dev, Error *reason); |
| 448 | |
| 449 | /** |
| 450 | * qdev_del_unplug_blocker: Remove an unplug blocker from a device |
| 451 | * |
| 452 | * @dev: Device to be unblocked |
| 453 | * @reason: Pointer to the Error used with qdev_add_unplug_blocker. |
| 454 | * Used as a handle to lookup the blocker for deletion. |
| 455 | */ |
| 456 | void qdev_del_unplug_blocker(DeviceState *dev, Error *reason); |
| 457 | |
| 458 | /** |
| 459 | * qdev_unplug_blocked: Confirm if a device is blocked from unplug |
| 460 | * |
| 461 | * @dev: Device to be tested |
| 462 | * @reason: Returns one of the reasons why the device is blocked, |
| 463 | * if any |
| 464 | * |
| 465 | * Returns: true if device is blocked from unplug, false otherwise |
| 466 | */ |
| 467 | bool qdev_unplug_blocked(DeviceState *dev, Error **errp); |
| 468 | |
| 469 | /** |
Philippe Mathieu-Daudé | ddb67f6 | 2020-06-16 06:23:50 +0200 | [diff] [blame] | 470 | * GpioPolarity: Polarity of a GPIO line |
| 471 | * |
| 472 | * GPIO lines use either positive (active-high) logic, |
| 473 | * or negative (active-low) logic. |
| 474 | * |
| 475 | * In active-high logic (%GPIO_POLARITY_ACTIVE_HIGH), a pin is |
| 476 | * active when the voltage on the pin is high (relative to ground); |
| 477 | * whereas in active-low logic (%GPIO_POLARITY_ACTIVE_LOW), a pin |
| 478 | * is active when the voltage on the pin is low (or grounded). |
| 479 | */ |
| 480 | typedef enum { |
| 481 | GPIO_POLARITY_ACTIVE_LOW, |
| 482 | GPIO_POLARITY_ACTIVE_HIGH |
| 483 | } GpioPolarity; |
| 484 | |
| 485 | /** |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 486 | * qdev_get_gpio_in: Get one of a device's anonymous input GPIO lines |
| 487 | * @dev: Device whose GPIO we want |
| 488 | * @n: Number of the anonymous GPIO line (which must be in range) |
| 489 | * |
| 490 | * Returns the qemu_irq corresponding to an anonymous input GPIO line |
| 491 | * (which the device has set up with qdev_init_gpio_in()). The index |
| 492 | * @n of the GPIO line must be valid (i.e. be at least 0 and less than |
| 493 | * the total number of anonymous input GPIOs the device has); this |
| 494 | * function will assert() if passed an invalid index. |
| 495 | * |
| 496 | * This function is intended to be used by board code or SoC "container" |
| 497 | * device models to wire up the GPIO lines; usually the return value |
| 498 | * will be passed to qdev_connect_gpio_out() or a similar function to |
| 499 | * connect another device's output GPIO line to this input. |
| 500 | * |
| 501 | * For named input GPIO lines, use qdev_get_gpio_in_named(). |
| 502 | */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 503 | qemu_irq qdev_get_gpio_in(DeviceState *dev, int n); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 504 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 505 | /** |
| 506 | * qdev_get_gpio_in_named: Get one of a device's named input GPIO lines |
| 507 | * @dev: Device whose GPIO we want |
| 508 | * @name: Name of the input GPIO array |
| 509 | * @n: Number of the GPIO line in that array (which must be in range) |
| 510 | * |
| 511 | * Returns the qemu_irq corresponding to a named input GPIO line |
| 512 | * (which the device has set up with qdev_init_gpio_in_named()). |
| 513 | * The @name string must correspond to an input GPIO array which exists on |
| 514 | * the device, and the index @n of the GPIO line must be valid (i.e. |
| 515 | * be at least 0 and less than the total number of input GPIOs in that |
| 516 | * array); this function will assert() if passed an invalid name or index. |
| 517 | * |
| 518 | * For anonymous input GPIO lines, use qdev_get_gpio_in(). |
| 519 | */ |
Peter Crosthwaite | a5f5429 | 2014-05-19 23:30:58 -0700 | [diff] [blame] | 520 | qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n); |
| 521 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 522 | /** |
| 523 | * qdev_connect_gpio_out: Connect one of a device's anonymous output GPIO lines |
| 524 | * @dev: Device whose GPIO to connect |
| 525 | * @n: Number of the anonymous output GPIO line (which must be in range) |
Philippe Mathieu-Daudé | 2ebd9ce | 2021-11-05 17:53:21 +0100 | [diff] [blame] | 526 | * @input_pin: qemu_irq to connect the output line to |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 527 | * |
| 528 | * This function connects an anonymous output GPIO line on a device |
| 529 | * up to an arbitrary qemu_irq, so that when the device asserts that |
| 530 | * output GPIO line, the qemu_irq's callback is invoked. |
| 531 | * The index @n of the GPIO line must be valid (i.e. be at least 0 and |
| 532 | * less than the total number of anonymous output GPIOs the device has |
| 533 | * created with qdev_init_gpio_out()); otherwise this function will assert(). |
| 534 | * |
| 535 | * Outbound GPIO lines can be connected to any qemu_irq, but the common |
| 536 | * case is connecting them to another device's inbound GPIO line, using |
| 537 | * the qemu_irq returned by qdev_get_gpio_in() or qdev_get_gpio_in_named(). |
| 538 | * |
| 539 | * It is not valid to try to connect one outbound GPIO to multiple |
| 540 | * qemu_irqs at once, or to connect multiple outbound GPIOs to the |
| 541 | * same qemu_irq. (Warning: there is no assertion or other guard to |
| 542 | * catch this error: the model will just not do the right thing.) |
Peter Maydell | 5df69ab | 2022-01-11 17:26:55 +0000 | [diff] [blame] | 543 | * Instead, for fan-out you can use the TYPE_SPLIT_IRQ device: connect |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 544 | * a device's outbound GPIO to the splitter's input, and connect each |
| 545 | * of the splitter's outputs to a different device. For fan-in you |
| 546 | * can use the TYPE_OR_IRQ device, which is a model of a logical OR |
| 547 | * gate with multiple inputs and one output. |
| 548 | * |
| 549 | * For named output GPIO lines, use qdev_connect_gpio_out_named(). |
| 550 | */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 551 | void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 552 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 553 | /** |
Philippe Mathieu-Daudé | 1fbd004 | 2021-11-05 17:50:28 +0100 | [diff] [blame] | 554 | * qdev_connect_gpio_out_named: Connect one of a device's named output |
| 555 | * GPIO lines |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 556 | * @dev: Device whose GPIO to connect |
| 557 | * @name: Name of the output GPIO array |
| 558 | * @n: Number of the anonymous output GPIO line (which must be in range) |
Philippe Mathieu-Daudé | 2ebd9ce | 2021-11-05 17:53:21 +0100 | [diff] [blame] | 559 | * @input_pin: qemu_irq to connect the output line to |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 560 | * |
| 561 | * This function connects an anonymous output GPIO line on a device |
| 562 | * up to an arbitrary qemu_irq, so that when the device asserts that |
| 563 | * output GPIO line, the qemu_irq's callback is invoked. |
| 564 | * The @name string must correspond to an output GPIO array which exists on |
| 565 | * the device, and the index @n of the GPIO line must be valid (i.e. |
| 566 | * be at least 0 and less than the total number of input GPIOs in that |
| 567 | * array); this function will assert() if passed an invalid name or index. |
| 568 | * |
| 569 | * Outbound GPIO lines can be connected to any qemu_irq, but the common |
| 570 | * case is connecting them to another device's inbound GPIO line, using |
| 571 | * the qemu_irq returned by qdev_get_gpio_in() or qdev_get_gpio_in_named(). |
| 572 | * |
| 573 | * It is not valid to try to connect one outbound GPIO to multiple |
| 574 | * qemu_irqs at once, or to connect multiple outbound GPIOs to the |
| 575 | * same qemu_irq; see qdev_connect_gpio_out() for details. |
| 576 | * |
Philippe Mathieu-Daudé | 1fbd004 | 2021-11-05 17:50:28 +0100 | [diff] [blame] | 577 | * For anonymous output GPIO lines, use qdev_connect_gpio_out(). |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 578 | */ |
Peter Crosthwaite | a5f5429 | 2014-05-19 23:30:58 -0700 | [diff] [blame] | 579 | void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, |
Philippe Mathieu-Daudé | 2ebd9ce | 2021-11-05 17:53:21 +0100 | [diff] [blame] | 580 | qemu_irq input_pin); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 581 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 582 | /** |
| 583 | * qdev_get_gpio_out_connector: Get the qemu_irq connected to an output GPIO |
| 584 | * @dev: Device whose output GPIO we are interested in |
| 585 | * @name: Name of the output GPIO array |
| 586 | * @n: Number of the output GPIO line within that array |
| 587 | * |
| 588 | * Returns whatever qemu_irq is currently connected to the specified |
| 589 | * output GPIO line of @dev. This will be NULL if the output GPIO line |
| 590 | * has never been wired up to the anything. Note that the qemu_irq |
| 591 | * returned does not belong to @dev -- it will be the input GPIO or |
| 592 | * IRQ of whichever device the board code has connected up to @dev's |
| 593 | * output GPIO. |
| 594 | * |
| 595 | * You probably don't need to use this function -- it is used only |
| 596 | * by the platform-bus subsystem. |
| 597 | */ |
Alexander Graf | b797318 | 2014-09-24 12:32:17 +0200 | [diff] [blame] | 598 | qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 599 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 600 | /** |
| 601 | * qdev_intercept_gpio_out: Intercept an existing GPIO connection |
| 602 | * @dev: Device to intercept the outbound GPIO line from |
| 603 | * @icpt: New qemu_irq to connect instead |
| 604 | * @name: Name of the output GPIO array |
| 605 | * @n: Number of the GPIO line in the array |
| 606 | * |
| 607 | * This function is provided only for use by the qtest testing framework |
| 608 | * and is not suitable for use in non-testing parts of QEMU. |
| 609 | * |
| 610 | * This function breaks an existing connection of an outbound GPIO |
| 611 | * line from @dev, and replaces it with the new qemu_irq @icpt, as if |
| 612 | * ``qdev_connect_gpio_out_named(dev, icpt, name, n)`` had been called. |
| 613 | * The previously connected qemu_irq is returned, so it can be restored |
| 614 | * by a second call to qdev_intercept_gpio_out() if desired. |
| 615 | */ |
Peter Crosthwaite | 0c24db2 | 2014-09-25 22:20:58 -0700 | [diff] [blame] | 616 | qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, |
| 617 | const char *name, int n); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 618 | |
| 619 | BusState *qdev_get_child_bus(DeviceState *dev, const char *name); |
| 620 | |
| 621 | /*** Device API. ***/ |
| 622 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 623 | /** |
| 624 | * qdev_init_gpio_in: create an array of anonymous input GPIO lines |
| 625 | * @dev: Device to create input GPIOs for |
| 626 | * @handler: Function to call when GPIO line value is set |
| 627 | * @n: Number of GPIO lines to create |
| 628 | * |
| 629 | * Devices should use functions in the qdev_init_gpio_in* family in |
| 630 | * their instance_init or realize methods to create any input GPIO |
| 631 | * lines they need. There is no functional difference between |
| 632 | * anonymous and named GPIO lines. Stylistically, named GPIOs are |
| 633 | * preferable (easier to understand at callsites) unless a device |
| 634 | * has exactly one uniform kind of GPIO input whose purpose is obvious. |
| 635 | * Note that input GPIO lines can serve as 'sinks' for IRQ lines. |
| 636 | * |
| 637 | * See qdev_get_gpio_in() for how code that uses such a device can get |
| 638 | * hold of an input GPIO line to manipulate it. |
| 639 | */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 640 | void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 641 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 642 | /** |
| 643 | * qdev_init_gpio_out: create an array of anonymous output GPIO lines |
| 644 | * @dev: Device to create output GPIOs for |
| 645 | * @pins: Pointer to qemu_irq or qemu_irq array for the GPIO lines |
| 646 | * @n: Number of GPIO lines to create |
| 647 | * |
| 648 | * Devices should use functions in the qdev_init_gpio_out* family |
| 649 | * in their instance_init or realize methods to create any output |
| 650 | * GPIO lines they need. There is no functional difference between |
| 651 | * anonymous and named GPIO lines. Stylistically, named GPIOs are |
| 652 | * preferable (easier to understand at callsites) unless a device |
| 653 | * has exactly one uniform kind of GPIO output whose purpose is obvious. |
| 654 | * |
| 655 | * The @pins argument should be a pointer to either a "qemu_irq" |
| 656 | * (if @n == 1) or a "qemu_irq []" array (if @n > 1) in the device's |
| 657 | * state structure. The device implementation can then raise and |
| 658 | * lower the GPIO line by calling qemu_set_irq(). (If anything is |
| 659 | * connected to the other end of the GPIO this will cause the handler |
| 660 | * function for that input GPIO to be called.) |
| 661 | * |
| 662 | * See qdev_connect_gpio_out() for how code that uses such a device |
| 663 | * can connect to one of its output GPIO lines. |
Philippe Mathieu-Daudé | 526dc84 | 2021-08-19 16:27:31 +0200 | [diff] [blame] | 664 | * |
| 665 | * There is no need to release the @pins allocated array because it |
| 666 | * will be automatically released when @dev calls its instance_finalize() |
| 667 | * handler. |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 668 | */ |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 669 | void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 670 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 671 | /** |
Philippe Mathieu-Daudé | 14b0375 | 2021-12-18 13:52:51 +0100 | [diff] [blame] | 672 | * qdev_init_gpio_out_named: create an array of named output GPIO lines |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 673 | * @dev: Device to create output GPIOs for |
| 674 | * @pins: Pointer to qemu_irq or qemu_irq array for the GPIO lines |
| 675 | * @name: Name to give this array of GPIO lines |
| 676 | * @n: Number of GPIO lines to create |
| 677 | * |
| 678 | * Like qdev_init_gpio_out(), but creates an array of GPIO output lines |
| 679 | * with a name. Code using the device can then connect these GPIO lines |
| 680 | * using qdev_connect_gpio_out_named(). |
| 681 | */ |
Peter Crosthwaite | a5f5429 | 2014-05-19 23:30:58 -0700 | [diff] [blame] | 682 | void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, |
| 683 | const char *name, int n); |
Philippe Mathieu-Daudé | 694804e | 2021-12-18 13:49:24 +0100 | [diff] [blame] | 684 | |
Peter Maydell | 4a15167 | 2018-03-02 10:45:38 +0000 | [diff] [blame] | 685 | /** |
| 686 | * qdev_init_gpio_in_named_with_opaque: create an array of input GPIO lines |
| 687 | * for the specified device |
| 688 | * |
| 689 | * @dev: Device to create input GPIOs for |
| 690 | * @handler: Function to call when GPIO line value is set |
| 691 | * @opaque: Opaque data pointer to pass to @handler |
| 692 | * @name: Name of the GPIO input (must be unique for this device) |
| 693 | * @n: Number of GPIO lines in this input set |
| 694 | */ |
| 695 | void qdev_init_gpio_in_named_with_opaque(DeviceState *dev, |
| 696 | qemu_irq_handler handler, |
| 697 | void *opaque, |
| 698 | const char *name, int n); |
| 699 | |
| 700 | /** |
| 701 | * qdev_init_gpio_in_named: create an array of input GPIO lines |
| 702 | * for the specified device |
| 703 | * |
| 704 | * Like qdev_init_gpio_in_named_with_opaque(), but the opaque pointer |
| 705 | * passed to the handler is @dev (which is the most commonly desired behaviour). |
| 706 | */ |
| 707 | static inline void qdev_init_gpio_in_named(DeviceState *dev, |
| 708 | qemu_irq_handler handler, |
| 709 | const char *name, int n) |
| 710 | { |
| 711 | qdev_init_gpio_in_named_with_opaque(dev, handler, dev, name, n); |
| 712 | } |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 713 | |
Peter Maydell | cd07d7f | 2020-07-11 15:24:25 +0100 | [diff] [blame] | 714 | /** |
| 715 | * qdev_pass_gpios: create GPIO lines on container which pass through to device |
| 716 | * @dev: Device which has GPIO lines |
| 717 | * @container: Container device which needs to expose them |
| 718 | * @name: Name of GPIO array to pass through (NULL for the anonymous GPIO array) |
| 719 | * |
| 720 | * In QEMU, complicated devices like SoCs are often modelled with a |
| 721 | * "container" QOM device which itself contains other QOM devices and |
| 722 | * which wires them up appropriately. This function allows the container |
| 723 | * to create GPIO arrays on itself which simply pass through to a GPIO |
| 724 | * array of one of its internal devices. |
| 725 | * |
| 726 | * If @dev has both input and output GPIOs named @name then both will |
| 727 | * be passed through. It is not possible to pass a subset of the array |
| 728 | * with this function. |
| 729 | * |
| 730 | * To users of the container device, the GPIO array created on @container |
| 731 | * behaves exactly like any other. |
| 732 | */ |
Peter Crosthwaite | 17a96a1 | 2014-09-25 22:23:42 -0700 | [diff] [blame] | 733 | void qdev_pass_gpios(DeviceState *dev, DeviceState *container, |
| 734 | const char *name); |
| 735 | |
Philippe Mathieu-Daudé | 2d2f250 | 2023-02-12 23:26:59 +0100 | [diff] [blame] | 736 | BusState *qdev_get_parent_bus(const DeviceState *dev); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 737 | |
| 738 | /*** BUS API. ***/ |
| 739 | |
| 740 | DeviceState *qdev_find_recursive(BusState *bus, const char *id); |
| 741 | |
| 742 | /* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */ |
| 743 | typedef int (qbus_walkerfn)(BusState *bus, void *opaque); |
| 744 | typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); |
| 745 | |
Peter Maydell | d637e1d | 2021-09-23 13:11:51 +0100 | [diff] [blame] | 746 | void qbus_init(void *bus, size_t size, const char *typename, |
| 747 | DeviceState *parent, const char *name); |
Peter Maydell | 9388d17 | 2021-09-23 13:11:52 +0100 | [diff] [blame] | 748 | BusState *qbus_new(const char *typename, DeviceState *parent, const char *name); |
Markus Armbruster | 9940b2c | 2020-06-10 07:31:53 +0200 | [diff] [blame] | 749 | bool qbus_realize(BusState *bus, Error **errp); |
| 750 | void qbus_unrealize(BusState *bus); |
| 751 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 752 | /* Returns > 0 if either devfn or busfn skip walk somewhere in cursion, |
| 753 | * < 0 if either devfn or busfn terminate walk somewhere in cursion, |
| 754 | * 0 otherwise. */ |
Paolo Bonzini | 0293214 | 2013-12-06 17:54:26 +0100 | [diff] [blame] | 755 | int qbus_walk_children(BusState *bus, |
| 756 | qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, |
| 757 | qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, |
| 758 | void *opaque); |
| 759 | int qdev_walk_children(DeviceState *dev, |
| 760 | qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, |
| 761 | qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, |
| 762 | void *opaque); |
| 763 | |
Damien Hedde | abb89db | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 764 | /** |
Damien Hedde | abb89db | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 765 | * device_cold_reset: |
| 766 | * Reset device @dev and perform a recursive processing using the resettable |
| 767 | * interface. It triggers a RESET_TYPE_COLD. |
| 768 | */ |
| 769 | void device_cold_reset(DeviceState *dev); |
| 770 | |
| 771 | /** |
| 772 | * bus_cold_reset: |
| 773 | * |
| 774 | * Reset bus @bus and perform a recursive processing using the resettable |
| 775 | * interface. It triggers a RESET_TYPE_COLD. |
| 776 | */ |
| 777 | void bus_cold_reset(BusState *bus); |
| 778 | |
| 779 | /** |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 780 | * device_is_in_reset: |
| 781 | * Return true if the device @dev is currently being reset. |
| 782 | */ |
| 783 | bool device_is_in_reset(DeviceState *dev); |
| 784 | |
| 785 | /** |
| 786 | * bus_is_in_reset: |
| 787 | * Return true if the bus @bus is currently being reset. |
| 788 | */ |
| 789 | bool bus_is_in_reset(BusState *bus); |
| 790 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 791 | /* This should go away once we get rid of the NULL bus hack */ |
| 792 | BusState *sysbus_get_default(void); |
| 793 | |
| 794 | char *qdev_get_fw_dev_path(DeviceState *dev); |
Gonglei | 0be6390 | 2015-01-29 15:08:51 +0800 | [diff] [blame] | 795 | char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 796 | |
Marc-André Lureau | 4f67d30 | 2020-01-10 19:30:32 +0400 | [diff] [blame] | 797 | void device_class_set_props(DeviceClass *dc, Property *props); |
| 798 | |
Damien Hedde | c11256a | 2020-01-30 16:02:04 +0000 | [diff] [blame] | 799 | /** |
| 800 | * device_class_set_parent_reset: |
| 801 | * TODO: remove the function when DeviceClass's reset method |
| 802 | * is not used anymore. |
| 803 | */ |
Philippe Mathieu-Daudé | 46795cf | 2018-01-13 23:04:11 -0300 | [diff] [blame] | 804 | void device_class_set_parent_reset(DeviceClass *dc, |
| 805 | DeviceReset dev_reset, |
| 806 | DeviceReset *parent_reset); |
| 807 | void device_class_set_parent_realize(DeviceClass *dc, |
| 808 | DeviceRealize dev_realize, |
| 809 | DeviceRealize *parent_realize); |
| 810 | void device_class_set_parent_unrealize(DeviceClass *dc, |
| 811 | DeviceUnrealize dev_unrealize, |
| 812 | DeviceUnrealize *parent_unrealize); |
| 813 | |
Markus Armbruster | 8a9358c | 2019-08-12 07:23:44 +0200 | [diff] [blame] | 814 | const VMStateDescription *qdev_get_vmsd(DeviceState *dev); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 815 | |
| 816 | const char *qdev_fw_name(DeviceState *dev); |
| 817 | |
Paolo Bonzini | f66dc87 | 2020-11-13 02:43:56 -0500 | [diff] [blame] | 818 | void qdev_assert_realized_properly(void); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 819 | Object *qdev_get_machine(void); |
| 820 | |
| 821 | /* FIXME: make this a link<> */ |
Paolo Bonzini | bb755ba | 2020-10-06 15:38:55 +0300 | [diff] [blame] | 822 | bool qdev_set_parent_bus(DeviceState *dev, BusState *bus, Error **errp); |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 823 | |
Juan Quintela | 21def24 | 2017-03-28 11:22:10 +0200 | [diff] [blame] | 824 | extern bool qdev_hot_removed; |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 825 | |
| 826 | char *qdev_get_dev_path(DeviceState *dev); |
| 827 | |
Markus Armbruster | 9bc6bfd | 2020-06-30 11:03:39 +0200 | [diff] [blame] | 828 | void qbus_set_hotplug_handler(BusState *bus, Object *handler); |
Markus Armbruster | cd7c866 | 2020-06-30 11:03:38 +0200 | [diff] [blame] | 829 | void qbus_set_bus_hotplug_handler(BusState *bus); |
Igor Mammedov | 39b888b | 2014-09-26 09:28:17 +0000 | [diff] [blame] | 830 | |
| 831 | static inline bool qbus_is_hotpluggable(BusState *bus) |
| 832 | { |
Igor Mammedov | ceefa0b | 2023-03-02 17:15:21 +0100 | [diff] [blame] | 833 | HotplugHandler *plug_handler = bus->hotplug_handler; |
| 834 | bool ret = !!plug_handler; |
| 835 | |
| 836 | if (plug_handler) { |
| 837 | HotplugHandlerClass *hdc; |
| 838 | |
| 839 | hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler); |
| 840 | if (hdc->is_hotpluggable_bus) { |
| 841 | ret = hdc->is_hotpluggable_bus(plug_handler, bus); |
| 842 | } |
| 843 | } |
| 844 | return ret; |
Igor Mammedov | 39b888b | 2014-09-26 09:28:17 +0000 | [diff] [blame] | 845 | } |
Paul Durrant | 707ff80 | 2015-01-20 11:05:07 +0000 | [diff] [blame] | 846 | |
Peter Maydell | 1518562 | 2021-09-13 16:07:25 +0100 | [diff] [blame] | 847 | /** |
| 848 | * qbus_mark_full: Mark this bus as full, so no more devices can be attached |
| 849 | * @bus: Bus to mark as full |
| 850 | * |
| 851 | * By default, QEMU will allow devices to be plugged into a bus up |
| 852 | * to the bus class's device count limit. Calling this function |
| 853 | * marks a particular bus as full, so that no more devices can be |
| 854 | * plugged into it. In particular this means that the bus will not |
| 855 | * be considered as a candidate for plugging in devices created by |
| 856 | * the user on the commandline or via the monitor. |
| 857 | * If a machine has multiple buses of a given type, such as I2C, |
| 858 | * where some of those buses in the real hardware are used only for |
| 859 | * internal devices and some are exposed via expansion ports, you |
| 860 | * can use this function to mark the internal-only buses as full |
| 861 | * after you have created all their internal devices. Then user |
| 862 | * created devices will appear on the expansion-port bus where |
| 863 | * guest software expects them. |
| 864 | */ |
| 865 | static inline void qbus_mark_full(BusState *bus) |
| 866 | { |
| 867 | bus->full = true; |
| 868 | } |
| 869 | |
Paul Durrant | 707ff80 | 2015-01-20 11:05:07 +0000 | [diff] [blame] | 870 | void device_listener_register(DeviceListener *listener); |
| 871 | void device_listener_unregister(DeviceListener *listener); |
| 872 | |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 873 | /** |
| 874 | * @qdev_should_hide_device: |
Kevin Wolf | f3558b1 | 2021-10-08 15:34:41 +0200 | [diff] [blame] | 875 | * @opts: options QDict |
| 876 | * @from_json: true if @opts entries are typed, false for all strings |
| 877 | * @errp: pointer to error object |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 878 | * |
| 879 | * Check if a device should be added. |
| 880 | * When a device is added via qdev_device_add() this will be called, |
| 881 | * and return if the device should be added now or not. |
| 882 | */ |
Kevin Wolf | f3558b1 | 2021-10-08 15:34:41 +0200 | [diff] [blame] | 883 | bool qdev_should_hide_device(const QDict *opts, bool from_json, Error **errp); |
Jens Freimann | f3a8505 | 2019-10-29 12:48:55 +0100 | [diff] [blame] | 884 | |
Paolo Bonzini | 2f181fb | 2020-11-12 09:38:36 -0500 | [diff] [blame] | 885 | typedef enum MachineInitPhase { |
| 886 | /* current_machine is NULL. */ |
| 887 | PHASE_NO_MACHINE, |
| 888 | |
| 889 | /* current_machine is not NULL, but current_machine->accel is NULL. */ |
| 890 | PHASE_MACHINE_CREATED, |
| 891 | |
| 892 | /* |
| 893 | * current_machine->accel is not NULL, but the machine properties have |
| 894 | * not been validated and machine_class->init has not yet been called. |
| 895 | */ |
| 896 | PHASE_ACCEL_CREATED, |
| 897 | |
| 898 | /* |
| 899 | * machine_class->init has been called, thus creating any embedded |
| 900 | * devices and validating machine properties. Devices created at |
| 901 | * this time are considered to be cold-plugged. |
| 902 | */ |
| 903 | PHASE_MACHINE_INITIALIZED, |
| 904 | |
| 905 | /* |
| 906 | * QEMU is ready to start CPUs and devices created at this time |
| 907 | * are considered to be hot-plugged. The monitor is not restricted |
| 908 | * to "preconfig" commands. |
| 909 | */ |
| 910 | PHASE_MACHINE_READY, |
| 911 | } MachineInitPhase; |
| 912 | |
| 913 | extern bool phase_check(MachineInitPhase phase); |
| 914 | extern void phase_advance(MachineInitPhase phase); |
| 915 | |
Anthony Liguori | 074a86f | 2012-08-10 12:00:43 -0500 | [diff] [blame] | 916 | #endif |