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 qbus_reset_all(BusState *bus) 329 { 330 qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL); 331 } 332 333 void qbus_reset_all_fn(void *opaque) 334 { 335 BusState *bus = opaque; 336 qbus_reset_all(bus); 337 } 338 339 /* can be used as ->unplug() callback for the simple cases */ 340 void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, 341 DeviceState *dev, Error **errp) 342 { 343 /* just zap it */ 344 object_unparent(OBJECT(dev)); 345 } 346 347 /* 348 * Realize @dev. 349 * Device properties should be set before calling this function. IRQs 350 * and MMIO regions should be connected/mapped after calling this 351 * function. 352 * On failure, report an error with error_report() and terminate the 353 * program. This is okay during machine creation. Don't use for 354 * hotplug, because there callers need to recover from failure. 355 * Exception: if you know the device's init() callback can't fail, 356 * then qdev_init_nofail() can't fail either, and is therefore usable 357 * even then. But relying on the device implementation that way is 358 * somewhat unclean, and best avoided. 359 */ 360 void qdev_init_nofail(DeviceState *dev) 361 { 362 Error *err = NULL; 363 364 assert(!dev->realized); 365 366 object_property_set_bool(OBJECT(dev), true, "realized", &err); 367 if (err) { 368 error_report("Initialization of device %s failed: %s", 369 object_get_typename(OBJECT(dev)), 370 error_get_pretty(err)); 371 exit(1); 372 } 373 } 374 375 void qdev_machine_creation_done(void) 376 { 377 /* 378 * ok, initial machine setup is done, starting from now we can 379 * only create hotpluggable devices 380 */ 381 qdev_hotplug = 1; 382 } 383 384 bool qdev_machine_modified(void) 385 { 386 return qdev_hot_added || qdev_hot_removed; 387 } 388 389 BusState *qdev_get_parent_bus(DeviceState *dev) 390 { 391 return dev->parent_bus; 392 } 393 394 static NamedGPIOList *qdev_get_named_gpio_list(DeviceState *dev, 395 const char *name) 396 { 397 NamedGPIOList *ngl; 398 399 QLIST_FOREACH(ngl, &dev->gpios, node) { 400 /* NULL is a valid and matchable name, otherwise do a normal 401 * strcmp match. 402 */ 403 if ((!ngl->name && !name) || 404 (name && ngl->name && strcmp(name, ngl->name) == 0)) { 405 return ngl; 406 } 407 } 408 409 ngl = g_malloc0(sizeof(*ngl)); 410 ngl->name = g_strdup(name); 411 QLIST_INSERT_HEAD(&dev->gpios, ngl, node); 412 return ngl; 413 } 414 415 void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler, 416 const char *name, int n) 417 { 418 int i; 419 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 420 421 assert(gpio_list->num_out == 0 || !name); 422 gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler, 423 dev, n); 424 425 if (!name) { 426 name = "unnamed-gpio-in"; 427 } 428 for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) { 429 gchar *propname = g_strdup_printf("%s[%u]", name, i); 430 431 object_property_add_child(OBJECT(dev), propname, 432 OBJECT(gpio_list->in[i]), &error_abort); 433 g_free(propname); 434 } 435 436 gpio_list->num_in += n; 437 } 438 439 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n) 440 { 441 qdev_init_gpio_in_named(dev, handler, NULL, n); 442 } 443 444 void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins, 445 const char *name, int n) 446 { 447 int i; 448 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 449 450 assert(gpio_list->num_in == 0 || !name); 451 452 if (!name) { 453 name = "unnamed-gpio-out"; 454 } 455 memset(pins, 0, sizeof(*pins) * n); 456 for (i = 0; i < n; ++i) { 457 gchar *propname = g_strdup_printf("%s[%u]", name, 458 gpio_list->num_out + i); 459 460 object_property_add_link(OBJECT(dev), propname, TYPE_IRQ, 461 (Object **)&pins[i], 462 object_property_allow_set_link, 463 OBJ_PROP_LINK_UNREF_ON_RELEASE, 464 &error_abort); 465 g_free(propname); 466 } 467 gpio_list->num_out += n; 468 } 469 470 void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n) 471 { 472 qdev_init_gpio_out_named(dev, pins, NULL, n); 473 } 474 475 qemu_irq qdev_get_gpio_in_named(DeviceState *dev, const char *name, int n) 476 { 477 NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name); 478 479 assert(n >= 0 && n < gpio_list->num_in); 480 return gpio_list->in[n]; 481 } 482 483 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n) 484 { 485 return qdev_get_gpio_in_named(dev, NULL, n); 486 } 487 488 void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n, 489 qemu_irq pin) 490 { 491 char *propname = g_strdup_printf("%s[%d]", 492 name ? name : "unnamed-gpio-out", n); 493 if (pin) { 494 /* We need a name for object_property_set_link to work. If the 495 * object has a parent, object_property_add_child will come back 496 * with an error without doing anything. If it has none, it will 497 * never fail. So we can just call it with a NULL Error pointer. 498 */ 499 object_property_add_child(container_get(qdev_get_machine(), 500 "/unattached"), 501 "non-qdev-gpio[*]", OBJECT(pin), NULL); 502 } 503 object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort); 504 g_free(propname); 505 } 506 507 qemu_irq qdev_get_gpio_out_connector(DeviceState *dev, const char *name, int n) 508 { 509 char *propname = g_strdup_printf("%s[%d]", 510 name ? name : "unnamed-gpio-out", n); 511 512 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 513 NULL); 514 515 return ret; 516 } 517 518 /* disconnect a GPIO output, returning the disconnected input (if any) */ 519 520 static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev, 521 const char *name, int n) 522 { 523 char *propname = g_strdup_printf("%s[%d]", 524 name ? name : "unnamed-gpio-out", n); 525 526 qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname, 527 NULL); 528 if (ret) { 529 object_property_set_link(OBJECT(dev), NULL, propname, NULL); 530 } 531 g_free(propname); 532 return ret; 533 } 534 535 qemu_irq qdev_intercept_gpio_out(DeviceState *dev, qemu_irq icpt, 536 const char *name, int n) 537 { 538 qemu_irq disconnected = qdev_disconnect_gpio_out_named(dev, name, n); 539 qdev_connect_gpio_out_named(dev, name, n, icpt); 540 return disconnected; 541 } 542 543 void qdev_connect_gpio_out(DeviceState * dev, int n, qemu_irq pin) 544 { 545 qdev_connect_gpio_out_named(dev, NULL, n, pin); 546 } 547 548 void qdev_pass_gpios(DeviceState *dev, DeviceState *container, 549 const char *name) 550 { 551 int i; 552 NamedGPIOList *ngl = qdev_get_named_gpio_list(dev, name); 553 554 for (i = 0; i < ngl->num_in; i++) { 555 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-in"; 556 char *propname = g_strdup_printf("%s[%d]", nm, i); 557 558 object_property_add_alias(OBJECT(container), propname, 559 OBJECT(dev), propname, 560 &error_abort); 561 g_free(propname); 562 } 563 for (i = 0; i < ngl->num_out; i++) { 564 const char *nm = ngl->name ? ngl->name : "unnamed-gpio-out"; 565 char *propname = g_strdup_printf("%s[%d]", nm, i); 566 567 object_property_add_alias(OBJECT(container), propname, 568 OBJECT(dev), propname, 569 &error_abort); 570 g_free(propname); 571 } 572 QLIST_REMOVE(ngl, node); 573 QLIST_INSERT_HEAD(&container->gpios, ngl, node); 574 } 575 576 BusState *qdev_get_child_bus(DeviceState *dev, const char *name) 577 { 578 BusState *bus; 579 580 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 581 if (strcmp(name, bus->name) == 0) { 582 return bus; 583 } 584 } 585 return NULL; 586 } 587 588 int qbus_walk_children(BusState *bus, 589 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 590 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 591 void *opaque) 592 { 593 BusChild *kid; 594 int err; 595 596 if (pre_busfn) { 597 err = pre_busfn(bus, opaque); 598 if (err) { 599 return err; 600 } 601 } 602 603 QTAILQ_FOREACH(kid, &bus->children, sibling) { 604 err = qdev_walk_children(kid->child, 605 pre_devfn, pre_busfn, 606 post_devfn, post_busfn, opaque); 607 if (err < 0) { 608 return err; 609 } 610 } 611 612 if (post_busfn) { 613 err = post_busfn(bus, opaque); 614 if (err) { 615 return err; 616 } 617 } 618 619 return 0; 620 } 621 622 int qdev_walk_children(DeviceState *dev, 623 qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, 624 qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, 625 void *opaque) 626 { 627 BusState *bus; 628 int err; 629 630 if (pre_devfn) { 631 err = pre_devfn(dev, opaque); 632 if (err) { 633 return err; 634 } 635 } 636 637 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 638 err = qbus_walk_children(bus, pre_devfn, pre_busfn, 639 post_devfn, post_busfn, opaque); 640 if (err < 0) { 641 return err; 642 } 643 } 644 645 if (post_devfn) { 646 err = post_devfn(dev, opaque); 647 if (err) { 648 return err; 649 } 650 } 651 652 return 0; 653 } 654 655 DeviceState *qdev_find_recursive(BusState *bus, const char *id) 656 { 657 BusChild *kid; 658 DeviceState *ret; 659 BusState *child; 660 661 QTAILQ_FOREACH(kid, &bus->children, sibling) { 662 DeviceState *dev = kid->child; 663 664 if (dev->id && strcmp(dev->id, id) == 0) { 665 return dev; 666 } 667 668 QLIST_FOREACH(child, &dev->child_bus, sibling) { 669 ret = qdev_find_recursive(child, id); 670 if (ret) { 671 return ret; 672 } 673 } 674 } 675 return NULL; 676 } 677 678 static void qbus_realize(BusState *bus, DeviceState *parent, const char *name) 679 { 680 const char *typename = object_get_typename(OBJECT(bus)); 681 BusClass *bc; 682 char *buf; 683 int i, len, bus_id; 684 685 bus->parent = parent; 686 687 if (name) { 688 bus->name = g_strdup(name); 689 } else if (bus->parent && bus->parent->id) { 690 /* parent device has id -> use it plus parent-bus-id for bus name */ 691 bus_id = bus->parent->num_child_bus; 692 693 len = strlen(bus->parent->id) + 16; 694 buf = g_malloc(len); 695 snprintf(buf, len, "%s.%d", bus->parent->id, bus_id); 696 bus->name = buf; 697 } else { 698 /* no id -> use lowercase bus type plus global bus-id for bus name */ 699 bc = BUS_GET_CLASS(bus); 700 bus_id = bc->automatic_ids++; 701 702 len = strlen(typename) + 16; 703 buf = g_malloc(len); 704 len = snprintf(buf, len, "%s.%d", typename, bus_id); 705 for (i = 0; i < len; i++) { 706 buf[i] = qemu_tolower(buf[i]); 707 } 708 bus->name = buf; 709 } 710 711 if (bus->parent) { 712 QLIST_INSERT_HEAD(&bus->parent->child_bus, bus, sibling); 713 bus->parent->num_child_bus++; 714 object_property_add_child(OBJECT(bus->parent), bus->name, OBJECT(bus), NULL); 715 object_unref(OBJECT(bus)); 716 } else if (bus != sysbus_get_default()) { 717 /* TODO: once all bus devices are qdevified, 718 only reset handler for main_system_bus should be registered here. */ 719 qemu_register_reset(qbus_reset_all_fn, bus); 720 } 721 } 722 723 static void bus_unparent(Object *obj) 724 { 725 BusState *bus = BUS(obj); 726 BusChild *kid; 727 728 while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) { 729 DeviceState *dev = kid->child; 730 object_unparent(OBJECT(dev)); 731 } 732 if (bus->parent) { 733 QLIST_REMOVE(bus, sibling); 734 bus->parent->num_child_bus--; 735 bus->parent = NULL; 736 } else { 737 assert(bus != sysbus_get_default()); /* main_system_bus is never freed */ 738 qemu_unregister_reset(qbus_reset_all_fn, bus); 739 } 740 } 741 742 static bool bus_get_realized(Object *obj, Error **errp) 743 { 744 BusState *bus = BUS(obj); 745 746 return bus->realized; 747 } 748 749 static void bus_set_realized(Object *obj, bool value, Error **errp) 750 { 751 BusState *bus = BUS(obj); 752 BusClass *bc = BUS_GET_CLASS(bus); 753 BusChild *kid; 754 Error *local_err = NULL; 755 756 if (value && !bus->realized) { 757 if (bc->realize) { 758 bc->realize(bus, &local_err); 759 } 760 761 /* TODO: recursive realization */ 762 } else if (!value && bus->realized) { 763 QTAILQ_FOREACH(kid, &bus->children, sibling) { 764 DeviceState *dev = kid->child; 765 object_property_set_bool(OBJECT(dev), false, "realized", 766 &local_err); 767 if (local_err != NULL) { 768 break; 769 } 770 } 771 if (bc->unrealize && local_err == NULL) { 772 bc->unrealize(bus, &local_err); 773 } 774 } 775 776 if (local_err != NULL) { 777 error_propagate(errp, local_err); 778 return; 779 } 780 781 bus->realized = value; 782 } 783 784 void qbus_create_inplace(void *bus, size_t size, const char *typename, 785 DeviceState *parent, const char *name) 786 { 787 object_initialize(bus, size, typename); 788 qbus_realize(bus, parent, name); 789 } 790 791 BusState *qbus_create(const char *typename, DeviceState *parent, const char *name) 792 { 793 BusState *bus; 794 795 bus = BUS(object_new(typename)); 796 qbus_realize(bus, parent, name); 797 798 return bus; 799 } 800 801 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev) 802 { 803 BusClass *bc = BUS_GET_CLASS(bus); 804 805 if (bc->get_fw_dev_path) { 806 return bc->get_fw_dev_path(dev); 807 } 808 809 return NULL; 810 } 811 812 static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev) 813 { 814 Object *obj = OBJECT(dev); 815 char *d = NULL; 816 817 while (!d && obj->parent) { 818 obj = obj->parent; 819 d = fw_path_provider_try_get_dev_path(obj, bus, dev); 820 } 821 return d; 822 } 823 824 char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev) 825 { 826 Object *obj = OBJECT(dev); 827 828 return fw_path_provider_try_get_dev_path(obj, bus, dev); 829 } 830 831 static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size) 832 { 833 int l = 0; 834 835 if (dev && dev->parent_bus) { 836 char *d; 837 l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size); 838 d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev); 839 if (!d) { 840 d = bus_get_fw_dev_path(dev->parent_bus, dev); 841 } 842 if (d) { 843 l += snprintf(p + l, size - l, "%s", d); 844 g_free(d); 845 } else { 846 return l; 847 } 848 } 849 l += snprintf(p + l , size - l, "/"); 850 851 return l; 852 } 853 854 char* qdev_get_fw_dev_path(DeviceState *dev) 855 { 856 char path[128]; 857 int l; 858 859 l = qdev_get_fw_dev_path_helper(dev, path, 128); 860 861 path[l-1] = '\0'; 862 863 return g_strdup(path); 864 } 865 866 char *qdev_get_dev_path(DeviceState *dev) 867 { 868 BusClass *bc; 869 870 if (!dev || !dev->parent_bus) { 871 return NULL; 872 } 873 874 bc = BUS_GET_CLASS(dev->parent_bus); 875 if (bc->get_dev_path) { 876 return bc->get_dev_path(dev); 877 } 878 879 return NULL; 880 } 881 882 /** 883 * Legacy property handling 884 */ 885 886 static void qdev_get_legacy_property(Object *obj, Visitor *v, void *opaque, 887 const char *name, Error **errp) 888 { 889 DeviceState *dev = DEVICE(obj); 890 Property *prop = opaque; 891 892 char buffer[1024]; 893 char *ptr = buffer; 894 895 prop->info->print(dev, prop, buffer, sizeof(buffer)); 896 visit_type_str(v, &ptr, name, errp); 897 } 898 899 /** 900 * @qdev_add_legacy_property - adds a legacy property 901 * 902 * Do not use this is new code! Properties added through this interface will 903 * be given names and types in the "legacy" namespace. 904 * 905 * Legacy properties are string versions of other OOM properties. The format 906 * of the string depends on the property type. 907 */ 908 static void qdev_property_add_legacy(DeviceState *dev, Property *prop, 909 Error **errp) 910 { 911 gchar *name; 912 913 /* Register pointer properties as legacy properties */ 914 if (!prop->info->print && prop->info->get) { 915 return; 916 } 917 918 name = g_strdup_printf("legacy-%s", prop->name); 919 object_property_add(OBJECT(dev), name, "str", 920 prop->info->print ? qdev_get_legacy_property : prop->info->get, 921 NULL, 922 NULL, 923 prop, errp); 924 925 g_free(name); 926 } 927 928 /** 929 * @qdev_property_add_static - add a @Property to a device. 930 * 931 * Static properties access data in a struct. The actual type of the 932 * property and the field depends on the property type. 933 */ 934 void qdev_property_add_static(DeviceState *dev, Property *prop, 935 Error **errp) 936 { 937 Error *local_err = NULL; 938 Object *obj = OBJECT(dev); 939 940 /* 941 * TODO qdev_prop_ptr does not have getters or setters. It must 942 * go now that it can be replaced with links. The test should be 943 * removed along with it: all static properties are read/write. 944 */ 945 if (!prop->info->get && !prop->info->set) { 946 return; 947 } 948 949 object_property_add(obj, prop->name, prop->info->name, 950 prop->info->get, prop->info->set, 951 prop->info->release, 952 prop, &local_err); 953 954 if (local_err) { 955 error_propagate(errp, local_err); 956 return; 957 } 958 959 object_property_set_description(obj, prop->name, 960 prop->info->description, 961 &error_abort); 962 963 if (prop->qtype == QTYPE_NONE) { 964 return; 965 } 966 967 if (prop->qtype == QTYPE_QBOOL) { 968 object_property_set_bool(obj, prop->defval, prop->name, &error_abort); 969 } else if (prop->info->enum_table) { 970 object_property_set_str(obj, prop->info->enum_table[prop->defval], 971 prop->name, &error_abort); 972 } else if (prop->qtype == QTYPE_QINT) { 973 object_property_set_int(obj, prop->defval, prop->name, &error_abort); 974 } 975 } 976 977 /* @qdev_alias_all_properties - Add alias properties to the source object for 978 * all qdev properties on the target DeviceState. 979 */ 980 void qdev_alias_all_properties(DeviceState *target, Object *source) 981 { 982 ObjectClass *class; 983 Property *prop; 984 985 class = object_get_class(OBJECT(target)); 986 do { 987 DeviceClass *dc = DEVICE_CLASS(class); 988 989 for (prop = dc->props; prop && prop->name; prop++) { 990 object_property_add_alias(source, prop->name, 991 OBJECT(target), prop->name, 992 &error_abort); 993 } 994 class = object_class_get_parent(class); 995 } while (class != object_class_by_name(TYPE_DEVICE)); 996 } 997 998 static int qdev_add_hotpluggable_device(Object *obj, void *opaque) 999 { 1000 GSList **list = opaque; 1001 DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj), 1002 TYPE_DEVICE); 1003 1004 if (dev == NULL) { 1005 return 0; 1006 } 1007 1008 if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) { 1009 *list = g_slist_append(*list, dev); 1010 } 1011 1012 return 0; 1013 } 1014 1015 GSList *qdev_build_hotpluggable_device_list(Object *peripheral) 1016 { 1017 GSList *list = NULL; 1018 1019 object_child_foreach(peripheral, qdev_add_hotpluggable_device, &list); 1020 1021 return list; 1022 } 1023 1024 static bool device_get_realized(Object *obj, Error **errp) 1025 { 1026 DeviceState *dev = DEVICE(obj); 1027 return dev->realized; 1028 } 1029 1030 static void device_set_realized(Object *obj, bool value, Error **errp) 1031 { 1032 DeviceState *dev = DEVICE(obj); 1033 DeviceClass *dc = DEVICE_GET_CLASS(dev); 1034 HotplugHandler *hotplug_ctrl; 1035 BusState *bus; 1036 Error *local_err = NULL; 1037 1038 if (dev->hotplugged && !dc->hotpluggable) { 1039 error_setg(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj)); 1040 return; 1041 } 1042 1043 if (value && !dev->realized) { 1044 if (!obj->parent) { 1045 static int unattached_count; 1046 gchar *name = g_strdup_printf("device[%d]", unattached_count++); 1047 1048 object_property_add_child(container_get(qdev_get_machine(), 1049 "/unattached"), 1050 name, obj, &error_abort); 1051 g_free(name); 1052 } 1053 1054 if (dc->realize) { 1055 dc->realize(dev, &local_err); 1056 } 1057 1058 if (local_err != NULL) { 1059 goto fail; 1060 } 1061 1062 DEVICE_LISTENER_CALL(realize, Forward, dev); 1063 1064 hotplug_ctrl = qdev_get_hotplug_handler(dev); 1065 if (hotplug_ctrl) { 1066 hotplug_handler_plug(hotplug_ctrl, dev, &local_err); 1067 } 1068 1069 if (local_err != NULL) { 1070 goto post_realize_fail; 1071 } 1072 1073 if (qdev_get_vmsd(dev)) { 1074 vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev, 1075 dev->instance_id_alias, 1076 dev->alias_required_for_version); 1077 } 1078 1079 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1080 object_property_set_bool(OBJECT(bus), true, "realized", 1081 &local_err); 1082 if (local_err != NULL) { 1083 goto child_realize_fail; 1084 } 1085 } 1086 if (dev->hotplugged) { 1087 device_reset(dev); 1088 } 1089 dev->pending_deleted_event = false; 1090 } else if (!value && dev->realized) { 1091 Error **local_errp = NULL; 1092 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1093 local_errp = local_err ? NULL : &local_err; 1094 object_property_set_bool(OBJECT(bus), false, "realized", 1095 local_errp); 1096 } 1097 if (qdev_get_vmsd(dev)) { 1098 vmstate_unregister(dev, qdev_get_vmsd(dev), dev); 1099 } 1100 if (dc->unrealize) { 1101 local_errp = local_err ? NULL : &local_err; 1102 dc->unrealize(dev, local_errp); 1103 } 1104 dev->pending_deleted_event = true; 1105 DEVICE_LISTENER_CALL(unrealize, Reverse, dev); 1106 } 1107 1108 if (local_err != NULL) { 1109 goto fail; 1110 } 1111 1112 dev->realized = value; 1113 return; 1114 1115 child_realize_fail: 1116 QLIST_FOREACH(bus, &dev->child_bus, sibling) { 1117 object_property_set_bool(OBJECT(bus), false, "realized", 1118 NULL); 1119 } 1120 1121 if (qdev_get_vmsd(dev)) { 1122 vmstate_unregister(dev, qdev_get_vmsd(dev), dev); 1123 } 1124 1125 post_realize_fail: 1126 if (dc->unrealize) { 1127 dc->unrealize(dev, NULL); 1128 } 1129 1130 fail: 1131 error_propagate(errp, local_err); 1132 return; 1133 } 1134 1135 static bool device_get_hotpluggable(Object *obj, Error **errp) 1136 { 1137 DeviceClass *dc = DEVICE_GET_CLASS(obj); 1138 DeviceState *dev = DEVICE(obj); 1139 1140 return dc->hotpluggable && (dev->parent_bus == NULL || 1141 qbus_is_hotpluggable(dev->parent_bus)); 1142 } 1143 1144 static bool device_get_hotplugged(Object *obj, Error **err) 1145 { 1146 DeviceState *dev = DEVICE(obj); 1147 1148 return dev->hotplugged; 1149 } 1150 1151 static void device_set_hotplugged(Object *obj, bool value, Error **err) 1152 { 1153 DeviceState *dev = DEVICE(obj); 1154 1155 dev->hotplugged = value; 1156 } 1157 1158 static void device_initfn(Object *obj) 1159 { 1160 DeviceState *dev = DEVICE(obj); 1161 ObjectClass *class; 1162 Property *prop; 1163 1164 if (qdev_hotplug) { 1165 dev->hotplugged = 1; 1166 qdev_hot_added = true; 1167 } 1168 1169 dev->instance_id_alias = -1; 1170 dev->realized = false; 1171 1172 object_property_add_bool(obj, "realized", 1173 device_get_realized, device_set_realized, NULL); 1174 object_property_add_bool(obj, "hotpluggable", 1175 device_get_hotpluggable, NULL, NULL); 1176 object_property_add_bool(obj, "hotplugged", 1177 device_get_hotplugged, device_set_hotplugged, 1178 &error_abort); 1179 1180 class = object_get_class(OBJECT(dev)); 1181 do { 1182 for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) { 1183 qdev_property_add_legacy(dev, prop, &error_abort); 1184 qdev_property_add_static(dev, prop, &error_abort); 1185 } 1186 class = object_class_get_parent(class); 1187 } while (class != object_class_by_name(TYPE_DEVICE)); 1188 1189 object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS, 1190 (Object **)&dev->parent_bus, NULL, 0, 1191 &error_abort); 1192 QLIST_INIT(&dev->gpios); 1193 } 1194 1195 static void device_post_init(Object *obj) 1196 { 1197 qdev_prop_set_globals(DEVICE(obj)); 1198 } 1199 1200 /* Unlink device from bus and free the structure. */ 1201 static void device_finalize(Object *obj) 1202 { 1203 NamedGPIOList *ngl, *next; 1204 1205 DeviceState *dev = DEVICE(obj); 1206 qemu_opts_del(dev->opts); 1207 1208 QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { 1209 QLIST_REMOVE(ngl, node); 1210 qemu_free_irqs(ngl->in, ngl->num_in); 1211 g_free(ngl->name); 1212 g_free(ngl); 1213 /* ngl->out irqs are owned by the other end and should not be freed 1214 * here 1215 */ 1216 } 1217 } 1218 1219 static void device_class_base_init(ObjectClass *class, void *data) 1220 { 1221 DeviceClass *klass = DEVICE_CLASS(class); 1222 1223 /* We explicitly look up properties in the superclasses, 1224 * so do not propagate them to the subclasses. 1225 */ 1226 klass->props = NULL; 1227 } 1228 1229 static void device_unparent(Object *obj) 1230 { 1231 DeviceState *dev = DEVICE(obj); 1232 BusState *bus; 1233 1234 if (dev->realized) { 1235 object_property_set_bool(obj, false, "realized", NULL); 1236 } 1237 while (dev->num_child_bus) { 1238 bus = QLIST_FIRST(&dev->child_bus); 1239 object_unparent(OBJECT(bus)); 1240 } 1241 if (dev->parent_bus) { 1242 bus_remove_child(dev->parent_bus, dev); 1243 object_unref(OBJECT(dev->parent_bus)); 1244 dev->parent_bus = NULL; 1245 } 1246 1247 /* Only send event if the device had been completely realized */ 1248 if (dev->pending_deleted_event) { 1249 gchar *path = object_get_canonical_path(OBJECT(dev)); 1250 1251 qapi_event_send_device_deleted(!!dev->id, dev->id, path, &error_abort); 1252 g_free(path); 1253 } 1254 } 1255 1256 static void device_class_init(ObjectClass *class, void *data) 1257 { 1258 DeviceClass *dc = DEVICE_CLASS(class); 1259 1260 class->unparent = device_unparent; 1261 dc->realize = device_realize; 1262 dc->unrealize = device_unrealize; 1263 1264 /* by default all devices were considered as hotpluggable, 1265 * so with intent to check it in generic qdev_unplug() / 1266 * device_set_realized() functions make every device 1267 * hotpluggable. Devices that shouldn't be hotpluggable, 1268 * should override it in their class_init() 1269 */ 1270 dc->hotpluggable = true; 1271 } 1272 1273 void device_reset(DeviceState *dev) 1274 { 1275 DeviceClass *klass = DEVICE_GET_CLASS(dev); 1276 1277 if (klass->reset) { 1278 klass->reset(dev); 1279 } 1280 } 1281 1282 Object *qdev_get_machine(void) 1283 { 1284 static Object *dev; 1285 1286 if (dev == NULL) { 1287 dev = container_get(object_get_root(), "/machine"); 1288 } 1289 1290 return dev; 1291 } 1292 1293 static const TypeInfo device_type_info = { 1294 .name = TYPE_DEVICE, 1295 .parent = TYPE_OBJECT, 1296 .instance_size = sizeof(DeviceState), 1297 .instance_init = device_initfn, 1298 .instance_post_init = device_post_init, 1299 .instance_finalize = device_finalize, 1300 .class_base_init = device_class_base_init, 1301 .class_init = device_class_init, 1302 .abstract = true, 1303 .class_size = sizeof(DeviceClass), 1304 }; 1305 1306 static void qbus_initfn(Object *obj) 1307 { 1308 BusState *bus = BUS(obj); 1309 1310 QTAILQ_INIT(&bus->children); 1311 object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY, 1312 TYPE_HOTPLUG_HANDLER, 1313 (Object **)&bus->hotplug_handler, 1314 object_property_allow_set_link, 1315 OBJ_PROP_LINK_UNREF_ON_RELEASE, 1316 NULL); 1317 object_property_add_bool(obj, "realized", 1318 bus_get_realized, bus_set_realized, NULL); 1319 } 1320 1321 static char *default_bus_get_fw_dev_path(DeviceState *dev) 1322 { 1323 return g_strdup(object_get_typename(OBJECT(dev))); 1324 } 1325 1326 static void bus_class_init(ObjectClass *class, void *data) 1327 { 1328 BusClass *bc = BUS_CLASS(class); 1329 1330 class->unparent = bus_unparent; 1331 bc->get_fw_dev_path = default_bus_get_fw_dev_path; 1332 } 1333 1334 static void qbus_finalize(Object *obj) 1335 { 1336 BusState *bus = BUS(obj); 1337 1338 g_free((char *)bus->name); 1339 } 1340 1341 static const TypeInfo bus_info = { 1342 .name = TYPE_BUS, 1343 .parent = TYPE_OBJECT, 1344 .instance_size = sizeof(BusState), 1345 .abstract = true, 1346 .class_size = sizeof(BusClass), 1347 .instance_init = qbus_initfn, 1348 .instance_finalize = qbus_finalize, 1349 .class_init = bus_class_init, 1350 }; 1351 1352 static void qdev_register_types(void) 1353 { 1354 type_register_static(&bus_info); 1355 type_register_static(&device_type_info); 1356 } 1357 1358 type_init(qdev_register_types) 1359