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 * If @bus, plug @dev into @bus. This takes a reference to @dev. 412 * If @dev has no QOM parent, make one up, taking another reference. 413 * On success, return true. 414 * On failure, store an error through @errp and return false. 415 */ 416 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp) 417 { 418 Error *err = NULL; 419 420 assert(!dev->realized && !dev->parent_bus); 421 422 if (bus) { 423 qdev_set_parent_bus(dev, bus); 424 } else { 425 assert(!DEVICE_GET_CLASS(dev)->bus_type); 426 } 427 428 object_property_set_bool(OBJECT(dev), true, "realized", &err); 429 if (err) { 430 error_propagate(errp, err); 431 } 432 return !err; 433 } 434 435 /* 436 * Realize @dev and drop a reference. 437 * This is like qdev_realize(), except the caller must hold a 438 * (private) reference, which is dropped on return regardless of 439 * success or failure. Intended use: 440 * dev = qdev_new(); 441 * [...] 442 * qdev_realize_and_unref(dev, bus, errp); 443 * Now @dev can go away without further ado. 444 */ 445 bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp) 446 { 447 bool ret; 448 449 ret = qdev_realize(dev, bus, errp); 450 object_unref(OBJECT(dev)); 451 return ret; 452 } 453 454 void qdev_unrealize(DeviceState *dev) 455 { 456 object_property_set_bool(OBJECT(dev), false, "realized", &error_abort); 457 } 458 459 static int qdev_assert_realized_properly(Object *obj, void *opaque) 460 { 461 DeviceState *dev = DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); 462 DeviceClass *dc; 463 464 if (dev) { 465 dc = DEVICE_GET_CLASS(dev); 466 assert(dev->realized); 467 assert(dev->parent_bus || !dc->bus_type); 468 } 469 return 0; 470 } 471 472 void qdev_machine_creation_done(void) 473 { 474 /* 475 * ok, initial machine setup is done, starting from now we can 476 * only create hotpluggable devices 477 */ 478 qdev_hotplug = true; 479 480 object_child_foreach_recursive(object_get_root(), 481 qdev_assert_realized_properly, NULL); 482 } 483 484 bool qdev_machine_modified(void) 485 { 486 return qdev_hot_added || qdev_hot_removed; 487 } 488 489 BusState *qdev_get_parent_bus(DeviceState *dev) 490 { 491 return dev->parent_bus; 492 } 493 494 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev, 495 const char *name) 496 { 497 NamedGPIOList *ngl; 498 499 QLIST_FOREACH(ngl, &dev->gpios, node) { 500 /* NULL is a valid and matchable name. */ 501 if (g_strcmp0(name, ngl->name) == 0) { 502 return ngl; 503 } 504 } 505 506 ngl = g_malloc0(sizeof(*ngl)); 507 ngl->name = g_strdup(name); 508 QLIST_INSERT_HEAD(&dev->gpios, ngl, node); 509 return ngl; 510 } 511 512 void qdev_init_gpio_in_named_with_opaque(DeviceState *dev, 513 qemu_irq_handler handler, 514 void *opaque, 515 const char *name, int n) 516 { 517 int i; 518 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 519 520 assert(gpio_list->num_out == 0 || !name); 521 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler, 522 opaque, n); 523 524 if (!name) { 525 name = "unnamed-gpio-in"; 526 } 527 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) { 528 gchar *propname = g_strdup_printf("%s[%u]", name, i); 529 530 object_property_add_child(OBJECT(dev), propname, 531 OBJECT(gpio_list->in[i])); 532 g_free(propname); 533 } 534 535 gpio_list->num_in += n; 536 } 537 538 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) 539 { 540 qdev_init_gpio_in_named(dev, handler, NULL, n); 541 } 542 543 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, 544 const char *name, int n) 545 { 546 int i; 547 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 548 549 assert(gpio_list->num_in == 0 || !name); 550 551 if (!name) { 552 name = "unnamed-gpio-out"; 553 } 554 memset(pins, 0, sizeof(*pins) * n); 555 for (i = 0; i < n; ++i) { 556 gchar *propname = g_strdup_printf("%s[%u]", name, 557 gpio_list->num_out + i); 558 559 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, 560 (Object **)&pins[i], 561 object_property_allow_set_link, 562 OBJ_PROP_LINK_STRONG); 563 g_free(propname); 564 } 565 gpio_list->num_out += n; 566 } 567 568 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) 569 { 570 qdev_init_gpio_out_named(dev, pins, NULL, n); 571 } 572 573 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) 574 { 575 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 576 577 assert(n >= 0 && n < gpio_list->num_in); 578 return gpio_list->in[n]; 579 } 580 581 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) 582 { 583 return qdev_get_gpio_in_named(dev, NULL, n); 584 } 585 586 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, 587 qemu_irq pin) 588 { 589 char *propname = g_strdup_printf("%s[%d]", 590 name ? name : "unnamed-gpio-out", n); 591 if (pin && !OBJECT(pin)->parent) { 592 /* We need a name for object_property_set_link to work */ 593 object_property_add_child(container_get(qdev_get_machine(), 594 "/unattached"), 595 "non-qdev-gpio[*]", OBJECT(pin)); 596 } 597 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort); 598 g_free(propname); 599 } 600 601 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n) 602 { 603 g_autofree char *propname = g_strdup_printf("%s[%d]", 604 name ? name : "unnamed-gpio-out", n); 605 606 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 607 NULL); 608 609 return ret; 610 } 611 612 /* disconnect a GPIO output, returning the disconnected input (if any) */ 613 614 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, 615 const char *name, int n) 616 { 617 char *propname = g_strdup_printf("%s[%d]", 618 name ? name : "unnamed-gpio-out", n); 619 620 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 621 NULL); 622 if (ret) { 623 object_property_set_link(OBJECT(dev), NULL, propname, NULL); 624 } 625 g_free(propname); 626 return ret; 627 } 628 629 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, 630 const char *name, int n) 631 { 632 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n); 633 qdev_connect_gpio_out_named(dev, name, n, icpt); 634 return disconnected; 635 } 636 637 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) 638 { 639 qdev_connect_gpio_out_named(dev, NULL, n, pin); 640 } 641 642 void qdev_pass_gpios(DeviceState *dev, DeviceState *container, 643 const char *name) 644 { 645 int i; 646 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name); 647 648 for (i = 0; i < ngl->num_in; i++) { 649 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in"; 650 char *propname = g_strdup_printf("%s[%d]", nm, i); 651 652 object_property_add_alias(OBJECT(container), propname, 653 OBJECT(dev), propname); 654 g_free(propname); 655 } 656 for (i = 0; i < ngl->num_out; i++) { 657 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out"; 658 char *propname = g_strdup_printf("%s[%d]", nm, i); 659 660 object_property_add_alias(OBJECT(container), propname, 661 OBJECT(dev), propname); 662 g_free(propname); 663 } 664 QLIST_REMOVE(ngl, node); 665 QLIST_INSERT_HEAD(&container->gpios, ngl, node); 666 } 667 668 BusState *qdev_get_child_bus(DeviceState *dev, const char *name) 669 { 670 BusState *bus; 671 Object *child = object_resolve_path_component(OBJECT(dev), name); 672 673 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS); 674 if (bus) { 675 return bus; 676 } 677 678 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 679 if (strcmp(name, bus->name) == 0) { 680 return bus; 681 } 682 } 683 return NULL; 684 } 685 686 int qdev_walk_children(DeviceState *dev, 687 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 688 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 689 void *opaque) 690 { 691 BusState *bus; 692 int err; 693 694 if (pre_devfn) { 695 err = pre_devfn(dev, opaque); 696 if (err) { 697 return err; 698 } 699 } 700 701 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 702 err = qbus_walk_children(bus, pre_devfn, pre_busfn, 703 post_devfn, post_busfn, opaque); 704 if (err < 0) { 705 return err; 706 } 707 } 708 709 if (post_devfn) { 710 err = post_devfn(dev, opaque); 711 if (err) { 712 return err; 713 } 714 } 715 716 return 0; 717 } 718 719 DeviceState *qdev_find_recursive(BusState *bus, const char *id) 720 { 721 BusChild *kid; 722 DeviceState *ret; 723 BusState *child; 724 725 QTAILQ_FOREACH(kid, &bus->children, sibling) { 726 DeviceState *dev = kid->child; 727 728 if (dev->id && strcmp(dev->id, id) == 0) { 729 return dev; 730 } 731 732 QLIST_FOREACH(child, &dev->child_bus, sibling) { 733 ret = qdev_find_recursive(child, id); 734 if (ret) { 735 return ret; 736 } 737 } 738 } 739 return NULL; 740 } 741 742 char *qdev_get_dev_path(DeviceState *dev) 743 { 744 BusClass *bc; 745 746 if (!dev || !dev->parent_bus) { 747 return NULL; 748 } 749 750 bc = BUS_GET_CLASS(dev->parent_bus); 751 if (bc->get_dev_path) { 752 return bc->get_dev_path(dev); 753 } 754 755 return NULL; 756 } 757 758 /** 759 * Legacy property handling 760 */ 761 762 static void qdev_get_legacy_property(Object *obj, Visitor *v, 763 const char *name, void *opaque, 764 Error **errp) 765 { 766 DeviceState *dev = DEVICE(obj); 767 Property *prop = opaque; 768 769 char buffer[1024]; 770 char *ptr = buffer; 771 772 prop->info->print(dev, prop, buffer, sizeof(buffer)); 773 visit_type_str(v, name, &ptr, errp); 774 } 775 776 /** 777 * qdev_class_add_legacy_property: 778 * @dev: Device to add the property to. 779 * @prop: The qdev property definition. 780 * 781 * Add a legacy QOM property to @dev for qdev property @prop. 782 * 783 * Legacy properties are string versions of QOM properties. The format of 784 * the string depends on the property type. Legacy properties are only 785 * needed for "info qtree". 786 * 787 * Do not use this in new code! QOM Properties added through this interface 788 * will be given names in the "legacy" namespace. 789 */ 790 static void qdev_class_add_legacy_property(DeviceClass *dc, Property *prop) 791 { 792 g_autofree char *name = NULL; 793 794 /* Register pointer properties as legacy properties */ 795 if (!prop->info->print && prop->info->get) { 796 return; 797 } 798 799 name = g_strdup_printf("legacy-%s", prop->name); 800 object_class_property_add(OBJECT_CLASS(dc), name, "str", 801 prop->info->print ? qdev_get_legacy_property : prop->info->get, 802 NULL, NULL, prop); 803 } 804 805 void qdev_property_add_static(DeviceState *dev, Property *prop) 806 { 807 Object *obj = OBJECT(dev); 808 ObjectProperty *op; 809 810 assert(!prop->info->create); 811 812 op = object_property_add(obj, prop->name, prop->info->name, 813 prop->info->get, prop->info->set, 814 prop->info->release, 815 prop); 816 817 object_property_set_description(obj, prop->name, 818 prop->info->description); 819 820 if (prop->set_default) { 821 prop->info->set_default_value(op, prop); 822 if (op->init) { 823 op->init(obj, op); 824 } 825 } 826 } 827 828 static void qdev_class_add_property(DeviceClass *klass, Property *prop) 829 { 830 ObjectClass *oc = OBJECT_CLASS(klass); 831 832 if (prop->info->create) { 833 prop->info->create(oc, prop); 834 } else { 835 ObjectProperty *op; 836 837 op = object_class_property_add(oc, 838 prop->name, prop->info->name, 839 prop->info->get, prop->info->set, 840 prop->info->release, 841 prop); 842 if (prop->set_default) { 843 prop->info->set_default_value(op, prop); 844 } 845 } 846 object_class_property_set_description(oc, prop->name, 847 prop->info->description); 848 } 849 850 /* @qdev_alias_all_properties - Add alias properties to the source object for 851 * all qdev properties on the target DeviceState. 852 */ 853 void qdev_alias_all_properties(DeviceState *target, Object *source) 854 { 855 ObjectClass *class; 856 Property *prop; 857 858 class = object_get_class(OBJECT(target)); 859 do { 860 DeviceClass *dc = DEVICE_CLASS(class); 861 862 for (prop = dc->props_; prop && prop->name; prop++) { 863 object_property_add_alias(source, prop->name, 864 OBJECT(target), prop->name); 865 } 866 class = object_class_get_parent(class); 867 } while (class != object_class_by_name(TYPE_DEVICE)); 868 } 869 870 static bool device_get_realized(Object *obj, Error **errp) 871 { 872 DeviceState *dev = DEVICE(obj); 873 return dev->realized; 874 } 875 876 static bool check_only_migratable(Object *obj, Error **errp) 877 { 878 DeviceClass *dc = DEVICE_GET_CLASS(obj); 879 880 if (!vmstate_check_only_migratable(dc->vmsd)) { 881 error_setg(errp, "Device %s is not migratable, but " 882 "--only-migratable was specified", 883 object_get_typename(obj)); 884 return false; 885 } 886 887 return true; 888 } 889 890 static void device_set_realized(Object *obj, bool value, Error **errp) 891 { 892 DeviceState *dev = DEVICE(obj); 893 DeviceClass *dc = DEVICE_GET_CLASS(dev); 894 HotplugHandler *hotplug_ctrl; 895 BusState *bus; 896 NamedClockList *ncl; 897 Error *local_err = NULL; 898 bool unattached_parent = false; 899 static int unattached_count; 900 901 if (dev->hotplugged && !dc->hotpluggable) { 902 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj)); 903 return; 904 } 905 906 if (value && !dev->realized) { 907 if (!check_only_migratable(obj, &local_err)) { 908 goto fail; 909 } 910 911 if (!obj->parent) { 912 gchar *name = g_strdup_printf("device[%d]", unattached_count++); 913 914 object_property_add_child(container_get(qdev_get_machine(), 915 "/unattached"), 916 name, obj); 917 unattached_parent = true; 918 g_free(name); 919 } 920 921 hotplug_ctrl = qdev_get_hotplug_handler(dev); 922 if (hotplug_ctrl) { 923 hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err); 924 if (local_err != NULL) { 925 goto fail; 926 } 927 } 928 929 if (dc->realize) { 930 dc->realize(dev, &local_err); 931 if (local_err != NULL) { 932 goto fail; 933 } 934 } 935 936 DEVICE_LISTENER_CALL(realize, Forward, dev); 937 938 /* 939 * always free/re-initialize here since the value cannot be cleaned up 940 * in device_unrealize due to its usage later on in the unplug path 941 */ 942 g_free(dev->canonical_path); 943 dev->canonical_path = object_get_canonical_path(OBJECT(dev)); 944 QLIST_FOREACH(ncl, &dev->clocks, node) { 945 if (ncl->alias) { 946 continue; 947 } else { 948 clock_setup_canonical_path(ncl->clock); 949 } 950 } 951 952 if (qdev_get_vmsd(dev)) { 953 if (vmstate_register_with_alias_id(VMSTATE_IF(dev), 954 VMSTATE_INSTANCE_ID_ANY, 955 qdev_get_vmsd(dev), dev, 956 dev->instance_id_alias, 957 dev->alias_required_for_version, 958 &local_err) < 0) { 959 goto post_realize_fail; 960 } 961 } 962 963 /* 964 * Clear the reset state, in case the object was previously unrealized 965 * with a dirty state. 966 */ 967 resettable_state_clear(&dev->reset); 968 969 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 970 if (!qbus_realize(bus, errp)) { 971 goto child_realize_fail; 972 } 973 } 974 if (dev->hotplugged) { 975 /* 976 * Reset the device, as well as its subtree which, at this point, 977 * should be realized too. 978 */ 979 resettable_assert_reset(OBJECT(dev), RESET_TYPE_COLD); 980 resettable_change_parent(OBJECT(dev), OBJECT(dev->parent_bus), 981 NULL); 982 resettable_release_reset(OBJECT(dev), RESET_TYPE_COLD); 983 } 984 dev->pending_deleted_event = false; 985 986 if (hotplug_ctrl) { 987 hotplug_handler_plug(hotplug_ctrl, dev, &local_err); 988 if (local_err != NULL) { 989 goto child_realize_fail; 990 } 991 } 992 993 } else if (!value && dev->realized) { 994 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 995 qbus_unrealize(bus); 996 } 997 if (qdev_get_vmsd(dev)) { 998 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 999 } 1000 if (dc->unrealize) { 1001 dc->unrealize(dev); 1002 } 1003 dev->pending_deleted_event = true; 1004 DEVICE_LISTENER_CALL(unrealize, Reverse, dev); 1005 } 1006 1007 assert(local_err == NULL); 1008 dev->realized = value; 1009 return; 1010 1011 child_realize_fail: 1012 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1013 qbus_unrealize(bus); 1014 } 1015 1016 if (qdev_get_vmsd(dev)) { 1017 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 1018 } 1019 1020 post_realize_fail: 1021 g_free(dev->canonical_path); 1022 dev->canonical_path = NULL; 1023 if (dc->unrealize) { 1024 dc->unrealize(dev); 1025 } 1026 1027 fail: 1028 error_propagate(errp, local_err); 1029 if (unattached_parent) { 1030 /* 1031 * Beware, this doesn't just revert 1032 * object_property_add_child(), it also runs bus_remove()! 1033 */ 1034 object_unparent(OBJECT(dev)); 1035 unattached_count--; 1036 } 1037 } 1038 1039 static bool device_get_hotpluggable(Object *obj, Error **errp) 1040 { 1041 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1042 DeviceState *dev = DEVICE(obj); 1043 1044 return dc->hotpluggable && (dev->parent_bus == NULL || 1045 qbus_is_hotpluggable(dev->parent_bus)); 1046 } 1047 1048 static bool device_get_hotplugged(Object *obj, Error **errp) 1049 { 1050 DeviceState *dev = DEVICE(obj); 1051 1052 return dev->hotplugged; 1053 } 1054 1055 static void device_initfn(Object *obj) 1056 { 1057 DeviceState *dev = DEVICE(obj); 1058 1059 if (qdev_hotplug) { 1060 dev->hotplugged = 1; 1061 qdev_hot_added = true; 1062 } 1063 1064 dev->instance_id_alias = -1; 1065 dev->realized = false; 1066 dev->allow_unplug_during_migration = false; 1067 1068 QLIST_INIT(&dev->gpios); 1069 QLIST_INIT(&dev->clocks); 1070 } 1071 1072 static void device_post_init(Object *obj) 1073 { 1074 /* 1075 * Note: ordered so that the user's global properties take 1076 * precedence. 1077 */ 1078 object_apply_compat_props(obj); 1079 qdev_prop_set_globals(DEVICE(obj)); 1080 } 1081 1082 /* Unlink device from bus and free the structure. */ 1083 static void device_finalize(Object *obj) 1084 { 1085 NamedGPIOList *ngl, *next; 1086 1087 DeviceState *dev = DEVICE(obj); 1088 1089 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { 1090 QLIST_REMOVE(ngl, node); 1091 qemu_free_irqs(ngl->in, ngl->num_in); 1092 g_free(ngl->name); 1093 g_free(ngl); 1094 /* ngl->out irqs are owned by the other end and should not be freed 1095 * here 1096 */ 1097 } 1098 1099 qdev_finalize_clocklist(dev); 1100 1101 /* Only send event if the device had been completely realized */ 1102 if (dev->pending_deleted_event) { 1103 g_assert(dev->canonical_path); 1104 1105 qapi_event_send_device_deleted(!!dev->id, dev->id, dev->canonical_path); 1106 g_free(dev->canonical_path); 1107 dev->canonical_path = NULL; 1108 } 1109 1110 qemu_opts_del(dev->opts); 1111 } 1112 1113 static void device_class_base_init(ObjectClass *class, void *data) 1114 { 1115 DeviceClass *klass = DEVICE_CLASS(class); 1116 1117 /* We explicitly look up properties in the superclasses, 1118 * so do not propagate them to the subclasses. 1119 */ 1120 klass->props_ = NULL; 1121 } 1122 1123 static void device_unparent(Object *obj) 1124 { 1125 DeviceState *dev = DEVICE(obj); 1126 BusState *bus; 1127 1128 if (dev->realized) { 1129 qdev_unrealize(dev); 1130 } 1131 while (dev->num_child_bus) { 1132 bus = QLIST_FIRST(&dev->child_bus); 1133 object_unparent(OBJECT(bus)); 1134 } 1135 if (dev->parent_bus) { 1136 bus_remove_child(dev->parent_bus, dev); 1137 object_unref(OBJECT(dev->parent_bus)); 1138 dev->parent_bus = NULL; 1139 } 1140 } 1141 1142 static char * 1143 device_vmstate_if_get_id(VMStateIf *obj) 1144 { 1145 DeviceState *dev = DEVICE(obj); 1146 1147 return qdev_get_dev_path(dev); 1148 } 1149 1150 /** 1151 * device_phases_reset: 1152 * Transition reset method for devices to allow moving 1153 * smoothly from legacy reset method to multi-phases 1154 */ 1155 static void device_phases_reset(DeviceState *dev) 1156 { 1157 ResettableClass *rc = RESETTABLE_GET_CLASS(dev); 1158 1159 if (rc->phases.enter) { 1160 rc->phases.enter(OBJECT(dev), RESET_TYPE_COLD); 1161 } 1162 if (rc->phases.hold) { 1163 rc->phases.hold(OBJECT(dev)); 1164 } 1165 if (rc->phases.exit) { 1166 rc->phases.exit(OBJECT(dev)); 1167 } 1168 } 1169 1170 static void device_transitional_reset(Object *obj) 1171 { 1172 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1173 1174 /* 1175 * This will call either @device_phases_reset (for multi-phases transitioned 1176 * devices) or a device's specific method for not-yet transitioned devices. 1177 * In both case, it does not reset children. 1178 */ 1179 if (dc->reset) { 1180 dc->reset(DEVICE(obj)); 1181 } 1182 } 1183 1184 /** 1185 * device_get_transitional_reset: 1186 * check if the device's class is ready for multi-phase 1187 */ 1188 static ResettableTrFunction device_get_transitional_reset(Object *obj) 1189 { 1190 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1191 if (dc->reset != device_phases_reset) { 1192 /* 1193 * dc->reset has been overridden by a subclass, 1194 * the device is not ready for multi phase yet. 1195 */ 1196 return device_transitional_reset; 1197 } 1198 return NULL; 1199 } 1200 1201 static void device_class_init(ObjectClass *class, void *data) 1202 { 1203 DeviceClass *dc = DEVICE_CLASS(class); 1204 VMStateIfClass *vc = VMSTATE_IF_CLASS(class); 1205 ResettableClass *rc = RESETTABLE_CLASS(class); 1206 1207 class->unparent = device_unparent; 1208 1209 /* by default all devices were considered as hotpluggable, 1210 * so with intent to check it in generic qdev_unplug() / 1211 * device_set_realized() functions make every device 1212 * hotpluggable. Devices that shouldn't be hotpluggable, 1213 * should override it in their class_init() 1214 */ 1215 dc->hotpluggable = true; 1216 dc->user_creatable = true; 1217 vc->get_id = device_vmstate_if_get_id; 1218 rc->get_state = device_get_reset_state; 1219 rc->child_foreach = device_reset_child_foreach; 1220 1221 /* 1222 * @device_phases_reset is put as the default reset method below, allowing 1223 * to do the multi-phase transition from base classes to leaf classes. It 1224 * allows a legacy-reset Device class to extend a multi-phases-reset 1225 * Device class for the following reason: 1226 * + If a base class B has been moved to multi-phase, then it does not 1227 * override this default reset method and may have defined phase methods. 1228 * + A child class C (extending class B) which uses 1229 * device_class_set_parent_reset() (or similar means) to override the 1230 * reset method will still work as expected. @device_phases_reset function 1231 * will be registered as the parent reset method and effectively call 1232 * parent reset phases. 1233 */ 1234 dc->reset = device_phases_reset; 1235 rc->get_transitional_function = device_get_transitional_reset; 1236 1237 object_class_property_add_bool(class, "realized", 1238 device_get_realized, device_set_realized); 1239 object_class_property_add_bool(class, "hotpluggable", 1240 device_get_hotpluggable, NULL); 1241 object_class_property_add_bool(class, "hotplugged", 1242 device_get_hotplugged, NULL); 1243 object_class_property_add_link(class, "parent_bus", TYPE_BUS, 1244 offsetof(DeviceState, parent_bus), NULL, 0); 1245 } 1246 1247 void device_class_set_props(DeviceClass *dc, Property *props) 1248 { 1249 Property *prop; 1250 1251 dc->props_ = props; 1252 for (prop = props; prop && prop->name; prop++) { 1253 qdev_class_add_legacy_property(dc, prop); 1254 qdev_class_add_property(dc, prop); 1255 } 1256 } 1257 1258 void device_class_set_parent_reset(DeviceClass *dc, 1259 DeviceReset dev_reset, 1260 DeviceReset *parent_reset) 1261 { 1262 *parent_reset = dc->reset; 1263 dc->reset = dev_reset; 1264 } 1265 1266 void device_class_set_parent_realize(DeviceClass *dc, 1267 DeviceRealize dev_realize, 1268 DeviceRealize *parent_realize) 1269 { 1270 *parent_realize = dc->realize; 1271 dc->realize = dev_realize; 1272 } 1273 1274 void device_class_set_parent_unrealize(DeviceClass *dc, 1275 DeviceUnrealize dev_unrealize, 1276 DeviceUnrealize *parent_unrealize) 1277 { 1278 *parent_unrealize = dc->unrealize; 1279 dc->unrealize = dev_unrealize; 1280 } 1281 1282 void device_legacy_reset(DeviceState *dev) 1283 { 1284 DeviceClass *klass = DEVICE_GET_CLASS(dev); 1285 1286 trace_qdev_reset(dev, object_get_typename(OBJECT(dev))); 1287 if (klass->reset) { 1288 klass->reset(dev); 1289 } 1290 } 1291 1292 Object *qdev_get_machine(void) 1293 { 1294 static Object *dev; 1295 1296 if (dev == NULL) { 1297 dev = container_get(object_get_root(), "/machine"); 1298 } 1299 1300 return dev; 1301 } 1302 1303 static const TypeInfo device_type_info = { 1304 .name = TYPE_DEVICE, 1305 .parent = TYPE_OBJECT, 1306 .instance_size = sizeof(DeviceState), 1307 .instance_init = device_initfn, 1308 .instance_post_init = device_post_init, 1309 .instance_finalize = device_finalize, 1310 .class_base_init = device_class_base_init, 1311 .class_init = device_class_init, 1312 .abstract = true, 1313 .class_size = sizeof(DeviceClass), 1314 .interfaces = (InterfaceInfo[]) { 1315 { TYPE_VMSTATE_IF }, 1316 { TYPE_RESETTABLE_INTERFACE }, 1317 { } 1318 } 1319 }; 1320 1321 static void qdev_register_types(void) 1322 { 1323 type_register_static(&device_type_info); 1324 } 1325 1326 type_init(qdev_register_types) 1327