|
|
1.1 root 1: /*
2: * USB UHCI controller emulation
1.1.1.5 root 3: *
1.1 root 4: * Copyright (c) 2005 Fabrice Bellard
1.1.1.5 root 5: *
1.1.1.6 root 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: *
1.1 root 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: */
1.1.1.5 root 28: #include "hw.h"
29: #include "usb.h"
30: #include "pci.h"
31: #include "qemu-timer.h"
1.1 root 32:
33: //#define DEBUG
1.1.1.6 root 34: //#define DEBUG_DUMP_DATA
1.1 root 35:
1.1.1.5 root 36: #define UHCI_CMD_FGR (1 << 4)
37: #define UHCI_CMD_EGSM (1 << 3)
1.1 root 38: #define UHCI_CMD_GRESET (1 << 2)
39: #define UHCI_CMD_HCRESET (1 << 1)
40: #define UHCI_CMD_RS (1 << 0)
41:
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:
49: #define TD_CTRL_SPD (1 << 29)
50: #define TD_CTRL_ERROR_SHIFT 27
51: #define TD_CTRL_IOS (1 << 25)
52: #define TD_CTRL_IOC (1 << 24)
53: #define TD_CTRL_ACTIVE (1 << 23)
54: #define TD_CTRL_STALL (1 << 22)
55: #define TD_CTRL_BABBLE (1 << 20)
56: #define TD_CTRL_NAK (1 << 19)
57: #define TD_CTRL_TIMEOUT (1 << 18)
58:
59: #define UHCI_PORT_RESET (1 << 9)
60: #define UHCI_PORT_LSDA (1 << 8)
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:
66: #define FRAME_TIMER_FREQ 1000
67:
68: #define FRAME_MAX_LOOPS 100
69:
70: #define NB_PORTS 2
71:
1.1.1.6 root 72: #ifdef DEBUG
73: #define dprintf printf
74:
1.1.1.7 ! root 75: static const char *pid2str(int pid)
1.1.1.6 root 76: {
77: switch (pid) {
78: case USB_TOKEN_SETUP: return "SETUP";
79: case USB_TOKEN_IN: return "IN";
80: case USB_TOKEN_OUT: return "OUT";
81: }
82: return "?";
83: }
84:
85: #else
86: #define dprintf(...)
87: #endif
88:
89: #ifdef DEBUG_DUMP_DATA
90: static void dump_data(const uint8_t *data, int len)
91: {
92: int i;
93:
94: printf("uhci: data: ");
95: for(i = 0; i < len; i++)
96: printf(" %02x", data[i]);
97: printf("\n");
98: }
99: #else
100: static void dump_data(const uint8_t *data, int len) {}
101: #endif
102:
103: /*
104: * Pending async transaction.
105: * 'packet' must be the first field because completion
106: * handler does "(UHCIAsync *) pkt" cast.
107: */
108: typedef struct UHCIAsync {
109: USBPacket packet;
110: struct UHCIAsync *next;
111: uint32_t td;
112: uint32_t token;
113: int8_t valid;
114: uint8_t done;
115: uint8_t buffer[2048];
116: } UHCIAsync;
117:
1.1 root 118: typedef struct UHCIPort {
119: USBPort port;
120: uint16_t ctrl;
121: } UHCIPort;
122:
123: typedef struct UHCIState {
124: PCIDevice dev;
125: uint16_t cmd; /* cmd register */
126: uint16_t status;
127: uint16_t intr; /* interrupt enable register */
128: uint16_t frnum; /* frame number */
129: uint32_t fl_base_addr; /* frame list base address */
130: uint8_t sof_timing;
131: uint8_t status2; /* bit 0 and 1 are used to generate UHCI_STS_USBINT */
132: QEMUTimer *frame_timer;
133: UHCIPort ports[NB_PORTS];
1.1.1.4 root 134:
135: /* Interrupts that should be raised at the end of the current frame. */
136: uint32_t pending_int_mask;
1.1.1.6 root 137:
138: /* Active packets */
139: UHCIAsync *async_pending;
140: UHCIAsync *async_pool;
1.1 root 141: } UHCIState;
142:
143: typedef struct UHCI_TD {
144: uint32_t link;
145: uint32_t ctrl; /* see TD_CTRL_xxx */
146: uint32_t token;
147: uint32_t buffer;
148: } UHCI_TD;
149:
150: typedef struct UHCI_QH {
151: uint32_t link;
152: uint32_t el_link;
153: } UHCI_QH;
154:
1.1.1.6 root 155: static UHCIAsync *uhci_async_alloc(UHCIState *s)
156: {
157: UHCIAsync *async = qemu_malloc(sizeof(UHCIAsync));
158:
159: memset(&async->packet, 0, sizeof(async->packet));
160: async->valid = 0;
161: async->td = 0;
162: async->token = 0;
163: async->done = 0;
164: async->next = NULL;
165:
166: return async;
167: }
168:
169: static void uhci_async_free(UHCIState *s, UHCIAsync *async)
170: {
171: qemu_free(async);
172: }
173:
174: static void uhci_async_link(UHCIState *s, UHCIAsync *async)
175: {
176: async->next = s->async_pending;
177: s->async_pending = async;
178: }
179:
180: static void uhci_async_unlink(UHCIState *s, UHCIAsync *async)
181: {
182: UHCIAsync *curr = s->async_pending;
183: UHCIAsync **prev = &s->async_pending;
184:
185: while (curr) {
186: if (curr == async) {
187: *prev = curr->next;
188: return;
189: }
190:
191: prev = &curr->next;
192: curr = curr->next;
193: }
194: }
195:
196: static void uhci_async_cancel(UHCIState *s, UHCIAsync *async)
197: {
198: dprintf("uhci: cancel td 0x%x token 0x%x done %u\n",
199: async->td, async->token, async->done);
200:
201: if (!async->done)
202: usb_cancel_packet(&async->packet);
203: uhci_async_free(s, async);
204: }
205:
206: /*
207: * Mark all outstanding async packets as invalid.
208: * This is used for canceling them when TDs are removed by the HCD.
209: */
210: static UHCIAsync *uhci_async_validate_begin(UHCIState *s)
211: {
212: UHCIAsync *async = s->async_pending;
213:
214: while (async) {
215: async->valid--;
216: async = async->next;
217: }
218: return NULL;
219: }
220:
221: /*
222: * Cancel async packets that are no longer valid
223: */
224: static void uhci_async_validate_end(UHCIState *s)
225: {
226: UHCIAsync *curr = s->async_pending;
227: UHCIAsync **prev = &s->async_pending;
228: UHCIAsync *next;
229:
230: while (curr) {
231: if (curr->valid > 0) {
232: prev = &curr->next;
233: curr = curr->next;
234: continue;
235: }
236:
237: next = curr->next;
238:
239: /* Unlink */
240: *prev = next;
241:
242: uhci_async_cancel(s, curr);
243:
244: curr = next;
245: }
246: }
247:
248: static void uhci_async_cancel_all(UHCIState *s)
249: {
250: UHCIAsync *curr = s->async_pending;
251: UHCIAsync *next;
252:
253: while (curr) {
254: next = curr->next;
255:
256: uhci_async_cancel(s, curr);
257:
258: curr = next;
259: }
260:
261: s->async_pending = NULL;
262: }
263:
264: static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t addr, uint32_t token)
265: {
266: UHCIAsync *async = s->async_pending;
267: UHCIAsync *match = NULL;
268: int count = 0;
269:
270: /*
271: * We're looking for the best match here. ie both td addr and token.
272: * Otherwise we return last good match. ie just token.
273: * It's ok to match just token because it identifies the transaction
274: * rather well, token includes: device addr, endpoint, size, etc.
275: *
276: * Also since we queue async transactions in reverse order by returning
277: * last good match we restores the order.
278: *
279: * It's expected that we wont have a ton of outstanding transactions.
280: * If we ever do we'd want to optimize this algorithm.
281: */
282:
283: while (async) {
284: if (async->token == token) {
285: /* Good match */
286: match = async;
287:
288: if (async->td == addr) {
289: /* Best match */
290: break;
291: }
292: }
293:
294: async = async->next;
295: count++;
296: }
297:
298: if (count > 64)
299: fprintf(stderr, "uhci: warning lots of async transactions\n");
300:
301: return match;
302: }
303:
1.1 root 304: static void uhci_attach(USBPort *port1, USBDevice *dev);
305:
306: static void uhci_update_irq(UHCIState *s)
307: {
308: int level;
309: if (((s->status2 & 1) && (s->intr & (1 << 2))) ||
310: ((s->status2 & 2) && (s->intr & (1 << 3))) ||
311: ((s->status & UHCI_STS_USBERR) && (s->intr & (1 << 0))) ||
312: ((s->status & UHCI_STS_RD) && (s->intr & (1 << 1))) ||
313: (s->status & UHCI_STS_HSERR) ||
314: (s->status & UHCI_STS_HCPERR)) {
315: level = 1;
316: } else {
317: level = 0;
318: }
1.1.1.5 root 319: qemu_set_irq(s->dev.irq[3], level);
1.1 root 320: }
321:
1.1.1.7 ! root 322: static void uhci_reset(void *opaque)
1.1 root 323: {
1.1.1.7 ! root 324: UHCIState *s = opaque;
1.1 root 325: uint8_t *pci_conf;
326: int i;
327: UHCIPort *port;
328:
1.1.1.6 root 329: dprintf("uhci: full reset\n");
330:
1.1 root 331: pci_conf = s->dev.config;
332:
333: pci_conf[0x6a] = 0x01; /* usb clock */
334: pci_conf[0x6b] = 0x00;
335: s->cmd = 0;
336: s->status = 0;
337: s->status2 = 0;
338: s->intr = 0;
339: s->fl_base_addr = 0;
340: s->sof_timing = 64;
1.1.1.6 root 341:
1.1 root 342: for(i = 0; i < NB_PORTS; i++) {
343: port = &s->ports[i];
344: port->ctrl = 0x0080;
345: if (port->port.dev)
346: uhci_attach(&port->port, port->port.dev);
347: }
1.1.1.6 root 348:
349: uhci_async_cancel_all(s);
1.1 root 350: }
351:
1.1.1.5 root 352: static void uhci_save(QEMUFile *f, void *opaque)
353: {
354: UHCIState *s = opaque;
355: uint8_t num_ports = NB_PORTS;
356: int i;
357:
1.1.1.6 root 358: uhci_async_cancel_all(s);
359:
1.1.1.5 root 360: pci_device_save(&s->dev, f);
361:
362: qemu_put_8s(f, &num_ports);
363: for (i = 0; i < num_ports; ++i)
364: qemu_put_be16s(f, &s->ports[i].ctrl);
365: qemu_put_be16s(f, &s->cmd);
366: qemu_put_be16s(f, &s->status);
367: qemu_put_be16s(f, &s->intr);
368: qemu_put_be16s(f, &s->frnum);
369: qemu_put_be32s(f, &s->fl_base_addr);
370: qemu_put_8s(f, &s->sof_timing);
371: qemu_put_8s(f, &s->status2);
372: qemu_put_timer(f, s->frame_timer);
373: }
374:
375: static int uhci_load(QEMUFile *f, void *opaque, int version_id)
376: {
377: UHCIState *s = opaque;
378: uint8_t num_ports;
379: int i, ret;
380:
381: if (version_id > 1)
382: return -EINVAL;
383:
384: ret = pci_device_load(&s->dev, f);
385: if (ret < 0)
386: return ret;
387:
388: qemu_get_8s(f, &num_ports);
389: if (num_ports != NB_PORTS)
390: return -EINVAL;
391:
392: for (i = 0; i < num_ports; ++i)
393: qemu_get_be16s(f, &s->ports[i].ctrl);
394: qemu_get_be16s(f, &s->cmd);
395: qemu_get_be16s(f, &s->status);
396: qemu_get_be16s(f, &s->intr);
397: qemu_get_be16s(f, &s->frnum);
398: qemu_get_be32s(f, &s->fl_base_addr);
399: qemu_get_8s(f, &s->sof_timing);
400: qemu_get_8s(f, &s->status2);
401: qemu_get_timer(f, s->frame_timer);
402:
403: return 0;
404: }
405:
1.1 root 406: static void uhci_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
407: {
408: UHCIState *s = opaque;
1.1.1.5 root 409:
1.1 root 410: addr &= 0x1f;
411: switch(addr) {
412: case 0x0c:
413: s->sof_timing = val;
414: break;
415: }
416: }
417:
418: static uint32_t uhci_ioport_readb(void *opaque, uint32_t addr)
419: {
420: UHCIState *s = opaque;
421: uint32_t val;
422:
423: addr &= 0x1f;
424: switch(addr) {
425: case 0x0c:
426: val = s->sof_timing;
1.1.1.2 root 427: break;
1.1 root 428: default:
429: val = 0xff;
430: break;
431: }
432: return val;
433: }
434:
435: static void uhci_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
436: {
437: UHCIState *s = opaque;
1.1.1.5 root 438:
1.1 root 439: addr &= 0x1f;
1.1.1.6 root 440: dprintf("uhci: writew port=0x%04x val=0x%04x\n", addr, val);
441:
1.1 root 442: switch(addr) {
443: case 0x00:
444: if ((val & UHCI_CMD_RS) && !(s->cmd & UHCI_CMD_RS)) {
445: /* start frame processing */
446: qemu_mod_timer(s->frame_timer, qemu_get_clock(vm_clock));
1.1.1.2 root 447: s->status &= ~UHCI_STS_HCHALTED;
448: } else if (!(val & UHCI_CMD_RS)) {
449: s->status |= UHCI_STS_HCHALTED;
1.1 root 450: }
451: if (val & UHCI_CMD_GRESET) {
452: UHCIPort *port;
453: USBDevice *dev;
454: int i;
455:
456: /* send reset on the USB bus */
457: for(i = 0; i < NB_PORTS; i++) {
458: port = &s->ports[i];
459: dev = port->port.dev;
460: if (dev) {
1.1.1.4 root 461: usb_send_msg(dev, USB_MSG_RESET);
1.1 root 462: }
463: }
464: uhci_reset(s);
465: return;
466: }
467: if (val & UHCI_CMD_HCRESET) {
468: uhci_reset(s);
469: return;
470: }
471: s->cmd = val;
472: break;
473: case 0x02:
474: s->status &= ~val;
475: /* XXX: the chip spec is not coherent, so we add a hidden
476: register to distinguish between IOC and SPD */
477: if (val & UHCI_STS_USBINT)
478: s->status2 = 0;
479: uhci_update_irq(s);
480: break;
481: case 0x04:
482: s->intr = val;
483: uhci_update_irq(s);
484: break;
485: case 0x06:
486: if (s->status & UHCI_STS_HCHALTED)
487: s->frnum = val & 0x7ff;
488: break;
489: case 0x10 ... 0x1f:
490: {
491: UHCIPort *port;
492: USBDevice *dev;
493: int n;
494:
495: n = (addr >> 1) & 7;
496: if (n >= NB_PORTS)
497: return;
498: port = &s->ports[n];
499: dev = port->port.dev;
500: if (dev) {
501: /* port reset */
1.1.1.5 root 502: if ( (val & UHCI_PORT_RESET) &&
1.1 root 503: !(port->ctrl & UHCI_PORT_RESET) ) {
1.1.1.4 root 504: usb_send_msg(dev, USB_MSG_RESET);
1.1 root 505: }
506: }
507: port->ctrl = (port->ctrl & 0x01fb) | (val & ~0x01fb);
508: /* some bits are reset when a '1' is written to them */
509: port->ctrl &= ~(val & 0x000a);
510: }
511: break;
512: }
513: }
514:
515: static uint32_t uhci_ioport_readw(void *opaque, uint32_t addr)
516: {
517: UHCIState *s = opaque;
518: uint32_t val;
519:
520: addr &= 0x1f;
521: switch(addr) {
522: case 0x00:
523: val = s->cmd;
524: break;
525: case 0x02:
526: val = s->status;
527: break;
528: case 0x04:
529: val = s->intr;
530: break;
531: case 0x06:
532: val = s->frnum;
533: break;
534: case 0x10 ... 0x1f:
535: {
536: UHCIPort *port;
537: int n;
538: n = (addr >> 1) & 7;
1.1.1.5 root 539: if (n >= NB_PORTS)
1.1 root 540: goto read_default;
541: port = &s->ports[n];
542: val = port->ctrl;
543: }
544: break;
545: default:
546: read_default:
547: val = 0xff7f; /* disabled port */
548: break;
549: }
1.1.1.6 root 550:
551: dprintf("uhci: readw port=0x%04x val=0x%04x\n", addr, val);
552:
1.1 root 553: return val;
554: }
555:
556: static void uhci_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
557: {
558: UHCIState *s = opaque;
559:
560: addr &= 0x1f;
1.1.1.6 root 561: dprintf("uhci: writel port=0x%04x val=0x%08x\n", addr, val);
562:
1.1 root 563: switch(addr) {
564: case 0x08:
565: s->fl_base_addr = val & ~0xfff;
566: break;
567: }
568: }
569:
570: static uint32_t uhci_ioport_readl(void *opaque, uint32_t addr)
571: {
572: UHCIState *s = opaque;
573: uint32_t val;
574:
575: addr &= 0x1f;
576: switch(addr) {
577: case 0x08:
578: val = s->fl_base_addr;
579: break;
580: default:
581: val = 0xffffffff;
582: break;
583: }
584: return val;
585: }
586:
1.1.1.5 root 587: /* signal resume if controller suspended */
588: static void uhci_resume (void *opaque)
589: {
590: UHCIState *s = (UHCIState *)opaque;
591:
592: if (!s)
593: return;
594:
595: if (s->cmd & UHCI_CMD_EGSM) {
596: s->cmd |= UHCI_CMD_FGR;
597: s->status |= UHCI_STS_RD;
598: uhci_update_irq(s);
599: }
600: }
601:
1.1 root 602: static void uhci_attach(USBPort *port1, USBDevice *dev)
603: {
604: UHCIState *s = port1->opaque;
605: UHCIPort *port = &s->ports[port1->index];
606:
607: if (dev) {
608: if (port->port.dev) {
609: usb_attach(port1, NULL);
610: }
611: /* set connect status */
1.1.1.3 root 612: port->ctrl |= UHCI_PORT_CCS | UHCI_PORT_CSC;
613:
1.1 root 614: /* update speed */
615: if (dev->speed == USB_SPEED_LOW)
616: port->ctrl |= UHCI_PORT_LSDA;
617: else
618: port->ctrl &= ~UHCI_PORT_LSDA;
1.1.1.5 root 619:
620: uhci_resume(s);
621:
1.1 root 622: port->port.dev = dev;
623: /* send the attach message */
1.1.1.4 root 624: usb_send_msg(dev, USB_MSG_ATTACH);
1.1 root 625: } else {
626: /* set connect status */
1.1.1.3 root 627: if (port->ctrl & UHCI_PORT_CCS) {
628: port->ctrl &= ~UHCI_PORT_CCS;
629: port->ctrl |= UHCI_PORT_CSC;
1.1 root 630: }
631: /* disable port */
632: if (port->ctrl & UHCI_PORT_EN) {
633: port->ctrl &= ~UHCI_PORT_EN;
634: port->ctrl |= UHCI_PORT_ENC;
635: }
1.1.1.5 root 636:
637: uhci_resume(s);
638:
1.1 root 639: dev = port->port.dev;
640: if (dev) {
641: /* send the detach message */
1.1.1.4 root 642: usb_send_msg(dev, USB_MSG_DETACH);
1.1 root 643: }
644: port->port.dev = NULL;
645: }
646: }
647:
1.1.1.4 root 648: static int uhci_broadcast_packet(UHCIState *s, USBPacket *p)
1.1 root 649: {
650: int i, ret;
651:
1.1.1.6 root 652: dprintf("uhci: packet enter. pid %s addr 0x%02x ep %d len %d\n",
653: pid2str(p->pid), p->devaddr, p->devep, p->len);
654: if (p->pid == USB_TOKEN_OUT || p->pid == USB_TOKEN_SETUP)
655: dump_data(p->data, p->len);
656:
657: ret = USB_RET_NODEV;
658: for (i = 0; i < NB_PORTS && ret == USB_RET_NODEV; i++) {
659: UHCIPort *port = &s->ports[i];
660: USBDevice *dev = port->port.dev;
661:
662: if (dev && (port->ctrl & UHCI_PORT_EN))
1.1.1.4 root 663: ret = dev->handle_packet(dev, p);
1.1 root 664: }
1.1.1.6 root 665:
666: dprintf("uhci: packet exit. ret %d len %d\n", ret, p->len);
667: if (p->pid == USB_TOKEN_IN && ret > 0)
668: dump_data(p->data, ret);
669:
670: return ret;
1.1 root 671: }
672:
1.1.1.6 root 673: static void uhci_async_complete(USBPacket * packet, void *opaque);
674: static void uhci_process_frame(UHCIState *s);
1.1.1.4 root 675:
1.1 root 676: /* return -1 if fatal error (frame must be stopped)
677: 0 if TD successful
678: 1 if TD unsuccessful or inactive
679: */
1.1.1.6 root 680: static int uhci_complete_td(UHCIState *s, UHCI_TD *td, UHCIAsync *async, uint32_t *int_mask)
1.1 root 681: {
1.1.1.6 root 682: int len = 0, max_len, err, ret;
1.1 root 683: uint8_t pid;
684:
1.1.1.6 root 685: max_len = ((td->token >> 21) + 1) & 0x7ff;
686: pid = td->token & 0xff;
687:
688: ret = async->packet.len;
689:
690: if (td->ctrl & TD_CTRL_IOC)
1.1 root 691: *int_mask |= 0x01;
1.1.1.5 root 692:
1.1.1.6 root 693: if (td->ctrl & TD_CTRL_IOS)
694: td->ctrl &= ~TD_CTRL_ACTIVE;
1.1 root 695:
1.1.1.6 root 696: if (ret < 0)
697: goto out;
1.1.1.5 root 698:
1.1.1.6 root 699: len = async->packet.len;
700: td->ctrl = (td->ctrl & ~0x7ff) | ((len - 1) & 0x7ff);
701:
702: /* The NAK bit may have been set by a previous frame, so clear it
703: here. The docs are somewhat unclear, but win2k relies on this
704: behavior. */
705: td->ctrl &= ~(TD_CTRL_ACTIVE | TD_CTRL_NAK);
706:
707: if (pid == USB_TOKEN_IN) {
708: if (len > max_len) {
1.1.1.4 root 709: len = max_len;
1.1.1.6 root 710: ret = USB_RET_BABBLE;
711: goto out;
1.1.1.4 root 712: }
1.1.1.5 root 713:
1.1.1.6 root 714: if (len > 0) {
715: /* write the data back */
716: cpu_physical_memory_write(td->buffer, async->buffer, len);
717: }
718:
719: if ((td->ctrl & TD_CTRL_SPD) && len < max_len) {
1.1 root 720: *int_mask |= 0x02;
721: /* short packet: do not update QH */
1.1.1.6 root 722: dprintf("uhci: short packet. td 0x%x token 0x%x\n", async->td, async->token);
1.1 root 723: return 1;
724: }
1.1.1.6 root 725: }
726:
727: /* success */
728: return 0;
729:
730: out:
731: switch(ret) {
732: case USB_RET_STALL:
733: td->ctrl |= TD_CTRL_STALL;
734: td->ctrl &= ~TD_CTRL_ACTIVE;
735: return 1;
736:
737: case USB_RET_BABBLE:
738: td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL;
739: td->ctrl &= ~TD_CTRL_ACTIVE;
740: /* frame interrupted */
741: return -1;
742:
743: case USB_RET_NAK:
744: td->ctrl |= TD_CTRL_NAK;
745: if (pid == USB_TOKEN_SETUP)
746: break;
747: return 1;
748:
749: case USB_RET_NODEV:
750: default:
751: break;
752: }
753:
754: /* Retry the TD if error count is not zero */
755:
756: td->ctrl |= TD_CTRL_TIMEOUT;
757: err = (td->ctrl >> TD_CTRL_ERROR_SHIFT) & 3;
758: if (err != 0) {
759: err--;
760: if (err == 0) {
1.1 root 761: td->ctrl &= ~TD_CTRL_ACTIVE;
1.1.1.6 root 762: s->status |= UHCI_STS_USBERR;
763: uhci_update_irq(s);
1.1 root 764: }
765: }
1.1.1.6 root 766: td->ctrl = (td->ctrl & ~(3 << TD_CTRL_ERROR_SHIFT)) |
767: (err << TD_CTRL_ERROR_SHIFT);
768: return 1;
1.1 root 769: }
770:
1.1.1.6 root 771: static int uhci_handle_td(UHCIState *s, uint32_t addr, UHCI_TD *td, uint32_t *int_mask)
772: {
773: UHCIAsync *async;
774: int len = 0, max_len;
775: uint8_t pid;
776:
777: /* Is active ? */
778: if (!(td->ctrl & TD_CTRL_ACTIVE))
779: return 1;
780:
781: async = uhci_async_find_td(s, addr, td->token);
782: if (async) {
783: /* Already submitted */
784: async->valid = 32;
785:
786: if (!async->done)
787: return 1;
788:
789: uhci_async_unlink(s, async);
790: goto done;
791: }
792:
793: /* Allocate new packet */
794: async = uhci_async_alloc(s);
795: if (!async)
796: return 1;
797:
798: async->valid = 10;
799: async->td = addr;
800: async->token = td->token;
801:
802: max_len = ((td->token >> 21) + 1) & 0x7ff;
803: pid = td->token & 0xff;
804:
805: async->packet.pid = pid;
806: async->packet.devaddr = (td->token >> 8) & 0x7f;
807: async->packet.devep = (td->token >> 15) & 0xf;
808: async->packet.data = async->buffer;
809: async->packet.len = max_len;
810: async->packet.complete_cb = uhci_async_complete;
811: async->packet.complete_opaque = s;
812:
813: switch(pid) {
814: case USB_TOKEN_OUT:
815: case USB_TOKEN_SETUP:
816: cpu_physical_memory_read(td->buffer, async->buffer, max_len);
817: len = uhci_broadcast_packet(s, &async->packet);
818: if (len >= 0)
819: len = max_len;
820: break;
821:
822: case USB_TOKEN_IN:
823: len = uhci_broadcast_packet(s, &async->packet);
824: break;
825:
826: default:
827: /* invalid pid : frame interrupted */
828: uhci_async_free(s, async);
829: s->status |= UHCI_STS_HCPERR;
830: uhci_update_irq(s);
831: return -1;
832: }
833:
834: if (len == USB_RET_ASYNC) {
835: uhci_async_link(s, async);
836: return 2;
837: }
838:
839: async->packet.len = len;
840:
841: done:
842: len = uhci_complete_td(s, td, async, int_mask);
843: uhci_async_free(s, async);
844: return len;
845: }
846:
847: static void uhci_async_complete(USBPacket *packet, void *opaque)
1.1.1.4 root 848: {
849: UHCIState *s = opaque;
1.1.1.6 root 850: UHCIAsync *async = (UHCIAsync *) packet;
851:
852: dprintf("uhci: async complete. td 0x%x token 0x%x\n", async->td, async->token);
853:
854: async->done = 1;
855:
856: uhci_process_frame(s);
857: }
858:
859: static int is_valid(uint32_t link)
860: {
861: return (link & 1) == 0;
862: }
863:
864: static int is_qh(uint32_t link)
865: {
866: return (link & 2) != 0;
867: }
868:
869: static int depth_first(uint32_t link)
870: {
871: return (link & 4) != 0;
872: }
873:
874: /* QH DB used for detecting QH loops */
875: #define UHCI_MAX_QUEUES 128
876: typedef struct {
877: uint32_t addr[UHCI_MAX_QUEUES];
878: int count;
879: } QhDb;
880:
881: static void qhdb_reset(QhDb *db)
882: {
883: db->count = 0;
884: }
885:
886: /* Add QH to DB. Returns 1 if already present or DB is full. */
887: static int qhdb_insert(QhDb *db, uint32_t addr)
888: {
889: int i;
890: for (i = 0; i < db->count; i++)
891: if (db->addr[i] == addr)
892: return 1;
893:
894: if (db->count >= UHCI_MAX_QUEUES)
895: return 1;
896:
897: db->addr[db->count++] = addr;
898: return 0;
899: }
900:
901: static void uhci_process_frame(UHCIState *s)
902: {
903: uint32_t frame_addr, link, old_td_ctrl, val, int_mask;
904: uint32_t curr_qh;
905: int cnt, ret;
1.1.1.4 root 906: UHCI_TD td;
1.1.1.6 root 907: UHCI_QH qh;
908: QhDb qhdb;
909:
910: frame_addr = s->fl_base_addr + ((s->frnum & 0x3ff) << 2);
911:
912: dprintf("uhci: processing frame %d addr 0x%x\n" , s->frnum, frame_addr);
913:
914: cpu_physical_memory_read(frame_addr, (uint8_t *)&link, 4);
915: le32_to_cpus(&link);
916:
917: int_mask = 0;
918: curr_qh = 0;
919:
920: qhdb_reset(&qhdb);
921:
922: for (cnt = FRAME_MAX_LOOPS; is_valid(link) && cnt; cnt--) {
923: if (is_qh(link)) {
924: /* QH */
925:
926: if (qhdb_insert(&qhdb, link)) {
927: /*
928: * We're going in circles. Which is not a bug because
929: * HCD is allowed to do that as part of the BW management.
930: * In our case though it makes no sense to spin here. Sync transations
931: * are already done, and async completion handler will re-process
932: * the frame when something is ready.
933: */
934: dprintf("uhci: detected loop. qh 0x%x\n", link);
935: break;
936: }
937:
938: cpu_physical_memory_read(link & ~0xf, (uint8_t *) &qh, sizeof(qh));
939: le32_to_cpus(&qh.link);
940: le32_to_cpus(&qh.el_link);
941:
942: dprintf("uhci: QH 0x%x load. link 0x%x elink 0x%x\n",
943: link, qh.link, qh.el_link);
1.1.1.4 root 944:
1.1.1.6 root 945: if (!is_valid(qh.el_link)) {
946: /* QH w/o elements */
947: curr_qh = 0;
948: link = qh.link;
949: } else {
950: /* QH with elements */
951: curr_qh = link;
952: link = qh.el_link;
953: }
954: continue;
955: }
1.1.1.5 root 956:
1.1.1.6 root 957: /* TD */
958: cpu_physical_memory_read(link & ~0xf, (uint8_t *) &td, sizeof(td));
1.1.1.5 root 959: le32_to_cpus(&td.link);
960: le32_to_cpus(&td.ctrl);
961: le32_to_cpus(&td.token);
962: le32_to_cpus(&td.buffer);
963:
1.1.1.6 root 964: dprintf("uhci: TD 0x%x load. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
965: link, td.link, td.ctrl, td.token, curr_qh);
966:
967: old_td_ctrl = td.ctrl;
968: ret = uhci_handle_td(s, link, &td, &int_mask);
1.1.1.5 root 969: if (old_td_ctrl != td.ctrl) {
1.1.1.6 root 970: /* update the status bits of the TD */
1.1.1.5 root 971: val = cpu_to_le32(td.ctrl);
972: cpu_physical_memory_write((link & ~0xf) + 4,
1.1.1.6 root 973: (const uint8_t *)&val, sizeof(val));
1.1.1.5 root 974: }
1.1.1.6 root 975:
976: if (ret < 0) {
977: /* interrupted frame */
978: break;
1.1.1.5 root 979: }
980:
1.1.1.6 root 981: if (ret == 2 || ret == 1) {
982: dprintf("uhci: TD 0x%x %s. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
983: link, ret == 2 ? "pend" : "skip",
984: td.link, td.ctrl, td.token, curr_qh);
1.1.1.5 root 985:
1.1.1.6 root 986: link = curr_qh ? qh.link : td.link;
987: continue;
988: }
989:
990: /* completed TD */
991:
992: dprintf("uhci: TD 0x%x done. link 0x%x ctrl 0x%x token 0x%x qh 0x%x\n",
993: link, td.link, td.ctrl, td.token, curr_qh);
994:
995: link = td.link;
996:
997: if (curr_qh) {
998: /* update QH element link */
999: qh.el_link = link;
1.1.1.4 root 1000: val = cpu_to_le32(qh.el_link);
1.1.1.6 root 1001: cpu_physical_memory_write((curr_qh & ~0xf) + 4,
1002: (const uint8_t *)&val, sizeof(val));
1003:
1004: if (!depth_first(link)) {
1005: /* done with this QH */
1006:
1007: dprintf("uhci: QH 0x%x done. link 0x%x elink 0x%x\n",
1008: curr_qh, qh.link, qh.el_link);
1009:
1010: curr_qh = 0;
1011: link = qh.link;
1012: }
1.1.1.4 root 1013: }
1.1.1.6 root 1014:
1015: /* go to the next entry */
1.1.1.4 root 1016: }
1.1.1.6 root 1017:
1018: s->pending_int_mask = int_mask;
1.1.1.4 root 1019: }
1020:
1.1 root 1021: static void uhci_frame_timer(void *opaque)
1022: {
1023: UHCIState *s = opaque;
1024: int64_t expire_time;
1025:
1026: if (!(s->cmd & UHCI_CMD_RS)) {
1.1.1.6 root 1027: /* Full stop */
1.1 root 1028: qemu_del_timer(s->frame_timer);
1.1.1.2 root 1029: /* set hchalted bit in status - UHCI11D 2.1.2 */
1030: s->status |= UHCI_STS_HCHALTED;
1.1.1.6 root 1031:
1032: dprintf("uhci: halted\n");
1.1 root 1033: return;
1034: }
1.1.1.6 root 1035:
1036: /* Complete the previous frame */
1.1.1.4 root 1037: if (s->pending_int_mask) {
1038: s->status2 |= s->pending_int_mask;
1.1.1.6 root 1039: s->status |= UHCI_STS_USBINT;
1.1.1.4 root 1040: uhci_update_irq(s);
1041: }
1.1.1.5 root 1042:
1.1.1.6 root 1043: /* Start new frame */
1044: s->frnum = (s->frnum + 1) & 0x7ff;
1045:
1046: dprintf("uhci: new frame #%u\n" , s->frnum);
1047:
1048: uhci_async_validate_begin(s);
1049:
1050: uhci_process_frame(s);
1051:
1052: uhci_async_validate_end(s);
1.1.1.5 root 1053:
1.1 root 1054: /* prepare the timer for the next frame */
1.1.1.5 root 1055: expire_time = qemu_get_clock(vm_clock) +
1.1 root 1056: (ticks_per_sec / FRAME_TIMER_FREQ);
1057: qemu_mod_timer(s->frame_timer, expire_time);
1058: }
1059:
1.1.1.5 root 1060: static void uhci_map(PCIDevice *pci_dev, int region_num,
1.1 root 1061: uint32_t addr, uint32_t size, int type)
1062: {
1063: UHCIState *s = (UHCIState *)pci_dev;
1064:
1065: register_ioport_write(addr, 32, 2, uhci_ioport_writew, s);
1066: register_ioport_read(addr, 32, 2, uhci_ioport_readw, s);
1067: register_ioport_write(addr, 32, 4, uhci_ioport_writel, s);
1068: register_ioport_read(addr, 32, 4, uhci_ioport_readl, s);
1069: register_ioport_write(addr, 32, 1, uhci_ioport_writeb, s);
1070: register_ioport_read(addr, 32, 1, uhci_ioport_readb, s);
1071: }
1072:
1.1.1.5 root 1073: void usb_uhci_piix3_init(PCIBus *bus, int devfn)
1.1 root 1074: {
1075: UHCIState *s;
1076: uint8_t *pci_conf;
1077: int i;
1078:
1079: s = (UHCIState *)pci_register_device(bus,
1080: "USB-UHCI", sizeof(UHCIState),
1.1.1.3 root 1081: devfn, NULL, NULL);
1.1 root 1082: pci_conf = s->dev.config;
1.1.1.6 root 1083: pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1084: pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371SB_2);
1.1 root 1085: pci_conf[0x08] = 0x01; // revision number
1086: pci_conf[0x09] = 0x00;
1.1.1.6 root 1087: pci_config_set_class(pci_conf, PCI_CLASS_SERIAL_USB);
1.1.1.7 ! root 1088: pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; // header_type
1.1 root 1089: pci_conf[0x3d] = 4; // interrupt pin 3
1.1.1.2 root 1090: pci_conf[0x60] = 0x10; // release number
1.1.1.5 root 1091:
1092: for(i = 0; i < NB_PORTS; i++) {
1093: qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);
1094: }
1095: s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s);
1096:
1.1.1.7 ! root 1097: qemu_register_reset(uhci_reset, s);
1.1.1.5 root 1098: uhci_reset(s);
1099:
1100: /* Use region 4 for consistency with real hardware. BSD guests seem
1101: to rely on this. */
1.1.1.7 ! root 1102: pci_register_bar(&s->dev, 4, 0x20,
1.1.1.5 root 1103: PCI_ADDRESS_SPACE_IO, uhci_map);
1.1.1.6 root 1104:
1105: register_savevm("uhci", 0, 1, uhci_save, uhci_load, s);
1.1.1.5 root 1106: }
1107:
1108: void usb_uhci_piix4_init(PCIBus *bus, int devfn)
1109: {
1110: UHCIState *s;
1111: uint8_t *pci_conf;
1112: int i;
1113:
1114: s = (UHCIState *)pci_register_device(bus,
1115: "USB-UHCI", sizeof(UHCIState),
1116: devfn, NULL, NULL);
1117: pci_conf = s->dev.config;
1.1.1.6 root 1118: pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
1119: pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371AB_2);
1.1.1.5 root 1120: pci_conf[0x08] = 0x01; // revision number
1121: pci_conf[0x09] = 0x00;
1.1.1.6 root 1122: pci_config_set_class(pci_conf, PCI_CLASS_SERIAL_USB);
1.1.1.7 ! root 1123: pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; // header_type
1.1.1.5 root 1124: pci_conf[0x3d] = 4; // interrupt pin 3
1125: pci_conf[0x60] = 0x10; // release number
1126:
1.1 root 1127: for(i = 0; i < NB_PORTS; i++) {
1.1.1.3 root 1128: qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);
1.1 root 1129: }
1130: s->frame_timer = qemu_new_timer(vm_clock, uhci_frame_timer, s);
1131:
1.1.1.7 ! root 1132: qemu_register_reset(uhci_reset, s);
1.1 root 1133: uhci_reset(s);
1134:
1.1.1.2 root 1135: /* Use region 4 for consistency with real hardware. BSD guests seem
1136: to rely on this. */
1.1.1.7 ! root 1137: pci_register_bar(&s->dev, 4, 0x20,
1.1 root 1138: PCI_ADDRESS_SPACE_IO, uhci_map);
1.1.1.6 root 1139:
1140: register_savevm("uhci", 0, 1, uhci_save, uhci_load, s);
1.1 root 1141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.