usb-uhci.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276
  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. //#define DEBUG
  34. //#define DEBUG_DUMP_DATA
  35. #define UHCI_CMD_FGR (1 << 4)
  36. #define UHCI_CMD_EGSM (1 << 3)
  37. #define UHCI_CMD_GRESET (1 << 2)
  38. #define UHCI_CMD_HCRESET (1 << 1)
  39. #define UHCI_CMD_RS (1 << 0)
  40. #define UHCI_STS_HCHALTED (1 << 5)
  41. #define UHCI_STS_HCPERR (1 << 4)
  42. #define UHCI_STS_HSERR (1 << 3)
  43. #define UHCI_STS_RD (1 << 2)
  44. #define UHCI_STS_USBERR (1 << 1)
  45. #define UHCI_STS_USBINT (1 << 0)
  46. #define TD_CTRL_SPD (1 << 29)
  47. #define TD_CTRL_ERROR_SHIFT 27
  48. #define TD_CTRL_IOS (1 << 25)
  49. #define TD_CTRL_IOC (1 << 24)
  50. #define TD_CTRL_ACTIVE (1 << 23)
  51. #define TD_CTRL_STALL (1 << 22)
  52. #define TD_CTRL_BABBLE (1 << 20)
  53. #define TD_CTRL_NAK (1 << 19)
  54. #define TD_CTRL_TIMEOUT (1 << 18)
  55. #define UHCI_PORT_SUSPEND (1 << 12)
  56. #define UHCI_PORT_RESET (1 << 9)
  57. #define UHCI_PORT_LSDA (1 << 8)
  58. #define UHCI_PORT_RD (1 << 6)
  59. #define UHCI_PORT_ENC (1 << 3)
  60. #define UHCI_PORT_EN (1 << 2)
  61. #define UHCI_PORT_CSC (1 << 1)
  62. #define UHCI_PORT_CCS (1 << 0)
  63. #define UHCI_PORT_READ_ONLY (0x1bb)
  64. #define UHCI_PORT_WRITE_CLEAR (UHCI_PORT_CSC | UHCI_PORT_ENC)
  65. #define FRAME_TIMER_FREQ 1000
  66. #define FRAME_MAX_LOOPS 100
  67. #define NB_PORTS 2
  68. #ifdef DEBUG
  69. #define DPRINTF printf
  70. static const char *pid2str(int pid)
  71. {
  72. switch (pid) {
  73. case USB_TOKEN_SETUP: return "SETUP";
  74. case USB_TOKEN_IN: return "IN";
  75. case USB_TOKEN_OUT: return "OUT";
  76. }
  77. return "?";
  78. }
  79. #else
  80. #define DPRINTF(...)
  81. #endif
  82. #ifdef DEBUG_DUMP_DATA
  83. static void dump_data(const uint8_t *data, int len)
  84. {
  85. int i;
  86. printf("uhci: data: ");
  87. for(i = 0; i < len; i++)
  88. printf(" %02x", data[i]);
  89. printf("\n");
  90. }
  91. #else
  92. static void dump_data(const uint8_t *data, int len) {}
  93. #endif
  94. typedef struct UHCIState UHCIState;
  95. /*
  96. * Pending async transaction.
  97. * 'packet' must be the first field because completion
  98. * handler does "(UHCIAsync *) pkt" cast.
  99. */
  100. typedef struct UHCIAsync {
  101. USBPacket packet;
  102. UHCIState *uhci;
  103. QTAILQ_ENTRY(UHCIAsync) next;
  104. uint32_t td;
  105. uint32_t token;
  106. int8_t valid;
  107. uint8_t isoc;
  108. uint8_t done;
  109. uint8_t buffer[2048];
  110. } UHCIAsync;
  111. typedef struct UHCIPort {
  112. USBPort port;
  113. uint16_t ctrl;
  114. } UHCIPort;
  115. struct UHCIState {
  116. PCIDevice dev;
  117. USBBus bus; /* Note unused when we're a companion controller */
  118. uint16_t cmd; /* cmd register */
  119. uint16_t status;
  120. uint16_t intr; /* interrupt enable register */
  121. uint16_t frnum; /* frame number */
  122. uint32_t fl_base_addr; /* frame list base address */
  123. uint8_t sof_timing;
  124. uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */
  125. int64_t expire_time;
  126. QEMUTimer *frame_timer;
  127. UHCIPort ports[NB_PORTS];
  128. /* Interrupts that should be raised at the end of the current frame. */
  129. uint32_t pending_int_mask;
  130. /* Active packets */
  131. QTAILQ_HEAD(,UHCIAsync) async_pending;
  132. uint8_t num_ports_vmstate;
  133. /* Properties */
  134. char *masterbus;
  135. uint32_t firstport;
  136. };
  137. typedef struct UHCI_TD {
  138. uint32_t link;
  139. uint32_t ctrl; /* see TD_CTRL_xxx */
  140. uint32_t token;
  141. uint32_t buffer;
  142. } UHCI_TD;
  143. typedef struct UHCI_QH {
  144. uint32_t link;
  145. uint32_t el_link;
  146. } UHCI_QH;
  147. static UHCIAsync *uhci_async_alloc(UHCIState *s)
  148. {
  149. UHCIAsync *async = qemu_malloc(sizeof(UHCIAsync));
  150. memset(&async->packet, 0, sizeof(async->packet));
  151. async->uhci = s;
  152. async->valid = 0;
  153. async->td = 0;
  154. async->token = 0;
  155. async->done = 0;
  156. async->isoc = 0;
  157. return async;
  158. }
  159. static void uhci_async_free(UHCIState *s, UHCIAsync *async)
  160. {
  161. qemu_free(async);
  162. }
  163. static void uhci_async_link(UHCIState *s, UHCIAsync *async)
  164. {
  165. QTAILQ_INSERT_HEAD(&s->async_pending, async, next);
  166. }
  167. static void uhci_async_unlink(UHCIState *s, UHCIAsync *async)
  168. {
  169. QTAILQ_REMOVE(&s->async_pending, async, next);
  170. }
  171. static void uhci_async_cancel(UHCIState *s, UHCIAsync *async)
  172. {
  173. DPRINTF("uhci: cancel td 0x%x token 0x%x done %u\n",
  174. async->td, async->token, async->done);
  175. if (!async->done)
  176. usb_cancel_packet(&async->packet);
  177. uhci_async_free(s, async);
  178. }
  179. /*
  180. * Mark all outstanding async packets as invalid.
  181. * This is used for canceling them when TDs are removed by the HCD.
  182. */
  183. static UHCIAsync *uhci_async_validate_begin(UHCIState *s)
  184. {
  185. UHCIAsync *async;
  186. QTAILQ_FOREACH(async, &s->async_pending, next) {
  187. async->valid--;
  188. }
  189. return NULL;
  190. }
  191. /*
  192. * Cancel async packets that are no longer valid
  193. */
  194. static void uhci_async_validate_end(UHCIState *s)
  195. {
  196. UHCIAsync *curr, *n;
  197. QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
  198. if (curr->valid > 0) {
  199. continue;
  200. }
  201. uhci_async_unlink(s, curr);
  202. uhci_async_cancel(s, curr);
  203. }
  204. }
  205. static void uhci_async_cancel_device(UHCIState *s, USBDevice *dev)
  206. {
  207. UHCIAsync *curr, *n;
  208. QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
  209. if (curr->packet.owner != dev) {
  210. continue;
  211. }
  212. uhci_async_unlink(s, curr);
  213. uhci_async_cancel(s, curr);
  214. }
  215. }
  216. static void uhci_async_cancel_all(UHCIState *s)
  217. {
  218. UHCIAsync *curr, *n;
  219. QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
  220. uhci_async_unlink(s, curr);
  221. uhci_async_cancel(s, curr);
  222. }
  223. }
  224. static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t addr, uint32_t token)
  225. {
  226. UHCIAsync *async;
  227. UHCIAsync *match = NULL;
  228. int count = 0;
  229. /*
  230. * We're looking for the best match here. ie both td addr and token.
  231. * Otherwise we return last good match. ie just token.
  232. * It's ok to match just token because it identifies the transaction
  233. * rather well, token includes: device addr, endpoint, size, etc.
  234. *
  235. * Also since we queue async transactions in reverse order by returning
  236. * last good match we restores the order.
  237. *
  238. * It's expected that we wont have a ton of outstanding transactions.
  239. * If we ever do we'd want to optimize this algorithm.
  240. */
  241. QTAILQ_FOREACH(async, &s->async_pending, next) {
  242. if (async->token == token) {
  243. /* Good match */
  244. match = async;
  245. if (async->td == addr) {
  246. /* Best match */
  247. break;
  248. }
  249. }
  250. count++;
  251. }
  252. if (count > 64)
  253. fprintf(stderr, "uhci: warning lots of async transactions\n");
  254. return match;
  255. }
  256. static void uhci_update_irq(UHCIState *s)
  257. {
  258. int level;
  259. if (((s->status2 & 1) && (s->intr & (1 << 2))) ||
  260. ((s->status2 & 2) && (s->intr & (1 << 3))) ||
  261. ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||
  262. ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) ||
  263. (s->status & UHCI_STS_HSERR) ||
  264. (s->status & UHCI_STS_HCPERR)) {
  265. level = 1;
  266. } else {
  267. level = 0;
  268. }
  269. qemu_set_irq(s->dev.irq[3], level);
  270. }
  271. static void uhci_reset(void *opaque)
  272. {
  273. UHCIState *s = opaque;
  274. uint8_t *pci_conf;
  275. int i;
  276. UHCIPort *port;
  277. DPRINTF("uhci: full reset\n");
  278. pci_conf = s->dev.config;
  279. pci_conf[0x6a] = 0x01; /* usb clock */
  280. pci_conf[0x6b] = 0x00;
  281. s->cmd = 0;
  282. s->status = 0;
  283. s->status2 = 0;
  284. s->intr = 0;
  285. s->fl_base_addr = 0;
  286. s->sof_timing = 64;
  287. for(i = 0; i < NB_PORTS; i++) {
  288. port = &s->ports[i];
  289. port->ctrl = 0x0080;
  290. if (port->port.dev) {
  291. usb_attach(&port->port, port->port.dev);
  292. }
  293. }
  294. uhci_async_cancel_all(s);
  295. }
  296. static void uhci_pre_save(void *opaque)
  297. {
  298. UHCIState *s = opaque;
  299. uhci_async_cancel_all(s);
  300. }
  301. static const VMStateDescription vmstate_uhci_port = {
  302. .name = "uhci port",
  303. .version_id = 1,
  304. .minimum_version_id = 1,
  305. .minimum_version_id_old = 1,
  306. .fields = (VMStateField []) {
  307. VMSTATE_UINT16(ctrl, UHCIPort),
  308. VMSTATE_END_OF_LIST()
  309. }
  310. };
  311. static const VMStateDescription vmstate_uhci = {
  312. .name = "uhci",
  313. .version_id = 2,
  314. .minimum_version_id = 1,
  315. .minimum_version_id_old = 1,
  316. .pre_save = uhci_pre_save,
  317. .fields = (VMStateField []) {
  318. VMSTATE_PCI_DEVICE(dev, UHCIState),
  319. VMSTATE_UINT8_EQUAL(num_ports_vmstate, UHCIState),
  320. VMSTATE_STRUCT_ARRAY(ports, UHCIState, NB_PORTS, 1,
  321. vmstate_uhci_port, UHCIPort),
  322. VMSTATE_UINT16(cmd, UHCIState),
  323. VMSTATE_UINT16(status, UHCIState),
  324. VMSTATE_UINT16(intr, UHCIState),
  325. VMSTATE_UINT16(frnum, UHCIState),
  326. VMSTATE_UINT32(fl_base_addr, UHCIState),
  327. VMSTATE_UINT8(sof_timing, UHCIState),
  328. VMSTATE_UINT8(status2, UHCIState),
  329. VMSTATE_TIMER(frame_timer, UHCIState),
  330. VMSTATE_INT64_V(expire_time, UHCIState, 2),
  331. VMSTATE_END_OF_LIST()
  332. }
  333. };
  334. static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
  335. {
  336. UHCIState *s = opaque;
  337. addr &= 0x1f;
  338. switch(addr) {
  339. case 0x0c:
  340. s->sof_timing = val;
  341. break;
  342. }
  343. }
  344. static uint32_t uhci_ioport_readb(void *opaque, uint32_t addr)
  345. {
  346. UHCIState *s = opaque;
  347. uint32_t val;
  348. addr &= 0x1f;
  349. switch(addr) {
  350. case 0x0c:
  351. val = s->sof_timing;
  352. break;
  353. default:
  354. val = 0xff;
  355. break;
  356. }
  357. return val;
  358. }
  359. static void uhci_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
  360. {
  361. UHCIState *s = opaque;
  362. addr &= 0x1f;
  363. DPRINTF("uhci: writew port=0x%04x val=0x%04x\n", addr, val);
  364. switch(addr) {
  365. case 0x00:
  366. if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) {
  367. /* start frame processing */
  368. s->expire_time = qemu_get_clock_ns(vm_clock) +
  369. (get_ticks_per_sec() / FRAME_TIMER_FREQ);
  370. qemu_mod_timer(s->frame_timer, qemu_get_clock_ns(vm_clock));
  371. s->status &= ~UHCI_STS_HCHALTED;
  372. } else if (!(val & UHCI_CMD_RS)) {
  373. s->status |= UHCI_STS_HCHALTED;
  374. }
  375. if (val & UHCI_CMD_GRESET) {
  376. UHCIPort *port;
  377. USBDevice *dev;
  378. int i;
  379. /* send reset on the USB bus */
  380. for(i = 0; i < NB_PORTS; i++) {
  381. port = &s->ports[i];
  382. dev = port->port.dev;
  383. if (dev) {
  384. usb_send_msg(dev, USB_MSG_RESET);
  385. }
  386. }
  387. uhci_reset(s);
  388. return;
  389. }
  390. if (val & UHCI_CMD_HCRESET) {
  391. uhci_reset(s);
  392. return;
  393. }
  394. s->cmd = val;
  395. break;
  396. case 0x02:
  397. s->status &= ~val;
  398. /* XXX: the chip spec is not coherent, so we add a hidden
  399. register to distinguish between IOC and SPD */
  400. if (val & UHCI_STS_USBINT)
  401. s->status2 = 0;
  402. uhci_update_irq(s);
  403. break;
  404. case 0x04:
  405. s->intr = val;
  406. uhci_update_irq(s);
  407. break;
  408. case 0x06:
  409. if (s->status & UHCI_STS_HCHALTED)
  410. s->frnum = val & 0x7ff;
  411. break;
  412. case 0x10 ... 0x1f:
  413. {
  414. UHCIPort *port;
  415. USBDevice *dev;
  416. int n;
  417. n = (addr >> 1) & 7;
  418. if (n >= NB_PORTS)
  419. return;
  420. port = &s->ports[n];
  421. dev = port->port.dev;
  422. if (dev) {
  423. /* port reset */
  424. if ( (val & UHCI_PORT_RESET) &&
  425. !(port->ctrl & UHCI_PORT_RESET) ) {
  426. usb_send_msg(dev, USB_MSG_RESET);
  427. }
  428. }
  429. port->ctrl &= UHCI_PORT_READ_ONLY;
  430. port->ctrl |= (val & ~UHCI_PORT_READ_ONLY);
  431. /* some bits are reset when a '1' is written to them */
  432. port->ctrl &= ~(val & UHCI_PORT_WRITE_CLEAR);
  433. }
  434. break;
  435. }
  436. }
  437. static uint32_t uhci_ioport_readw(void *opaque, uint32_t addr)
  438. {
  439. UHCIState *s = opaque;
  440. uint32_t val;
  441. addr &= 0x1f;
  442. switch(addr) {
  443. case 0x00:
  444. val = s->cmd;
  445. break;
  446. case 0x02:
  447. val = s->status;
  448. break;
  449. case 0x04:
  450. val = s->intr;
  451. break;
  452. case 0x06:
  453. val = s->frnum;
  454. break;
  455. case 0x10 ... 0x1f:
  456. {
  457. UHCIPort *port;
  458. int n;
  459. n = (addr >> 1) & 7;
  460. if (n >= NB_PORTS)
  461. goto read_default;
  462. port = &s->ports[n];
  463. val = port->ctrl;
  464. }
  465. break;
  466. default:
  467. read_default:
  468. val = 0xff7f; /* disabled port */
  469. break;
  470. }
  471. DPRINTF("uhci: readw port=0x%04x val=0x%04x\n", addr, val);
  472. return val;
  473. }
  474. static void uhci_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
  475. {
  476. UHCIState *s = opaque;
  477. addr &= 0x1f;
  478. DPRINTF("uhci: writel port=0x%04x val=0x%08x\n", addr, val);
  479. switch(addr) {
  480. case 0x08:
  481. s->fl_base_addr = val & ~0xfff;
  482. break;
  483. }
  484. }
  485. static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr)
  486. {
  487. UHCIState *s = opaque;
  488. uint32_t val;
  489. addr &= 0x1f;
  490. switch(addr) {
  491. case 0x08:
  492. val = s->fl_base_addr;
  493. break;
  494. default:
  495. val = 0xffffffff;
  496. break;
  497. }
  498. return val;
  499. }
  500. /* signal resume if controller suspended */
  501. static void uhci_resume (void *opaque)
  502. {
  503. UHCIState *s = (UHCIState *)opaque;
  504. if (!s)
  505. return;
  506. if (s->cmd & UHCI_CMD_EGSM) {
  507. s->cmd |= UHCI_CMD_FGR;
  508. s->status |= UHCI_STS_RD;
  509. uhci_update_irq(s);
  510. }
  511. }
  512. static void uhci_attach(USBPort *port1)
  513. {
  514. UHCIState *s = port1->opaque;
  515. UHCIPort *port = &s->ports[port1->index];
  516. /* set connect status */
  517. port->ctrl |= UHCI_PORT_CCS | UHCI_PORT_CSC;
  518. /* update speed */
  519. if (port->port.dev->speed == USB_SPEED_LOW) {
  520. port->ctrl |= UHCI_PORT_LSDA;
  521. } else {
  522. port->ctrl &= ~UHCI_PORT_LSDA;
  523. }
  524. uhci_resume(s);
  525. }
  526. static void uhci_detach(USBPort *port1)
  527. {
  528. UHCIState *s = port1->opaque;
  529. UHCIPort *port = &s->ports[port1->index];
  530. uhci_async_cancel_device(s, port1->dev);
  531. /* set connect status */
  532. if (port->ctrl & UHCI_PORT_CCS) {
  533. port->ctrl &= ~UHCI_PORT_CCS;
  534. port->ctrl |= UHCI_PORT_CSC;
  535. }
  536. /* disable port */
  537. if (port->ctrl & UHCI_PORT_EN) {
  538. port->ctrl &= ~UHCI_PORT_EN;
  539. port->ctrl |= UHCI_PORT_ENC;
  540. }
  541. uhci_resume(s);
  542. }
  543. static void uhci_child_detach(USBPort *port1, USBDevice *child)
  544. {
  545. UHCIState *s = port1->opaque;
  546. uhci_async_cancel_device(s, child);
  547. }
  548. static void uhci_wakeup(USBPort *port1)
  549. {
  550. UHCIState *s = port1->opaque;
  551. UHCIPort *port = &s->ports[port1->index];
  552. if (port->ctrl & UHCI_PORT_SUSPEND && !(port->ctrl & UHCI_PORT_RD)) {
  553. port->ctrl |= UHCI_PORT_RD;
  554. uhci_resume(s);
  555. }
  556. }
  557. static int uhci_broadcast_packet(UHCIState *s, USBPacket *p)
  558. {
  559. int i, ret;
  560. DPRINTF("uhci: packet enter. pid %s addr 0x%02x ep %d len %d\n",
  561. pid2str(p->pid), p->devaddr, p->devep, p->len);
  562. if (p->pid == USB_TOKEN_OUT || p->pid == USB_TOKEN_SETUP)
  563. dump_data(p->data, p->len);
  564. ret = USB_RET_NODEV;
  565. for (i = 0; i < NB_PORTS && ret == USB_RET_NODEV; i++) {
  566. UHCIPort *port = &s->ports[i];
  567. USBDevice *dev = port->port.dev;
  568. if (dev && (port->ctrl & UHCI_PORT_EN))
  569. ret = usb_handle_packet(dev, p);
  570. }
  571. DPRINTF("uhci: packet exit. ret %d len %d\n", ret, p->len);
  572. if (p->pid == USB_TOKEN_IN && ret > 0)
  573. dump_data(p->data, ret);
  574. return ret;
  575. }
  576. static void uhci_async_complete(USBPort *port, USBPacket *packet);
  577. static void uhci_process_frame(UHCIState *s);
  578. /* return -1 if fatal error (frame must be stopped)
  579. 0 if TD successful
  580. 1 if TD unsuccessful or inactive
  581. */
  582. static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_t *int_mask)
  583. {
  584. int len = 0, max_len, err, ret;
  585. uint8_t pid;
  586. max_len = ((td->token >> 21) + 1) & 0x7ff;
  587. pid = td->token & 0xff;
  588. ret = async->packet.len;
  589. if (td->ctrl & TD_CTRL_IOS)
  590. td->ctrl &= ~TD_CTRL_ACTIVE;
  591. if (ret < 0)
  592. goto out;
  593. len = async->packet.len;
  594. td->ctrl = (td->ctrl & ~0x7ff) | ((len - 1) & 0x7ff);
  595. /* The NAK bit may have been set by a previous frame, so clear it
  596. here. The docs are somewhat unclear, but win2k relies on this
  597. behavior. */
  598. td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
  599. if (td->ctrl & TD_CTRL_IOC)
  600. *int_mask |= 0x01;
  601. if (pid == USB_TOKEN_IN) {
  602. if (len > max_len) {
  603. ret = USB_RET_BABBLE;
  604. goto out;
  605. }
  606. if (len > 0) {
  607. /* write the data back */
  608. cpu_physical_memory_write(td->buffer, async->buffer, len);
  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. async->packet.pid = pid;
  708. async->packet.devaddr = (td->token >> 8) & 0x7f;
  709. async->packet.devep = (td->token >> 15) & 0xf;
  710. async->packet.data = async->buffer;
  711. async->packet.len = max_len;
  712. switch(pid) {
  713. case USB_TOKEN_OUT:
  714. case USB_TOKEN_SETUP:
  715. cpu_physical_memory_read(td->buffer, async->buffer, max_len);
  716. len = uhci_broadcast_packet(s, &async->packet);
  717. if (len >= 0)
  718. len = max_len;
  719. break;
  720. case USB_TOKEN_IN:
  721. len = uhci_broadcast_packet(s, &async->packet);
  722. break;
  723. default:
  724. /* invalid pid : frame interrupted */
  725. uhci_async_free(s, async);
  726. s->status |= UHCI_STS_HCPERR;
  727. uhci_update_irq(s);
  728. return -1;
  729. }
  730. if (len == USB_RET_ASYNC) {
  731. uhci_async_link(s, async);
  732. return 2;
  733. }
  734. async->packet.len = len;
  735. done:
  736. len = uhci_complete_td(s, td, async, int_mask);
  737. uhci_async_free(s, async);
  738. return len;
  739. }
  740. static void uhci_async_complete(USBPort *port, USBPacket *packet)
  741. {
  742. UHCIAsync *async = container_of(packet, UHCIAsync, packet);
  743. UHCIState *s = async->uhci;
  744. DPRINTF("uhci: async complete. td 0x%x token 0x%x\n", async->td, async->token);
  745. if (async->isoc) {
  746. UHCI_TD td;
  747. uint32_t link = async->td;
  748. uint32_t int_mask = 0, val;
  749. cpu_physical_memory_read(link & ~0xf, (uint8_t *) &td, sizeof(td));
  750. le32_to_cpus(&td.link);
  751. le32_to_cpus(&td.ctrl);
  752. le32_to_cpus(&td.token);
  753. le32_to_cpus(&td.buffer);
  754. uhci_async_unlink(s, async);
  755. uhci_complete_td(s, &td, async, &int_mask);
  756. s->pending_int_mask |= int_mask;
  757. /* update the status bits of the TD */
  758. val = cpu_to_le32(td.ctrl);
  759. cpu_physical_memory_write((link & ~0xf) + 4,
  760. (const uint8_t *)&val, sizeof(val));
  761. uhci_async_free(s, async);
  762. } else {
  763. async->done = 1;
  764. uhci_process_frame(s);
  765. }
  766. }
  767. static int is_valid(uint32_t link)
  768. {
  769. return (link & 1) == 0;
  770. }
  771. static int is_qh(uint32_t link)
  772. {
  773. return (link & 2) != 0;
  774. }
  775. static int depth_first(uint32_t link)
  776. {
  777. return (link & 4) != 0;
  778. }
  779. /* QH DB used for detecting QH loops */
  780. #define UHCI_MAX_QUEUES 128
  781. typedef struct {
  782. uint32_t addr[UHCI_MAX_QUEUES];
  783. int count;
  784. } QhDb;
  785. static void qhdb_reset(QhDb *db)
  786. {
  787. db->count = 0;
  788. }
  789. /* Add QH to DB. Returns 1 if already present or DB is full. */
  790. static int qhdb_insert(QhDb *db, uint32_t addr)
  791. {
  792. int i;
  793. for (i = 0; i < db->count; i++)
  794. if (db->addr[i] == addr)
  795. return 1;
  796. if (db->count >= UHCI_MAX_QUEUES)
  797. return 1;
  798. db->addr[db->count++] = addr;
  799. return 0;
  800. }
  801. static void uhci_process_frame(UHCIState *s)
  802. {
  803. uint32_t frame_addr, link, old_td_ctrl, val, int_mask;
  804. uint32_t curr_qh;
  805. int cnt, ret;
  806. UHCI_TD td;
  807. UHCI_QH qh;
  808. QhDb qhdb;
  809. frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
  810. DPRINTF("uhci: processing frame %d addr 0x%x\n" , s->frnum, frame_addr);
  811. cpu_physical_memory_read(frame_addr, (uint8_t *)&link, 4);
  812. le32_to_cpus(&link);
  813. int_mask = 0;
  814. curr_qh = 0;
  815. qhdb_reset(&qhdb);
  816. for (cnt = FRAME_MAX_LOOPS; is_valid(link) && cnt; cnt--) {
  817. if (is_qh(link)) {
  818. /* QH */
  819. if (qhdb_insert(&qhdb, link)) {
  820. /*
  821. * We're going in circles. Which is not a bug because
  822. * HCD is allowed to do that as part of the BW management.
  823. * In our case though it makes no sense to spin here. Sync transations
  824. * are already done, and async completion handler will re-process
  825. * the frame when something is ready.
  826. */
  827. DPRINTF("uhci: detected loop. qh 0x%x\n", link);
  828. break;
  829. }
  830. cpu_physical_memory_read(link & ~0xf, (uint8_t *) &qh, sizeof(qh));
  831. le32_to_cpus(&qh.link);
  832. le32_to_cpus(&qh.el_link);
  833. DPRINTF("uhci: QH 0x%x load. link 0x%x elink 0x%x\n",
  834. link, qh.link, qh.el_link);
  835. if (!is_valid(qh.el_link)) {
  836. /* QH w/o elements */
  837. curr_qh = 0;
  838. link = qh.link;
  839. } else {
  840. /* QH with elements */
  841. curr_qh = link;
  842. link = qh.el_link;
  843. }
  844. continue;
  845. }
  846. /* TD */
  847. cpu_physical_memory_read(link & ~0xf, (uint8_t *) &td, sizeof(td));
  848. le32_to_cpus(&td.link);
  849. le32_to_cpus(&td.ctrl);
  850. le32_to_cpus(&td.token);
  851. le32_to_cpus(&td.buffer);
  852. DPRINTF("uhci: TD 0x%x load. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
  853. link, td.link, td.ctrl, td.token, curr_qh);
  854. old_td_ctrl = td.ctrl;
  855. ret = uhci_handle_td(s, link, &td, &int_mask);
  856. if (old_td_ctrl != td.ctrl) {
  857. /* update the status bits of the TD */
  858. val = cpu_to_le32(td.ctrl);
  859. cpu_physical_memory_write((link & ~0xf) + 4,
  860. (const uint8_t *)&val, sizeof(val));
  861. }
  862. if (ret < 0) {
  863. /* interrupted frame */
  864. break;
  865. }
  866. if (ret == 2 || ret == 1) {
  867. DPRINTF("uhci: TD 0x%x %s. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
  868. link, ret == 2 ? "pend" : "skip",
  869. td.link, td.ctrl, td.token, curr_qh);
  870. link = curr_qh ? qh.link : td.link;
  871. continue;
  872. }
  873. /* completed TD */
  874. DPRINTF("uhci: TD 0x%x done. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
  875. link, td.link, td.ctrl, td.token, curr_qh);
  876. link = td.link;
  877. if (curr_qh) {
  878. /* update QH element link */
  879. qh.el_link = link;
  880. val = cpu_to_le32(qh.el_link);
  881. cpu_physical_memory_write((curr_qh & ~0xf) + 4,
  882. (const uint8_t *)&val, sizeof(val));
  883. if (!depth_first(link)) {
  884. /* done with this QH */
  885. DPRINTF("uhci: QH 0x%x done. link 0x%x elink 0x%x\n",
  886. curr_qh, qh.link, qh.el_link);
  887. curr_qh = 0;
  888. link = qh.link;
  889. }
  890. }
  891. /* go to the next entry */
  892. }
  893. s->pending_int_mask |= int_mask;
  894. }
  895. static void uhci_frame_timer(void *opaque)
  896. {
  897. UHCIState *s = opaque;
  898. /* prepare the timer for the next frame */
  899. s->expire_time += (get_ticks_per_sec() / FRAME_TIMER_FREQ);
  900. if (!(s->cmd & UHCI_CMD_RS)) {
  901. /* Full stop */
  902. qemu_del_timer(s->frame_timer);
  903. /* set hchalted bit in status - UHCI11D 2.1.2 */
  904. s->status |= UHCI_STS_HCHALTED;
  905. DPRINTF("uhci: halted\n");
  906. return;
  907. }
  908. /* Complete the previous frame */
  909. if (s->pending_int_mask) {
  910. s->status2 |= s->pending_int_mask;
  911. s->status |= UHCI_STS_USBINT;
  912. uhci_update_irq(s);
  913. }
  914. s->pending_int_mask = 0;
  915. /* Start new frame */
  916. s->frnum = (s->frnum + 1) & 0x7ff;
  917. DPRINTF("uhci: new frame #%u\n" , s->frnum);
  918. uhci_async_validate_begin(s);
  919. uhci_process_frame(s);
  920. uhci_async_validate_end(s);
  921. qemu_mod_timer(s->frame_timer, s->expire_time);
  922. }
  923. static void uhci_map(PCIDevice *pci_dev, int region_num,
  924. pcibus_t addr, pcibus_t size, int type)
  925. {
  926. UHCIState *s = (UHCIState *)pci_dev;
  927. register_ioport_write(addr, 32, 2, uhci_ioport_writew, s);
  928. register_ioport_read(addr, 32, 2, uhci_ioport_readw, s);
  929. register_ioport_write(addr, 32, 4, uhci_ioport_writel, s);
  930. register_ioport_read(addr, 32, 4, uhci_ioport_readl, s);
  931. register_ioport_write(addr, 32, 1, uhci_ioport_writeb, s);
  932. register_ioport_read(addr, 32, 1, uhci_ioport_readb, s);
  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 3
  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. /* Use region 4 for consistency with real hardware. BSD guests seem
  974. to rely on this. */
  975. pci_register_bar(&s->dev, 4, 0x20,
  976. PCI_BASE_ADDRESS_SPACE_IO, uhci_map);
  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 Property uhci_properties[] = {
  992. DEFINE_PROP_STRING("masterbus", UHCIState, masterbus),
  993. DEFINE_PROP_UINT32("firstport", UHCIState, firstport, 0),
  994. DEFINE_PROP_END_OF_LIST(),
  995. };
  996. static PCIDeviceInfo uhci_info[] = {
  997. {
  998. .qdev.name = "piix3-usb-uhci",
  999. .qdev.size = sizeof(UHCIState),
  1000. .qdev.vmsd = &vmstate_uhci,
  1001. .init = usb_uhci_common_initfn,
  1002. .vendor_id = PCI_VENDOR_ID_INTEL,
  1003. .device_id = PCI_DEVICE_ID_INTEL_82371SB_2,
  1004. .revision = 0x01,
  1005. .class_id = PCI_CLASS_SERIAL_USB,
  1006. .qdev.props = uhci_properties,
  1007. },{
  1008. .qdev.name = "piix4-usb-uhci",
  1009. .qdev.size = sizeof(UHCIState),
  1010. .qdev.vmsd = &vmstate_uhci,
  1011. .init = usb_uhci_common_initfn,
  1012. .vendor_id = PCI_VENDOR_ID_INTEL,
  1013. .device_id = PCI_DEVICE_ID_INTEL_82371AB_2,
  1014. .revision = 0x01,
  1015. .class_id = PCI_CLASS_SERIAL_USB,
  1016. .qdev.props = uhci_properties,
  1017. },{
  1018. .qdev.name = "vt82c686b-usb-uhci",
  1019. .qdev.size = sizeof(UHCIState),
  1020. .qdev.vmsd = &vmstate_uhci,
  1021. .init = usb_uhci_vt82c686b_initfn,
  1022. .vendor_id = PCI_VENDOR_ID_VIA,
  1023. .device_id = PCI_DEVICE_ID_VIA_UHCI,
  1024. .revision = 0x01,
  1025. .class_id = PCI_CLASS_SERIAL_USB,
  1026. .qdev.props = uhci_properties,
  1027. },{
  1028. .qdev.name = "ich9-usb-uhci1",
  1029. .qdev.size = sizeof(UHCIState),
  1030. .qdev.vmsd = &vmstate_uhci,
  1031. .init = usb_uhci_common_initfn,
  1032. .vendor_id = PCI_VENDOR_ID_INTEL,
  1033. .device_id = PCI_DEVICE_ID_INTEL_82801I_UHCI1,
  1034. .revision = 0x03,
  1035. .class_id = PCI_CLASS_SERIAL_USB,
  1036. .qdev.props = uhci_properties,
  1037. },{
  1038. .qdev.name = "ich9-usb-uhci2",
  1039. .qdev.size = sizeof(UHCIState),
  1040. .qdev.vmsd = &vmstate_uhci,
  1041. .init = usb_uhci_common_initfn,
  1042. .vendor_id = PCI_VENDOR_ID_INTEL,
  1043. .device_id = PCI_DEVICE_ID_INTEL_82801I_UHCI2,
  1044. .revision = 0x03,
  1045. .class_id = PCI_CLASS_SERIAL_USB,
  1046. .qdev.props = uhci_properties,
  1047. },{
  1048. .qdev.name = "ich9-usb-uhci3",
  1049. .qdev.size = sizeof(UHCIState),
  1050. .qdev.vmsd = &vmstate_uhci,
  1051. .init = usb_uhci_common_initfn,
  1052. .vendor_id = PCI_VENDOR_ID_INTEL,
  1053. .device_id = PCI_DEVICE_ID_INTEL_82801I_UHCI3,
  1054. .revision = 0x03,
  1055. .class_id = PCI_CLASS_SERIAL_USB,
  1056. .qdev.props = uhci_properties,
  1057. },{
  1058. /* end of list */
  1059. }
  1060. };
  1061. static void uhci_register(void)
  1062. {
  1063. pci_qdev_register_many(uhci_info);
  1064. }
  1065. device_init(uhci_register);
  1066. void usb_uhci_piix3_init(PCIBus *bus, int devfn)
  1067. {
  1068. pci_create_simple(bus, devfn, "piix3-usb-uhci");
  1069. }
  1070. void usb_uhci_piix4_init(PCIBus *bus, int devfn)
  1071. {
  1072. pci_create_simple(bus, devfn, "piix4-usb-uhci");
  1073. }
  1074. void usb_uhci_vt82c686b_init(PCIBus *bus, int devfn)
  1075. {
  1076. pci_create_simple(bus, devfn, "vt82c686b-usb-uhci");
  1077. }