1 #include "hw/hw.h" 2 #include "hw/usb.h" 3 #include "hw/qdev.h" 4 #include "sysemu/sysemu.h" 5 #include "monitor/monitor.h" 6 #include "trace.h" 7 8 static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent); 9 10 static char *usb_get_dev_path(DeviceState *dev); 11 static char *usb_get_fw_dev_path(DeviceState *qdev); 12 static int usb_qdev_exit(DeviceState *qdev); 13 14 static Property usb_props[] = { 15 DEFINE_PROP_STRING("port", USBDevice, port_path), 16 DEFINE_PROP_STRING("serial", USBDevice, serial), 17 DEFINE_PROP_BIT("full-path", USBDevice, flags, 18 USB_DEV_FLAG_FULL_PATH, true), 19 DEFINE_PROP_END_OF_LIST() 20 }; 21 22 static void usb_bus_class_init(ObjectClass *klass, void *data) 23 { 24 BusClass *k = BUS_CLASS(klass); 25 26 k->print_dev = usb_bus_dev_print; 27 k->get_dev_path = usb_get_dev_path; 28 k->get_fw_dev_path = usb_get_fw_dev_path; 29 } 30 31 static const TypeInfo usb_bus_info = { 32 .name = TYPE_USB_BUS, 33 .parent = TYPE_BUS, 34 .instance_size = sizeof(USBBus), 35 .class_init = usb_bus_class_init, 36 }; 37 38 static int next_usb_bus = 0; 39 static QTAILQ_HEAD(, USBBus) busses = QTAILQ_HEAD_INITIALIZER(busses); 40 41 static int usb_device_post_load(void *opaque, int version_id) 42 { 43 USBDevice *dev = opaque; 44 45 if (dev->state == USB_STATE_NOTATTACHED) { 46 dev->attached = 0; 47 } else { 48 dev->attached = 1; 49 } 50 if (dev->setup_index >= sizeof(dev->data_buf) || 51 dev->setup_len >= sizeof(dev->data_buf)) { 52 return -EINVAL; 53 } 54 return 0; 55 } 56 57 const VMStateDescription vmstate_usb_device = { 58 .name = "USBDevice", 59 .version_id = 1, 60 .minimum_version_id = 1, 61 .post_load = usb_device_post_load, 62 .fields = (VMStateField []) { 63 VMSTATE_UINT8(addr, USBDevice), 64 VMSTATE_INT32(state, USBDevice), 65 VMSTATE_INT32(remote_wakeup, USBDevice), 66 VMSTATE_INT32(setup_state, USBDevice), 67 VMSTATE_INT32(setup_len, USBDevice), 68 VMSTATE_INT32(setup_index, USBDevice), 69 VMSTATE_UINT8_ARRAY(setup_buf, USBDevice, 8), 70 VMSTATE_END_OF_LIST(), 71 } 72 }; 73 74 void usb_bus_new(USBBus *bus, size_t bus_size, 75 USBBusOps *ops, DeviceState *host) 76 { 77 qbus_create_inplace(bus, bus_size, TYPE_USB_BUS, host, NULL); 78 bus->ops = ops; 79 bus->busnr = next_usb_bus++; 80 bus->qbus.allow_hotplug = 1; /* Yes, we can */ 81 QTAILQ_INIT(&bus->free); 82 QTAILQ_INIT(&bus->used); 83 QTAILQ_INSERT_TAIL(&busses, bus, next); 84 } 85 86 USBBus *usb_bus_find(int busnr) 87 { 88 USBBus *bus; 89 90 if (-1 == busnr) 91 return QTAILQ_FIRST(&busses); 92 QTAILQ_FOREACH(bus, &busses, next) { 93 if (bus->busnr == busnr) 94 return bus; 95 } 96 return NULL; 97 } 98 99 static int usb_device_init(USBDevice *dev) 100 { 101 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 102 if (klass->init) { 103 return klass->init(dev); 104 } 105 return 0; 106 } 107 108 USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr) 109 { 110 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 111 if (klass->find_device) { 112 return klass->find_device(dev, addr); 113 } 114 return NULL; 115 } 116 117 static void usb_device_handle_destroy(USBDevice *dev) 118 { 119 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 120 if (klass->handle_destroy) { 121 klass->handle_destroy(dev); 122 } 123 } 124 125 void usb_device_cancel_packet(USBDevice *dev, USBPacket *p) 126 { 127 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 128 if (klass->cancel_packet) { 129 klass->cancel_packet(dev, p); 130 } 131 } 132 133 void usb_device_handle_attach(USBDevice *dev) 134 { 135 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 136 if (klass->handle_attach) { 137 klass->handle_attach(dev); 138 } 139 } 140 141 void usb_device_handle_reset(USBDevice *dev) 142 { 143 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 144 if (klass->handle_reset) { 145 klass->handle_reset(dev); 146 } 147 } 148 149 void usb_device_handle_control(USBDevice *dev, USBPacket *p, int request, 150 int value, int index, int length, uint8_t *data) 151 { 152 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 153 if (klass->handle_control) { 154 klass->handle_control(dev, p, request, value, index, length, data); 155 } 156 } 157 158 void usb_device_handle_data(USBDevice *dev, USBPacket *p) 159 { 160 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 161 if (klass->handle_data) { 162 klass->handle_data(dev, p); 163 } 164 } 165 166 const char *usb_device_get_product_desc(USBDevice *dev) 167 { 168 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 169 return klass->product_desc; 170 } 171 172 const USBDesc *usb_device_get_usb_desc(USBDevice *dev) 173 { 174 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 175 if (dev->usb_desc) { 176 return dev->usb_desc; 177 } 178 return klass->usb_desc; 179 } 180 181 void usb_device_set_interface(USBDevice *dev, int interface, 182 int alt_old, int alt_new) 183 { 184 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 185 if (klass->set_interface) { 186 klass->set_interface(dev, interface, alt_old, alt_new); 187 } 188 } 189 190 void usb_device_flush_ep_queue(USBDevice *dev, USBEndpoint *ep) 191 { 192 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 193 if (klass->flush_ep_queue) { 194 klass->flush_ep_queue(dev, ep); 195 } 196 } 197 198 void usb_device_ep_stopped(USBDevice *dev, USBEndpoint *ep) 199 { 200 USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev); 201 if (klass->ep_stopped) { 202 klass->ep_stopped(dev, ep); 203 } 204 } 205 206 static int usb_qdev_init(DeviceState *qdev) 207 { 208 USBDevice *dev = USB_DEVICE(qdev); 209 int rc; 210 211 pstrcpy(dev->product_desc, sizeof(dev->product_desc), 212 usb_device_get_product_desc(dev)); 213 dev->auto_attach = 1; 214 QLIST_INIT(&dev->strings); 215 usb_ep_init(dev); 216 rc = usb_claim_port(dev); 217 if (rc != 0) { 218 return rc; 219 } 220 rc = usb_device_init(dev); 221 if (rc != 0) { 222 usb_release_port(dev); 223 return rc; 224 } 225 if (dev->auto_attach) { 226 rc = usb_device_attach(dev); 227 if (rc != 0) { 228 usb_qdev_exit(qdev); 229 return rc; 230 } 231 } 232 return 0; 233 } 234 235 static int usb_qdev_exit(DeviceState *qdev) 236 { 237 USBDevice *dev = USB_DEVICE(qdev); 238 239 if (dev->attached) { 240 usb_device_detach(dev); 241 } 242 usb_device_handle_destroy(dev); 243 if (dev->port) { 244 usb_release_port(dev); 245 } 246 return 0; 247 } 248 249 typedef struct LegacyUSBFactory 250 { 251 const char *name; 252 const char *usbdevice_name; 253 USBDevice *(*usbdevice_init)(USBBus *bus, const char *params); 254 } LegacyUSBFactory; 255 256 static GSList *legacy_usb_factory; 257 258 void usb_legacy_register(const char *typename, const char *usbdevice_name, 259 USBDevice *(*usbdevice_init)(USBBus *bus, 260 const char *params)) 261 { 262 if (usbdevice_name) { 263 LegacyUSBFactory *f = g_malloc0(sizeof(*f)); 264 f->name = typename; 265 f->usbdevice_name = usbdevice_name; 266 f->usbdevice_init = usbdevice_init; 267 legacy_usb_factory = g_slist_append(legacy_usb_factory, f); 268 } 269 } 270 271 USBDevice *usb_create(USBBus *bus, const char *name) 272 { 273 DeviceState *dev; 274 275 dev = qdev_create(&bus->qbus, name); 276 return USB_DEVICE(dev); 277 } 278 279 USBDevice *usb_create_simple(USBBus *bus, const char *name) 280 { 281 USBDevice *dev = usb_create(bus, name); 282 int rc; 283 284 if (!dev) { 285 error_report("Failed to create USB device '%s'", name); 286 return NULL; 287 } 288 rc = qdev_init(&dev->qdev); 289 if (rc < 0) { 290 error_report("Failed to initialize USB device '%s'", name); 291 return NULL; 292 } 293 return dev; 294 } 295 296 static void usb_fill_port(USBPort *port, void *opaque, int index, 297 USBPortOps *ops, int speedmask) 298 { 299 port->opaque = opaque; 300 port->index = index; 301 port->ops = ops; 302 port->speedmask = speedmask; 303 usb_port_location(port, NULL, index + 1); 304 } 305 306 void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index, 307 USBPortOps *ops, int speedmask) 308 { 309 usb_fill_port(port, opaque, index, ops, speedmask); 310 QTAILQ_INSERT_TAIL(&bus->free, port, next); 311 bus->nfree++; 312 } 313 314 int usb_register_companion(const char *masterbus, USBPort *ports[], 315 uint32_t portcount, uint32_t firstport, 316 void *opaque, USBPortOps *ops, int speedmask) 317 { 318 USBBus *bus; 319 int i; 320 321 QTAILQ_FOREACH(bus, &busses, next) { 322 if (strcmp(bus->qbus.name, masterbus) == 0) { 323 break; 324 } 325 } 326 327 if (!bus || !bus->ops->register_companion) { 328 qerror_report(QERR_INVALID_PARAMETER_VALUE, "masterbus", 329 "an USB masterbus"); 330 if (bus) { 331 error_printf_unless_qmp( 332 "USB bus '%s' does not allow companion controllers\n", 333 masterbus); 334 } 335 return -1; 336 } 337 338 for (i = 0; i < portcount; i++) { 339 usb_fill_port(ports[i], opaque, i, ops, speedmask); 340 } 341 342 return bus->ops->register_companion(bus, ports, portcount, firstport); 343 } 344 345 void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr) 346 { 347 if (upstream) { 348 snprintf(downstream->path, sizeof(downstream->path), "%s.%d", 349 upstream->path, portnr); 350 downstream->hubcount = upstream->hubcount + 1; 351 } else { 352 snprintf(downstream->path, sizeof(downstream->path), "%d", portnr); 353 downstream->hubcount = 0; 354 } 355 } 356 357 void usb_unregister_port(USBBus *bus, USBPort *port) 358 { 359 if (port->dev) { 360 object_unparent(OBJECT(port->dev)); 361 } 362 QTAILQ_REMOVE(&bus->free, port, next); 363 bus->nfree--; 364 } 365 366 int usb_claim_port(USBDevice *dev) 367 { 368 USBBus *bus = usb_bus_from_device(dev); 369 USBPort *port; 370 371 assert(dev->port == NULL); 372 373 if (dev->port_path) { 374 QTAILQ_FOREACH(port, &bus->free, next) { 375 if (strcmp(port->path, dev->port_path) == 0) { 376 break; 377 } 378 } 379 if (port == NULL) { 380 error_report("Error: usb port %s (bus %s) not found (in use?)", 381 dev->port_path, bus->qbus.name); 382 return -1; 383 } 384 } else { 385 if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) { 386 /* Create a new hub and chain it on */ 387 usb_create_simple(bus, "usb-hub"); 388 } 389 if (bus->nfree == 0) { 390 error_report("Error: tried to attach usb device %s to a bus " 391 "with no free ports", dev->product_desc); 392 return -1; 393 } 394 port = QTAILQ_FIRST(&bus->free); 395 } 396 trace_usb_port_claim(bus->busnr, port->path); 397 398 QTAILQ_REMOVE(&bus->free, port, next); 399 bus->nfree--; 400 401 dev->port = port; 402 port->dev = dev; 403 404 QTAILQ_INSERT_TAIL(&bus->used, port, next); 405 bus->nused++; 406 return 0; 407 } 408 409 void usb_release_port(USBDevice *dev) 410 { 411 USBBus *bus = usb_bus_from_device(dev); 412 USBPort *port = dev->port; 413 414 assert(port != NULL); 415 trace_usb_port_release(bus->busnr, port->path); 416 417 QTAILQ_REMOVE(&bus->used, port, next); 418 bus->nused--; 419 420 dev->port = NULL; 421 port->dev = NULL; 422 423 QTAILQ_INSERT_TAIL(&bus->free, port, next); 424 bus->nfree++; 425 } 426 427 static void usb_mask_to_str(char *dest, size_t size, 428 unsigned int speedmask) 429 { 430 static const struct { 431 unsigned int mask; 432 const char *name; 433 } speeds[] = { 434 { .mask = USB_SPEED_MASK_FULL, .name = "full" }, 435 { .mask = USB_SPEED_MASK_HIGH, .name = "high" }, 436 { .mask = USB_SPEED_MASK_SUPER, .name = "super" }, 437 }; 438 int i, pos = 0; 439 440 for (i = 0; i < ARRAY_SIZE(speeds); i++) { 441 if (speeds[i].mask & speedmask) { 442 pos += snprintf(dest + pos, size - pos, "%s%s", 443 pos ? "+" : "", 444 speeds[i].name); 445 } 446 } 447 } 448 449 int usb_device_attach(USBDevice *dev) 450 { 451 USBBus *bus = usb_bus_from_device(dev); 452 USBPort *port = dev->port; 453 char devspeed[32], portspeed[32]; 454 455 assert(port != NULL); 456 assert(!dev->attached); 457 usb_mask_to_str(devspeed, sizeof(devspeed), dev->speedmask); 458 usb_mask_to_str(portspeed, sizeof(portspeed), port->speedmask); 459 trace_usb_port_attach(bus->busnr, port->path, 460 devspeed, portspeed); 461 462 if (!(port->speedmask & dev->speedmask)) { 463 error_report("Warning: speed mismatch trying to attach" 464 " usb device \"%s\" (%s speed)" 465 " to bus \"%s\", port \"%s\" (%s speed)", 466 dev->product_desc, devspeed, 467 bus->qbus.name, port->path, portspeed); 468 return -1; 469 } 470 471 dev->attached++; 472 usb_attach(port); 473 474 return 0; 475 } 476 477 int usb_device_detach(USBDevice *dev) 478 { 479 USBBus *bus = usb_bus_from_device(dev); 480 USBPort *port = dev->port; 481 482 assert(port != NULL); 483 assert(dev->attached); 484 trace_usb_port_detach(bus->busnr, port->path); 485 486 usb_detach(port); 487 dev->attached--; 488 return 0; 489 } 490 491 int usb_device_delete_addr(int busnr, int addr) 492 { 493 USBBus *bus; 494 USBPort *port; 495 USBDevice *dev; 496 497 bus = usb_bus_find(busnr); 498 if (!bus) 499 return -1; 500 501 QTAILQ_FOREACH(port, &bus->used, next) { 502 if (port->dev->addr == addr) 503 break; 504 } 505 if (!port) 506 return -1; 507 dev = port->dev; 508 509 object_unparent(OBJECT(dev)); 510 return 0; 511 } 512 513 static const char *usb_speed(unsigned int speed) 514 { 515 static const char *txt[] = { 516 [ USB_SPEED_LOW ] = "1.5", 517 [ USB_SPEED_FULL ] = "12", 518 [ USB_SPEED_HIGH ] = "480", 519 [ USB_SPEED_SUPER ] = "5000", 520 }; 521 if (speed >= ARRAY_SIZE(txt)) 522 return "?"; 523 return txt[speed]; 524 } 525 526 static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent) 527 { 528 USBDevice *dev = USB_DEVICE(qdev); 529 USBBus *bus = usb_bus_from_device(dev); 530 531 monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n", 532 indent, "", bus->busnr, dev->addr, 533 dev->port ? dev->port->path : "-", 534 usb_speed(dev->speed), dev->product_desc, 535 dev->attached ? ", attached" : ""); 536 } 537 538 static char *usb_get_dev_path(DeviceState *qdev) 539 { 540 USBDevice *dev = USB_DEVICE(qdev); 541 DeviceState *hcd = qdev->parent_bus->parent; 542 char *id = NULL; 543 544 if (dev->flags & (1 << USB_DEV_FLAG_FULL_PATH)) { 545 id = qdev_get_dev_path(hcd); 546 } 547 if (id) { 548 char *ret = g_strdup_printf("%s/%s", id, dev->port->path); 549 g_free(id); 550 return ret; 551 } else { 552 return g_strdup(dev->port->path); 553 } 554 } 555 556 static char *usb_get_fw_dev_path(DeviceState *qdev) 557 { 558 USBDevice *dev = USB_DEVICE(qdev); 559 char *fw_path, *in; 560 ssize_t pos = 0, fw_len; 561 long nr; 562 563 fw_len = 32 + strlen(dev->port->path) * 6; 564 fw_path = g_malloc(fw_len); 565 in = dev->port->path; 566 while (fw_len - pos > 0) { 567 nr = strtol(in, &in, 10); 568 if (in[0] == '.') { 569 /* some hub between root port and device */ 570 pos += snprintf(fw_path + pos, fw_len - pos, "hub@%ld/", nr); 571 in++; 572 } else { 573 /* the device itself */ 574 pos += snprintf(fw_path + pos, fw_len - pos, "%s@%ld", 575 qdev_fw_name(qdev), nr); 576 break; 577 } 578 } 579 return fw_path; 580 } 581 582 void usb_info(Monitor *mon, const QDict *qdict) 583 { 584 USBBus *bus; 585 USBDevice *dev; 586 USBPort *port; 587 588 if (QTAILQ_EMPTY(&busses)) { 589 monitor_printf(mon, "USB support not enabled\n"); 590 return; 591 } 592 593 QTAILQ_FOREACH(bus, &busses, next) { 594 QTAILQ_FOREACH(port, &bus->used, next) { 595 dev = port->dev; 596 if (!dev) 597 continue; 598 monitor_printf(mon, " Device %d.%d, Port %s, Speed %s Mb/s, Product %s\n", 599 bus->busnr, dev->addr, port->path, usb_speed(dev->speed), 600 dev->product_desc); 601 } 602 } 603 } 604 605 /* handle legacy -usbdevice cmd line option */ 606 USBDevice *usbdevice_create(const char *cmdline) 607 { 608 USBBus *bus = usb_bus_find(-1 /* any */); 609 LegacyUSBFactory *f = NULL; 610 GSList *i; 611 char driver[32]; 612 const char *params; 613 int len; 614 615 params = strchr(cmdline,':'); 616 if (params) { 617 params++; 618 len = params - cmdline; 619 if (len > sizeof(driver)) 620 len = sizeof(driver); 621 pstrcpy(driver, len, cmdline); 622 } else { 623 params = ""; 624 pstrcpy(driver, sizeof(driver), cmdline); 625 } 626 627 for (i = legacy_usb_factory; i; i = i->next) { 628 f = i->data; 629 if (strcmp(f->usbdevice_name, driver) == 0) { 630 break; 631 } 632 } 633 if (i == NULL) { 634 #if 0 635 /* no error because some drivers are not converted (yet) */ 636 error_report("usbdevice %s not found", driver); 637 #endif 638 return NULL; 639 } 640 641 if (!bus) { 642 error_report("Error: no usb bus to attach usbdevice %s, " 643 "please try -machine usb=on and check that " 644 "the machine model supports USB", driver); 645 return NULL; 646 } 647 648 if (!f->usbdevice_init) { 649 if (*params) { 650 error_report("usbdevice %s accepts no params", driver); 651 return NULL; 652 } 653 return usb_create_simple(bus, f->name); 654 } 655 return f->usbdevice_init(bus, params); 656 } 657 658 static void usb_device_class_init(ObjectClass *klass, void *data) 659 { 660 DeviceClass *k = DEVICE_CLASS(klass); 661 k->bus_type = TYPE_USB_BUS; 662 k->init = usb_qdev_init; 663 k->unplug = qdev_simple_unplug_cb; 664 k->exit = usb_qdev_exit; 665 k->props = usb_props; 666 } 667 668 static const TypeInfo usb_device_type_info = { 669 .name = TYPE_USB_DEVICE, 670 .parent = TYPE_DEVICE, 671 .instance_size = sizeof(USBDevice), 672 .abstract = true, 673 .class_size = sizeof(USBDeviceClass), 674 .class_init = usb_device_class_init, 675 }; 676 677 static void usb_register_types(void) 678 { 679 type_register_static(&usb_bus_info); 680 type_register_static(&usb_device_type_info); 681 } 682 683 type_init(usb_register_types) 684