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 "hw/qdev.h" 29 #include "hw/fw-path-provider.h" 30 #include "sysemu/sysemu.h" 31 #include "qapi/error.h" 32 #include "qapi/qmp/qerror.h" 33 #include "qapi/visitor.h" 34 #include "qapi/qmp/qjson.h" 35 #include "qemu/error-report.h" 36 #include "hw/hotplug.h" 37 #include "hw/boards.h" 38 #include "qapi-event.h" 39 40 int qdev_hotplug = 0; 41 static bool qdev_hot_added = false; 42 static bool qdev_hot_removed = false; 43 44 const VMStateDescription *qdev_get_vmsd(DeviceState *dev) 45 { 46 DeviceClass *dc = DEVICE_GET_CLASS(dev); 47 return dc->vmsd; 48 } 49 50 const char *qdev_fw_name(DeviceState *dev) 51 { 52 DeviceClass *dc = DEVICE_GET_CLASS(dev); 53 54 if (dc->fw_name) { 55 return dc->fw_name; 56 } 57 58 return object_get_typename(OBJECT(dev)); 59 } 60 61 static void qdev_property_add_legacy(DeviceState *dev, Property *prop, 62 Error **errp); 63 64 static void bus_remove_child(BusState *bus, DeviceState *child) 65 { 66 BusChild *kid; 67 68 QTAILQ_FOREACH(kid, &bus->children, sibling) { 69 if (kid->child == child) { 70 char name[32]; 71 72 snprintf(name, sizeof(name), "child[%d]", kid->index); 73 QTAILQ_REMOVE(&bus->children, kid, sibling); 74 75 /* This gives back ownership of kid->child back to us. */ 76 object_property_del(OBJECT(bus), name, NULL); 77 object_unref(OBJECT(kid->child)); 78 g_free(kid); 79 return; 80 } 81 } 82 } 83 84 static void bus_add_child(BusState *bus, DeviceState *child) 85 { 86 char name[32]; 87 BusChild *kid = g_malloc0(sizeof(*kid)); 88 89 kid->index = bus->max_index++; 90 kid->child = child; 91 object_ref(OBJECT(kid->child)); 92 93 QTAILQ_INSERT_HEAD(&bus->children, kid, sibling); 94 95 /* This transfers ownership of kid->child to the property. */ 96 snprintf(name, sizeof(name), "child[%d]", kid->index); 97 object_property_add_link(OBJECT(bus), name, 98 object_get_typename(OBJECT(child)), 99 (Object **)&kid->child, 100 NULL, /* read-only property */ 101 0, /* return ownership on prop deletion */ 102 NULL); 103 } 104 105 void qdev_set_parent_bus(DeviceState *dev, BusState *bus) 106 { 107 dev->parent_bus = bus; 108 object_ref(OBJECT(bus)); 109 bus_add_child(bus, dev); 110 } 111 112 static void qbus_set_hotplug_handler_internal(BusState *bus, Object *handler, 113 Error **errp) 114 { 115 116 object_property_set_link(OBJECT(bus), OBJECT(handler), 117 QDEV_HOTPLUG_HANDLER_PROPERTY, errp); 118 } 119 120 void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, Error **errp) 121 { 122 qbus_set_hotplug_handler_internal(bus, OBJECT(handler), errp); 123 } 124 125 void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp) 126 { 127 qbus_set_hotplug_handler_internal(bus, OBJECT(bus), errp); 128 } 129 130 /* Create a new device. This only initializes the device state 131 structure and allows properties to be set. The device still needs 132 to be realized. See qdev-core.h. */ 133 DeviceState *qdev_create(BusState *bus, const char *name) 134 { 135 DeviceState *dev; 136 137 dev = qdev_try_create(bus, name); 138 if (!dev) { 139 if (bus) { 140 error_report("Unknown device '%s' for bus '%s'", name, 141 object_get_typename(OBJECT(bus))); 142 } else { 143 error_report("Unknown device '%s' for default sysbus", name); 144 } 145 abort(); 146 } 147 148 return dev; 149 } 150 151 DeviceState *qdev_try_create(BusState *bus, const char *type) 152 { 153 DeviceState *dev; 154 155 if (object_class_by_name(type) == NULL) { 156 return NULL; 157 } 158 dev = DEVICE(object_new(type)); 159 if (!dev) { 160 return NULL; 161 } 162 163 if (!bus) { 164 bus = sysbus_get_default(); 165 } 166 167 qdev_set_parent_bus(dev, bus); 168 object_unref(OBJECT(dev)); 169 return dev; 170 } 171 172 static QTAILQ_HEAD(device_listeners, DeviceListener) device_listeners 173 = QTAILQ_HEAD_INITIALIZER(device_listeners); 174 175 enum ListenerDirection { Forward, Reverse }; 176 177 #define DEVICE_LISTENER_CALL(_callback, _direction, _args...) \ 178 do { \ 179 DeviceListener *_listener; \ 180 \ 181 switch (_direction) { \ 182 case Forward: \ 183 QTAILQ_FOREACH(_listener, &device_listeners, link) { \ 184 if (_listener->_callback) { \ 185 _listener->_callback(_listener, ##_args); \ 186 } \ 187 } \ 188 break; \ 189 case Reverse: \ 190 QTAILQ_FOREACH_REVERSE(_listener, &device_listeners, \ 191 device_listeners, link) { \ 192 if (_listener->_callback) { \ 193 _listener->_callback(_listener, ##_args); \ 194 } \ 195 } \ 196 break; \ 197 default: \ 198 abort(); \ 199 } \ 200 } while (0) 201 202 static int device_listener_add(DeviceState *dev, void *opaque) 203 { 204 DEVICE_LISTENER_CALL(realize, Forward, dev); 205 206 return 0; 207 } 208 209 void device_listener_register(DeviceListener *listener) 210 { 211 QTAILQ_INSERT_TAIL(&device_listeners, listener, link); 212 213 qbus_walk_children(sysbus_get_default(), NULL, NULL, device_listener_add, 214 NULL, NULL); 215 } 216 217 void device_listener_unregister(DeviceListener *listener) 218 { 219 QTAILQ_REMOVE(&device_listeners, listener, link); 220 } 221 222 static void device_realize(DeviceState *dev, Error **errp) 223 { 224 DeviceClass *dc = DEVICE_GET_CLASS(dev); 225 226 if (dc->init) { 227 int rc = dc->init(dev); 228 if (rc < 0) { 229 error_setg(errp, "Device initialization failed."); 230 return; 231 } 232 } 233 } 234 235 static void device_unrealize(DeviceState *dev, Error **errp) 236 { 237 DeviceClass *dc = DEVICE_GET_CLASS(dev); 238 239 if (dc->exit) { 240 int rc = dc->exit(dev); 241 if (rc < 0) { 242 error_setg(errp, "Device exit failed."); 243 return; 244 } 245 } 246 } 247 248 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, 249 int required_for_version) 250 { 251 assert(!dev->realized); 252 dev->instance_id_alias = alias_id; 253 dev->alias_required_for_version = required_for_version; 254 } 255 256 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev) 257 { 258 HotplugHandler *hotplug_ctrl = NULL; 259 260 if (dev->parent_bus && dev->parent_bus->hotplug_handler) { 261 hotplug_ctrl = dev->parent_bus->hotplug_handler; 262 } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) { 263 MachineState *machine = MACHINE(qdev_get_machine()); 264 MachineClass *mc = MACHINE_GET_CLASS(machine); 265 266 if (mc->get_hotplug_handler) { 267 hotplug_ctrl = mc->get_hotplug_handler(machine, dev); 268 } 269 } 270 return hotplug_ctrl; 271 } 272 273 void qdev_unplug(DeviceState *dev, Error **errp) 274 { 275 DeviceClass *dc = DEVICE_GET_CLASS(dev); 276 HotplugHandler *hotplug_ctrl; 277 HotplugHandlerClass *hdc; 278 279 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) { 280 error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name); 281 return; 282 } 283 284 if (!dc->hotpluggable) { 285 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, 286 object_get_typename(OBJECT(dev))); 287 return; 288 } 289 290 qdev_hot_removed = true; 291 292 hotplug_ctrl = qdev_get_hotplug_handler(dev); 293 /* hotpluggable device MUST have HotplugHandler, if it doesn't 294 * then something is very wrong with it */ 295 g_assert(hotplug_ctrl); 296 297 /* If device supports async unplug just request it to be done, 298 * otherwise just remove it synchronously */ 299 hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl); 300 if (hdc->unplug_request) { 301 hotplug_handler_unplug_request(hotplug_ctrl, dev, errp); 302 } else { 303 hotplug_handler_unplug(hotplug_ctrl, dev, errp); 304 } 305 } 306 307 static int qdev_reset_one(DeviceState *dev, void *opaque) 308 { 309 device_reset(dev); 310 311 return 0; 312 } 313 314 static int qbus_reset_one(BusState *bus, void *opaque) 315 { 316 BusClass *bc = BUS_GET_CLASS(bus); 317 if (bc->reset) { 318 bc->reset(bus); 319 } 320 return 0; 321 } 322 323 void qdev_reset_all(DeviceState *dev) 324 { 325 qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 326 } 327 328 void qdev_reset_all_fn(void *opaque) 329 { 330 qdev_reset_all(DEVICE(opaque)); 331 } 332 333 void qbus_reset_all(BusState *bus) 334 { 335 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 336 } 337 338 void qbus_reset_all_fn(void *opaque) 339 { 340 BusState *bus = opaque; 341 qbus_reset_all(bus); 342 } 343 344 /* can be used as ->unplug() callback for the simple cases */ 345 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, 346 DeviceState *dev, Error **errp) 347 { 348 /* just zap it */ 349 object_unparent(OBJECT(dev)); 350 } 351 352 /* 353 * Realize @dev. 354 * Device properties should be set before calling this function. IRQs 355 * and MMIO regions should be connected/mapped after calling this 356 * function. 357 * On failure, report an error with error_report() and terminate the 358 * program. This is okay during machine creation. Don't use for 359 * hotplug, because there callers need to recover from failure. 360 * Exception: if you know the device's init() callback can't fail, 361 * then qdev_init_nofail() can't fail either, and is therefore usable 362 * even then. But relying on the device implementation that way is 363 * somewhat unclean, and best avoided. 364 */ 365 void qdev_init_nofail(DeviceState *dev) 366 { 367 Error *err = NULL; 368 369 assert(!dev->realized); 370 371 object_property_set_bool(OBJECT(dev), true, "realized", &err); 372 if (err) { 373 error_reportf_err(err, "Initialization of device %s failed: ", 374 object_get_typename(OBJECT(dev))); 375 exit(1); 376 } 377 } 378 379 void qdev_machine_creation_done(void) 380 { 381 /* 382 * ok, initial machine setup is done, starting from now we can 383 * only create hotpluggable devices 384 */ 385 qdev_hotplug = 1; 386 } 387 388 bool qdev_machine_modified(void) 389 { 390 return qdev_hot_added || qdev_hot_removed; 391 } 392 393 BusState *qdev_get_parent_bus(DeviceState *dev) 394 { 395 return dev->parent_bus; 396 } 397 398 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev, 399 const char *name) 400 { 401 NamedGPIOList *ngl; 402 403 QLIST_FOREACH(ngl, &dev->gpios, node) { 404 /* NULL is a valid and matchable name, otherwise do a normal 405 * strcmp match. 406 */ 407 if ((!ngl->name && !name) || 408 (name && ngl->name && strcmp(name, ngl->name) == 0)) { 409 return ngl; 410 } 411 } 412 413 ngl = g_malloc0(sizeof(*ngl)); 414 ngl->name = g_strdup(name); 415 QLIST_INSERT_HEAD(&dev->gpios, ngl, node); 416 return ngl; 417 } 418 419 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler, 420 const char *name, int n) 421 { 422 int i; 423 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 424 425 assert(gpio_list->num_out == 0 || !name); 426 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler, 427 dev, n); 428 429 if (!name) { 430 name = "unnamed-gpio-in"; 431 } 432 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) { 433 gchar *propname = g_strdup_printf("%s[%u]", name, i); 434 435 object_property_add_child(OBJECT(dev), propname, 436 OBJECT(gpio_list->in[i]), &error_abort); 437 g_free(propname); 438 } 439 440 gpio_list->num_in += n; 441 } 442 443 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) 444 { 445 qdev_init_gpio_in_named(dev, handler, NULL, n); 446 } 447 448 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, 449 const char *name, int n) 450 { 451 int i; 452 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 453 454 assert(gpio_list->num_in == 0 || !name); 455 456 if (!name) { 457 name = "unnamed-gpio-out"; 458 } 459 memset(pins, 0, sizeof(*pins) * n); 460 for (i = 0; i < n; ++i) { 461 gchar *propname = g_strdup_printf("%s[%u]", name, 462 gpio_list->num_out + i); 463 464 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, 465 (Object **)&pins[i], 466 object_property_allow_set_link, 467 OBJ_PROP_LINK_UNREF_ON_RELEASE, 468 &error_abort); 469 g_free(propname); 470 } 471 gpio_list->num_out += n; 472 } 473 474 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) 475 { 476 qdev_init_gpio_out_named(dev, pins, NULL, n); 477 } 478 479 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) 480 { 481 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 482 483 assert(n >= 0 && n < gpio_list->num_in); 484 return gpio_list->in[n]; 485 } 486 487 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) 488 { 489 return qdev_get_gpio_in_named(dev, NULL, n); 490 } 491 492 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, 493 qemu_irq pin) 494 { 495 char *propname = g_strdup_printf("%s[%d]", 496 name ? name : "unnamed-gpio-out", n); 497 if (pin) { 498 /* We need a name for object_property_set_link to work. If the 499 * object has a parent, object_property_add_child will come back 500 * with an error without doing anything. If it has none, it will 501 * never fail. So we can just call it with a NULL Error pointer. 502 */ 503 object_property_add_child(container_get(qdev_get_machine(), 504 "/unattached"), 505 "non-qdev-gpio[*]", OBJECT(pin), NULL); 506 } 507 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort); 508 g_free(propname); 509 } 510 511 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n) 512 { 513 char *propname = g_strdup_printf("%s[%d]", 514 name ? name : "unnamed-gpio-out", n); 515 516 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 517 NULL); 518 519 return ret; 520 } 521 522 /* disconnect a GPIO output, returning the disconnected input (if any) */ 523 524 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, 525 const char *name, int n) 526 { 527 char *propname = g_strdup_printf("%s[%d]", 528 name ? name : "unnamed-gpio-out", n); 529 530 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 531 NULL); 532 if (ret) { 533 object_property_set_link(OBJECT(dev), NULL, propname, NULL); 534 } 535 g_free(propname); 536 return ret; 537 } 538 539 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, 540 const char *name, int n) 541 { 542 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n); 543 qdev_connect_gpio_out_named(dev, name, n, icpt); 544 return disconnected; 545 } 546 547 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) 548 { 549 qdev_connect_gpio_out_named(dev, NULL, n, pin); 550 } 551 552 void qdev_pass_gpios(DeviceState *dev, DeviceState *container, 553 const char *name) 554 { 555 int i; 556 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name); 557 558 for (i = 0; i < ngl->num_in; i++) { 559 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in"; 560 char *propname = g_strdup_printf("%s[%d]", nm, i); 561 562 object_property_add_alias(OBJECT(container), propname, 563 OBJECT(dev), propname, 564 &error_abort); 565 g_free(propname); 566 } 567 for (i = 0; i < ngl->num_out; i++) { 568 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out"; 569 char *propname = g_strdup_printf("%s[%d]", nm, i); 570 571 object_property_add_alias(OBJECT(container), propname, 572 OBJECT(dev), propname, 573 &error_abort); 574 g_free(propname); 575 } 576 QLIST_REMOVE(ngl, node); 577 QLIST_INSERT_HEAD(&container->gpios, ngl, node); 578 } 579 580 BusState *qdev_get_child_bus(DeviceState *dev, const char *name) 581 { 582 BusState *bus; 583 Object *child = object_resolve_path_component(OBJECT(dev), name); 584 585 bus = (BusState *)object_dynamic_cast(child, TYPE_BUS); 586 if (bus) { 587 return bus; 588 } 589 590 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 591 if (strcmp(name, bus->name) == 0) { 592 return bus; 593 } 594 } 595 return NULL; 596 } 597 598 int qbus_walk_children(BusState *bus, 599 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 600 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 601 void *opaque) 602 { 603 BusChild *kid; 604 int err; 605 606 if (pre_busfn) { 607 err = pre_busfn(bus, opaque); 608 if (err) { 609 return err; 610 } 611 } 612 613 QTAILQ_FOREACH(kid, &bus->children, sibling) { 614 err = qdev_walk_children(kid->child, 615 pre_devfn, pre_busfn, 616 post_devfn, post_busfn, opaque); 617 if (err < 0) { 618 return err; 619 } 620 } 621 622 if (post_busfn) { 623 err = post_busfn(bus, opaque); 624 if (err) { 625 return err; 626 } 627 } 628 629 return 0; 630 } 631 632 int qdev_walk_children(DeviceState *dev, 633 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 634 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 635 void *opaque) 636 { 637 BusState *bus; 638 int err; 639 640 if (pre_devfn) { 641 err = pre_devfn(dev, opaque); 642 if (err) { 643 return err; 644 } 645 } 646 647 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 648 err = qbus_walk_children(bus, pre_devfn, pre_busfn, 649 post_devfn, post_busfn, opaque); 650 if (err < 0) { 651 return err; 652 } 653 } 654 655 if (post_devfn) { 656 err = post_devfn(dev, opaque); 657 if (err) { 658 return err; 659 } 660 } 661 662 return 0; 663 } 664 665 DeviceState *qdev_find_recursive(BusState *bus, const char *id) 666 { 667 BusChild *kid; 668 DeviceState *ret; 669 BusState *child; 670 671 QTAILQ_FOREACH(kid, &bus->children, sibling) { 672 DeviceState *dev = kid->child; 673 674 if (dev->id && strcmp(dev->id, id) == 0) { 675 return dev; 676 } 677 678 QLIST_FOREACH(child, &dev->child_bus, sibling) { 679 ret = qdev_find_recursive(child, id); 680 if (ret) { 681 return ret; 682 } 683 } 684 } 685 return NULL; 686 } 687 688 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name) 689 { 690 const char *typename = object_get_typename(OBJECT(bus)); 691 BusClass *bc; 692 char *buf; 693 int i, len, bus_id; 694 695 bus->parent = parent; 696 697 if (name) { 698 bus->name = g_strdup(name); 699 } else if (bus->parent && bus->parent->id) { 700 /* parent device has id -> use it plus parent-bus-id for bus name */ 701 bus_id = bus->parent->num_child_bus; 702 703 len = strlen(bus->parent->id) + 16; 704 buf = g_malloc(len); 705 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id); 706 bus->name = buf; 707 } else { 708 /* no id -> use lowercase bus type plus global bus-id for bus name */ 709 bc = BUS_GET_CLASS(bus); 710 bus_id = bc->automatic_ids++; 711 712 len = strlen(typename) + 16; 713 buf = g_malloc(len); 714 len = snprintf(buf, len, "%s.%d", typename, bus_id); 715 for (i = 0; i < len; i++) { 716 buf[i] = qemu_tolower(buf[i]); 717 } 718 bus->name = buf; 719 } 720 721 if (bus->parent) { 722 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling); 723 bus->parent->num_child_bus++; 724 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL); 725 object_unref(OBJECT(bus)); 726 } else if (bus != sysbus_get_default()) { 727 /* TODO: once all bus devices are qdevified, 728 only reset handler for main_system_bus should be registered here. */ 729 qemu_register_reset(qbus_reset_all_fn, bus); 730 } 731 } 732 733 static void bus_unparent(Object *obj) 734 { 735 BusState *bus = BUS(obj); 736 BusChild *kid; 737 738 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) { 739 DeviceState *dev = kid->child; 740 object_unparent(OBJECT(dev)); 741 } 742 if (bus->parent) { 743 QLIST_REMOVE(bus, sibling); 744 bus->parent->num_child_bus--; 745 bus->parent = NULL; 746 } else { 747 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */ 748 qemu_unregister_reset(qbus_reset_all_fn, bus); 749 } 750 } 751 752 static bool bus_get_realized(Object *obj, Error **errp) 753 { 754 BusState *bus = BUS(obj); 755 756 return bus->realized; 757 } 758 759 static void bus_set_realized(Object *obj, bool value, Error **errp) 760 { 761 BusState *bus = BUS(obj); 762 BusClass *bc = BUS_GET_CLASS(bus); 763 BusChild *kid; 764 Error *local_err = NULL; 765 766 if (value && !bus->realized) { 767 if (bc->realize) { 768 bc->realize(bus, &local_err); 769 } 770 771 /* TODO: recursive realization */ 772 } else if (!value && bus->realized) { 773 QTAILQ_FOREACH(kid, &bus->children, sibling) { 774 DeviceState *dev = kid->child; 775 object_property_set_bool(OBJECT(dev), false, "realized", 776 &local_err); 777 if (local_err != NULL) { 778 break; 779 } 780 } 781 if (bc->unrealize && local_err == NULL) { 782 bc->unrealize(bus, &local_err); 783 } 784 } 785 786 if (local_err != NULL) { 787 error_propagate(errp, local_err); 788 return; 789 } 790 791 bus->realized = value; 792 } 793 794 void qbus_create_inplace(void *bus, size_t size, const char *typename, 795 DeviceState *parent, const char *name) 796 { 797 object_initialize(bus, size, typename); 798 qbus_realize(bus, parent, name); 799 } 800 801 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name) 802 { 803 BusState *bus; 804 805 bus = BUS(object_new(typename)); 806 qbus_realize(bus, parent, name); 807 808 return bus; 809 } 810 811 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev) 812 { 813 BusClass *bc = BUS_GET_CLASS(bus); 814 815 if (bc->get_fw_dev_path) { 816 return bc->get_fw_dev_path(dev); 817 } 818 819 return NULL; 820 } 821 822 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev) 823 { 824 Object *obj = OBJECT(dev); 825 char *d = NULL; 826 827 while (!d && obj->parent) { 828 obj = obj->parent; 829 d = fw_path_provider_try_get_dev_path(obj, bus, dev); 830 } 831 return d; 832 } 833 834 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev) 835 { 836 Object *obj = OBJECT(dev); 837 838 return fw_path_provider_try_get_dev_path(obj, bus, dev); 839 } 840 841 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size) 842 { 843 int l = 0; 844 845 if (dev && dev->parent_bus) { 846 char *d; 847 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size); 848 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev); 849 if (!d) { 850 d = bus_get_fw_dev_path(dev->parent_bus, dev); 851 } 852 if (d) { 853 l += snprintf(p + l, size - l, "%s", d); 854 g_free(d); 855 } else { 856 return l; 857 } 858 } 859 l += snprintf(p + l , size - l, "/"); 860 861 return l; 862 } 863 864 char* qdev_get_fw_dev_path(DeviceState *dev) 865 { 866 char path[128]; 867 int l; 868 869 l = qdev_get_fw_dev_path_helper(dev, path, 128); 870 871 path[l-1] = '\0'; 872 873 return g_strdup(path); 874 } 875 876 char *qdev_get_dev_path(DeviceState *dev) 877 { 878 BusClass *bc; 879 880 if (!dev || !dev->parent_bus) { 881 return NULL; 882 } 883 884 bc = BUS_GET_CLASS(dev->parent_bus); 885 if (bc->get_dev_path) { 886 return bc->get_dev_path(dev); 887 } 888 889 return NULL; 890 } 891 892 /** 893 * Legacy property handling 894 */ 895 896 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque, 897 const char *name, Error **errp) 898 { 899 DeviceState *dev = DEVICE(obj); 900 Property *prop = opaque; 901 902 char buffer[1024]; 903 char *ptr = buffer; 904 905 prop->info->print(dev, prop, buffer, sizeof(buffer)); 906 visit_type_str(v, &ptr, name, errp); 907 } 908 909 /** 910 * @qdev_add_legacy_property - adds a legacy property 911 * 912 * Do not use this is new code! Properties added through this interface will 913 * be given names and types in the "legacy" namespace. 914 * 915 * Legacy properties are string versions of other OOM properties. The format 916 * of the string depends on the property type. 917 */ 918 static void qdev_property_add_legacy(DeviceState *dev, Property *prop, 919 Error **errp) 920 { 921 gchar *name; 922 923 /* Register pointer properties as legacy properties */ 924 if (!prop->info->print && prop->info->get) { 925 return; 926 } 927 928 name = g_strdup_printf("legacy-%s", prop->name); 929 object_property_add(OBJECT(dev), name, "str", 930 prop->info->print ? qdev_get_legacy_property : prop->info->get, 931 NULL, 932 NULL, 933 prop, errp); 934 935 g_free(name); 936 } 937 938 /** 939 * @qdev_property_add_static - add a @Property to a device. 940 * 941 * Static properties access data in a struct. The actual type of the 942 * property and the field depends on the property type. 943 */ 944 void qdev_property_add_static(DeviceState *dev, Property *prop, 945 Error **errp) 946 { 947 Error *local_err = NULL; 948 Object *obj = OBJECT(dev); 949 950 /* 951 * TODO qdev_prop_ptr does not have getters or setters. It must 952 * go now that it can be replaced with links. The test should be 953 * removed along with it: all static properties are read/write. 954 */ 955 if (!prop->info->get && !prop->info->set) { 956 return; 957 } 958 959 object_property_add(obj, prop->name, prop->info->name, 960 prop->info->get, prop->info->set, 961 prop->info->release, 962 prop, &local_err); 963 964 if (local_err) { 965 error_propagate(errp, local_err); 966 return; 967 } 968 969 object_property_set_description(obj, prop->name, 970 prop->info->description, 971 &error_abort); 972 973 if (prop->qtype == QTYPE_NONE) { 974 return; 975 } 976 977 if (prop->qtype == QTYPE_QBOOL) { 978 object_property_set_bool(obj, prop->defval, prop->name, &error_abort); 979 } else if (prop->info->enum_table) { 980 object_property_set_str(obj, prop->info->enum_table[prop->defval], 981 prop->name, &error_abort); 982 } else if (prop->qtype == QTYPE_QINT) { 983 object_property_set_int(obj, prop->defval, prop->name, &error_abort); 984 } 985 } 986 987 /* @qdev_alias_all_properties - Add alias properties to the source object for 988 * all qdev properties on the target DeviceState. 989 */ 990 void qdev_alias_all_properties(DeviceState *target, Object *source) 991 { 992 ObjectClass *class; 993 Property *prop; 994 995 class = object_get_class(OBJECT(target)); 996 do { 997 DeviceClass *dc = DEVICE_CLASS(class); 998 999 for (prop = dc->props; prop && prop->name; prop++) { 1000 object_property_add_alias(source, prop->name, 1001 OBJECT(target), prop->name, 1002 &error_abort); 1003 } 1004 class = object_class_get_parent(class); 1005 } while (class != object_class_by_name(TYPE_DEVICE)); 1006 } 1007 1008 static int qdev_add_hotpluggable_device(Object *obj, void *opaque) 1009 { 1010 GSList **list = opaque; 1011 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj), 1012 TYPE_DEVICE); 1013 1014 if (dev == NULL) { 1015 return 0; 1016 } 1017 1018 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) { 1019 *list = g_slist_append(*list, dev); 1020 } 1021 1022 return 0; 1023 } 1024 1025 GSList *qdev_build_hotpluggable_device_list(Object *peripheral) 1026 { 1027 GSList *list = NULL; 1028 1029 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list); 1030 1031 return list; 1032 } 1033 1034 static bool device_get_realized(Object *obj, Error **errp) 1035 { 1036 DeviceState *dev = DEVICE(obj); 1037 return dev->realized; 1038 } 1039 1040 static void device_set_realized(Object *obj, bool value, Error **errp) 1041 { 1042 DeviceState *dev = DEVICE(obj); 1043 DeviceClass *dc = DEVICE_GET_CLASS(dev); 1044 HotplugHandler *hotplug_ctrl; 1045 BusState *bus; 1046 Error *local_err = NULL; 1047 1048 if (dev->hotplugged && !dc->hotpluggable) { 1049 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj)); 1050 return; 1051 } 1052 1053 if (value && !dev->realized) { 1054 if (!obj->parent) { 1055 static int unattached_count; 1056 gchar *name = g_strdup_printf("device[%d]", unattached_count++); 1057 1058 object_property_add_child(container_get(qdev_get_machine(), 1059 "/unattached"), 1060 name, obj, &error_abort); 1061 g_free(name); 1062 } 1063 1064 if (dc->realize) { 1065 dc->realize(dev, &local_err); 1066 } 1067 1068 if (local_err != NULL) { 1069 goto fail; 1070 } 1071 1072 DEVICE_LISTENER_CALL(realize, Forward, dev); 1073 1074 hotplug_ctrl = qdev_get_hotplug_handler(dev); 1075 if (hotplug_ctrl) { 1076 hotplug_handler_plug(hotplug_ctrl, dev, &local_err); 1077 } 1078 1079 if (local_err != NULL) { 1080 goto post_realize_fail; 1081 } 1082 1083 if (qdev_get_vmsd(dev)) { 1084 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev, 1085 dev->instance_id_alias, 1086 dev->alias_required_for_version); 1087 } 1088 1089 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1090 object_property_set_bool(OBJECT(bus), true, "realized", 1091 &local_err); 1092 if (local_err != NULL) { 1093 goto child_realize_fail; 1094 } 1095 } 1096 if (dev->hotplugged) { 1097 device_reset(dev); 1098 } 1099 dev->pending_deleted_event = false; 1100 } else if (!value && dev->realized) { 1101 Error **local_errp = NULL; 1102 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1103 local_errp = local_err ? NULL : &local_err; 1104 object_property_set_bool(OBJECT(bus), false, "realized", 1105 local_errp); 1106 } 1107 if (qdev_get_vmsd(dev)) { 1108 vmstate_unregister(dev, qdev_get_vmsd(dev), dev); 1109 } 1110 if (dc->unrealize) { 1111 local_errp = local_err ? NULL : &local_err; 1112 dc->unrealize(dev, local_errp); 1113 } 1114 dev->pending_deleted_event = true; 1115 DEVICE_LISTENER_CALL(unrealize, Reverse, dev); 1116 } 1117 1118 if (local_err != NULL) { 1119 goto fail; 1120 } 1121 1122 dev->realized = value; 1123 return; 1124 1125 child_realize_fail: 1126 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1127 object_property_set_bool(OBJECT(bus), false, "realized", 1128 NULL); 1129 } 1130 1131 if (qdev_get_vmsd(dev)) { 1132 vmstate_unregister(dev, qdev_get_vmsd(dev), dev); 1133 } 1134 1135 post_realize_fail: 1136 if (dc->unrealize) { 1137 dc->unrealize(dev, NULL); 1138 } 1139 1140 fail: 1141 error_propagate(errp, local_err); 1142 } 1143 1144 static bool device_get_hotpluggable(Object *obj, Error **errp) 1145 { 1146 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1147 DeviceState *dev = DEVICE(obj); 1148 1149 return dc->hotpluggable && (dev->parent_bus == NULL || 1150 qbus_is_hotpluggable(dev->parent_bus)); 1151 } 1152 1153 static bool device_get_hotplugged(Object *obj, Error **err) 1154 { 1155 DeviceState *dev = DEVICE(obj); 1156 1157 return dev->hotplugged; 1158 } 1159 1160 static void device_set_hotplugged(Object *obj, bool value, Error **err) 1161 { 1162 DeviceState *dev = DEVICE(obj); 1163 1164 dev->hotplugged = value; 1165 } 1166 1167 static void device_initfn(Object *obj) 1168 { 1169 DeviceState *dev = DEVICE(obj); 1170 ObjectClass *class; 1171 Property *prop; 1172 1173 if (qdev_hotplug) { 1174 dev->hotplugged = 1; 1175 qdev_hot_added = true; 1176 } 1177 1178 dev->instance_id_alias = -1; 1179 dev->realized = false; 1180 1181 object_property_add_bool(obj, "realized", 1182 device_get_realized, device_set_realized, NULL); 1183 object_property_add_bool(obj, "hotpluggable", 1184 device_get_hotpluggable, NULL, NULL); 1185 object_property_add_bool(obj, "hotplugged", 1186 device_get_hotplugged, device_set_hotplugged, 1187 &error_abort); 1188 1189 class = object_get_class(OBJECT(dev)); 1190 do { 1191 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) { 1192 qdev_property_add_legacy(dev, prop, &error_abort); 1193 qdev_property_add_static(dev, prop, &error_abort); 1194 } 1195 class = object_class_get_parent(class); 1196 } while (class != object_class_by_name(TYPE_DEVICE)); 1197 1198 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS, 1199 (Object **)&dev->parent_bus, NULL, 0, 1200 &error_abort); 1201 QLIST_INIT(&dev->gpios); 1202 } 1203 1204 static void device_post_init(Object *obj) 1205 { 1206 qdev_prop_set_globals(DEVICE(obj)); 1207 } 1208 1209 /* Unlink device from bus and free the structure. */ 1210 static void device_finalize(Object *obj) 1211 { 1212 NamedGPIOList *ngl, *next; 1213 1214 DeviceState *dev = DEVICE(obj); 1215 1216 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { 1217 QLIST_REMOVE(ngl, node); 1218 qemu_free_irqs(ngl->in, ngl->num_in); 1219 g_free(ngl->name); 1220 g_free(ngl); 1221 /* ngl->out irqs are owned by the other end and should not be freed 1222 * here 1223 */ 1224 } 1225 } 1226 1227 static void device_class_base_init(ObjectClass *class, void *data) 1228 { 1229 DeviceClass *klass = DEVICE_CLASS(class); 1230 1231 /* We explicitly look up properties in the superclasses, 1232 * so do not propagate them to the subclasses. 1233 */ 1234 klass->props = NULL; 1235 } 1236 1237 static void device_unparent(Object *obj) 1238 { 1239 DeviceState *dev = DEVICE(obj); 1240 BusState *bus; 1241 1242 if (dev->realized) { 1243 object_property_set_bool(obj, false, "realized", NULL); 1244 } 1245 while (dev->num_child_bus) { 1246 bus = QLIST_FIRST(&dev->child_bus); 1247 object_unparent(OBJECT(bus)); 1248 } 1249 if (dev->parent_bus) { 1250 bus_remove_child(dev->parent_bus, dev); 1251 object_unref(OBJECT(dev->parent_bus)); 1252 dev->parent_bus = NULL; 1253 } 1254 1255 /* Only send event if the device had been completely realized */ 1256 if (dev->pending_deleted_event) { 1257 gchar *path = object_get_canonical_path(OBJECT(dev)); 1258 1259 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort); 1260 g_free(path); 1261 } 1262 1263 qemu_opts_del(dev->opts); 1264 dev->opts = NULL; 1265 } 1266 1267 static void device_class_init(ObjectClass *class, void *data) 1268 { 1269 DeviceClass *dc = DEVICE_CLASS(class); 1270 1271 class->unparent = device_unparent; 1272 dc->realize = device_realize; 1273 dc->unrealize = device_unrealize; 1274 1275 /* by default all devices were considered as hotpluggable, 1276 * so with intent to check it in generic qdev_unplug() / 1277 * device_set_realized() functions make every device 1278 * hotpluggable. Devices that shouldn't be hotpluggable, 1279 * should override it in their class_init() 1280 */ 1281 dc->hotpluggable = true; 1282 } 1283 1284 void device_reset(DeviceState *dev) 1285 { 1286 DeviceClass *klass = DEVICE_GET_CLASS(dev); 1287 1288 if (klass->reset) { 1289 klass->reset(dev); 1290 } 1291 } 1292 1293 Object *qdev_get_machine(void) 1294 { 1295 static Object *dev; 1296 1297 if (dev == NULL) { 1298 dev = container_get(object_get_root(), "/machine"); 1299 } 1300 1301 return dev; 1302 } 1303 1304 static const TypeInfo device_type_info = { 1305 .name = TYPE_DEVICE, 1306 .parent = TYPE_OBJECT, 1307 .instance_size = sizeof(DeviceState), 1308 .instance_init = device_initfn, 1309 .instance_post_init = device_post_init, 1310 .instance_finalize = device_finalize, 1311 .class_base_init = device_class_base_init, 1312 .class_init = device_class_init, 1313 .abstract = true, 1314 .class_size = sizeof(DeviceClass), 1315 }; 1316 1317 static void qbus_initfn(Object *obj) 1318 { 1319 BusState *bus = BUS(obj); 1320 1321 QTAILQ_INIT(&bus->children); 1322 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY, 1323 TYPE_HOTPLUG_HANDLER, 1324 (Object **)&bus->hotplug_handler, 1325 object_property_allow_set_link, 1326 OBJ_PROP_LINK_UNREF_ON_RELEASE, 1327 NULL); 1328 object_property_add_bool(obj, "realized", 1329 bus_get_realized, bus_set_realized, NULL); 1330 } 1331 1332 static char *default_bus_get_fw_dev_path(DeviceState *dev) 1333 { 1334 return g_strdup(object_get_typename(OBJECT(dev))); 1335 } 1336 1337 static void bus_class_init(ObjectClass *class, void *data) 1338 { 1339 BusClass *bc = BUS_CLASS(class); 1340 1341 class->unparent = bus_unparent; 1342 bc->get_fw_dev_path = default_bus_get_fw_dev_path; 1343 } 1344 1345 static void qbus_finalize(Object *obj) 1346 { 1347 BusState *bus = BUS(obj); 1348 1349 g_free((char *)bus->name); 1350 } 1351 1352 static const TypeInfo bus_info = { 1353 .name = TYPE_BUS, 1354 .parent = TYPE_OBJECT, 1355 .instance_size = sizeof(BusState), 1356 .abstract = true, 1357 .class_size = sizeof(BusClass), 1358 .instance_init = qbus_initfn, 1359 .instance_finalize = qbus_finalize, 1360 .class_init = bus_class_init, 1361 }; 1362 1363 static void qdev_register_types(void) 1364 { 1365 type_register_static(&bus_info); 1366 type_register_static(&device_type_info); 1367 } 1368 1369 type_init(qdev_register_types) 1370