usb-uhci.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285
  1. /*
  2. * USB UHCI controller emulation
  3. *
  4. * Copyright (c) 2005 Fabrice Bellard
  5. *
  6. * Copyright (c) 2008 Max Krasnyansky
  7. * Magor rewrite of the UHCI data structures parser and frame processor
  8. * Support for fully async operation and multiple outstanding transactions
  9. *
  10. * Permission is hereby granted, free of charge, to any person obtaining a copy
  11. * of this software and associated documentation files (the "Software"), to deal
  12. * in the Software without restriction, including without limitation the rights
  13. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  14. * copies of the Software, and to permit persons to whom the Software is
  15. * furnished to do so, subject to the following conditions:
  16. *
  17. * The above copyright notice and this permission notice shall be included in
  18. * all copies or substantial portions of the Software.
  19. *
  20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  23. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  24. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  25. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  26. * THE SOFTWARE.
  27. */
  28. #include "hw.h"
  29. #include "usb.h"
  30. #include "pci.h"
  31. #include "qemu-timer.h"
  32. #include "usb-uhci.h"
  33. #include "iov.h"
  34. #include "dma.h"
  35. //#define DEBUG
  36. //#define DEBUG_DUMP_DATA
  37. #define UHCI_CMD_FGR (1 << 4)
  38. #define UHCI_CMD_EGSM (1 << 3)
  39. #define UHCI_CMD_GRESET (1 << 2)
  40. #define UHCI_CMD_HCRESET (1 << 1)
  41. #define UHCI_CMD_RS (1 << 0)
  42. #define UHCI_STS_HCHALTED (1 << 5)
  43. #define UHCI_STS_HCPERR (1 << 4)
  44. #define UHCI_STS_HSERR (1 << 3)
  45. #define UHCI_STS_RD (1 << 2)
  46. #define UHCI_STS_USBERR (1 << 1)
  47. #define UHCI_STS_USBINT (1 << 0)
  48. #define TD_CTRL_SPD (1 << 29)
  49. #define TD_CTRL_ERROR_SHIFT 27
  50. #define TD_CTRL_IOS (1 << 25)
  51. #define TD_CTRL_IOC (1 << 24)
  52. #define TD_CTRL_ACTIVE (1 << 23)
  53. #define TD_CTRL_STALL (1 << 22)
  54. #define TD_CTRL_BABBLE (1 << 20)
  55. #define TD_CTRL_NAK (1 << 19)
  56. #define TD_CTRL_TIMEOUT (1 << 18)
  57. #define UHCI_PORT_SUSPEND (1 << 12)
  58. #define UHCI_PORT_RESET (1 << 9)
  59. #define UHCI_PORT_LSDA (1 << 8)
  60. #define UHCI_PORT_RD (1 << 6)
  61. #define UHCI_PORT_ENC (1 << 3)
  62. #define UHCI_PORT_EN (1 << 2)
  63. #define UHCI_PORT_CSC (1 << 1)
  64. #define UHCI_PORT_CCS (1 << 0)
  65. #define UHCI_PORT_READ_ONLY (0x1bb)
  66. #define UHCI_PORT_WRITE_CLEAR (UHCI_PORT_CSC | UHCI_PORT_ENC)
  67. #define FRAME_TIMER_FREQ 1000
  68. #define FRAME_MAX_LOOPS 100
  69. #define NB_PORTS 2
  70. #ifdef DEBUG
  71. #define DPRINTF printf
  72. static const char *pid2str(int pid)
  73. {
  74. switch (pid) {
  75. case USB_TOKEN_SETUP: return "SETUP";
  76. case USB_TOKEN_IN: return "IN";
  77. case USB_TOKEN_OUT: return "OUT";
  78. }
  79. return "?";
  80. }
  81. #else
  82. #define DPRINTF(...)
  83. #endif
  84. #ifdef DEBUG_DUMP_DATA
  85. static void dump_data(USBPacket *p, int ret)
  86. {
  87. iov_hexdump(p->iov.iov, p->iov.niov, stderr, "uhci", ret);
  88. }
  89. #else
  90. static void dump_data(USBPacket *p, int ret) {}
  91. #endif
  92. typedef struct UHCIState UHCIState;
  93. /*
  94. * Pending async transaction.
  95. * 'packet' must be the first field because completion
  96. * handler does "(UHCIAsync *) pkt" cast.
  97. */
  98. typedef struct UHCIAsync {
  99. USBPacket packet;
  100. QEMUSGList sgl;
  101. UHCIState *uhci;
  102. QTAILQ_ENTRY(UHCIAsync) next;
  103. uint32_t td;
  104. uint32_t token;
  105. int8_t valid;
  106. uint8_t isoc;
  107. uint8_t done;
  108. } UHCIAsync;
  109. typedef struct UHCIPort {
  110. USBPort port;
  111. uint16_t ctrl;
  112. } UHCIPort;
  113. struct UHCIState {
  114. PCIDevice dev;
  115. MemoryRegion io_bar;
  116. USBBus bus; /* Note unused when we're a companion controller */
  117. uint16_t cmd; /* cmd register */
  118. uint16_t status;
  119. uint16_t intr; /* interrupt enable register */
  120. uint16_t frnum; /* frame number */
  121. uint32_t fl_base_addr; /* frame list base address */
  122. uint8_t sof_timing;
  123. uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */
  124. int64_t expire_time;
  125. QEMUTimer *frame_timer;
  126. UHCIPort ports[NB_PORTS];
  127. /* Interrupts that should be raised at the end of the current frame. */
  128. uint32_t pending_int_mask;
  129. /* Active packets */
  130. QTAILQ_HEAD(,UHCIAsync) async_pending;
  131. uint8_t num_ports_vmstate;
  132. /* Properties */
  133. char *masterbus;
  134. uint32_t firstport;
  135. };
  136. typedef struct UHCI_TD {
  137. uint32_t link;
  138. uint32_t ctrl; /* see TD_CTRL_xxx */
  139. uint32_t token;
  140. uint32_t buffer;
  141. } UHCI_TD;
  142. typedef struct UHCI_QH {
  143. uint32_t link;
  144. uint32_t el_link;
  145. } UHCI_QH;
  146. static UHCIAsync *uhci_async_alloc(UHCIState *s)
  147. {
  148. UHCIAsync *async = g_malloc(sizeof(UHCIAsync));
  149. memset(&async->packet, 0, sizeof(async->packet));
  150. async->uhci = s;
  151. async->valid = 0;
  152. async->td = 0;
  153. async->token = 0;
  154. async->done = 0;
  155. async->isoc = 0;
  156. usb_packet_init(&async->packet);
  157. pci_dma_sglist_init(&async->sgl, &s->dev, 1);
  158. return async;
  159. }
  160. static void uhci_async_free(UHCIState *s, UHCIAsync *async)
  161. {
  162. usb_packet_cleanup(&async->packet);
  163. qemu_sglist_destroy(&async->sgl);
  164. g_free(async);
  165. }
  166. static void uhci_async_link(UHCIState *s, UHCIAsync *async)
  167. {
  168. QTAILQ_INSERT_HEAD(&s->async_pending, async, next);
  169. }
  170. static void uhci_async_unlink(UHCIState *s, UHCIAsync *async)
  171. {
  172. QTAILQ_REMOVE(&s->async_pending, async, next);
  173. }
  174. static void uhci_async_cancel(UHCIState *s, UHCIAsync *async)
  175. {
  176. DPRINTF("uhci: cancel td 0x%x token 0x%x done %u\n",
  177. async->td, async->token, async->done);
  178. if (!async->done)
  179. usb_cancel_packet(&async->packet);
  180. uhci_async_free(s, async);
  181. }
  182. /*
  183. * Mark all outstanding async packets as invalid.
  184. * This is used for canceling them when TDs are removed by the HCD.
  185. */
  186. static UHCIAsync *uhci_async_validate_begin(UHCIState *s)
  187. {
  188. UHCIAsync *async;
  189. QTAILQ_FOREACH(async, &s->async_pending, next) {
  190. async->valid--;
  191. }
  192. return NULL;
  193. }
  194. /*
  195. * Cancel async packets that are no longer valid
  196. */
  197. static void uhci_async_validate_end(UHCIState *s)
  198. {
  199. UHCIAsync *curr, *n;
  200. QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
  201. if (curr->valid > 0) {
  202. continue;
  203. }
  204. uhci_async_unlink(s, curr);
  205. uhci_async_cancel(s, curr);
  206. }
  207. }
  208. static void uhci_async_cancel_device(UHCIState *s, USBDevice *dev)
  209. {
  210. UHCIAsync *curr, *n;
  211. QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
  212. if (curr->packet.owner != dev) {
  213. continue;
  214. }
  215. uhci_async_unlink(s, curr);
  216. uhci_async_cancel(s, curr);
  217. }
  218. }
  219. static void uhci_async_cancel_all(UHCIState *s)
  220. {
  221. UHCIAsync *curr, *n;
  222. QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
  223. uhci_async_unlink(s, curr);
  224. uhci_async_cancel(s, curr);
  225. }
  226. }
  227. static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t addr, uint32_t token)
  228. {
  229. UHCIAsync *async;
  230. UHCIAsync *match = NULL;
  231. int count = 0;
  232. /*
  233. * We're looking for the best match here. ie both td addr and token.
  234. * Otherwise we return last good match. ie just token.
  235. * It's ok to match just token because it identifies the transaction
  236. * rather well, token includes: device addr, endpoint, size, etc.
  237. *
  238. * Also since we queue async transactions in reverse order by returning
  239. * last good match we restores the order.
  240. *
  241. * It's expected that we wont have a ton of outstanding transactions.
  242. * If we ever do we'd want to optimize this algorithm.
  243. */
  244. QTAILQ_FOREACH(async, &s->async_pending, next) {
  245. if (async->token == token) {
  246. /* Good match */
  247. match = async;
  248. if (async->td == addr) {
  249. /* Best match */
  250. break;
  251. }
  252. }
  253. count++;
  254. }
  255. if (count > 64)
  256. fprintf(stderr, "uhci: warning lots of async transactions\n");
  257. return match;
  258. }
  259. static void uhci_update_irq(UHCIState *s)
  260. {
  261. int level;
  262. if (((s->status2 & 1) && (s->intr & (1 << 2))) ||
  263. ((s->status2 & 2) && (s->intr & (1 << 3))) ||
  264. ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||
  265. ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) ||
  266. (s->status & UHCI_STS_HSERR) ||
  267. (s->status & UHCI_STS_HCPERR)) {
  268. level = 1;
  269. } else {
  270. level = 0;
  271. }
  272. qemu_set_irq(s->dev.irq[3], level);
  273. }
  274. static void uhci_reset(void *opaque)
  275. {
  276. UHCIState *s = opaque;
  277. uint8_t *pci_conf;
  278. int i;
  279. UHCIPort *port;
  280. DPRINTF("uhci: full reset\n");
  281. pci_conf = s->dev.config;
  282. pci_conf[0x6a] = 0x01; /* usb clock */
  283. pci_conf[0x6b] = 0x00;
  284. s->cmd = 0;
  285. s->status = 0;
  286. s->status2 = 0;
  287. s->intr = 0;
  288. s->fl_base_addr = 0;
  289. s->sof_timing = 64;
  290. for(i = 0; i < NB_PORTS; i++) {
  291. port = &s->ports[i];
  292. port->ctrl = 0x0080;
  293. if (port->port.dev && port->port.dev->attached) {
  294. usb_reset(&port->port);
  295. }
  296. }
  297. uhci_async_cancel_all(s);
  298. }
  299. static void uhci_pre_save(void *opaque)
  300. {
  301. UHCIState *s = opaque;
  302. uhci_async_cancel_all(s);
  303. }
  304. static const VMStateDescription vmstate_uhci_port = {
  305. .name = "uhci port",
  306. .version_id = 1,
  307. .minimum_version_id = 1,
  308. .minimum_version_id_old = 1,
  309. .fields = (VMStateField []) {
  310. VMSTATE_UINT16(ctrl, UHCIPort),
  311. VMSTATE_END_OF_LIST()
  312. }
  313. };
  314. static const VMStateDescription vmstate_uhci = {
  315. .name = "uhci",
  316. .version_id = 2,
  317. .minimum_version_id = 1,
  318. .minimum_version_id_old = 1,
  319. .pre_save = uhci_pre_save,
  320. .fields = (VMStateField []) {
  321. VMSTATE_PCI_DEVICE(dev, UHCIState),
  322. VMSTATE_UINT8_EQUAL(num_ports_vmstate, UHCIState),
  323. VMSTATE_STRUCT_ARRAY(ports, UHCIState, NB_PORTS, 1,
  324. vmstate_uhci_port, UHCIPort),
  325. VMSTATE_UINT16(cmd, UHCIState),
  326. VMSTATE_UINT16(status, UHCIState),
  327. VMSTATE_UINT16(intr, UHCIState),
  328. VMSTATE_UINT16(frnum, UHCIState),
  329. VMSTATE_UINT32(fl_base_addr, UHCIState),
  330. VMSTATE_UINT8(sof_timing, UHCIState),
  331. VMSTATE_UINT8(status2, UHCIState),
  332. VMSTATE_TIMER(frame_timer, UHCIState),
  333. VMSTATE_INT64_V(expire_time, UHCIState, 2),
  334. VMSTATE_END_OF_LIST()
  335. }
  336. };
  337. static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
  338. {
  339. UHCIState *s = opaque;
  340. addr &= 0x1f;
  341. switch(addr) {
  342. case 0x0c:
  343. s->sof_timing = val;
  344. break;
  345. }
  346. }
  347. static uint32_t uhci_ioport_readb(void *opaque, uint32_t addr)
  348. {
  349. UHCIState *s = opaque;
  350. uint32_t val;
  351. addr &= 0x1f;
  352. switch(addr) {
  353. case 0x0c:
  354. val = s->sof_timing;
  355. break;
  356. default:
  357. val = 0xff;
  358. break;
  359. }
  360. return val;
  361. }
  362. static void uhci_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
  363. {
  364. UHCIState *s = opaque;
  365. addr &= 0x1f;
  366. DPRINTF("uhci: writew port=0x%04x val=0x%04x\n", addr, val);
  367. switch(addr) {
  368. case 0x00:
  369. if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) {
  370. /* start frame processing */
  371. s->expire_time = qemu_get_clock_ns(vm_clock) +
  372. (get_ticks_per_sec() / FRAME_TIMER_FREQ);
  373. qemu_mod_timer(s->frame_timer, qemu_get_clock_ns(vm_clock));
  374. s->status &= ~UHCI_STS_HCHALTED;
  375. } else if (!(val & UHCI_CMD_RS)) {
  376. s->status |= UHCI_STS_HCHALTED;
  377. }
  378. if (val & UHCI_CMD_GRESET) {
  379. UHCIPort *port;
  380. USBDevice *dev;
  381. int i;
  382. /* send reset on the USB bus */
  383. for(i = 0; i < NB_PORTS; i++) {
  384. port = &s->ports[i];
  385. dev = port->port.dev;
  386. if (dev && dev->attached) {
  387. usb_send_msg(dev, USB_MSG_RESET);
  388. }
  389. }
  390. uhci_reset(s);
  391. return;
  392. }
  393. if (val & UHCI_CMD_HCRESET) {
  394. uhci_reset(s);
  395. return;
  396. }
  397. s->cmd = val;
  398. break;
  399. case 0x02:
  400. s->status &= ~val;
  401. /* XXX: the chip spec is not coherent, so we add a hidden
  402. register to distinguish between IOC and SPD */
  403. if (val & UHCI_STS_USBINT)
  404. s->status2 = 0;
  405. uhci_update_irq(s);
  406. break;
  407. case 0x04:
  408. s->intr = val;
  409. uhci_update_irq(s);
  410. break;
  411. case 0x06:
  412. if (s->status & UHCI_STS_HCHALTED)
  413. s->frnum = val & 0x7ff;
  414. break;
  415. case 0x10 ... 0x1f:
  416. {
  417. UHCIPort *port;
  418. USBDevice *dev;
  419. int n;
  420. n = (addr >> 1) & 7;
  421. if (n >= NB_PORTS)
  422. return;
  423. port = &s->ports[n];
  424. dev = port->port.dev;
  425. if (dev && dev->attached) {
  426. /* port reset */
  427. if ( (val & UHCI_PORT_RESET) &&
  428. !(port->ctrl & UHCI_PORT_RESET) ) {
  429. usb_send_msg(dev, USB_MSG_RESET);
  430. }
  431. }
  432. port->ctrl &= UHCI_PORT_READ_ONLY;
  433. port->ctrl |= (val & ~UHCI_PORT_READ_ONLY);
  434. /* some bits are reset when a '1' is written to them */
  435. port->ctrl &= ~(val & UHCI_PORT_WRITE_CLEAR);
  436. }
  437. break;
  438. }
  439. }
  440. static uint32_t uhci_ioport_readw(void *opaque, uint32_t addr)
  441. {
  442. UHCIState *s = opaque;
  443. uint32_t val;
  444. addr &= 0x1f;
  445. switch(addr) {
  446. case 0x00:
  447. val = s->cmd;
  448. break;
  449. case 0x02:
  450. val = s->status;
  451. break;
  452. case 0x04:
  453. val = s->intr;
  454. break;
  455. case 0x06:
  456. val = s->frnum;
  457. break;
  458. case 0x10 ... 0x1f:
  459. {
  460. UHCIPort *port;
  461. int n;
  462. n = (addr >> 1) & 7;
  463. if (n >= NB_PORTS)
  464. goto read_default;
  465. port = &s->ports[n];
  466. val = port->ctrl;
  467. }
  468. break;
  469. default:
  470. read_default:
  471. val = 0xff7f; /* disabled port */
  472. break;
  473. }
  474. DPRINTF("uhci: readw port=0x%04x val=0x%04x\n", addr, val);
  475. return val;
  476. }
  477. static void uhci_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
  478. {
  479. UHCIState *s = opaque;
  480. addr &= 0x1f;
  481. DPRINTF("uhci: writel port=0x%04x val=0x%08x\n", addr, val);
  482. switch(addr) {
  483. case 0x08:
  484. s->fl_base_addr = val & ~0xfff;
  485. break;
  486. }
  487. }
  488. static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr)
  489. {
  490. UHCIState *s = opaque;
  491. uint32_t val;
  492. addr &= 0x1f;
  493. switch(addr) {
  494. case 0x08:
  495. val = s->fl_base_addr;
  496. break;
  497. default:
  498. val = 0xffffffff;
  499. break;
  500. }
  501. return val;
  502. }
  503. /* signal resume if controller suspended */
  504. static void uhci_resume (void *opaque)
  505. {
  506. UHCIState *s = (UHCIState *)opaque;
  507. if (!s)
  508. return;
  509. if (s->cmd & UHCI_CMD_EGSM) {
  510. s->cmd |= UHCI_CMD_FGR;
  511. s->status |= UHCI_STS_RD;
  512. uhci_update_irq(s);
  513. }
  514. }
  515. static void uhci_attach(USBPort *port1)
  516. {
  517. UHCIState *s = port1->opaque;
  518. UHCIPort *port = &s->ports[port1->index];
  519. /* set connect status */
  520. port->ctrl |= UHCI_PORT_CCS | UHCI_PORT_CSC;
  521. /* update speed */
  522. if (port->port.dev->speed == USB_SPEED_LOW) {
  523. port->ctrl |= UHCI_PORT_LSDA;
  524. } else {
  525. port->ctrl &= ~UHCI_PORT_LSDA;
  526. }
  527. uhci_resume(s);
  528. }
  529. static void uhci_detach(USBPort *port1)
  530. {
  531. UHCIState *s = port1->opaque;
  532. UHCIPort *port = &s->ports[port1->index];
  533. uhci_async_cancel_device(s, port1->dev);
  534. /* set connect status */
  535. if (port->ctrl & UHCI_PORT_CCS) {
  536. port->ctrl &= ~UHCI_PORT_CCS;
  537. port->ctrl |= UHCI_PORT_CSC;
  538. }
  539. /* disable port */
  540. if (port->ctrl & UHCI_PORT_EN) {
  541. port->ctrl &= ~UHCI_PORT_EN;
  542. port->ctrl |= UHCI_PORT_ENC;
  543. }
  544. uhci_resume(s);
  545. }
  546. static void uhci_child_detach(USBPort *port1, USBDevice *child)
  547. {
  548. UHCIState *s = port1->opaque;
  549. uhci_async_cancel_device(s, child);
  550. }
  551. static void uhci_wakeup(USBPort *port1)
  552. {
  553. UHCIState *s = port1->opaque;
  554. UHCIPort *port = &s->ports[port1->index];
  555. if (port->ctrl & UHCI_PORT_SUSPEND && !(port->ctrl & UHCI_PORT_RD)) {
  556. port->ctrl |= UHCI_PORT_RD;
  557. uhci_resume(s);
  558. }
  559. }
  560. static int uhci_broadcast_packet(UHCIState *s, USBPacket *p)
  561. {
  562. int i, ret;
  563. DPRINTF("uhci: packet enter. pid %s addr 0x%02x ep %d len %zd\n",
  564. pid2str(p->pid), p->devaddr, p->devep, p->iov.size);
  565. if (p->pid == USB_TOKEN_OUT || p->pid == USB_TOKEN_SETUP)
  566. dump_data(p, 0);
  567. ret = USB_RET_NODEV;
  568. for (i = 0; i < NB_PORTS && ret == USB_RET_NODEV; i++) {
  569. UHCIPort *port = &s->ports[i];
  570. USBDevice *dev = port->port.dev;
  571. if (dev && dev->attached && (port->ctrl & UHCI_PORT_EN)) {
  572. ret = usb_handle_packet(dev, p);
  573. }
  574. }
  575. DPRINTF("uhci: packet exit. ret %d len %zd\n", ret, p->iov.size);
  576. if (p->pid == USB_TOKEN_IN && ret > 0)
  577. dump_data(p, ret);
  578. return ret;
  579. }
  580. static void uhci_async_complete(USBPort *port, USBPacket *packet);
  581. static void uhci_process_frame(UHCIState *s);
  582. /* return -1 if fatal error (frame must be stopped)
  583. 0 if TD successful
  584. 1 if TD unsuccessful or inactive
  585. */
  586. static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_t *int_mask)
  587. {
  588. int len = 0, max_len, err, ret;
  589. uint8_t pid;
  590. max_len = ((td->token >> 21) + 1) & 0x7ff;
  591. pid = td->token & 0xff;
  592. ret = async->packet.result;
  593. if (td->ctrl & TD_CTRL_IOS)
  594. td->ctrl &= ~TD_CTRL_ACTIVE;
  595. if (ret < 0)
  596. goto out;
  597. len = async->packet.result;
  598. td->ctrl = (td->ctrl & ~0x7ff) | ((len - 1) & 0x7ff);
  599. /* The NAK bit may have been set by a previous frame, so clear it
  600. here. The docs are somewhat unclear, but win2k relies on this
  601. behavior. */
  602. td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
  603. if (td->ctrl & TD_CTRL_IOC)
  604. *int_mask |= 0x01;
  605. if (pid == USB_TOKEN_IN) {
  606. if (len > max_len) {
  607. ret = USB_RET_BABBLE;
  608. goto out;
  609. }
  610. if ((td->ctrl & TD_CTRL_SPD) && len < max_len) {
  611. *int_mask |= 0x02;
  612. /* short packet: do not update QH */
  613. DPRINTF("uhci: short packet. td 0x%x token 0x%x\n", async->td, async->token);
  614. return 1;
  615. }
  616. }
  617. /* success */
  618. return 0;
  619. out:
  620. switch(ret) {
  621. case USB_RET_STALL:
  622. td->ctrl |= TD_CTRL_STALL;
  623. td->ctrl &= ~TD_CTRL_ACTIVE;
  624. s->status |= UHCI_STS_USBERR;
  625. if (td->ctrl & TD_CTRL_IOC) {
  626. *int_mask |= 0x01;
  627. }
  628. uhci_update_irq(s);
  629. return 1;
  630. case USB_RET_BABBLE:
  631. td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL;
  632. td->ctrl &= ~TD_CTRL_ACTIVE;
  633. s->status |= UHCI_STS_USBERR;
  634. if (td->ctrl & TD_CTRL_IOC) {
  635. *int_mask |= 0x01;
  636. }
  637. uhci_update_irq(s);
  638. /* frame interrupted */
  639. return -1;
  640. case USB_RET_NAK:
  641. td->ctrl |= TD_CTRL_NAK;
  642. if (pid == USB_TOKEN_SETUP)
  643. break;
  644. return 1;
  645. case USB_RET_NODEV:
  646. default:
  647. break;
  648. }
  649. /* Retry the TD if error count is not zero */
  650. td->ctrl |= TD_CTRL_TIMEOUT;
  651. err = (td->ctrl >> TD_CTRL_ERROR_SHIFT) & 3;
  652. if (err != 0) {
  653. err--;
  654. if (err == 0) {
  655. td->ctrl &= ~TD_CTRL_ACTIVE;
  656. s->status |= UHCI_STS_USBERR;
  657. if (td->ctrl & TD_CTRL_IOC)
  658. *int_mask |= 0x01;
  659. uhci_update_irq(s);
  660. }
  661. }
  662. td->ctrl = (td->ctrl & ~(3 << TD_CTRL_ERROR_SHIFT)) |
  663. (err << TD_CTRL_ERROR_SHIFT);
  664. return 1;
  665. }
  666. static int uhci_handle_td(UHCIState *s, uint32_t addr, UHCI_TD *td, uint32_t *int_mask)
  667. {
  668. UHCIAsync *async;
  669. int len = 0, max_len;
  670. uint8_t pid, isoc;
  671. uint32_t token;
  672. /* Is active ? */
  673. if (!(td->ctrl & TD_CTRL_ACTIVE))
  674. return 1;
  675. /* token field is not unique for isochronous requests,
  676. * so use the destination buffer
  677. */
  678. if (td->ctrl & TD_CTRL_IOS) {
  679. token = td->buffer;
  680. isoc = 1;
  681. } else {
  682. token = td->token;
  683. isoc = 0;
  684. }
  685. async = uhci_async_find_td(s, addr, token);
  686. if (async) {
  687. /* Already submitted */
  688. async->valid = 32;
  689. if (!async->done)
  690. return 1;
  691. uhci_async_unlink(s, async);
  692. goto done;
  693. }
  694. /* Allocate new packet */
  695. async = uhci_async_alloc(s);
  696. if (!async)
  697. return 1;
  698. /* valid needs to be large enough to handle 10 frame delay
  699. * for initial isochronous requests
  700. */
  701. async->valid = 32;
  702. async->td = addr;
  703. async->token = token;
  704. async->isoc = isoc;
  705. max_len = ((td->token >> 21) + 1) & 0x7ff;
  706. pid = td->token & 0xff;
  707. usb_packet_setup(&async->packet, pid, (td->token >> 8) & 0x7f,
  708. (td->token >> 15) & 0xf);
  709. qemu_sglist_add(&async->sgl, td->buffer, max_len);
  710. usb_packet_map(&async->packet, &async->sgl);
  711. switch(pid) {
  712. case USB_TOKEN_OUT:
  713. case USB_TOKEN_SETUP:
  714. len = uhci_broadcast_packet(s, &async->packet);
  715. if (len >= 0)
  716. len = max_len;
  717. break;
  718. case USB_TOKEN_IN:
  719. len = uhci_broadcast_packet(s, &async->packet);
  720. break;
  721. default:
  722. /* invalid pid : frame interrupted */
  723. uhci_async_free(s, async);
  724. s->status |= UHCI_STS_HCPERR;
  725. uhci_update_irq(s);
  726. return -1;
  727. }
  728. if (len == USB_RET_ASYNC) {
  729. uhci_async_link(s, async);
  730. return 2;
  731. }
  732. async->packet.result = len;
  733. done:
  734. len = uhci_complete_td(s, td, async, int_mask);
  735. usb_packet_unmap(&async->packet);
  736. uhci_async_free(s, async);
  737. return len;
  738. }
  739. static void uhci_async_complete(USBPort *port, USBPacket *packet)
  740. {
  741. UHCIAsync *async = container_of(packet, UHCIAsync, packet);
  742. UHCIState *s = async->uhci;
  743. DPRINTF("uhci: async complete. td 0x%x token 0x%x\n", async->td, async->token);
  744. if (async->isoc) {
  745. UHCI_TD td;
  746. uint32_t link = async->td;
  747. uint32_t int_mask = 0, val;
  748. pci_dma_read(&s->dev, link & ~0xf, (uint8_t *) &td, sizeof(td));
  749. le32_to_cpus(&td.link);
  750. le32_to_cpus(&td.ctrl);
  751. le32_to_cpus(&td.token);
  752. le32_to_cpus(&td.buffer);
  753. uhci_async_unlink(s, async);
  754. uhci_complete_td(s, &td, async, &int_mask);
  755. s->pending_int_mask |= int_mask;
  756. /* update the status bits of the TD */
  757. val = cpu_to_le32(td.ctrl);
  758. pci_dma_write(&s->dev, (link & ~0xf) + 4,
  759. (const uint8_t *)&val, sizeof(val));
  760. uhci_async_free(s, async);
  761. } else {
  762. async->done = 1;
  763. uhci_process_frame(s);
  764. }
  765. }
  766. static int is_valid(uint32_t link)
  767. {
  768. return (link & 1) == 0;
  769. }
  770. static int is_qh(uint32_t link)
  771. {
  772. return (link & 2) != 0;
  773. }
  774. static int depth_first(uint32_t link)
  775. {
  776. return (link & 4) != 0;
  777. }
  778. /* QH DB used for detecting QH loops */
  779. #define UHCI_MAX_QUEUES 128
  780. typedef struct {
  781. uint32_t addr[UHCI_MAX_QUEUES];
  782. int count;
  783. } QhDb;
  784. static void qhdb_reset(QhDb *db)
  785. {
  786. db->count = 0;
  787. }
  788. /* Add QH to DB. Returns 1 if already present or DB is full. */
  789. static int qhdb_insert(QhDb *db, uint32_t addr)
  790. {
  791. int i;
  792. for (i = 0; i < db->count; i++)
  793. if (db->addr[i] == addr)
  794. return 1;
  795. if (db->count >= UHCI_MAX_QUEUES)
  796. return 1;
  797. db->addr[db->count++] = addr;
  798. return 0;
  799. }
  800. static void uhci_process_frame(UHCIState *s)
  801. {
  802. uint32_t frame_addr, link, old_td_ctrl, val, int_mask;
  803. uint32_t curr_qh;
  804. int cnt, ret;
  805. UHCI_TD td;
  806. UHCI_QH qh;
  807. QhDb qhdb;
  808. frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
  809. DPRINTF("uhci: processing frame %d addr 0x%x\n" , s->frnum, frame_addr);
  810. pci_dma_read(&s->dev, frame_addr, (uint8_t *)&link, 4);
  811. le32_to_cpus(&link);
  812. int_mask = 0;
  813. curr_qh = 0;
  814. qhdb_reset(&qhdb);
  815. for (cnt = FRAME_MAX_LOOPS; is_valid(link) && cnt; cnt--) {
  816. if (is_qh(link)) {
  817. /* QH */
  818. if (qhdb_insert(&qhdb, link)) {
  819. /*
  820. * We're going in circles. Which is not a bug because
  821. * HCD is allowed to do that as part of the BW management.
  822. * In our case though it makes no sense to spin here. Sync transations
  823. * are already done, and async completion handler will re-process
  824. * the frame when something is ready.
  825. */
  826. DPRINTF("uhci: detected loop. qh 0x%x\n", link);
  827. break;
  828. }
  829. pci_dma_read(&s->dev, link & ~0xf, (uint8_t *) &qh, sizeof(qh));
  830. le32_to_cpus(&qh.link);
  831. le32_to_cpus(&qh.el_link);
  832. DPRINTF("uhci: QH 0x%x load. link 0x%x elink 0x%x\n",
  833. link, qh.link, qh.el_link);
  834. if (!is_valid(qh.el_link)) {
  835. /* QH w/o elements */
  836. curr_qh = 0;
  837. link = qh.link;
  838. } else {
  839. /* QH with elements */
  840. curr_qh = link;
  841. link = qh.el_link;
  842. }
  843. continue;
  844. }
  845. /* TD */
  846. pci_dma_read(&s->dev, link & ~0xf, (uint8_t *) &td, sizeof(td));
  847. le32_to_cpus(&td.link);
  848. le32_to_cpus(&td.ctrl);
  849. le32_to_cpus(&td.token);
  850. le32_to_cpus(&td.buffer);
  851. DPRINTF("uhci: TD 0x%x load. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
  852. link, td.link, td.ctrl, td.token, curr_qh);
  853. old_td_ctrl = td.ctrl;
  854. ret = uhci_handle_td(s, link, &td, &int_mask);
  855. if (old_td_ctrl != td.ctrl) {
  856. /* update the status bits of the TD */
  857. val = cpu_to_le32(td.ctrl);
  858. pci_dma_write(&s->dev, (link & ~0xf) + 4,
  859. (const uint8_t *)&val, sizeof(val));
  860. }
  861. if (ret < 0) {
  862. /* interrupted frame */
  863. break;
  864. }
  865. if (ret == 2 || ret == 1) {
  866. DPRINTF("uhci: TD 0x%x %s. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
  867. link, ret == 2 ? "pend" : "skip",
  868. td.link, td.ctrl, td.token, curr_qh);
  869. link = curr_qh ? qh.link : td.link;
  870. continue;
  871. }
  872. /* completed TD */
  873. DPRINTF("uhci: TD 0x%x done. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
  874. link, td.link, td.ctrl, td.token, curr_qh);
  875. link = td.link;
  876. if (curr_qh) {
  877. /* update QH element link */
  878. qh.el_link = link;
  879. val = cpu_to_le32(qh.el_link);
  880. pci_dma_write(&s->dev, (curr_qh & ~0xf) + 4,
  881. (const uint8_t *)&val, sizeof(val));
  882. if (!depth_first(link)) {
  883. /* done with this QH */
  884. DPRINTF("uhci: QH 0x%x done. link 0x%x elink 0x%x\n",
  885. curr_qh, qh.link, qh.el_link);
  886. curr_qh = 0;
  887. link = qh.link;
  888. }
  889. }
  890. /* go to the next entry */
  891. }
  892. s->pending_int_mask |= int_mask;
  893. }
  894. static void uhci_frame_timer(void *opaque)
  895. {
  896. UHCIState *s = opaque;
  897. /* prepare the timer for the next frame */
  898. s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
  899. if (!(s->cmd & UHCI_CMD_RS)) {
  900. /* Full stop */
  901. qemu_del_timer(s->frame_timer);
  902. /* set hchalted bit in status - UHCI11D 2.1.2 */
  903. s->status |= UHCI_STS_HCHALTED;
  904. DPRINTF("uhci: halted\n");
  905. return;
  906. }
  907. /* Complete the previous frame */
  908. if (s->pending_int_mask) {
  909. s->status2 |= s->pending_int_mask;
  910. s->status |= UHCI_STS_USBINT;
  911. uhci_update_irq(s);
  912. }
  913. s->pending_int_mask = 0;
  914. /* Start new frame */
  915. s->frnum = (s->frnum + 1) & 0x7ff;
  916. DPRINTF("uhci: new frame #%u\n" , s->frnum);
  917. uhci_async_validate_begin(s);
  918. uhci_process_frame(s);
  919. uhci_async_validate_end(s);
  920. qemu_mod_timer(s->frame_timer, s->expire_time);
  921. }
  922. static const MemoryRegionPortio uhci_portio[] = {
  923. { 0, 32, 2, .write = uhci_ioport_writew, },
  924. { 0, 32, 2, .read = uhci_ioport_readw, },
  925. { 0, 32, 4, .write = uhci_ioport_writel, },
  926. { 0, 32, 4, .read = uhci_ioport_readl, },
  927. { 0, 32, 1, .write = uhci_ioport_writeb, },
  928. { 0, 32, 1, .read = uhci_ioport_readb, },
  929. PORTIO_END_OF_LIST()
  930. };
  931. static const MemoryRegionOps uhci_ioport_ops = {
  932. .old_portio = uhci_portio,
  933. };
  934. static USBPortOps uhci_port_ops = {
  935. .attach = uhci_attach,
  936. .detach = uhci_detach,
  937. .child_detach = uhci_child_detach,
  938. .wakeup = uhci_wakeup,
  939. .complete = uhci_async_complete,
  940. };
  941. static USBBusOps uhci_bus_ops = {
  942. };
  943. static int usb_uhci_common_initfn(PCIDevice *dev)
  944. {
  945. UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
  946. uint8_t *pci_conf = s->dev.config;
  947. int i;
  948. pci_conf[PCI_CLASS_PROG] = 0x00;
  949. /* TODO: reset value should be 0. */
  950. pci_conf[PCI_INTERRUPT_PIN] = 4; /* interrupt pin D */
  951. pci_conf[USB_SBRN] = USB_RELEASE_1; // release number
  952. if (s->masterbus) {
  953. USBPort *ports[NB_PORTS];
  954. for(i = 0; i < NB_PORTS; i++) {
  955. ports[i] = &s->ports[i].port;
  956. }
  957. if (usb_register_companion(s->masterbus, ports, NB_PORTS,
  958. s->firstport, s, &uhci_port_ops,
  959. USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL) != 0) {
  960. return -1;
  961. }
  962. } else {
  963. usb_bus_new(&s->bus, &uhci_bus_ops, &s->dev.qdev);
  964. for (i = 0; i < NB_PORTS; i++) {
  965. usb_register_port(&s->bus, &s->ports[i].port, s, i, &uhci_port_ops,
  966. USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
  967. }
  968. }
  969. s->frame_timer = qemu_new_timer_ns(vm_clock, uhci_frame_timer, s);
  970. s->num_ports_vmstate = NB_PORTS;
  971. QTAILQ_INIT(&s->async_pending);
  972. qemu_register_reset(uhci_reset, s);
  973. memory_region_init_io(&s->io_bar, &uhci_ioport_ops, s, "uhci", 0x20);
  974. /* Use region 4 for consistency with real hardware. BSD guests seem
  975. to rely on this. */
  976. pci_register_bar(&s->dev, 4, PCI_BASE_ADDRESS_SPACE_IO, &s->io_bar);
  977. return 0;
  978. }
  979. static int usb_uhci_vt82c686b_initfn(PCIDevice *dev)
  980. {
  981. UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
  982. uint8_t *pci_conf = s->dev.config;
  983. /* USB misc control 1/2 */
  984. pci_set_long(pci_conf + 0x40,0x00001000);
  985. /* PM capability */
  986. pci_set_long(pci_conf + 0x80,0x00020001);
  987. /* USB legacy support */
  988. pci_set_long(pci_conf + 0xc0,0x00002000);
  989. return usb_uhci_common_initfn(dev);
  990. }
  991. static int usb_uhci_exit(PCIDevice *dev)
  992. {
  993. UHCIState *s = DO_UPCAST(UHCIState, dev, dev);
  994. memory_region_destroy(&s->io_bar);
  995. return 0;
  996. }
  997. static Property uhci_properties[] = {
  998. DEFINE_PROP_STRING("masterbus", UHCIState, masterbus),
  999. DEFINE_PROP_UINT32("firstport", UHCIState, firstport, 0),
  1000. DEFINE_PROP_END_OF_LIST(),
  1001. };
  1002. static PCIDeviceInfo uhci_info[] = {
  1003. {
  1004. .qdev.name = "piix3-usb-uhci",
  1005. .qdev.size = sizeof(UHCIState),
  1006. .qdev.vmsd = &vmstate_uhci,
  1007. .init = usb_uhci_common_initfn,
  1008. .exit = usb_uhci_exit,
  1009. .vendor_id = PCI_VENDOR_ID_INTEL,
  1010. .device_id = PCI_DEVICE_ID_INTEL_82371SB_2,
  1011. .revision = 0x01,
  1012. .class_id = PCI_CLASS_SERIAL_USB,
  1013. .qdev.props = uhci_properties,
  1014. },{
  1015. .qdev.name = "piix4-usb-uhci",
  1016. .qdev.size = sizeof(UHCIState),
  1017. .qdev.vmsd = &vmstate_uhci,
  1018. .init = usb_uhci_common_initfn,
  1019. .exit = usb_uhci_exit,
  1020. .vendor_id = PCI_VENDOR_ID_INTEL,
  1021. .device_id = PCI_DEVICE_ID_INTEL_82371AB_2,
  1022. .revision = 0x01,
  1023. .class_id = PCI_CLASS_SERIAL_USB,
  1024. .qdev.props = uhci_properties,
  1025. },{
  1026. .qdev.name = "vt82c686b-usb-uhci",
  1027. .qdev.size = sizeof(UHCIState),
  1028. .qdev.vmsd = &vmstate_uhci,
  1029. .init = usb_uhci_vt82c686b_initfn,
  1030. .exit = usb_uhci_exit,
  1031. .vendor_id = PCI_VENDOR_ID_VIA,
  1032. .device_id = PCI_DEVICE_ID_VIA_UHCI,
  1033. .revision = 0x01,
  1034. .class_id = PCI_CLASS_SERIAL_USB,
  1035. .qdev.props = uhci_properties,
  1036. },{
  1037. .qdev.name = "ich9-usb-uhci1",
  1038. .qdev.size = sizeof(UHCIState),
  1039. .qdev.vmsd = &vmstate_uhci,
  1040. .init = usb_uhci_common_initfn,
  1041. .vendor_id = PCI_VENDOR_ID_INTEL,
  1042. .device_id = PCI_DEVICE_ID_INTEL_82801I_UHCI1,
  1043. .revision = 0x03,
  1044. .class_id = PCI_CLASS_SERIAL_USB,
  1045. .qdev.props = uhci_properties,
  1046. },{
  1047. .qdev.name = "ich9-usb-uhci2",
  1048. .qdev.size = sizeof(UHCIState),
  1049. .qdev.vmsd = &vmstate_uhci,
  1050. .init = usb_uhci_common_initfn,
  1051. .vendor_id = PCI_VENDOR_ID_INTEL,
  1052. .device_id = PCI_DEVICE_ID_INTEL_82801I_UHCI2,
  1053. .revision = 0x03,
  1054. .class_id = PCI_CLASS_SERIAL_USB,
  1055. .qdev.props = uhci_properties,
  1056. },{
  1057. .qdev.name = "ich9-usb-uhci3",
  1058. .qdev.size = sizeof(UHCIState),
  1059. .qdev.vmsd = &vmstate_uhci,
  1060. .init = usb_uhci_common_initfn,
  1061. .vendor_id = PCI_VENDOR_ID_INTEL,
  1062. .device_id = PCI_DEVICE_ID_INTEL_82801I_UHCI3,
  1063. .revision = 0x03,
  1064. .class_id = PCI_CLASS_SERIAL_USB,
  1065. .qdev.props = uhci_properties,
  1066. },{
  1067. /* end of list */
  1068. }
  1069. };
  1070. static void uhci_register(void)
  1071. {
  1072. pci_qdev_register_many(uhci_info);
  1073. }
  1074. device_init(uhci_register);
  1075. void usb_uhci_piix3_init(PCIBus *bus, int devfn)
  1076. {
  1077. pci_create_simple(bus, devfn, "piix3-usb-uhci");
  1078. }
  1079. void usb_uhci_piix4_init(PCIBus *bus, int devfn)
  1080. {
  1081. pci_create_simple(bus, devfn, "piix4-usb-uhci");
  1082. }
  1083. void usb_uhci_vt82c686b_init(PCIBus *bus, int devfn)
  1084. {
  1085. pci_create_simple(bus, devfn, "vt82c686b-usb-uhci");
  1086. }