bus.c 16 KB

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