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