1 /* 2 * Dynamic device configuration and creation. 3 * 4 * Copyright (c) 2009 CodeSourcery 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 /* The theory here is that it should be possible to create a machine without 21 knowledge of specific devices. Historically board init routines have 22 passed a bunch of arguments to each device, requiring the board know 23 exactly which device it is dealing with. This file provides an abstract 24 API for device configuration and initialization. Devices will generally 25 inherit from a particular bus (e.g. PCI or I2C) rather than 26 this API directly. */ 27 28 #include "qemu/osdep.h" 29 #include "qapi/error.h" 30 #include "qapi/qapi-events-qdev.h" 31 #include "qapi/qmp/qerror.h" 32 #include "qapi/visitor.h" 33 #include "qemu/error-report.h" 34 #include "qemu/option.h" 35 #include "hw/hotplug.h" 36 #include "hw/irq.h" 37 #include "hw/qdev-properties.h" 38 #include "hw/boards.h" 39 #include "hw/sysbus.h" 40 #include "hw/qdev-clock.h" 41 #include "migration/vmstate.h" 42 #include "trace.h" 43 44 bool qdev_hotplug = false; 45 static bool qdev_hot_added = false; 46 bool qdev_hot_removed = false; 47 48 const VMStateDescription *qdev_get_vmsd(DeviceState *dev) 49 { 50 DeviceClass *dc = DEVICE_GET_CLASS(dev); 51 return dc->vmsd; 52 } 53 54 static void bus_remove_child(BusState *bus, DeviceState *child) 55 { 56 BusChild *kid; 57 58 QTAILQ_FOREACH(kid, &bus->children, sibling) { 59 if (kid->child == child) { 60 char name[32]; 61 62 snprintf(name, sizeof(name), "child[%d]", kid->index); 63 QTAILQ_REMOVE(&bus->children, kid, sibling); 64 65 bus->num_children--; 66 67 /* This gives back ownership of kid->child back to us. */ 68 object_property_del(OBJECT(bus), name); 69 object_unref(OBJECT(kid->child)); 70 g_free(kid); 71 return; 72 } 73 } 74 } 75 76 static void bus_add_child(BusState *bus, DeviceState *child) 77 { 78 char name[32]; 79 BusChild *kid = g_malloc0(sizeof(*kid)); 80 81 bus->num_children++; 82 kid->index = bus->max_index++; 83 kid->child = child; 84 object_ref(OBJECT(kid->child)); 85 86 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling); 87 88 /* This transfers ownership of kid->child to the property. */ 89 snprintf(name, sizeof(name), "child[%d]", kid->index); 90 object_property_add_link(OBJECT(bus), name, 91 object_get_typename(OBJECT(child)), 92 (Object **)&kid->child, 93 NULL, /* read-only property */ 94 0); 95 } 96 97 void qdev_set_parent_bus(DeviceState *dev, BusState *bus) 98 { 99 BusState *old_parent_bus = dev->parent_bus; 100 DeviceClass *dc = DEVICE_GET_CLASS(dev); 101 102 assert(dc->bus_type && object_dynamic_cast(OBJECT(bus), dc->bus_type)); 103 104 if (old_parent_bus) { 105 trace_qdev_update_parent_bus(dev, object_get_typename(OBJECT(dev)), 106 old_parent_bus, object_get_typename(OBJECT(old_parent_bus)), 107 OBJECT(bus), object_get_typename(OBJECT(bus))); 108 /* 109 * Keep a reference to the device while it's not plugged into 110 * any bus, to avoid it potentially evaporating when it is 111 * dereffed in bus_remove_child(). 112 * Also keep the ref of the parent bus until the end, so that 113 * we can safely call resettable_change_parent() below. 114 */ 115 object_ref(OBJECT(dev)); 116 bus_remove_child(dev->parent_bus, dev); 117 } 118 dev->parent_bus = bus; 119 object_ref(OBJECT(bus)); 120 bus_add_child(bus, dev); 121 if (dev->realized) { 122 resettable_change_parent(OBJECT(dev), OBJECT(bus), 123 OBJECT(old_parent_bus)); 124 } 125 if (old_parent_bus) { 126 object_unref(OBJECT(old_parent_bus)); 127 object_unref(OBJECT(dev)); 128 } 129 } 130 131 /* 132 * Create a device on the heap. 133 * A type @name must exist. 134 * This only initializes the device state structure and allows 135 * properties to be set. The device still needs to be realized. See 136 * qdev-core.h. 137 */ 138 DeviceState *qdev_new(const char *name) 139 { 140 return DEVICE(object_new(name)); 141 } 142 143 /* 144 * Try to create a device on the heap. 145 * This is like qdev_new(), except it returns %NULL when type @name 146 * does not exist. 147 */ 148 DeviceState *qdev_try_new(const char *name) 149 { 150 if (!object_class_by_name(name)) { 151 return NULL; 152 } 153 154 return DEVICE(object_new(name)); 155 } 156 157 static QTAILQ_HEAD(, DeviceListener) device_listeners 158 = QTAILQ_HEAD_INITIALIZER(device_listeners); 159 160 enum ListenerDirection { Forward, Reverse }; 161 162 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \ 163 do { \ 164 DeviceListener *_listener; \ 165 \ 166 switch (_direction) { \ 167 case Forward: \ 168 QTAILQ_FOREACH(_listener, &device_listeners, link) { \ 169 if (_listener->_callback) { \ 170 _listener->_callback(_listener, ##_args); \ 171 } \ 172 } \ 173 break; \ 174 case Reverse: \ 175 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \ 176 link) { \ 177 if (_listener->_callback) { \ 178 _listener->_callback(_listener, ##_args); \ 179 } \ 180 } \ 181 break; \ 182 default: \ 183 abort(); \ 184 } \ 185 } while (0) 186 187 static int device_listener_add(DeviceState *dev, void *opaque) 188 { 189 DEVICE_LISTENER_CALL(realize, Forward, dev); 190 191 return 0; 192 } 193 194 void device_listener_register(DeviceListener *listener) 195 { 196 QTAILQ_INSERT_TAIL(&device_listeners, listener, link); 197 198 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add, 199 NULL, NULL); 200 } 201 202 void device_listener_unregister(DeviceListener *listener) 203 { 204 QTAILQ_REMOVE(&device_listeners, listener, link); 205 } 206 207 bool qdev_should_hide_device(QemuOpts *opts) 208 { 209 int rc = -1; 210 DeviceListener *listener; 211 212 QTAILQ_FOREACH(listener, &device_listeners, link) { 213 if (listener->should_be_hidden) { 214 /* 215 * should_be_hidden_will return 216 * 1 if device matches opts and it should be hidden 217 * 0 if device matches opts and should not be hidden 218 * -1 if device doesn't match ops 219 */ 220 rc = listener->should_be_hidden(listener, opts); 221 } 222 223 if (rc > 0) { 224 break; 225 } 226 } 227 228 return rc > 0; 229 } 230 231 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, 232 int required_for_version) 233 { 234 assert(!dev->realized); 235 dev->instance_id_alias = alias_id; 236 dev->alias_required_for_version = required_for_version; 237 } 238 239 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev) 240 { 241 MachineState *machine; 242 MachineClass *mc; 243 Object *m_obj = qdev_get_machine(); 244 245 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) { 246 machine = MACHINE(m_obj); 247 mc = MACHINE_GET_CLASS(machine); 248 if (mc->get_hotplug_handler) { 249 return mc->get_hotplug_handler(machine, dev); 250 } 251 } 252 253 return NULL; 254 } 255 256 bool qdev_hotplug_allowed(DeviceState *dev, Error **errp) 257 { 258 MachineState *machine; 259 MachineClass *mc; 260 Object *m_obj = qdev_get_machine(); 261 262 if (object_dynamic_cast(m_obj, TYPE_MACHINE)) { 263 machine = MACHINE(m_obj); 264 mc = MACHINE_GET_CLASS(machine); 265 if (mc->hotplug_allowed) { 266 return mc->hotplug_allowed(machine, dev, errp); 267 } 268 } 269 270 return true; 271 } 272 273 HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev) 274 { 275 if (dev->parent_bus) { 276 return dev->parent_bus->hotplug_handler; 277 } 278 return NULL; 279 } 280 281 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev) 282 { 283 HotplugHandler *hotplug_ctrl = qdev_get_machine_hotplug_handler(dev); 284 285 if (hotplug_ctrl == NULL && dev->parent_bus) { 286 hotplug_ctrl = qdev_get_bus_hotplug_handler(dev); 287 } 288 return hotplug_ctrl; 289 } 290 291 static int qdev_prereset(DeviceState *dev, void *opaque) 292 { 293 trace_qdev_reset_tree(dev, object_get_typename(OBJECT(dev))); 294 return 0; 295 } 296 297 static int qbus_prereset(BusState *bus, void *opaque) 298 { 299 trace_qbus_reset_tree(bus, object_get_typename(OBJECT(bus))); 300 return 0; 301 } 302 303 static int qdev_reset_one(DeviceState *dev, void *opaque) 304 { 305 device_legacy_reset(dev); 306 307 return 0; 308 } 309 310 static int qbus_reset_one(BusState *bus, void *opaque) 311 { 312 BusClass *bc = BUS_GET_CLASS(bus); 313 trace_qbus_reset(bus, object_get_typename(OBJECT(bus))); 314 if (bc->reset) { 315 bc->reset(bus); 316 } 317 return 0; 318 } 319 320 void qdev_reset_all(DeviceState *dev) 321 { 322 trace_qdev_reset_all(dev, object_get_typename(OBJECT(dev))); 323 qdev_walk_children(dev, qdev_prereset, qbus_prereset, 324 qdev_reset_one, qbus_reset_one, NULL); 325 } 326 327 void qdev_reset_all_fn(void *opaque) 328 { 329 qdev_reset_all(DEVICE(opaque)); 330 } 331 332 void qbus_reset_all(BusState *bus) 333 { 334 trace_qbus_reset_all(bus, object_get_typename(OBJECT(bus))); 335 qbus_walk_children(bus, qdev_prereset, qbus_prereset, 336 qdev_reset_one, qbus_reset_one, NULL); 337 } 338 339 void qbus_reset_all_fn(void *opaque) 340 { 341 BusState *bus = opaque; 342 qbus_reset_all(bus); 343 } 344 345 void device_cold_reset(DeviceState *dev) 346 { 347 resettable_reset(OBJECT(dev), RESET_TYPE_COLD); 348 } 349 350 bool device_is_in_reset(DeviceState *dev) 351 { 352 return resettable_is_in_reset(OBJECT(dev)); 353 } 354 355 static ResettableState *device_get_reset_state(Object *obj) 356 { 357 DeviceState *dev = DEVICE(obj); 358 return &dev->reset; 359 } 360 361 static void device_reset_child_foreach(Object *obj, ResettableChildCallback cb, 362 void *opaque, ResetType type) 363 { 364 DeviceState *dev = DEVICE(obj); 365 BusState *bus; 366 367 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 368 cb(OBJECT(bus), opaque, type); 369 } 370 } 371 372 /* can be used as ->unplug() callback for the simple cases */ 373 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, 374 DeviceState *dev, Error **errp) 375 { 376 qdev_unrealize(dev); 377 } 378 379 /* 380 * Realize @dev. 381 * Device properties should be set before calling this function. IRQs 382 * and MMIO regions should be connected/mapped after calling this 383 * function. 384 * On failure, report an error with error_report() and terminate the 385 * program. This is okay during machine creation. Don't use for 386 * hotplug, because there callers need to recover from failure. 387 * Exception: if you know the device's init() callback can't fail, 388 * then qdev_init_nofail() can't fail either, and is therefore usable 389 * even then. But relying on the device implementation that way is 390 * somewhat unclean, and best avoided. 391 */ 392 void qdev_init_nofail(DeviceState *dev) 393 { 394 Error *err = NULL; 395 396 assert(!dev->realized); 397 398 object_ref(OBJECT(dev)); 399 object_property_set_bool(OBJECT(dev), true, "realized", &err); 400 if (err) { 401 error_reportf_err(err, "Initialization of device %s failed: ", 402 object_get_typename(OBJECT(dev))); 403 exit(1); 404 } 405 object_unref(OBJECT(dev)); 406 } 407 408 /* 409 * Realize @dev. 410 * @dev must not be plugged into a bus. 411 * Plug @dev into @bus if non-null, else into the main system bus. 412 * This takes a reference to @dev. 413 * If @dev has no QOM parent, make one up, taking another reference. 414 * On success, return true. 415 * On failure, store an error through @errp and return false. 416 */ 417 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp) 418 { 419 Error *err = NULL; 420 421 assert(!dev->realized && !dev->parent_bus); 422 423 if (!bus) { 424 /* 425 * Assert that the device really is a SysBusDevice before we 426 * put it onto the sysbus. Non-sysbus devices which aren't 427 * being put onto a bus should be realized with 428 * object_property_set_bool(OBJECT(dev), true, "realized", 429 * errp); 430 */ 431 g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)); 432 bus = sysbus_get_default(); 433 } 434 435 qdev_set_parent_bus(dev, bus); 436 437 object_property_set_bool(OBJECT(dev), true, "realized", &err); 438 if (err) { 439 error_propagate(errp, err); 440 } 441 return !err; 442 } 443 444 /* 445 * Realize @dev and drop a reference. 446 * This is like qdev_realize(), except the caller must hold a 447 * (private) reference, which is dropped on return regardless of 448 * success or failure. Intended use: 449 * dev = qdev_new(); 450 * [...] 451 * qdev_realize_and_unref(dev, bus, errp); 452 * Now @dev can go away without further ado. 453 */ 454 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp) 455 { 456 bool ret; 457 458 ret = qdev_realize(dev, bus, errp); 459 object_unref(OBJECT(dev)); 460 return ret; 461 } 462 463 void qdev_unrealize(DeviceState *dev) 464 { 465 object_property_set_bool(OBJECT(dev), false, "realized", &error_abort); 466 } 467 468 static int qdev_assert_realized_properly(Object *obj, void *opaque) 469 { 470 DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); 471 DeviceClass *dc; 472 473 if (dev) { 474 dc = DEVICE_GET_CLASS(dev); 475 assert(dev->realized); 476 assert(dev->parent_bus || !dc->bus_type); 477 } 478 return 0; 479 } 480 481 void qdev_machine_creation_done(void) 482 { 483 /* 484 * ok, initial machine setup is done, starting from now we can 485 * only create hotpluggable devices 486 */ 487 qdev_hotplug = true; 488 489 object_child_foreach_recursive(object_get_root(), 490 qdev_assert_realized_properly, NULL); 491 } 492 493 bool qdev_machine_modified(void) 494 { 495 return qdev_hot_added || qdev_hot_removed; 496 } 497 498 BusState *qdev_get_parent_bus(DeviceState *dev) 499 { 500 return dev->parent_bus; 501 } 502 503 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev, 504 const char *name) 505 { 506 NamedGPIOList *ngl; 507 508 QLIST_FOREACH(ngl, &dev->gpios, node) { 509 /* NULL is a valid and matchable name. */ 510 if (g_strcmp0(name, ngl->name) == 0) { 511 return ngl; 512 } 513 } 514 515 ngl = g_malloc0(sizeof(*ngl)); 516 ngl->name = g_strdup(name); 517 QLIST_INSERT_HEAD(&dev->gpios, ngl, node); 518 return ngl; 519 } 520 521 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev, 522 qemu_irq_handler handler, 523 void *opaque, 524 const char *name, int n) 525 { 526 int i; 527 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 528 529 assert(gpio_list->num_out == 0 || !name); 530 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler, 531 opaque, n); 532 533 if (!name) { 534 name = "unnamed-gpio-in"; 535 } 536 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) { 537 gchar *propname = g_strdup_printf("%s[%u]", name, i); 538 539 object_property_add_child(OBJECT(dev), propname, 540 OBJECT(gpio_list->in[i])); 541 g_free(propname); 542 } 543 544 gpio_list->num_in += n; 545 } 546 547 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) 548 { 549 qdev_init_gpio_in_named(dev, handler, NULL, n); 550 } 551 552 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, 553 const char *name, int n) 554 { 555 int i; 556 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 557 558 assert(gpio_list->num_in == 0 || !name); 559 560 if (!name) { 561 name = "unnamed-gpio-out"; 562 } 563 memset(pins, 0, sizeof(*pins) * n); 564 for (i = 0; i < n; ++i) { 565 gchar *propname = g_strdup_printf("%s[%u]", name, 566 gpio_list->num_out + i); 567 568 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, 569 (Object **)&pins[i], 570 object_property_allow_set_link, 571 OBJ_PROP_LINK_STRONG); 572 g_free(propname); 573 } 574 gpio_list->num_out += n; 575 } 576 577 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) 578 { 579 qdev_init_gpio_out_named(dev, pins, NULL, n); 580 } 581 582 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) 583 { 584 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 585 586 assert(n >= 0 && n < gpio_list->num_in); 587 return gpio_list->in[n]; 588 } 589 590 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) 591 { 592 return qdev_get_gpio_in_named(dev, NULL, n); 593 } 594 595 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, 596 qemu_irq pin) 597 { 598 char *propname = g_strdup_printf("%s[%d]", 599 name ? name : "unnamed-gpio-out", n); 600 if (pin && !OBJECT(pin)->parent) { 601 /* We need a name for object_property_set_link to work */ 602 object_property_add_child(container_get(qdev_get_machine(), 603 "/unattached"), 604 "non-qdev-gpio[*]", OBJECT(pin)); 605 } 606 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort); 607 g_free(propname); 608 } 609 610 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n) 611 { 612 g_autofree char *propname = g_strdup_printf("%s[%d]", 613 name ? name : "unnamed-gpio-out", n); 614 615 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 616 NULL); 617 618 return ret; 619 } 620 621 /* disconnect a GPIO output, returning the disconnected input (if any) */ 622 623 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, 624 const char *name, int n) 625 { 626 char *propname = g_strdup_printf("%s[%d]", 627 name ? name : "unnamed-gpio-out", n); 628 629 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 630 NULL); 631 if (ret) { 632 object_property_set_link(OBJECT(dev), NULL, propname, NULL); 633 } 634 g_free(propname); 635 return ret; 636 } 637 638 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, 639 const char *name, int n) 640 { 641 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n); 642 qdev_connect_gpio_out_named(dev, name, n, icpt); 643 return disconnected; 644 } 645 646 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) 647 { 648 qdev_connect_gpio_out_named(dev, NULL, n, pin); 649 } 650 651 void qdev_pass_gpios(DeviceState *dev, DeviceState *container, 652 const char *name) 653 { 654 int i; 655 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name); 656 657 for (i = 0; i < ngl->num_in; i++) { 658 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in"; 659 char *propname = g_strdup_printf("%s[%d]", nm, i); 660 661 object_property_add_alias(OBJECT(container), propname, 662 OBJECT(dev), propname); 663 g_free(propname); 664 } 665 for (i = 0; i < ngl->num_out; i++) { 666 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out"; 667 char *propname = g_strdup_printf("%s[%d]", nm, i); 668 669 object_property_add_alias(OBJECT(container), propname, 670 OBJECT(dev), propname); 671 g_free(propname); 672 } 673 QLIST_REMOVE(ngl, node); 674 QLIST_INSERT_HEAD(&container->gpios, ngl, node); 675 } 676 677 BusState *qdev_get_child_bus(DeviceState *dev, const char *name) 678 { 679 BusState *bus; 680 Object *child = object_resolve_path_component(OBJECT(dev), name); 681 682 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS); 683 if (bus) { 684 return bus; 685 } 686 687 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 688 if (strcmp(name, bus->name) == 0) { 689 return bus; 690 } 691 } 692 return NULL; 693 } 694 695 int qdev_walk_children(DeviceState *dev, 696 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 697 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 698 void *opaque) 699 { 700 BusState *bus; 701 int err; 702 703 if (pre_devfn) { 704 err = pre_devfn(dev, opaque); 705 if (err) { 706 return err; 707 } 708 } 709 710 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 711 err = qbus_walk_children(bus, pre_devfn, pre_busfn, 712 post_devfn, post_busfn, opaque); 713 if (err < 0) { 714 return err; 715 } 716 } 717 718 if (post_devfn) { 719 err = post_devfn(dev, opaque); 720 if (err) { 721 return err; 722 } 723 } 724 725 return 0; 726 } 727 728 DeviceState *qdev_find_recursive(BusState *bus, const char *id) 729 { 730 BusChild *kid; 731 DeviceState *ret; 732 BusState *child; 733 734 QTAILQ_FOREACH(kid, &bus->children, sibling) { 735 DeviceState *dev = kid->child; 736 737 if (dev->id && strcmp(dev->id, id) == 0) { 738 return dev; 739 } 740 741 QLIST_FOREACH(child, &dev->child_bus, sibling) { 742 ret = qdev_find_recursive(child, id); 743 if (ret) { 744 return ret; 745 } 746 } 747 } 748 return NULL; 749 } 750 751 char *qdev_get_dev_path(DeviceState *dev) 752 { 753 BusClass *bc; 754 755 if (!dev || !dev->parent_bus) { 756 return NULL; 757 } 758 759 bc = BUS_GET_CLASS(dev->parent_bus); 760 if (bc->get_dev_path) { 761 return bc->get_dev_path(dev); 762 } 763 764 return NULL; 765 } 766 767 /** 768 * Legacy property handling 769 */ 770 771 static void qdev_get_legacy_property(Object *obj, Visitor *v, 772 const char *name, void *opaque, 773 Error **errp) 774 { 775 DeviceState *dev = DEVICE(obj); 776 Property *prop = opaque; 777 778 char buffer[1024]; 779 char *ptr = buffer; 780 781 prop->info->print(dev, prop, buffer, sizeof(buffer)); 782 visit_type_str(v, name, &ptr, errp); 783 } 784 785 /** 786 * qdev_class_add_legacy_property: 787 * @dev: Device to add the property to. 788 * @prop: The qdev property definition. 789 * 790 * Add a legacy QOM property to @dev for qdev property @prop. 791 * 792 * Legacy properties are string versions of QOM properties. The format of 793 * the string depends on the property type. Legacy properties are only 794 * needed for "info qtree". 795 * 796 * Do not use this in new code! QOM Properties added through this interface 797 * will be given names in the "legacy" namespace. 798 */ 799 static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop) 800 { 801 g_autofree char *name = NULL; 802 803 /* Register pointer properties as legacy properties */ 804 if (!prop->info->print && prop->info->get) { 805 return; 806 } 807 808 name = g_strdup_printf("legacy-%s", prop->name); 809 object_class_property_add(OBJECT_CLASS(dc), name, "str", 810 prop->info->print ? qdev_get_legacy_property : prop->info->get, 811 NULL, NULL, prop); 812 } 813 814 void qdev_property_add_static(DeviceState *dev, Property *prop) 815 { 816 Object *obj = OBJECT(dev); 817 ObjectProperty *op; 818 819 assert(!prop->info->create); 820 821 op = object_property_add(obj, prop->name, prop->info->name, 822 prop->info->get, prop->info->set, 823 prop->info->release, 824 prop); 825 826 object_property_set_description(obj, prop->name, 827 prop->info->description); 828 829 if (prop->set_default) { 830 prop->info->set_default_value(op, prop); 831 if (op->init) { 832 op->init(obj, op); 833 } 834 } 835 } 836 837 static void qdev_class_add_property(DeviceClass *klass, Property *prop) 838 { 839 ObjectClass *oc = OBJECT_CLASS(klass); 840 841 if (prop->info->create) { 842 prop->info->create(oc, prop); 843 } else { 844 ObjectProperty *op; 845 846 op = object_class_property_add(oc, 847 prop->name, prop->info->name, 848 prop->info->get, prop->info->set, 849 prop->info->release, 850 prop); 851 if (prop->set_default) { 852 prop->info->set_default_value(op, prop); 853 } 854 } 855 object_class_property_set_description(oc, prop->name, 856 prop->info->description); 857 } 858 859 /* @qdev_alias_all_properties - Add alias properties to the source object for 860 * all qdev properties on the target DeviceState. 861 */ 862 void qdev_alias_all_properties(DeviceState *target, Object *source) 863 { 864 ObjectClass *class; 865 Property *prop; 866 867 class = object_get_class(OBJECT(target)); 868 do { 869 DeviceClass *dc = DEVICE_CLASS(class); 870 871 for (prop = dc->props_; prop && prop->name; prop++) { 872 object_property_add_alias(source, prop->name, 873 OBJECT(target), prop->name); 874 } 875 class = object_class_get_parent(class); 876 } while (class != object_class_by_name(TYPE_DEVICE)); 877 } 878 879 static bool device_get_realized(Object *obj, Error **errp) 880 { 881 DeviceState *dev = DEVICE(obj); 882 return dev->realized; 883 } 884 885 static bool check_only_migratable(Object *obj, Error **errp) 886 { 887 DeviceClass *dc = DEVICE_GET_CLASS(obj); 888 889 if (!vmstate_check_only_migratable(dc->vmsd)) { 890 error_setg(errp, "Device %s is not migratable, but " 891 "--only-migratable was specified", 892 object_get_typename(obj)); 893 return false; 894 } 895 896 return true; 897 } 898 899 static void device_set_realized(Object *obj, bool value, Error **errp) 900 { 901 DeviceState *dev = DEVICE(obj); 902 DeviceClass *dc = DEVICE_GET_CLASS(dev); 903 HotplugHandler *hotplug_ctrl; 904 BusState *bus; 905 NamedClockList *ncl; 906 Error *local_err = NULL; 907 bool unattached_parent = false; 908 static int unattached_count; 909 910 if (dev->hotplugged && !dc->hotpluggable) { 911 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj)); 912 return; 913 } 914 915 if (value && !dev->realized) { 916 if (!check_only_migratable(obj, &local_err)) { 917 goto fail; 918 } 919 920 if (!obj->parent) { 921 gchar *name = g_strdup_printf("device[%d]", unattached_count++); 922 923 object_property_add_child(container_get(qdev_get_machine(), 924 "/unattached"), 925 name, obj); 926 unattached_parent = true; 927 g_free(name); 928 } 929 930 hotplug_ctrl = qdev_get_hotplug_handler(dev); 931 if (hotplug_ctrl) { 932 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err); 933 if (local_err != NULL) { 934 goto fail; 935 } 936 } 937 938 if (dc->realize) { 939 dc->realize(dev, &local_err); 940 if (local_err != NULL) { 941 goto fail; 942 } 943 } 944 945 DEVICE_LISTENER_CALL(realize, Forward, dev); 946 947 /* 948 * always free/re-initialize here since the value cannot be cleaned up 949 * in device_unrealize due to its usage later on in the unplug path 950 */ 951 g_free(dev->canonical_path); 952 dev->canonical_path = object_get_canonical_path(OBJECT(dev)); 953 QLIST_FOREACH(ncl, &dev->clocks, node) { 954 if (ncl->alias) { 955 continue; 956 } else { 957 clock_setup_canonical_path(ncl->clock); 958 } 959 } 960 961 if (qdev_get_vmsd(dev)) { 962 if (vmstate_register_with_alias_id(VMSTATE_IF(dev), 963 VMSTATE_INSTANCE_ID_ANY, 964 qdev_get_vmsd(dev), dev, 965 dev->instance_id_alias, 966 dev->alias_required_for_version, 967 &local_err) < 0) { 968 goto post_realize_fail; 969 } 970 } 971 972 /* 973 * Clear the reset state, in case the object was previously unrealized 974 * with a dirty state. 975 */ 976 resettable_state_clear(&dev->reset); 977 978 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 979 if (!qbus_realize(bus, errp)) { 980 goto child_realize_fail; 981 } 982 } 983 if (dev->hotplugged) { 984 /* 985 * Reset the device, as well as its subtree which, at this point, 986 * should be realized too. 987 */ 988 resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD); 989 resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus), 990 NULL); 991 resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD); 992 } 993 dev->pending_deleted_event = false; 994 995 if (hotplug_ctrl) { 996 hotplug_handler_plug(hotplug_ctrl, dev, &local_err); 997 if (local_err != NULL) { 998 goto child_realize_fail; 999 } 1000 } 1001 1002 } else if (!value && dev->realized) { 1003 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1004 qbus_unrealize(bus); 1005 } 1006 if (qdev_get_vmsd(dev)) { 1007 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 1008 } 1009 if (dc->unrealize) { 1010 dc->unrealize(dev); 1011 } 1012 dev->pending_deleted_event = true; 1013 DEVICE_LISTENER_CALL(unrealize, Reverse, dev); 1014 } 1015 1016 assert(local_err == NULL); 1017 dev->realized = value; 1018 return; 1019 1020 child_realize_fail: 1021 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1022 qbus_unrealize(bus); 1023 } 1024 1025 if (qdev_get_vmsd(dev)) { 1026 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 1027 } 1028 1029 post_realize_fail: 1030 g_free(dev->canonical_path); 1031 dev->canonical_path = NULL; 1032 if (dc->unrealize) { 1033 dc->unrealize(dev); 1034 } 1035 1036 fail: 1037 error_propagate(errp, local_err); 1038 if (unattached_parent) { 1039 /* 1040 * Beware, this doesn't just revert 1041 * object_property_add_child(), it also runs bus_remove()! 1042 */ 1043 object_unparent(OBJECT(dev)); 1044 unattached_count--; 1045 } 1046 } 1047 1048 static bool device_get_hotpluggable(Object *obj, Error **errp) 1049 { 1050 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1051 DeviceState *dev = DEVICE(obj); 1052 1053 return dc->hotpluggable && (dev->parent_bus == NULL || 1054 qbus_is_hotpluggable(dev->parent_bus)); 1055 } 1056 1057 static bool device_get_hotplugged(Object *obj, Error **errp) 1058 { 1059 DeviceState *dev = DEVICE(obj); 1060 1061 return dev->hotplugged; 1062 } 1063 1064 static void device_initfn(Object *obj) 1065 { 1066 DeviceState *dev = DEVICE(obj); 1067 1068 if (qdev_hotplug) { 1069 dev->hotplugged = 1; 1070 qdev_hot_added = true; 1071 } 1072 1073 dev->instance_id_alias = -1; 1074 dev->realized = false; 1075 dev->allow_unplug_during_migration = false; 1076 1077 QLIST_INIT(&dev->gpios); 1078 QLIST_INIT(&dev->clocks); 1079 } 1080 1081 static void device_post_init(Object *obj) 1082 { 1083 /* 1084 * Note: ordered so that the user's global properties take 1085 * precedence. 1086 */ 1087 object_apply_compat_props(obj); 1088 qdev_prop_set_globals(DEVICE(obj)); 1089 } 1090 1091 /* Unlink device from bus and free the structure. */ 1092 static void device_finalize(Object *obj) 1093 { 1094 NamedGPIOList *ngl, *next; 1095 1096 DeviceState *dev = DEVICE(obj); 1097 1098 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { 1099 QLIST_REMOVE(ngl, node); 1100 qemu_free_irqs(ngl->in, ngl->num_in); 1101 g_free(ngl->name); 1102 g_free(ngl); 1103 /* ngl->out irqs are owned by the other end and should not be freed 1104 * here 1105 */ 1106 } 1107 1108 qdev_finalize_clocklist(dev); 1109 1110 /* Only send event if the device had been completely realized */ 1111 if (dev->pending_deleted_event) { 1112 g_assert(dev->canonical_path); 1113 1114 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path); 1115 g_free(dev->canonical_path); 1116 dev->canonical_path = NULL; 1117 } 1118 1119 qemu_opts_del(dev->opts); 1120 } 1121 1122 static void device_class_base_init(ObjectClass *class, void *data) 1123 { 1124 DeviceClass *klass = DEVICE_CLASS(class); 1125 1126 /* We explicitly look up properties in the superclasses, 1127 * so do not propagate them to the subclasses. 1128 */ 1129 klass->props_ = NULL; 1130 } 1131 1132 static void device_unparent(Object *obj) 1133 { 1134 DeviceState *dev = DEVICE(obj); 1135 BusState *bus; 1136 1137 if (dev->realized) { 1138 qdev_unrealize(dev); 1139 } 1140 while (dev->num_child_bus) { 1141 bus = QLIST_FIRST(&dev->child_bus); 1142 object_unparent(OBJECT(bus)); 1143 } 1144 if (dev->parent_bus) { 1145 bus_remove_child(dev->parent_bus, dev); 1146 object_unref(OBJECT(dev->parent_bus)); 1147 dev->parent_bus = NULL; 1148 } 1149 } 1150 1151 static char * 1152 device_vmstate_if_get_id(VMStateIf *obj) 1153 { 1154 DeviceState *dev = DEVICE(obj); 1155 1156 return qdev_get_dev_path(dev); 1157 } 1158 1159 /** 1160 * device_phases_reset: 1161 * Transition reset method for devices to allow moving 1162 * smoothly from legacy reset method to multi-phases 1163 */ 1164 static void device_phases_reset(DeviceState *dev) 1165 { 1166 ResettableClass *rc = RESETTABLE_GET_CLASS(dev); 1167 1168 if (rc->phases.enter) { 1169 rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD); 1170 } 1171 if (rc->phases.hold) { 1172 rc->phases.hold(OBJECT(dev)); 1173 } 1174 if (rc->phases.exit) { 1175 rc->phases.exit(OBJECT(dev)); 1176 } 1177 } 1178 1179 static void device_transitional_reset(Object *obj) 1180 { 1181 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1182 1183 /* 1184 * This will call either @device_phases_reset (for multi-phases transitioned 1185 * devices) or a device's specific method for not-yet transitioned devices. 1186 * In both case, it does not reset children. 1187 */ 1188 if (dc->reset) { 1189 dc->reset(DEVICE(obj)); 1190 } 1191 } 1192 1193 /** 1194 * device_get_transitional_reset: 1195 * check if the device's class is ready for multi-phase 1196 */ 1197 static ResettableTrFunction device_get_transitional_reset(Object *obj) 1198 { 1199 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1200 if (dc->reset != device_phases_reset) { 1201 /* 1202 * dc->reset has been overridden by a subclass, 1203 * the device is not ready for multi phase yet. 1204 */ 1205 return device_transitional_reset; 1206 } 1207 return NULL; 1208 } 1209 1210 static void device_class_init(ObjectClass *class, void *data) 1211 { 1212 DeviceClass *dc = DEVICE_CLASS(class); 1213 VMStateIfClass *vc = VMSTATE_IF_CLASS(class); 1214 ResettableClass *rc = RESETTABLE_CLASS(class); 1215 1216 class->unparent = device_unparent; 1217 1218 /* by default all devices were considered as hotpluggable, 1219 * so with intent to check it in generic qdev_unplug() / 1220 * device_set_realized() functions make every device 1221 * hotpluggable. Devices that shouldn't be hotpluggable, 1222 * should override it in their class_init() 1223 */ 1224 dc->hotpluggable = true; 1225 dc->user_creatable = true; 1226 vc->get_id = device_vmstate_if_get_id; 1227 rc->get_state = device_get_reset_state; 1228 rc->child_foreach = device_reset_child_foreach; 1229 1230 /* 1231 * @device_phases_reset is put as the default reset method below, allowing 1232 * to do the multi-phase transition from base classes to leaf classes. It 1233 * allows a legacy-reset Device class to extend a multi-phases-reset 1234 * Device class for the following reason: 1235 * + If a base class B has been moved to multi-phase, then it does not 1236 * override this default reset method and may have defined phase methods. 1237 * + A child class C (extending class B) which uses 1238 * device_class_set_parent_reset() (or similar means) to override the 1239 * reset method will still work as expected. @device_phases_reset function 1240 * will be registered as the parent reset method and effectively call 1241 * parent reset phases. 1242 */ 1243 dc->reset = device_phases_reset; 1244 rc->get_transitional_function = device_get_transitional_reset; 1245 1246 object_class_property_add_bool(class, "realized", 1247 device_get_realized, device_set_realized); 1248 object_class_property_add_bool(class, "hotpluggable", 1249 device_get_hotpluggable, NULL); 1250 object_class_property_add_bool(class, "hotplugged", 1251 device_get_hotplugged, NULL); 1252 object_class_property_add_link(class, "parent_bus", TYPE_BUS, 1253 offsetof(DeviceState, parent_bus), NULL, 0); 1254 } 1255 1256 void device_class_set_props(DeviceClass *dc, Property *props) 1257 { 1258 Property *prop; 1259 1260 dc->props_ = props; 1261 for (prop = props; prop && prop->name; prop++) { 1262 qdev_class_add_legacy_property(dc, prop); 1263 qdev_class_add_property(dc, prop); 1264 } 1265 } 1266 1267 void device_class_set_parent_reset(DeviceClass *dc, 1268 DeviceReset dev_reset, 1269 DeviceReset *parent_reset) 1270 { 1271 *parent_reset = dc->reset; 1272 dc->reset = dev_reset; 1273 } 1274 1275 void device_class_set_parent_realize(DeviceClass *dc, 1276 DeviceRealize dev_realize, 1277 DeviceRealize *parent_realize) 1278 { 1279 *parent_realize = dc->realize; 1280 dc->realize = dev_realize; 1281 } 1282 1283 void device_class_set_parent_unrealize(DeviceClass *dc, 1284 DeviceUnrealize dev_unrealize, 1285 DeviceUnrealize *parent_unrealize) 1286 { 1287 *parent_unrealize = dc->unrealize; 1288 dc->unrealize = dev_unrealize; 1289 } 1290 1291 void device_legacy_reset(DeviceState *dev) 1292 { 1293 DeviceClass *klass = DEVICE_GET_CLASS(dev); 1294 1295 trace_qdev_reset(dev, object_get_typename(OBJECT(dev))); 1296 if (klass->reset) { 1297 klass->reset(dev); 1298 } 1299 } 1300 1301 Object *qdev_get_machine(void) 1302 { 1303 static Object *dev; 1304 1305 if (dev == NULL) { 1306 dev = container_get(object_get_root(), "/machine"); 1307 } 1308 1309 return dev; 1310 } 1311 1312 static const TypeInfo device_type_info = { 1313 .name = TYPE_DEVICE, 1314 .parent = TYPE_OBJECT, 1315 .instance_size = sizeof(DeviceState), 1316 .instance_init = device_initfn, 1317 .instance_post_init = device_post_init, 1318 .instance_finalize = device_finalize, 1319 .class_base_init = device_class_base_init, 1320 .class_init = device_class_init, 1321 .abstract = true, 1322 .class_size = sizeof(DeviceClass), 1323 .interfaces = (InterfaceInfo[]) { 1324 { TYPE_VMSTATE_IF }, 1325 { TYPE_RESETTABLE_INTERFACE }, 1326 { } 1327 } 1328 }; 1329 1330 static void qdev_register_types(void) 1331 { 1332 type_register_static(&device_type_info); 1333 } 1334 1335 type_init(qdev_register_types) 1336