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