xref: /openbmc/qemu/hw/usb/bus.c (revision 1cf9412b)
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         qdev_free(&port->dev->qdev);
361     QTAILQ_REMOVE(&bus->free, port, next);
362     bus->nfree--;
363 }
364 
365 int usb_claim_port(USBDevice *dev)
366 {
367     USBBus *bus = usb_bus_from_device(dev);
368     USBPort *port;
369 
370     assert(dev->port == NULL);
371 
372     if (dev->port_path) {
373         QTAILQ_FOREACH(port, &bus->free, next) {
374             if (strcmp(port->path, dev->port_path) == 0) {
375                 break;
376             }
377         }
378         if (port == NULL) {
379             error_report("Error: usb port %s (bus %s) not found (in use?)",
380                          dev->port_path, bus->qbus.name);
381             return -1;
382         }
383     } else {
384         if (bus->nfree == 1 && strcmp(object_get_typename(OBJECT(dev)), "usb-hub") != 0) {
385             /* Create a new hub and chain it on */
386             usb_create_simple(bus, "usb-hub");
387         }
388         if (bus->nfree == 0) {
389             error_report("Error: tried to attach usb device %s to a bus "
390                          "with no free ports", dev->product_desc);
391             return -1;
392         }
393         port = QTAILQ_FIRST(&bus->free);
394     }
395     trace_usb_port_claim(bus->busnr, port->path);
396 
397     QTAILQ_REMOVE(&bus->free, port, next);
398     bus->nfree--;
399 
400     dev->port = port;
401     port->dev = dev;
402 
403     QTAILQ_INSERT_TAIL(&bus->used, port, next);
404     bus->nused++;
405     return 0;
406 }
407 
408 void usb_release_port(USBDevice *dev)
409 {
410     USBBus *bus = usb_bus_from_device(dev);
411     USBPort *port = dev->port;
412 
413     assert(port != NULL);
414     trace_usb_port_release(bus->busnr, port->path);
415 
416     QTAILQ_REMOVE(&bus->used, port, next);
417     bus->nused--;
418 
419     dev->port = NULL;
420     port->dev = NULL;
421 
422     QTAILQ_INSERT_TAIL(&bus->free, port, next);
423     bus->nfree++;
424 }
425 
426 static void usb_mask_to_str(char *dest, size_t size,
427                             unsigned int speedmask)
428 {
429     static const struct {
430         unsigned int mask;
431         const char *name;
432     } speeds[] = {
433         { .mask = USB_SPEED_MASK_FULL,  .name = "full"  },
434         { .mask = USB_SPEED_MASK_HIGH,  .name = "high"  },
435         { .mask = USB_SPEED_MASK_SUPER, .name = "super" },
436     };
437     int i, pos = 0;
438 
439     for (i = 0; i < ARRAY_SIZE(speeds); i++) {
440         if (speeds[i].mask & speedmask) {
441             pos += snprintf(dest + pos, size - pos, "%s%s",
442                             pos ? "+" : "",
443                             speeds[i].name);
444         }
445     }
446 }
447 
448 int usb_device_attach(USBDevice *dev)
449 {
450     USBBus *bus = usb_bus_from_device(dev);
451     USBPort *port = dev->port;
452     char devspeed[32], portspeed[32];
453 
454     assert(port != NULL);
455     assert(!dev->attached);
456     usb_mask_to_str(devspeed, sizeof(devspeed), dev->speedmask);
457     usb_mask_to_str(portspeed, sizeof(portspeed), port->speedmask);
458     trace_usb_port_attach(bus->busnr, port->path,
459                           devspeed, portspeed);
460 
461     if (!(port->speedmask & dev->speedmask)) {
462         error_report("Warning: speed mismatch trying to attach"
463                      " usb device \"%s\" (%s speed)"
464                      " to bus \"%s\", port \"%s\" (%s speed)",
465                      dev->product_desc, devspeed,
466                      bus->qbus.name, port->path, portspeed);
467         return -1;
468     }
469 
470     dev->attached++;
471     usb_attach(port);
472 
473     return 0;
474 }
475 
476 int usb_device_detach(USBDevice *dev)
477 {
478     USBBus *bus = usb_bus_from_device(dev);
479     USBPort *port = dev->port;
480 
481     assert(port != NULL);
482     assert(dev->attached);
483     trace_usb_port_detach(bus->busnr, port->path);
484 
485     usb_detach(port);
486     dev->attached--;
487     return 0;
488 }
489 
490 int usb_device_delete_addr(int busnr, int addr)
491 {
492     USBBus *bus;
493     USBPort *port;
494     USBDevice *dev;
495 
496     bus = usb_bus_find(busnr);
497     if (!bus)
498         return -1;
499 
500     QTAILQ_FOREACH(port, &bus->used, next) {
501         if (port->dev->addr == addr)
502             break;
503     }
504     if (!port)
505         return -1;
506     dev = port->dev;
507 
508     qdev_free(&dev->qdev);
509     return 0;
510 }
511 
512 static const char *usb_speed(unsigned int speed)
513 {
514     static const char *txt[] = {
515         [ USB_SPEED_LOW  ] = "1.5",
516         [ USB_SPEED_FULL ] = "12",
517         [ USB_SPEED_HIGH ] = "480",
518         [ USB_SPEED_SUPER ] = "5000",
519     };
520     if (speed >= ARRAY_SIZE(txt))
521         return "?";
522     return txt[speed];
523 }
524 
525 static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
526 {
527     USBDevice *dev = USB_DEVICE(qdev);
528     USBBus *bus = usb_bus_from_device(dev);
529 
530     monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n",
531                    indent, "", bus->busnr, dev->addr,
532                    dev->port ? dev->port->path : "-",
533                    usb_speed(dev->speed), dev->product_desc,
534                    dev->attached ? ", attached" : "");
535 }
536 
537 static char *usb_get_dev_path(DeviceState *qdev)
538 {
539     USBDevice *dev = USB_DEVICE(qdev);
540     DeviceState *hcd = qdev->parent_bus->parent;
541     char *id = NULL;
542 
543     if (dev->flags & (1 << USB_DEV_FLAG_FULL_PATH)) {
544         id = qdev_get_dev_path(hcd);
545     }
546     if (id) {
547         char *ret = g_strdup_printf("%s/%s", id, dev->port->path);
548         g_free(id);
549         return ret;
550     } else {
551         return g_strdup(dev->port->path);
552     }
553 }
554 
555 static char *usb_get_fw_dev_path(DeviceState *qdev)
556 {
557     USBDevice *dev = USB_DEVICE(qdev);
558     char *fw_path, *in;
559     ssize_t pos = 0, fw_len;
560     long nr;
561 
562     fw_len = 32 + strlen(dev->port->path) * 6;
563     fw_path = g_malloc(fw_len);
564     in = dev->port->path;
565     while (fw_len - pos > 0) {
566         nr = strtol(in, &in, 10);
567         if (in[0] == '.') {
568             /* some hub between root port and device */
569             pos += snprintf(fw_path + pos, fw_len - pos, "hub@%ld/", nr);
570             in++;
571         } else {
572             /* the device itself */
573             pos += snprintf(fw_path + pos, fw_len - pos, "%s@%ld",
574                             qdev_fw_name(qdev), nr);
575             break;
576         }
577     }
578     return fw_path;
579 }
580 
581 void usb_info(Monitor *mon, const QDict *qdict)
582 {
583     USBBus *bus;
584     USBDevice *dev;
585     USBPort *port;
586 
587     if (QTAILQ_EMPTY(&busses)) {
588         monitor_printf(mon, "USB support not enabled\n");
589         return;
590     }
591 
592     QTAILQ_FOREACH(bus, &busses, next) {
593         QTAILQ_FOREACH(port, &bus->used, next) {
594             dev = port->dev;
595             if (!dev)
596                 continue;
597             monitor_printf(mon, "  Device %d.%d, Port %s, Speed %s Mb/s, Product %s\n",
598                            bus->busnr, dev->addr, port->path, usb_speed(dev->speed),
599                            dev->product_desc);
600         }
601     }
602 }
603 
604 /* handle legacy -usbdevice cmd line option */
605 USBDevice *usbdevice_create(const char *cmdline)
606 {
607     USBBus *bus = usb_bus_find(-1 /* any */);
608     LegacyUSBFactory *f = NULL;
609     GSList *i;
610     char driver[32];
611     const char *params;
612     int len;
613 
614     params = strchr(cmdline,':');
615     if (params) {
616         params++;
617         len = params - cmdline;
618         if (len > sizeof(driver))
619             len = sizeof(driver);
620         pstrcpy(driver, len, cmdline);
621     } else {
622         params = "";
623         pstrcpy(driver, sizeof(driver), cmdline);
624     }
625 
626     for (i = legacy_usb_factory; i; i = i->next) {
627         f = i->data;
628         if (strcmp(f->usbdevice_name, driver) == 0) {
629             break;
630         }
631     }
632     if (i == NULL) {
633 #if 0
634         /* no error because some drivers are not converted (yet) */
635         error_report("usbdevice %s not found", driver);
636 #endif
637         return NULL;
638     }
639 
640     if (!bus) {
641         error_report("Error: no usb bus to attach usbdevice %s, "
642                      "please try -machine usb=on and check that "
643                      "the machine model supports USB", driver);
644         return NULL;
645     }
646 
647     if (!f->usbdevice_init) {
648         if (*params) {
649             error_report("usbdevice %s accepts no params", driver);
650             return NULL;
651         }
652         return usb_create_simple(bus, f->name);
653     }
654     return f->usbdevice_init(bus, params);
655 }
656 
657 static void usb_device_class_init(ObjectClass *klass, void *data)
658 {
659     DeviceClass *k = DEVICE_CLASS(klass);
660     k->bus_type = TYPE_USB_BUS;
661     k->init     = usb_qdev_init;
662     k->unplug   = qdev_simple_unplug_cb;
663     k->exit     = usb_qdev_exit;
664     k->props    = usb_props;
665 }
666 
667 static const TypeInfo usb_device_type_info = {
668     .name = TYPE_USB_DEVICE,
669     .parent = TYPE_DEVICE,
670     .instance_size = sizeof(USBDevice),
671     .abstract = true,
672     .class_size = sizeof(USBDeviceClass),
673     .class_init = usb_device_class_init,
674 };
675 
676 static void usb_register_types(void)
677 {
678     type_register_static(&usb_bus_info);
679     type_register_static(&usb_device_type_info);
680 }
681 
682 type_init(usb_register_types)
683