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