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