|
|
1.1 root 1: /*
2: * QEMU USB EHCI Emulation
3: *
4: * Copyright(c) 2008 Emutex Ltd. (address@hidden)
5: *
6: * EHCI project was started by Mark Burkley, with contributions by
7: * Niels de Vos. David S. Ahern continued working on it. Kevin Wolf,
8: * Jan Kiszka and Vincent Palatin contributed bugfixes.
9: *
10: *
11: * This library is free software; you can redistribute it and/or
12: * modify it under the terms of the GNU Lesser General Public
13: * License as published by the Free Software Foundation; either
14: * version 2 of the License, or(at your option) any later version.
15: *
16: * This library is distributed in the hope that it will be useful,
17: * but WITHOUT ANY WARRANTY; without even the implied warranty of
18: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19: * Lesser General Public License for more details.
20: *
21: * You should have received a copy of the GNU General Public License
22: * along with this program; if not, see <http://www.gnu.org/licenses/>.
23: */
24:
25: #include "hw/hw.h"
26: #include "qemu-timer.h"
27: #include "hw/usb.h"
28: #include "hw/pci.h"
29: #include "monitor.h"
30: #include "trace.h"
31: #include "dma.h"
32:
33: #define EHCI_DEBUG 0
34:
35: #if EHCI_DEBUG
36: #define DPRINTF printf
37: #else
38: #define DPRINTF(...)
39: #endif
40:
41: /* internal processing - reset HC to try and recover */
42: #define USB_RET_PROCERR (-99)
43:
44: #define MMIO_SIZE 0x1000
45:
46: /* Capability Registers Base Address - section 2.2 */
47: #define CAPREGBASE 0x0000
48: #define CAPLENGTH CAPREGBASE + 0x0000 // 1-byte, 0x0001 reserved
49: #define HCIVERSION CAPREGBASE + 0x0002 // 2-bytes, i/f version #
50: #define HCSPARAMS CAPREGBASE + 0x0004 // 4-bytes, structural params
51: #define HCCPARAMS CAPREGBASE + 0x0008 // 4-bytes, capability params
52: #define EECP HCCPARAMS + 1
53: #define HCSPPORTROUTE1 CAPREGBASE + 0x000c
54: #define HCSPPORTROUTE2 CAPREGBASE + 0x0010
55:
56: #define OPREGBASE 0x0020 // Operational Registers Base Address
57:
58: #define USBCMD OPREGBASE + 0x0000
59: #define USBCMD_RUNSTOP (1 << 0) // run / Stop
60: #define USBCMD_HCRESET (1 << 1) // HC Reset
61: #define USBCMD_FLS (3 << 2) // Frame List Size
62: #define USBCMD_FLS_SH 2 // Frame List Size Shift
63: #define USBCMD_PSE (1 << 4) // Periodic Schedule Enable
64: #define USBCMD_ASE (1 << 5) // Asynch Schedule Enable
65: #define USBCMD_IAAD (1 << 6) // Int Asynch Advance Doorbell
66: #define USBCMD_LHCR (1 << 7) // Light Host Controller Reset
67: #define USBCMD_ASPMC (3 << 8) // Async Sched Park Mode Count
68: #define USBCMD_ASPME (1 << 11) // Async Sched Park Mode Enable
69: #define USBCMD_ITC (0x7f << 16) // Int Threshold Control
70: #define USBCMD_ITC_SH 16 // Int Threshold Control Shift
71:
72: #define USBSTS OPREGBASE + 0x0004
73: #define USBSTS_RO_MASK 0x0000003f
74: #define USBSTS_INT (1 << 0) // USB Interrupt
75: #define USBSTS_ERRINT (1 << 1) // Error Interrupt
76: #define USBSTS_PCD (1 << 2) // Port Change Detect
77: #define USBSTS_FLR (1 << 3) // Frame List Rollover
78: #define USBSTS_HSE (1 << 4) // Host System Error
79: #define USBSTS_IAA (1 << 5) // Interrupt on Async Advance
80: #define USBSTS_HALT (1 << 12) // HC Halted
81: #define USBSTS_REC (1 << 13) // Reclamation
82: #define USBSTS_PSS (1 << 14) // Periodic Schedule Status
83: #define USBSTS_ASS (1 << 15) // Asynchronous Schedule Status
84:
85: /*
86: * Interrupt enable bits correspond to the interrupt active bits in USBSTS
87: * so no need to redefine here.
88: */
89: #define USBINTR OPREGBASE + 0x0008
90: #define USBINTR_MASK 0x0000003f
91:
92: #define FRINDEX OPREGBASE + 0x000c
93: #define CTRLDSSEGMENT OPREGBASE + 0x0010
94: #define PERIODICLISTBASE OPREGBASE + 0x0014
95: #define ASYNCLISTADDR OPREGBASE + 0x0018
96: #define ASYNCLISTADDR_MASK 0xffffffe0
97:
98: #define CONFIGFLAG OPREGBASE + 0x0040
99:
100: #define PORTSC (OPREGBASE + 0x0044)
101: #define PORTSC_BEGIN PORTSC
102: #define PORTSC_END (PORTSC + 4 * NB_PORTS)
103: /*
104: * Bits that are reserved or are read-only are masked out of values
105: * written to us by software
106: */
107: #define PORTSC_RO_MASK 0x007001c0
108: #define PORTSC_RWC_MASK 0x0000002a
109: #define PORTSC_WKOC_E (1 << 22) // Wake on Over Current Enable
110: #define PORTSC_WKDS_E (1 << 21) // Wake on Disconnect Enable
111: #define PORTSC_WKCN_E (1 << 20) // Wake on Connect Enable
112: #define PORTSC_PTC (15 << 16) // Port Test Control
113: #define PORTSC_PTC_SH 16 // Port Test Control shift
114: #define PORTSC_PIC (3 << 14) // Port Indicator Control
115: #define PORTSC_PIC_SH 14 // Port Indicator Control Shift
116: #define PORTSC_POWNER (1 << 13) // Port Owner
117: #define PORTSC_PPOWER (1 << 12) // Port Power
118: #define PORTSC_LINESTAT (3 << 10) // Port Line Status
119: #define PORTSC_LINESTAT_SH 10 // Port Line Status Shift
120: #define PORTSC_PRESET (1 << 8) // Port Reset
121: #define PORTSC_SUSPEND (1 << 7) // Port Suspend
122: #define PORTSC_FPRES (1 << 6) // Force Port Resume
123: #define PORTSC_OCC (1 << 5) // Over Current Change
124: #define PORTSC_OCA (1 << 4) // Over Current Active
125: #define PORTSC_PEDC (1 << 3) // Port Enable/Disable Change
126: #define PORTSC_PED (1 << 2) // Port Enable/Disable
127: #define PORTSC_CSC (1 << 1) // Connect Status Change
128: #define PORTSC_CONNECT (1 << 0) // Current Connect Status
129:
130: #define FRAME_TIMER_FREQ 1000
131: #define FRAME_TIMER_NS (1000000000 / FRAME_TIMER_FREQ)
132:
133: #define NB_MAXINTRATE 8 // Max rate at which controller issues ints
134: #define NB_PORTS 6 // Number of downstream ports
135: #define BUFF_SIZE 5*4096 // Max bytes to transfer per transaction
136: #define MAX_QH 100 // Max allowable queue heads in a chain
137:
138: /* Internal periodic / asynchronous schedule state machine states
139: */
140: typedef enum {
141: EST_INACTIVE = 1000,
142: EST_ACTIVE,
143: EST_EXECUTING,
144: EST_SLEEPING,
145: /* The following states are internal to the state machine function
146: */
147: EST_WAITLISTHEAD,
148: EST_FETCHENTRY,
149: EST_FETCHQH,
150: EST_FETCHITD,
151: EST_FETCHSITD,
152: EST_ADVANCEQUEUE,
153: EST_FETCHQTD,
154: EST_EXECUTE,
155: EST_WRITEBACK,
156: EST_HORIZONTALQH
157: } EHCI_STATES;
158:
159: /* macros for accessing fields within next link pointer entry */
160: #define NLPTR_GET(x) ((x) & 0xffffffe0)
161: #define NLPTR_TYPE_GET(x) (((x) >> 1) & 3)
162: #define NLPTR_TBIT(x) ((x) & 1) // 1=invalid, 0=valid
163:
164: /* link pointer types */
165: #define NLPTR_TYPE_ITD 0 // isoc xfer descriptor
166: #define NLPTR_TYPE_QH 1 // queue head
167: #define NLPTR_TYPE_STITD 2 // split xaction, isoc xfer descriptor
168: #define NLPTR_TYPE_FSTN 3 // frame span traversal node
169:
170:
171: /* EHCI spec version 1.0 Section 3.3
172: */
173: typedef struct EHCIitd {
174: uint32_t next;
175:
176: uint32_t transact[8];
177: #define ITD_XACT_ACTIVE (1 << 31)
178: #define ITD_XACT_DBERROR (1 << 30)
179: #define ITD_XACT_BABBLE (1 << 29)
180: #define ITD_XACT_XACTERR (1 << 28)
181: #define ITD_XACT_LENGTH_MASK 0x0fff0000
182: #define ITD_XACT_LENGTH_SH 16
183: #define ITD_XACT_IOC (1 << 15)
184: #define ITD_XACT_PGSEL_MASK 0x00007000
185: #define ITD_XACT_PGSEL_SH 12
186: #define ITD_XACT_OFFSET_MASK 0x00000fff
187:
188: uint32_t bufptr[7];
189: #define ITD_BUFPTR_MASK 0xfffff000
190: #define ITD_BUFPTR_SH 12
191: #define ITD_BUFPTR_EP_MASK 0x00000f00
192: #define ITD_BUFPTR_EP_SH 8
193: #define ITD_BUFPTR_DEVADDR_MASK 0x0000007f
194: #define ITD_BUFPTR_DEVADDR_SH 0
195: #define ITD_BUFPTR_DIRECTION (1 << 11)
196: #define ITD_BUFPTR_MAXPKT_MASK 0x000007ff
197: #define ITD_BUFPTR_MAXPKT_SH 0
198: #define ITD_BUFPTR_MULT_MASK 0x00000003
199: #define ITD_BUFPTR_MULT_SH 0
200: } EHCIitd;
201:
202: /* EHCI spec version 1.0 Section 3.4
203: */
204: typedef struct EHCIsitd {
205: uint32_t next; // Standard next link pointer
206: uint32_t epchar;
207: #define SITD_EPCHAR_IO (1 << 31)
208: #define SITD_EPCHAR_PORTNUM_MASK 0x7f000000
209: #define SITD_EPCHAR_PORTNUM_SH 24
210: #define SITD_EPCHAR_HUBADD_MASK 0x007f0000
211: #define SITD_EPCHAR_HUBADDR_SH 16
212: #define SITD_EPCHAR_EPNUM_MASK 0x00000f00
213: #define SITD_EPCHAR_EPNUM_SH 8
214: #define SITD_EPCHAR_DEVADDR_MASK 0x0000007f
215:
216: uint32_t uframe;
217: #define SITD_UFRAME_CMASK_MASK 0x0000ff00
218: #define SITD_UFRAME_CMASK_SH 8
219: #define SITD_UFRAME_SMASK_MASK 0x000000ff
220:
221: uint32_t results;
222: #define SITD_RESULTS_IOC (1 << 31)
223: #define SITD_RESULTS_PGSEL (1 << 30)
224: #define SITD_RESULTS_TBYTES_MASK 0x03ff0000
225: #define SITD_RESULTS_TYBYTES_SH 16
226: #define SITD_RESULTS_CPROGMASK_MASK 0x0000ff00
227: #define SITD_RESULTS_CPROGMASK_SH 8
228: #define SITD_RESULTS_ACTIVE (1 << 7)
229: #define SITD_RESULTS_ERR (1 << 6)
230: #define SITD_RESULTS_DBERR (1 << 5)
231: #define SITD_RESULTS_BABBLE (1 << 4)
232: #define SITD_RESULTS_XACTERR (1 << 3)
233: #define SITD_RESULTS_MISSEDUF (1 << 2)
234: #define SITD_RESULTS_SPLITXSTATE (1 << 1)
235:
236: uint32_t bufptr[2];
237: #define SITD_BUFPTR_MASK 0xfffff000
238: #define SITD_BUFPTR_CURROFF_MASK 0x00000fff
239: #define SITD_BUFPTR_TPOS_MASK 0x00000018
240: #define SITD_BUFPTR_TPOS_SH 3
241: #define SITD_BUFPTR_TCNT_MASK 0x00000007
242:
243: uint32_t backptr; // Standard next link pointer
244: } EHCIsitd;
245:
246: /* EHCI spec version 1.0 Section 3.5
247: */
248: typedef struct EHCIqtd {
249: uint32_t next; // Standard next link pointer
250: uint32_t altnext; // Standard next link pointer
251: uint32_t token;
252: #define QTD_TOKEN_DTOGGLE (1 << 31)
253: #define QTD_TOKEN_TBYTES_MASK 0x7fff0000
254: #define QTD_TOKEN_TBYTES_SH 16
255: #define QTD_TOKEN_IOC (1 << 15)
256: #define QTD_TOKEN_CPAGE_MASK 0x00007000
257: #define QTD_TOKEN_CPAGE_SH 12
258: #define QTD_TOKEN_CERR_MASK 0x00000c00
259: #define QTD_TOKEN_CERR_SH 10
260: #define QTD_TOKEN_PID_MASK 0x00000300
261: #define QTD_TOKEN_PID_SH 8
262: #define QTD_TOKEN_ACTIVE (1 << 7)
263: #define QTD_TOKEN_HALT (1 << 6)
264: #define QTD_TOKEN_DBERR (1 << 5)
265: #define QTD_TOKEN_BABBLE (1 << 4)
266: #define QTD_TOKEN_XACTERR (1 << 3)
267: #define QTD_TOKEN_MISSEDUF (1 << 2)
268: #define QTD_TOKEN_SPLITXSTATE (1 << 1)
269: #define QTD_TOKEN_PING (1 << 0)
270:
271: uint32_t bufptr[5]; // Standard buffer pointer
272: #define QTD_BUFPTR_MASK 0xfffff000
273: #define QTD_BUFPTR_SH 12
274: } EHCIqtd;
275:
276: /* EHCI spec version 1.0 Section 3.6
277: */
278: typedef struct EHCIqh {
279: uint32_t next; // Standard next link pointer
280:
281: /* endpoint characteristics */
282: uint32_t epchar;
283: #define QH_EPCHAR_RL_MASK 0xf0000000
284: #define QH_EPCHAR_RL_SH 28
285: #define QH_EPCHAR_C (1 << 27)
286: #define QH_EPCHAR_MPLEN_MASK 0x07FF0000
287: #define QH_EPCHAR_MPLEN_SH 16
288: #define QH_EPCHAR_H (1 << 15)
289: #define QH_EPCHAR_DTC (1 << 14)
290: #define QH_EPCHAR_EPS_MASK 0x00003000
291: #define QH_EPCHAR_EPS_SH 12
292: #define EHCI_QH_EPS_FULL 0
293: #define EHCI_QH_EPS_LOW 1
294: #define EHCI_QH_EPS_HIGH 2
295: #define EHCI_QH_EPS_RESERVED 3
296:
297: #define QH_EPCHAR_EP_MASK 0x00000f00
298: #define QH_EPCHAR_EP_SH 8
299: #define QH_EPCHAR_I (1 << 7)
300: #define QH_EPCHAR_DEVADDR_MASK 0x0000007f
301: #define QH_EPCHAR_DEVADDR_SH 0
302:
303: /* endpoint capabilities */
304: uint32_t epcap;
305: #define QH_EPCAP_MULT_MASK 0xc0000000
306: #define QH_EPCAP_MULT_SH 30
307: #define QH_EPCAP_PORTNUM_MASK 0x3f800000
308: #define QH_EPCAP_PORTNUM_SH 23
309: #define QH_EPCAP_HUBADDR_MASK 0x007f0000
310: #define QH_EPCAP_HUBADDR_SH 16
311: #define QH_EPCAP_CMASK_MASK 0x0000ff00
312: #define QH_EPCAP_CMASK_SH 8
313: #define QH_EPCAP_SMASK_MASK 0x000000ff
314: #define QH_EPCAP_SMASK_SH 0
315:
316: uint32_t current_qtd; // Standard next link pointer
317: uint32_t next_qtd; // Standard next link pointer
318: uint32_t altnext_qtd;
319: #define QH_ALTNEXT_NAKCNT_MASK 0x0000001e
320: #define QH_ALTNEXT_NAKCNT_SH 1
321:
322: uint32_t token; // Same as QTD token
323: uint32_t bufptr[5]; // Standard buffer pointer
324: #define BUFPTR_CPROGMASK_MASK 0x000000ff
325: #define BUFPTR_FRAMETAG_MASK 0x0000001f
326: #define BUFPTR_SBYTES_MASK 0x00000fe0
327: #define BUFPTR_SBYTES_SH 5
328: } EHCIqh;
329:
330: /* EHCI spec version 1.0 Section 3.7
331: */
332: typedef struct EHCIfstn {
333: uint32_t next; // Standard next link pointer
334: uint32_t backptr; // Standard next link pointer
335: } EHCIfstn;
336:
337: typedef struct EHCIQueue EHCIQueue;
338: typedef struct EHCIState EHCIState;
339:
340: enum async_state {
341: EHCI_ASYNC_NONE = 0,
342: EHCI_ASYNC_INFLIGHT,
343: EHCI_ASYNC_FINISHED,
344: };
345:
346: struct EHCIQueue {
347: EHCIState *ehci;
348: QTAILQ_ENTRY(EHCIQueue) next;
349: uint32_t seen;
350: uint64_t ts;
351:
352: /* cached data from guest - needs to be flushed
353: * when guest removes an entry (doorbell, handshake sequence)
354: */
355: EHCIqh qh; // copy of current QH (being worked on)
356: uint32_t qhaddr; // address QH read from
357: EHCIqtd qtd; // copy of current QTD (being worked on)
358: uint32_t qtdaddr; // address QTD read from
359:
360: USBPacket packet;
361: QEMUSGList sgl;
362: int pid;
363: uint32_t tbytes;
364: enum async_state async;
365: int usb_status;
366: };
367:
368: typedef QTAILQ_HEAD(EHCIQueueHead, EHCIQueue) EHCIQueueHead;
369:
370: struct EHCIState {
371: PCIDevice dev;
372: USBBus bus;
373: qemu_irq irq;
374: MemoryRegion mem;
375: int companion_count;
376:
377: /* properties */
378: uint32_t freq;
379: uint32_t maxframes;
380:
381: /*
382: * EHCI spec version 1.0 Section 2.3
383: * Host Controller Operational Registers
384: */
385: union {
386: uint8_t mmio[MMIO_SIZE];
387: struct {
388: uint8_t cap[OPREGBASE];
389: uint32_t usbcmd;
390: uint32_t usbsts;
391: uint32_t usbintr;
392: uint32_t frindex;
393: uint32_t ctrldssegment;
394: uint32_t periodiclistbase;
395: uint32_t asynclistaddr;
396: uint32_t notused[9];
397: uint32_t configflag;
398: uint32_t portsc[NB_PORTS];
399: };
400: };
401:
402: /*
403: * Internal states, shadow registers, etc
404: */
405: QEMUTimer *frame_timer;
406: int attach_poll_counter;
407: int astate; // Current state in asynchronous schedule
408: int pstate; // Current state in periodic schedule
409: USBPort ports[NB_PORTS];
410: USBPort *companion_ports[NB_PORTS];
411: uint32_t usbsts_pending;
412: EHCIQueueHead aqueues;
413: EHCIQueueHead pqueues;
414:
415: uint32_t a_fetch_addr; // which address to look at next
416: uint32_t p_fetch_addr; // which address to look at next
417:
418: USBPacket ipacket;
419: QEMUSGList isgl;
420:
421: uint64_t last_run_ns;
422: };
423:
424: #define SET_LAST_RUN_CLOCK(s) \
425: (s)->last_run_ns = qemu_get_clock_ns(vm_clock);
426:
427: /* nifty macros from Arnon's EHCI version */
428: #define get_field(data, field) \
429: (((data) & field##_MASK) >> field##_SH)
430:
431: #define set_field(data, newval, field) do { \
432: uint32_t val = *data; \
433: val &= ~ field##_MASK; \
434: val |= ((newval) << field##_SH) & field##_MASK; \
435: *data = val; \
436: } while(0)
437:
438: static const char *ehci_state_names[] = {
439: [EST_INACTIVE] = "INACTIVE",
440: [EST_ACTIVE] = "ACTIVE",
441: [EST_EXECUTING] = "EXECUTING",
442: [EST_SLEEPING] = "SLEEPING",
443: [EST_WAITLISTHEAD] = "WAITLISTHEAD",
444: [EST_FETCHENTRY] = "FETCH ENTRY",
445: [EST_FETCHQH] = "FETCH QH",
446: [EST_FETCHITD] = "FETCH ITD",
447: [EST_ADVANCEQUEUE] = "ADVANCEQUEUE",
448: [EST_FETCHQTD] = "FETCH QTD",
449: [EST_EXECUTE] = "EXECUTE",
450: [EST_WRITEBACK] = "WRITEBACK",
451: [EST_HORIZONTALQH] = "HORIZONTALQH",
452: };
453:
454: static const char *ehci_mmio_names[] = {
455: [CAPLENGTH] = "CAPLENGTH",
456: [HCIVERSION] = "HCIVERSION",
457: [HCSPARAMS] = "HCSPARAMS",
458: [HCCPARAMS] = "HCCPARAMS",
459: [USBCMD] = "USBCMD",
460: [USBSTS] = "USBSTS",
461: [USBINTR] = "USBINTR",
462: [FRINDEX] = "FRINDEX",
463: [PERIODICLISTBASE] = "P-LIST BASE",
464: [ASYNCLISTADDR] = "A-LIST ADDR",
465: [PORTSC_BEGIN] = "PORTSC #0",
466: [PORTSC_BEGIN + 4] = "PORTSC #1",
467: [PORTSC_BEGIN + 8] = "PORTSC #2",
468: [PORTSC_BEGIN + 12] = "PORTSC #3",
469: [PORTSC_BEGIN + 16] = "PORTSC #4",
470: [PORTSC_BEGIN + 20] = "PORTSC #5",
471: [CONFIGFLAG] = "CONFIGFLAG",
472: };
473:
474: static const char *nr2str(const char **n, size_t len, uint32_t nr)
475: {
476: if (nr < len && n[nr] != NULL) {
477: return n[nr];
478: } else {
479: return "unknown";
480: }
481: }
482:
483: static const char *state2str(uint32_t state)
484: {
485: return nr2str(ehci_state_names, ARRAY_SIZE(ehci_state_names), state);
486: }
487:
488: static const char *addr2str(target_phys_addr_t addr)
489: {
490: return nr2str(ehci_mmio_names, ARRAY_SIZE(ehci_mmio_names), addr);
491: }
492:
493: static void ehci_trace_usbsts(uint32_t mask, int state)
494: {
495: /* interrupts */
496: if (mask & USBSTS_INT) {
497: trace_usb_ehci_usbsts("INT", state);
498: }
499: if (mask & USBSTS_ERRINT) {
500: trace_usb_ehci_usbsts("ERRINT", state);
501: }
502: if (mask & USBSTS_PCD) {
503: trace_usb_ehci_usbsts("PCD", state);
504: }
505: if (mask & USBSTS_FLR) {
506: trace_usb_ehci_usbsts("FLR", state);
507: }
508: if (mask & USBSTS_HSE) {
509: trace_usb_ehci_usbsts("HSE", state);
510: }
511: if (mask & USBSTS_IAA) {
512: trace_usb_ehci_usbsts("IAA", state);
513: }
514:
515: /* status */
516: if (mask & USBSTS_HALT) {
517: trace_usb_ehci_usbsts("HALT", state);
518: }
519: if (mask & USBSTS_REC) {
520: trace_usb_ehci_usbsts("REC", state);
521: }
522: if (mask & USBSTS_PSS) {
523: trace_usb_ehci_usbsts("PSS", state);
524: }
525: if (mask & USBSTS_ASS) {
526: trace_usb_ehci_usbsts("ASS", state);
527: }
528: }
529:
530: static inline void ehci_set_usbsts(EHCIState *s, int mask)
531: {
532: if ((s->usbsts & mask) == mask) {
533: return;
534: }
535: ehci_trace_usbsts(mask, 1);
536: s->usbsts |= mask;
537: }
538:
539: static inline void ehci_clear_usbsts(EHCIState *s, int mask)
540: {
541: if ((s->usbsts & mask) == 0) {
542: return;
543: }
544: ehci_trace_usbsts(mask, 0);
545: s->usbsts &= ~mask;
546: }
547:
548: static inline void ehci_set_interrupt(EHCIState *s, int intr)
549: {
550: int level = 0;
551:
552: // TODO honour interrupt threshold requests
553:
554: ehci_set_usbsts(s, intr);
555:
556: if ((s->usbsts & USBINTR_MASK) & s->usbintr) {
557: level = 1;
558: }
559:
560: qemu_set_irq(s->irq, level);
561: }
562:
563: static inline void ehci_record_interrupt(EHCIState *s, int intr)
564: {
565: s->usbsts_pending |= intr;
566: }
567:
568: static inline void ehci_commit_interrupt(EHCIState *s)
569: {
570: if (!s->usbsts_pending) {
571: return;
572: }
573: ehci_set_interrupt(s, s->usbsts_pending);
574: s->usbsts_pending = 0;
575: }
576:
577: static void ehci_set_state(EHCIState *s, int async, int state)
578: {
579: if (async) {
580: trace_usb_ehci_state("async", state2str(state));
581: s->astate = state;
582: } else {
583: trace_usb_ehci_state("periodic", state2str(state));
584: s->pstate = state;
585: }
586: }
587:
588: static int ehci_get_state(EHCIState *s, int async)
589: {
590: return async ? s->astate : s->pstate;
591: }
592:
593: static void ehci_set_fetch_addr(EHCIState *s, int async, uint32_t addr)
594: {
595: if (async) {
596: s->a_fetch_addr = addr;
597: } else {
598: s->p_fetch_addr = addr;
599: }
600: }
601:
602: static int ehci_get_fetch_addr(EHCIState *s, int async)
603: {
604: return async ? s->a_fetch_addr : s->p_fetch_addr;
605: }
606:
607: static void ehci_trace_qh(EHCIQueue *q, target_phys_addr_t addr, EHCIqh *qh)
608: {
609: /* need three here due to argument count limits */
610: trace_usb_ehci_qh_ptrs(q, addr, qh->next,
611: qh->current_qtd, qh->next_qtd, qh->altnext_qtd);
612: trace_usb_ehci_qh_fields(addr,
613: get_field(qh->epchar, QH_EPCHAR_RL),
614: get_field(qh->epchar, QH_EPCHAR_MPLEN),
615: get_field(qh->epchar, QH_EPCHAR_EPS),
616: get_field(qh->epchar, QH_EPCHAR_EP),
617: get_field(qh->epchar, QH_EPCHAR_DEVADDR));
618: trace_usb_ehci_qh_bits(addr,
619: (bool)(qh->epchar & QH_EPCHAR_C),
620: (bool)(qh->epchar & QH_EPCHAR_H),
621: (bool)(qh->epchar & QH_EPCHAR_DTC),
622: (bool)(qh->epchar & QH_EPCHAR_I));
623: }
624:
625: static void ehci_trace_qtd(EHCIQueue *q, target_phys_addr_t addr, EHCIqtd *qtd)
626: {
627: /* need three here due to argument count limits */
628: trace_usb_ehci_qtd_ptrs(q, addr, qtd->next, qtd->altnext);
629: trace_usb_ehci_qtd_fields(addr,
630: get_field(qtd->token, QTD_TOKEN_TBYTES),
631: get_field(qtd->token, QTD_TOKEN_CPAGE),
632: get_field(qtd->token, QTD_TOKEN_CERR),
633: get_field(qtd->token, QTD_TOKEN_PID));
634: trace_usb_ehci_qtd_bits(addr,
635: (bool)(qtd->token & QTD_TOKEN_IOC),
636: (bool)(qtd->token & QTD_TOKEN_ACTIVE),
637: (bool)(qtd->token & QTD_TOKEN_HALT),
638: (bool)(qtd->token & QTD_TOKEN_BABBLE),
639: (bool)(qtd->token & QTD_TOKEN_XACTERR));
640: }
641:
642: static void ehci_trace_itd(EHCIState *s, target_phys_addr_t addr, EHCIitd *itd)
643: {
644: trace_usb_ehci_itd(addr, itd->next,
645: get_field(itd->bufptr[1], ITD_BUFPTR_MAXPKT),
646: get_field(itd->bufptr[2], ITD_BUFPTR_MULT),
647: get_field(itd->bufptr[0], ITD_BUFPTR_EP),
648: get_field(itd->bufptr[0], ITD_BUFPTR_DEVADDR));
649: }
650:
651: static void ehci_trace_sitd(EHCIState *s, target_phys_addr_t addr,
652: EHCIsitd *sitd)
653: {
654: trace_usb_ehci_sitd(addr, sitd->next,
655: (bool)(sitd->results & SITD_RESULTS_ACTIVE));
656: }
657:
658: /* queue management */
659:
660: static EHCIQueue *ehci_alloc_queue(EHCIState *ehci, int async)
661: {
662: EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;
663: EHCIQueue *q;
664:
665: q = g_malloc0(sizeof(*q));
666: q->ehci = ehci;
667: usb_packet_init(&q->packet);
668: QTAILQ_INSERT_HEAD(head, q, next);
669: trace_usb_ehci_queue_action(q, "alloc");
670: return q;
671: }
672:
673: static void ehci_free_queue(EHCIQueue *q, int async)
674: {
675: EHCIQueueHead *head = async ? &q->ehci->aqueues : &q->ehci->pqueues;
676: trace_usb_ehci_queue_action(q, "free");
677: if (q->async == EHCI_ASYNC_INFLIGHT) {
678: usb_cancel_packet(&q->packet);
679: }
680: QTAILQ_REMOVE(head, q, next);
681: g_free(q);
682: }
683:
684: static EHCIQueue *ehci_find_queue_by_qh(EHCIState *ehci, uint32_t addr,
685: int async)
686: {
687: EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;
688: EHCIQueue *q;
689:
690: QTAILQ_FOREACH(q, head, next) {
691: if (addr == q->qhaddr) {
692: return q;
693: }
694: }
695: return NULL;
696: }
697:
698: static void ehci_queues_rip_unused(EHCIState *ehci, int async, int flush)
699: {
700: EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;
701: EHCIQueue *q, *tmp;
702:
703: QTAILQ_FOREACH_SAFE(q, head, next, tmp) {
704: if (q->seen) {
705: q->seen = 0;
706: q->ts = ehci->last_run_ns;
707: continue;
708: }
709: if (!flush && ehci->last_run_ns < q->ts + 250000000) {
710: /* allow 0.25 sec idle */
711: continue;
712: }
713: ehci_free_queue(q, async);
714: }
715: }
716:
717: static void ehci_queues_rip_device(EHCIState *ehci, USBDevice *dev, int async)
718: {
719: EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;
720: EHCIQueue *q, *tmp;
721:
722: QTAILQ_FOREACH_SAFE(q, head, next, tmp) {
723: if (!usb_packet_is_inflight(&q->packet) ||
724: q->packet.ep->dev != dev) {
725: continue;
726: }
727: ehci_free_queue(q, async);
728: }
729: }
730:
731: static void ehci_queues_rip_all(EHCIState *ehci, int async)
732: {
733: EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;
734: EHCIQueue *q, *tmp;
735:
736: QTAILQ_FOREACH_SAFE(q, head, next, tmp) {
737: ehci_free_queue(q, async);
738: }
739: }
740:
741: /* Attach or detach a device on root hub */
742:
743: static void ehci_attach(USBPort *port)
744: {
745: EHCIState *s = port->opaque;
746: uint32_t *portsc = &s->portsc[port->index];
747:
748: trace_usb_ehci_port_attach(port->index, port->dev->product_desc);
749:
750: if (*portsc & PORTSC_POWNER) {
751: USBPort *companion = s->companion_ports[port->index];
752: companion->dev = port->dev;
753: companion->ops->attach(companion);
754: return;
755: }
756:
757: *portsc |= PORTSC_CONNECT;
758: *portsc |= PORTSC_CSC;
759:
760: ehci_set_interrupt(s, USBSTS_PCD);
761: }
762:
763: static void ehci_detach(USBPort *port)
764: {
765: EHCIState *s = port->opaque;
766: uint32_t *portsc = &s->portsc[port->index];
767:
768: trace_usb_ehci_port_detach(port->index);
769:
770: if (*portsc & PORTSC_POWNER) {
771: USBPort *companion = s->companion_ports[port->index];
772: companion->ops->detach(companion);
773: companion->dev = NULL;
774: /*
775: * EHCI spec 4.2.2: "When a disconnect occurs... On the event,
776: * the port ownership is returned immediately to the EHCI controller."
777: */
778: *portsc &= ~PORTSC_POWNER;
779: return;
780: }
781:
782: ehci_queues_rip_device(s, port->dev, 0);
783: ehci_queues_rip_device(s, port->dev, 1);
784:
785: *portsc &= ~(PORTSC_CONNECT|PORTSC_PED);
786: *portsc |= PORTSC_CSC;
787:
788: ehci_set_interrupt(s, USBSTS_PCD);
789: }
790:
791: static void ehci_child_detach(USBPort *port, USBDevice *child)
792: {
793: EHCIState *s = port->opaque;
794: uint32_t portsc = s->portsc[port->index];
795:
796: if (portsc & PORTSC_POWNER) {
797: USBPort *companion = s->companion_ports[port->index];
798: companion->ops->child_detach(companion, child);
799: return;
800: }
801:
802: ehci_queues_rip_device(s, child, 0);
803: ehci_queues_rip_device(s, child, 1);
804: }
805:
806: static void ehci_wakeup(USBPort *port)
807: {
808: EHCIState *s = port->opaque;
809: uint32_t portsc = s->portsc[port->index];
810:
811: if (portsc & PORTSC_POWNER) {
812: USBPort *companion = s->companion_ports[port->index];
813: if (companion->ops->wakeup) {
814: companion->ops->wakeup(companion);
815: }
816: }
817: }
818:
819: static int ehci_register_companion(USBBus *bus, USBPort *ports[],
820: uint32_t portcount, uint32_t firstport)
821: {
822: EHCIState *s = container_of(bus, EHCIState, bus);
823: uint32_t i;
824:
825: if (firstport + portcount > NB_PORTS) {
826: qerror_report(QERR_INVALID_PARAMETER_VALUE, "firstport",
827: "firstport on masterbus");
828: error_printf_unless_qmp(
829: "firstport value of %u makes companion take ports %u - %u, which "
830: "is outside of the valid range of 0 - %u\n", firstport, firstport,
831: firstport + portcount - 1, NB_PORTS - 1);
832: return -1;
833: }
834:
835: for (i = 0; i < portcount; i++) {
836: if (s->companion_ports[firstport + i]) {
837: qerror_report(QERR_INVALID_PARAMETER_VALUE, "masterbus",
838: "an USB masterbus");
839: error_printf_unless_qmp(
840: "port %u on masterbus %s already has a companion assigned\n",
841: firstport + i, bus->qbus.name);
842: return -1;
843: }
844: }
845:
846: for (i = 0; i < portcount; i++) {
847: s->companion_ports[firstport + i] = ports[i];
848: s->ports[firstport + i].speedmask |=
849: USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL;
850: /* Ensure devs attached before the initial reset go to the companion */
851: s->portsc[firstport + i] = PORTSC_POWNER;
852: }
853:
854: s->companion_count++;
855: s->mmio[0x05] = (s->companion_count << 4) | portcount;
856:
857: return 0;
858: }
859:
860: static USBDevice *ehci_find_device(EHCIState *ehci, uint8_t addr)
861: {
862: USBDevice *dev;
863: USBPort *port;
864: int i;
865:
866: for (i = 0; i < NB_PORTS; i++) {
867: port = &ehci->ports[i];
868: if (!(ehci->portsc[i] & PORTSC_PED)) {
869: DPRINTF("Port %d not enabled\n", i);
870: continue;
871: }
872: dev = usb_find_device(port, addr);
873: if (dev != NULL) {
874: return dev;
875: }
876: }
877: return NULL;
878: }
879:
880: /* 4.1 host controller initialization */
881: static void ehci_reset(void *opaque)
882: {
883: EHCIState *s = opaque;
884: int i;
885: USBDevice *devs[NB_PORTS];
886:
887: trace_usb_ehci_reset();
888:
889: /*
890: * Do the detach before touching portsc, so that it correctly gets send to
891: * us or to our companion based on PORTSC_POWNER before the reset.
892: */
893: for(i = 0; i < NB_PORTS; i++) {
894: devs[i] = s->ports[i].dev;
895: if (devs[i] && devs[i]->attached) {
896: usb_detach(&s->ports[i]);
897: }
898: }
899:
900: memset(&s->mmio[OPREGBASE], 0x00, MMIO_SIZE - OPREGBASE);
901:
902: s->usbcmd = NB_MAXINTRATE << USBCMD_ITC_SH;
903: s->usbsts = USBSTS_HALT;
904:
905: s->astate = EST_INACTIVE;
906: s->pstate = EST_INACTIVE;
907: s->attach_poll_counter = 0;
908:
909: for(i = 0; i < NB_PORTS; i++) {
910: if (s->companion_ports[i]) {
911: s->portsc[i] = PORTSC_POWNER | PORTSC_PPOWER;
912: } else {
913: s->portsc[i] = PORTSC_PPOWER;
914: }
915: if (devs[i] && devs[i]->attached) {
916: usb_attach(&s->ports[i]);
917: usb_device_reset(devs[i]);
918: }
919: }
920: ehci_queues_rip_all(s, 0);
921: ehci_queues_rip_all(s, 1);
922: qemu_del_timer(s->frame_timer);
923: }
924:
925: static uint32_t ehci_mem_readb(void *ptr, target_phys_addr_t addr)
926: {
927: EHCIState *s = ptr;
928: uint32_t val;
929:
930: val = s->mmio[addr];
931:
932: return val;
933: }
934:
935: static uint32_t ehci_mem_readw(void *ptr, target_phys_addr_t addr)
936: {
937: EHCIState *s = ptr;
938: uint32_t val;
939:
940: val = s->mmio[addr] | (s->mmio[addr+1] << 8);
941:
942: return val;
943: }
944:
945: static uint32_t ehci_mem_readl(void *ptr, target_phys_addr_t addr)
946: {
947: EHCIState *s = ptr;
948: uint32_t val;
949:
950: val = s->mmio[addr] | (s->mmio[addr+1] << 8) |
951: (s->mmio[addr+2] << 16) | (s->mmio[addr+3] << 24);
952:
953: trace_usb_ehci_mmio_readl(addr, addr2str(addr), val);
954: return val;
955: }
956:
957: static void ehci_mem_writeb(void *ptr, target_phys_addr_t addr, uint32_t val)
958: {
959: fprintf(stderr, "EHCI doesn't handle byte writes to MMIO\n");
960: exit(1);
961: }
962:
963: static void ehci_mem_writew(void *ptr, target_phys_addr_t addr, uint32_t val)
964: {
965: fprintf(stderr, "EHCI doesn't handle 16-bit writes to MMIO\n");
966: exit(1);
967: }
968:
969: static void handle_port_owner_write(EHCIState *s, int port, uint32_t owner)
970: {
971: USBDevice *dev = s->ports[port].dev;
972: uint32_t *portsc = &s->portsc[port];
973: uint32_t orig;
974:
975: if (s->companion_ports[port] == NULL)
976: return;
977:
978: owner = owner & PORTSC_POWNER;
979: orig = *portsc & PORTSC_POWNER;
980:
981: if (!(owner ^ orig)) {
982: return;
983: }
984:
985: if (dev && dev->attached) {
986: usb_detach(&s->ports[port]);
987: }
988:
989: *portsc &= ~PORTSC_POWNER;
990: *portsc |= owner;
991:
992: if (dev && dev->attached) {
993: usb_attach(&s->ports[port]);
994: }
995: }
996:
997: static void handle_port_status_write(EHCIState *s, int port, uint32_t val)
998: {
999: uint32_t *portsc = &s->portsc[port];
1000: USBDevice *dev = s->ports[port].dev;
1001:
1002: /* Clear rwc bits */
1003: *portsc &= ~(val & PORTSC_RWC_MASK);
1004: /* The guest may clear, but not set the PED bit */
1005: *portsc &= val | ~PORTSC_PED;
1006: /* POWNER is masked out by RO_MASK as it is RO when we've no companion */
1007: handle_port_owner_write(s, port, val);
1008: /* And finally apply RO_MASK */
1009: val &= PORTSC_RO_MASK;
1010:
1011: if ((val & PORTSC_PRESET) && !(*portsc & PORTSC_PRESET)) {
1012: trace_usb_ehci_port_reset(port, 1);
1013: }
1014:
1015: if (!(val & PORTSC_PRESET) &&(*portsc & PORTSC_PRESET)) {
1016: trace_usb_ehci_port_reset(port, 0);
1017: if (dev && dev->attached) {
1018: usb_port_reset(&s->ports[port]);
1019: *portsc &= ~PORTSC_CSC;
1020: }
1021:
1022: /*
1023: * Table 2.16 Set the enable bit(and enable bit change) to indicate
1024: * to SW that this port has a high speed device attached
1025: */
1026: if (dev && dev->attached && (dev->speedmask & USB_SPEED_MASK_HIGH)) {
1027: val |= PORTSC_PED;
1028: }
1029: }
1030:
1031: *portsc &= ~PORTSC_RO_MASK;
1032: *portsc |= val;
1033: }
1034:
1035: static void ehci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val)
1036: {
1037: EHCIState *s = ptr;
1038: uint32_t *mmio = (uint32_t *)(&s->mmio[addr]);
1039: uint32_t old = *mmio;
1040: int i;
1041:
1042: trace_usb_ehci_mmio_writel(addr, addr2str(addr), val);
1043:
1044: /* Only aligned reads are allowed on OHCI */
1045: if (addr & 3) {
1046: fprintf(stderr, "usb-ehci: Mis-aligned write to addr 0x"
1047: TARGET_FMT_plx "\n", addr);
1048: return;
1049: }
1050:
1051: if (addr >= PORTSC && addr < PORTSC + 4 * NB_PORTS) {
1052: handle_port_status_write(s, (addr-PORTSC)/4, val);
1053: trace_usb_ehci_mmio_change(addr, addr2str(addr), *mmio, old);
1054: return;
1055: }
1056:
1057: if (addr < OPREGBASE) {
1058: fprintf(stderr, "usb-ehci: write attempt to read-only register"
1059: TARGET_FMT_plx "\n", addr);
1060: return;
1061: }
1062:
1063:
1064: /* Do any register specific pre-write processing here. */
1065: switch(addr) {
1066: case USBCMD:
1067: if ((val & USBCMD_RUNSTOP) && !(s->usbcmd & USBCMD_RUNSTOP)) {
1068: qemu_mod_timer(s->frame_timer, qemu_get_clock_ns(vm_clock));
1069: SET_LAST_RUN_CLOCK(s);
1070: ehci_clear_usbsts(s, USBSTS_HALT);
1071: }
1072:
1073: if (!(val & USBCMD_RUNSTOP) && (s->usbcmd & USBCMD_RUNSTOP)) {
1074: qemu_del_timer(s->frame_timer);
1075: ehci_queues_rip_all(s, 0);
1076: ehci_queues_rip_all(s, 1);
1077: ehci_set_usbsts(s, USBSTS_HALT);
1078: }
1079:
1080: if (val & USBCMD_HCRESET) {
1081: ehci_reset(s);
1082: val = s->usbcmd;
1083: }
1084:
1085: /* not supporting dynamic frame list size at the moment */
1086: if ((val & USBCMD_FLS) && !(s->usbcmd & USBCMD_FLS)) {
1087: fprintf(stderr, "attempt to set frame list size -- value %d\n",
1088: val & USBCMD_FLS);
1089: val &= ~USBCMD_FLS;
1090: }
1091: break;
1092:
1093: case USBSTS:
1094: val &= USBSTS_RO_MASK; // bits 6 through 31 are RO
1095: ehci_clear_usbsts(s, val); // bits 0 through 5 are R/WC
1096: val = s->usbsts;
1097: ehci_set_interrupt(s, 0);
1098: break;
1099:
1100: case USBINTR:
1101: val &= USBINTR_MASK;
1102: break;
1103:
1104: case FRINDEX:
1105: val &= 0x00003ff8; /* frindex is 14bits and always a multiple of 8 */
1106: break;
1107:
1108: case CONFIGFLAG:
1109: val &= 0x1;
1110: if (val) {
1111: for(i = 0; i < NB_PORTS; i++)
1112: handle_port_owner_write(s, i, 0);
1113: }
1114: break;
1115:
1116: case PERIODICLISTBASE:
1117: if ((s->usbcmd & USBCMD_PSE) && (s->usbcmd & USBCMD_RUNSTOP)) {
1118: fprintf(stderr,
1119: "ehci: PERIODIC list base register set while periodic schedule\n"
1120: " is enabled and HC is enabled\n");
1121: }
1122: break;
1123:
1124: case ASYNCLISTADDR:
1125: if ((s->usbcmd & USBCMD_ASE) && (s->usbcmd & USBCMD_RUNSTOP)) {
1126: fprintf(stderr,
1127: "ehci: ASYNC list address register set while async schedule\n"
1128: " is enabled and HC is enabled\n");
1129: }
1130: break;
1131: }
1132:
1133: *mmio = val;
1134: trace_usb_ehci_mmio_change(addr, addr2str(addr), *mmio, old);
1135: }
1136:
1137:
1138: // TODO : Put in common header file, duplication from usb-ohci.c
1139:
1140: /* Get an array of dwords from main memory */
1141: static inline int get_dwords(EHCIState *ehci, uint32_t addr,
1142: uint32_t *buf, int num)
1143: {
1144: int i;
1145:
1146: for(i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
1147: pci_dma_read(&ehci->dev, addr, buf, sizeof(*buf));
1148: *buf = le32_to_cpu(*buf);
1149: }
1150:
1151: return 1;
1152: }
1153:
1154: /* Put an array of dwords in to main memory */
1155: static inline int put_dwords(EHCIState *ehci, uint32_t addr,
1156: uint32_t *buf, int num)
1157: {
1158: int i;
1159:
1160: for(i = 0; i < num; i++, buf++, addr += sizeof(*buf)) {
1161: uint32_t tmp = cpu_to_le32(*buf);
1162: pci_dma_write(&ehci->dev, addr, &tmp, sizeof(tmp));
1163: }
1164:
1165: return 1;
1166: }
1167:
1168: // 4.10.2
1169:
1170: static int ehci_qh_do_overlay(EHCIQueue *q)
1171: {
1172: int i;
1173: int dtoggle;
1174: int ping;
1175: int eps;
1176: int reload;
1177:
1178: // remember values in fields to preserve in qh after overlay
1179:
1180: dtoggle = q->qh.token & QTD_TOKEN_DTOGGLE;
1181: ping = q->qh.token & QTD_TOKEN_PING;
1182:
1183: q->qh.current_qtd = q->qtdaddr;
1184: q->qh.next_qtd = q->qtd.next;
1185: q->qh.altnext_qtd = q->qtd.altnext;
1186: q->qh.token = q->qtd.token;
1187:
1188:
1189: eps = get_field(q->qh.epchar, QH_EPCHAR_EPS);
1190: if (eps == EHCI_QH_EPS_HIGH) {
1191: q->qh.token &= ~QTD_TOKEN_PING;
1192: q->qh.token |= ping;
1193: }
1194:
1195: reload = get_field(q->qh.epchar, QH_EPCHAR_RL);
1196: set_field(&q->qh.altnext_qtd, reload, QH_ALTNEXT_NAKCNT);
1197:
1198: for (i = 0; i < 5; i++) {
1199: q->qh.bufptr[i] = q->qtd.bufptr[i];
1200: }
1201:
1202: if (!(q->qh.epchar & QH_EPCHAR_DTC)) {
1203: // preserve QH DT bit
1204: q->qh.token &= ~QTD_TOKEN_DTOGGLE;
1205: q->qh.token |= dtoggle;
1206: }
1207:
1208: q->qh.bufptr[1] &= ~BUFPTR_CPROGMASK_MASK;
1209: q->qh.bufptr[2] &= ~BUFPTR_FRAMETAG_MASK;
1210:
1211: put_dwords(q->ehci, NLPTR_GET(q->qhaddr), (uint32_t *) &q->qh,
1212: sizeof(EHCIqh) >> 2);
1213:
1214: return 0;
1215: }
1216:
1217: static int ehci_init_transfer(EHCIQueue *q)
1218: {
1219: uint32_t cpage, offset, bytes, plen;
1220: dma_addr_t page;
1221:
1222: cpage = get_field(q->qh.token, QTD_TOKEN_CPAGE);
1223: bytes = get_field(q->qh.token, QTD_TOKEN_TBYTES);
1224: offset = q->qh.bufptr[0] & ~QTD_BUFPTR_MASK;
1225: pci_dma_sglist_init(&q->sgl, &q->ehci->dev, 5);
1226:
1227: while (bytes > 0) {
1228: if (cpage > 4) {
1229: fprintf(stderr, "cpage out of range (%d)\n", cpage);
1230: return USB_RET_PROCERR;
1231: }
1232:
1233: page = q->qh.bufptr[cpage] & QTD_BUFPTR_MASK;
1234: page += offset;
1235: plen = bytes;
1236: if (plen > 4096 - offset) {
1237: plen = 4096 - offset;
1238: offset = 0;
1239: cpage++;
1240: }
1241:
1242: qemu_sglist_add(&q->sgl, page, plen);
1243: bytes -= plen;
1244: }
1245: return 0;
1246: }
1247:
1248: static void ehci_finish_transfer(EHCIQueue *q, int status)
1249: {
1250: uint32_t cpage, offset;
1251:
1252: qemu_sglist_destroy(&q->sgl);
1253:
1254: if (status > 0) {
1255: /* update cpage & offset */
1256: cpage = get_field(q->qh.token, QTD_TOKEN_CPAGE);
1257: offset = q->qh.bufptr[0] & ~QTD_BUFPTR_MASK;
1258:
1259: offset += status;
1260: cpage += offset >> QTD_BUFPTR_SH;
1261: offset &= ~QTD_BUFPTR_MASK;
1262:
1263: set_field(&q->qh.token, cpage, QTD_TOKEN_CPAGE);
1264: q->qh.bufptr[0] &= QTD_BUFPTR_MASK;
1265: q->qh.bufptr[0] |= offset;
1266: }
1267: }
1268:
1269: static void ehci_async_complete_packet(USBPort *port, USBPacket *packet)
1270: {
1271: EHCIQueue *q;
1272: EHCIState *s = port->opaque;
1273: uint32_t portsc = s->portsc[port->index];
1274:
1275: if (portsc & PORTSC_POWNER) {
1276: USBPort *companion = s->companion_ports[port->index];
1277: companion->ops->complete(companion, packet);
1278: return;
1279: }
1280:
1281: q = container_of(packet, EHCIQueue, packet);
1282: trace_usb_ehci_queue_action(q, "wakeup");
1283: assert(q->async == EHCI_ASYNC_INFLIGHT);
1284: q->async = EHCI_ASYNC_FINISHED;
1285: q->usb_status = packet->result;
1286: }
1287:
1288: static void ehci_execute_complete(EHCIQueue *q)
1289: {
1290: assert(q->async != EHCI_ASYNC_INFLIGHT);
1291: q->async = EHCI_ASYNC_NONE;
1292:
1293: DPRINTF("execute_complete: qhaddr 0x%x, next %x, qtdaddr 0x%x, status %d\n",
1294: q->qhaddr, q->qh.next, q->qtdaddr, q->usb_status);
1295:
1296: if (q->usb_status < 0) {
1297: switch(q->usb_status) {
1298: case USB_RET_IOERROR:
1299: case USB_RET_NODEV:
1300: q->qh.token |= (QTD_TOKEN_HALT | QTD_TOKEN_XACTERR);
1301: set_field(&q->qh.token, 0, QTD_TOKEN_CERR);
1302: ehci_record_interrupt(q->ehci, USBSTS_ERRINT);
1303: break;
1304: case USB_RET_STALL:
1305: q->qh.token |= QTD_TOKEN_HALT;
1306: ehci_record_interrupt(q->ehci, USBSTS_ERRINT);
1307: break;
1308: case USB_RET_NAK:
1309: set_field(&q->qh.altnext_qtd, 0, QH_ALTNEXT_NAKCNT);
1310: return; /* We're not done yet with this transaction */
1311: case USB_RET_BABBLE:
1312: q->qh.token |= (QTD_TOKEN_HALT | QTD_TOKEN_BABBLE);
1313: ehci_record_interrupt(q->ehci, USBSTS_ERRINT);
1314: break;
1315: default:
1316: /* should not be triggerable */
1317: fprintf(stderr, "USB invalid response %d to handle\n", q->usb_status);
1318: assert(0);
1319: break;
1320: }
1321: } else if ((q->usb_status > q->tbytes) && (q->pid == USB_TOKEN_IN)) {
1322: q->usb_status = USB_RET_BABBLE;
1323: q->qh.token |= (QTD_TOKEN_HALT | QTD_TOKEN_BABBLE);
1324: ehci_record_interrupt(q->ehci, USBSTS_ERRINT);
1325: } else {
1326: // TODO check 4.12 for splits
1327:
1328: if (q->tbytes && q->pid == USB_TOKEN_IN) {
1329: q->tbytes -= q->usb_status;
1330: } else {
1331: q->tbytes = 0;
1332: }
1333:
1334: DPRINTF("updating tbytes to %d\n", q->tbytes);
1335: set_field(&q->qh.token, q->tbytes, QTD_TOKEN_TBYTES);
1336: }
1337: ehci_finish_transfer(q, q->usb_status);
1338: usb_packet_unmap(&q->packet);
1339:
1340: q->qh.token ^= QTD_TOKEN_DTOGGLE;
1341: q->qh.token &= ~QTD_TOKEN_ACTIVE;
1342:
1343: if (q->qh.token & QTD_TOKEN_IOC) {
1344: ehci_record_interrupt(q->ehci, USBSTS_INT);
1345: }
1346: }
1347:
1348: // 4.10.3
1349:
1350: static int ehci_execute(EHCIQueue *q)
1351: {
1352: USBDevice *dev;
1353: USBEndpoint *ep;
1354: int ret;
1355: int endp;
1356: int devadr;
1357:
1358: if ( !(q->qh.token & QTD_TOKEN_ACTIVE)) {
1359: fprintf(stderr, "Attempting to execute inactive QH\n");
1360: return USB_RET_PROCERR;
1361: }
1362:
1363: q->tbytes = (q->qh.token & QTD_TOKEN_TBYTES_MASK) >> QTD_TOKEN_TBYTES_SH;
1364: if (q->tbytes > BUFF_SIZE) {
1365: fprintf(stderr, "Request for more bytes than allowed\n");
1366: return USB_RET_PROCERR;
1367: }
1368:
1369: q->pid = (q->qh.token & QTD_TOKEN_PID_MASK) >> QTD_TOKEN_PID_SH;
1370: switch(q->pid) {
1371: case 0: q->pid = USB_TOKEN_OUT; break;
1372: case 1: q->pid = USB_TOKEN_IN; break;
1373: case 2: q->pid = USB_TOKEN_SETUP; break;
1374: default: fprintf(stderr, "bad token\n"); break;
1375: }
1376:
1377: if (ehci_init_transfer(q) != 0) {
1378: return USB_RET_PROCERR;
1379: }
1380:
1381: endp = get_field(q->qh.epchar, QH_EPCHAR_EP);
1382: devadr = get_field(q->qh.epchar, QH_EPCHAR_DEVADDR);
1383:
1384: /* TODO: associating device with ehci port */
1385: dev = ehci_find_device(q->ehci, devadr);
1386: ep = usb_ep_get(dev, q->pid, endp);
1387:
1388: usb_packet_setup(&q->packet, q->pid, ep);
1389: usb_packet_map(&q->packet, &q->sgl);
1390:
1391: ret = usb_handle_packet(dev, &q->packet);
1392: DPRINTF("submit: qh %x next %x qtd %x pid %x len %zd "
1393: "(total %d) endp %x ret %d\n",
1394: q->qhaddr, q->qh.next, q->qtdaddr, q->pid,
1395: q->packet.iov.size, q->tbytes, endp, ret);
1396:
1397: if (ret > BUFF_SIZE) {
1398: fprintf(stderr, "ret from usb_handle_packet > BUFF_SIZE\n");
1399: return USB_RET_PROCERR;
1400: }
1401:
1402: return ret;
1403: }
1404:
1405: /* 4.7.2
1406: */
1407:
1408: static int ehci_process_itd(EHCIState *ehci,
1409: EHCIitd *itd)
1410: {
1411: USBDevice *dev;
1412: USBEndpoint *ep;
1413: int ret;
1414: uint32_t i, len, pid, dir, devaddr, endp;
1415: uint32_t pg, off, ptr1, ptr2, max, mult;
1416:
1417: dir =(itd->bufptr[1] & ITD_BUFPTR_DIRECTION);
1418: devaddr = get_field(itd->bufptr[0], ITD_BUFPTR_DEVADDR);
1419: endp = get_field(itd->bufptr[0], ITD_BUFPTR_EP);
1420: max = get_field(itd->bufptr[1], ITD_BUFPTR_MAXPKT);
1421: mult = get_field(itd->bufptr[2], ITD_BUFPTR_MULT);
1422:
1423: for(i = 0; i < 8; i++) {
1424: if (itd->transact[i] & ITD_XACT_ACTIVE) {
1425: pg = get_field(itd->transact[i], ITD_XACT_PGSEL);
1426: off = itd->transact[i] & ITD_XACT_OFFSET_MASK;
1427: ptr1 = (itd->bufptr[pg] & ITD_BUFPTR_MASK);
1428: ptr2 = (itd->bufptr[pg+1] & ITD_BUFPTR_MASK);
1429: len = get_field(itd->transact[i], ITD_XACT_LENGTH);
1430:
1431: if (len > max * mult) {
1432: len = max * mult;
1433: }
1434:
1435: if (len > BUFF_SIZE) {
1436: return USB_RET_PROCERR;
1437: }
1438:
1439: pci_dma_sglist_init(&ehci->isgl, &ehci->dev, 2);
1440: if (off + len > 4096) {
1441: /* transfer crosses page border */
1442: uint32_t len2 = off + len - 4096;
1443: uint32_t len1 = len - len2;
1444: qemu_sglist_add(&ehci->isgl, ptr1 + off, len1);
1445: qemu_sglist_add(&ehci->isgl, ptr2, len2);
1446: } else {
1447: qemu_sglist_add(&ehci->isgl, ptr1 + off, len);
1448: }
1449:
1450: pid = dir ? USB_TOKEN_IN : USB_TOKEN_OUT;
1451:
1452: dev = ehci_find_device(ehci, devaddr);
1453: ep = usb_ep_get(dev, pid, endp);
1454: if (ep->type == USB_ENDPOINT_XFER_ISOC) {
1455: usb_packet_setup(&ehci->ipacket, pid, ep);
1456: usb_packet_map(&ehci->ipacket, &ehci->isgl);
1457: ret = usb_handle_packet(dev, &ehci->ipacket);
1458: assert(ret != USB_RET_ASYNC);
1459: usb_packet_unmap(&ehci->ipacket);
1460: } else {
1461: DPRINTF("ISOCH: attempt to addess non-iso endpoint\n");
1462: ret = USB_RET_NAK;
1463: }
1464: qemu_sglist_destroy(&ehci->isgl);
1465:
1466: if (ret < 0) {
1467: switch (ret) {
1468: default:
1469: fprintf(stderr, "Unexpected iso usb result: %d\n", ret);
1470: /* Fall through */
1471: case USB_RET_IOERROR:
1472: case USB_RET_NODEV:
1473: /* 3.3.2: XACTERR is only allowed on IN transactions */
1474: if (dir) {
1475: itd->transact[i] |= ITD_XACT_XACTERR;
1476: ehci_record_interrupt(ehci, USBSTS_ERRINT);
1477: }
1478: break;
1479: case USB_RET_BABBLE:
1480: itd->transact[i] |= ITD_XACT_BABBLE;
1481: ehci_record_interrupt(ehci, USBSTS_ERRINT);
1482: break;
1483: case USB_RET_NAK:
1484: /* no data for us, so do a zero-length transfer */
1485: ret = 0;
1486: break;
1487: }
1488: }
1489: if (ret >= 0) {
1490: if (!dir) {
1491: /* OUT */
1492: set_field(&itd->transact[i], len - ret, ITD_XACT_LENGTH);
1493: } else {
1494: /* IN */
1495: set_field(&itd->transact[i], ret, ITD_XACT_LENGTH);
1496: }
1497: }
1498: if (itd->transact[i] & ITD_XACT_IOC) {
1499: ehci_record_interrupt(ehci, USBSTS_INT);
1500: }
1501: itd->transact[i] &= ~ITD_XACT_ACTIVE;
1502: }
1503: }
1504: return 0;
1505: }
1506:
1507: /* This state is the entry point for asynchronous schedule
1508: * processing. Entry here consitutes a EHCI start event state (4.8.5)
1509: */
1510: static int ehci_state_waitlisthead(EHCIState *ehci, int async)
1511: {
1512: EHCIqh qh;
1513: int i = 0;
1514: int again = 0;
1515: uint32_t entry = ehci->asynclistaddr;
1516:
1517: /* set reclamation flag at start event (4.8.6) */
1518: if (async) {
1519: ehci_set_usbsts(ehci, USBSTS_REC);
1520: }
1521:
1522: ehci_queues_rip_unused(ehci, async, 0);
1523:
1524: /* Find the head of the list (4.9.1.1) */
1525: for(i = 0; i < MAX_QH; i++) {
1526: get_dwords(ehci, NLPTR_GET(entry), (uint32_t *) &qh,
1527: sizeof(EHCIqh) >> 2);
1528: ehci_trace_qh(NULL, NLPTR_GET(entry), &qh);
1529:
1530: if (qh.epchar & QH_EPCHAR_H) {
1531: if (async) {
1532: entry |= (NLPTR_TYPE_QH << 1);
1533: }
1534:
1535: ehci_set_fetch_addr(ehci, async, entry);
1536: ehci_set_state(ehci, async, EST_FETCHENTRY);
1537: again = 1;
1538: goto out;
1539: }
1540:
1541: entry = qh.next;
1542: if (entry == ehci->asynclistaddr) {
1543: break;
1544: }
1545: }
1546:
1547: /* no head found for list. */
1548:
1549: ehci_set_state(ehci, async, EST_ACTIVE);
1550:
1551: out:
1552: return again;
1553: }
1554:
1555:
1556: /* This state is the entry point for periodic schedule processing as
1557: * well as being a continuation state for async processing.
1558: */
1559: static int ehci_state_fetchentry(EHCIState *ehci, int async)
1560: {
1561: int again = 0;
1562: uint32_t entry = ehci_get_fetch_addr(ehci, async);
1563:
1564: if (NLPTR_TBIT(entry)) {
1565: ehci_set_state(ehci, async, EST_ACTIVE);
1566: goto out;
1567: }
1568:
1569: /* section 4.8, only QH in async schedule */
1570: if (async && (NLPTR_TYPE_GET(entry) != NLPTR_TYPE_QH)) {
1571: fprintf(stderr, "non queue head request in async schedule\n");
1572: return -1;
1573: }
1574:
1575: switch (NLPTR_TYPE_GET(entry)) {
1576: case NLPTR_TYPE_QH:
1577: ehci_set_state(ehci, async, EST_FETCHQH);
1578: again = 1;
1579: break;
1580:
1581: case NLPTR_TYPE_ITD:
1582: ehci_set_state(ehci, async, EST_FETCHITD);
1583: again = 1;
1584: break;
1585:
1586: case NLPTR_TYPE_STITD:
1587: ehci_set_state(ehci, async, EST_FETCHSITD);
1588: again = 1;
1589: break;
1590:
1591: default:
1592: /* TODO: handle FSTN type */
1593: fprintf(stderr, "FETCHENTRY: entry at %X is of type %d "
1594: "which is not supported yet\n", entry, NLPTR_TYPE_GET(entry));
1595: return -1;
1596: }
1597:
1598: out:
1599: return again;
1600: }
1601:
1602: static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async)
1603: {
1604: uint32_t entry;
1605: EHCIQueue *q;
1606:
1607: entry = ehci_get_fetch_addr(ehci, async);
1608: q = ehci_find_queue_by_qh(ehci, entry, async);
1609: if (NULL == q) {
1610: q = ehci_alloc_queue(ehci, async);
1611: }
1612: q->qhaddr = entry;
1613: q->seen++;
1614:
1615: if (q->seen > 1) {
1616: /* we are going in circles -- stop processing */
1617: ehci_set_state(ehci, async, EST_ACTIVE);
1618: q = NULL;
1619: goto out;
1620: }
1621:
1622: get_dwords(ehci, NLPTR_GET(q->qhaddr),
1623: (uint32_t *) &q->qh, sizeof(EHCIqh) >> 2);
1624: ehci_trace_qh(q, NLPTR_GET(q->qhaddr), &q->qh);
1625:
1626: if (q->async == EHCI_ASYNC_INFLIGHT) {
1627: /* I/O still in progress -- skip queue */
1628: ehci_set_state(ehci, async, EST_HORIZONTALQH);
1629: goto out;
1630: }
1631: if (q->async == EHCI_ASYNC_FINISHED) {
1632: /* I/O finished -- continue processing queue */
1633: trace_usb_ehci_queue_action(q, "resume");
1634: ehci_set_state(ehci, async, EST_EXECUTING);
1635: goto out;
1636: }
1637:
1638: if (async && (q->qh.epchar & QH_EPCHAR_H)) {
1639:
1640: /* EHCI spec version 1.0 Section 4.8.3 & 4.10.1 */
1641: if (ehci->usbsts & USBSTS_REC) {
1642: ehci_clear_usbsts(ehci, USBSTS_REC);
1643: } else {
1644: DPRINTF("FETCHQH: QH 0x%08x. H-bit set, reclamation status reset"
1645: " - done processing\n", q->qhaddr);
1646: ehci_set_state(ehci, async, EST_ACTIVE);
1647: q = NULL;
1648: goto out;
1649: }
1650: }
1651:
1652: #if EHCI_DEBUG
1653: if (q->qhaddr != q->qh.next) {
1654: DPRINTF("FETCHQH: QH 0x%08x (h %x halt %x active %x) next 0x%08x\n",
1655: q->qhaddr,
1656: q->qh.epchar & QH_EPCHAR_H,
1657: q->qh.token & QTD_TOKEN_HALT,
1658: q->qh.token & QTD_TOKEN_ACTIVE,
1659: q->qh.next);
1660: }
1661: #endif
1662:
1663: if (q->qh.token & QTD_TOKEN_HALT) {
1664: ehci_set_state(ehci, async, EST_HORIZONTALQH);
1665:
1666: } else if ((q->qh.token & QTD_TOKEN_ACTIVE) &&
1667: (NLPTR_TBIT(q->qh.current_qtd) == 0)) {
1668: q->qtdaddr = q->qh.current_qtd;
1669: ehci_set_state(ehci, async, EST_FETCHQTD);
1670:
1671: } else {
1672: /* EHCI spec version 1.0 Section 4.10.2 */
1673: ehci_set_state(ehci, async, EST_ADVANCEQUEUE);
1674: }
1675:
1676: out:
1677: return q;
1678: }
1679:
1680: static int ehci_state_fetchitd(EHCIState *ehci, int async)
1681: {
1682: uint32_t entry;
1683: EHCIitd itd;
1684:
1685: assert(!async);
1686: entry = ehci_get_fetch_addr(ehci, async);
1687:
1688: get_dwords(ehci, NLPTR_GET(entry), (uint32_t *) &itd,
1689: sizeof(EHCIitd) >> 2);
1690: ehci_trace_itd(ehci, entry, &itd);
1691:
1692: if (ehci_process_itd(ehci, &itd) != 0) {
1693: return -1;
1694: }
1695:
1696: put_dwords(ehci, NLPTR_GET(entry), (uint32_t *) &itd,
1697: sizeof(EHCIitd) >> 2);
1698: ehci_set_fetch_addr(ehci, async, itd.next);
1699: ehci_set_state(ehci, async, EST_FETCHENTRY);
1700:
1701: return 1;
1702: }
1703:
1704: static int ehci_state_fetchsitd(EHCIState *ehci, int async)
1705: {
1706: uint32_t entry;
1707: EHCIsitd sitd;
1708:
1709: assert(!async);
1710: entry = ehci_get_fetch_addr(ehci, async);
1711:
1712: get_dwords(ehci, NLPTR_GET(entry), (uint32_t *)&sitd,
1713: sizeof(EHCIsitd) >> 2);
1714: ehci_trace_sitd(ehci, entry, &sitd);
1715:
1716: if (!(sitd.results & SITD_RESULTS_ACTIVE)) {
1717: /* siTD is not active, nothing to do */;
1718: } else {
1719: /* TODO: split transfers are not implemented */
1720: fprintf(stderr, "WARNING: Skipping active siTD\n");
1721: }
1722:
1723: ehci_set_fetch_addr(ehci, async, sitd.next);
1724: ehci_set_state(ehci, async, EST_FETCHENTRY);
1725: return 1;
1726: }
1727:
1728: /* Section 4.10.2 - paragraph 3 */
1729: static int ehci_state_advqueue(EHCIQueue *q, int async)
1730: {
1731: #if 0
1732: /* TO-DO: 4.10.2 - paragraph 2
1733: * if I-bit is set to 1 and QH is not active
1734: * go to horizontal QH
1735: */
1736: if (I-bit set) {
1737: ehci_set_state(ehci, async, EST_HORIZONTALQH);
1738: goto out;
1739: }
1740: #endif
1741:
1742: /*
1743: * want data and alt-next qTD is valid
1744: */
1745: if (((q->qh.token & QTD_TOKEN_TBYTES_MASK) != 0) &&
1746: (NLPTR_TBIT(q->qh.altnext_qtd) == 0)) {
1747: q->qtdaddr = q->qh.altnext_qtd;
1748: ehci_set_state(q->ehci, async, EST_FETCHQTD);
1749:
1750: /*
1751: * next qTD is valid
1752: */
1753: } else if (NLPTR_TBIT(q->qh.next_qtd) == 0) {
1754: q->qtdaddr = q->qh.next_qtd;
1755: ehci_set_state(q->ehci, async, EST_FETCHQTD);
1756:
1757: /*
1758: * no valid qTD, try next QH
1759: */
1760: } else {
1761: ehci_set_state(q->ehci, async, EST_HORIZONTALQH);
1762: }
1763:
1764: return 1;
1765: }
1766:
1767: /* Section 4.10.2 - paragraph 4 */
1768: static int ehci_state_fetchqtd(EHCIQueue *q, int async)
1769: {
1770: int again = 0;
1771:
1772: get_dwords(q->ehci, NLPTR_GET(q->qtdaddr), (uint32_t *) &q->qtd,
1773: sizeof(EHCIqtd) >> 2);
1774: ehci_trace_qtd(q, NLPTR_GET(q->qtdaddr), &q->qtd);
1775:
1776: if (q->qtd.token & QTD_TOKEN_ACTIVE) {
1777: ehci_set_state(q->ehci, async, EST_EXECUTE);
1778: again = 1;
1779: } else {
1780: ehci_set_state(q->ehci, async, EST_HORIZONTALQH);
1781: again = 1;
1782: }
1783:
1784: return again;
1785: }
1786:
1787: static int ehci_state_horizqh(EHCIQueue *q, int async)
1788: {
1789: int again = 0;
1790:
1791: if (ehci_get_fetch_addr(q->ehci, async) != q->qh.next) {
1792: ehci_set_fetch_addr(q->ehci, async, q->qh.next);
1793: ehci_set_state(q->ehci, async, EST_FETCHENTRY);
1794: again = 1;
1795: } else {
1796: ehci_set_state(q->ehci, async, EST_ACTIVE);
1797: }
1798:
1799: return again;
1800: }
1801:
1802: /*
1803: * Write the qh back to guest physical memory. This step isn't
1804: * in the EHCI spec but we need to do it since we don't share
1805: * physical memory with our guest VM.
1806: *
1807: * The first three dwords are read-only for the EHCI, so skip them
1808: * when writing back the qh.
1809: */
1810: static void ehci_flush_qh(EHCIQueue *q)
1811: {
1812: uint32_t *qh = (uint32_t *) &q->qh;
1813: uint32_t dwords = sizeof(EHCIqh) >> 2;
1814: uint32_t addr = NLPTR_GET(q->qhaddr);
1815:
1816: put_dwords(q->ehci, addr + 3 * sizeof(uint32_t), qh + 3, dwords - 3);
1817: }
1818:
1819: static int ehci_state_execute(EHCIQueue *q, int async)
1820: {
1821: int again = 0;
1822:
1823: if (ehci_qh_do_overlay(q) != 0) {
1824: return -1;
1825: }
1826:
1827: // TODO verify enough time remains in the uframe as in 4.4.1.1
1828: // TODO write back ptr to async list when done or out of time
1829: // TODO Windows does not seem to ever set the MULT field
1830:
1831: if (!async) {
1832: int transactCtr = get_field(q->qh.epcap, QH_EPCAP_MULT);
1833: if (!transactCtr) {
1834: ehci_set_state(q->ehci, async, EST_HORIZONTALQH);
1835: again = 1;
1836: goto out;
1837: }
1838: }
1839:
1840: if (async) {
1841: ehci_set_usbsts(q->ehci, USBSTS_REC);
1842: }
1843:
1844: q->usb_status = ehci_execute(q);
1845: if (q->usb_status == USB_RET_PROCERR) {
1846: again = -1;
1847: goto out;
1848: }
1849: if (q->usb_status == USB_RET_ASYNC) {
1850: ehci_flush_qh(q);
1851: trace_usb_ehci_queue_action(q, "suspend");
1852: q->async = EHCI_ASYNC_INFLIGHT;
1853: ehci_set_state(q->ehci, async, EST_HORIZONTALQH);
1854: again = 1;
1855: goto out;
1856: }
1857:
1858: ehci_set_state(q->ehci, async, EST_EXECUTING);
1859: again = 1;
1860:
1861: out:
1862: return again;
1863: }
1864:
1865: static int ehci_state_executing(EHCIQueue *q, int async)
1866: {
1867: int again = 0;
1868:
1869: ehci_execute_complete(q);
1870: if (q->usb_status == USB_RET_ASYNC) {
1871: goto out;
1872: }
1873: if (q->usb_status == USB_RET_PROCERR) {
1874: again = -1;
1875: goto out;
1876: }
1877:
1878: // 4.10.3
1879: if (!async) {
1880: int transactCtr = get_field(q->qh.epcap, QH_EPCAP_MULT);
1881: transactCtr--;
1882: set_field(&q->qh.epcap, transactCtr, QH_EPCAP_MULT);
1883: // 4.10.3, bottom of page 82, should exit this state when transaction
1884: // counter decrements to 0
1885: }
1886:
1887: /* 4.10.5 */
1888: if (q->usb_status == USB_RET_NAK) {
1889: ehci_set_state(q->ehci, async, EST_HORIZONTALQH);
1890: } else {
1891: ehci_set_state(q->ehci, async, EST_WRITEBACK);
1892: }
1893:
1894: again = 1;
1895:
1896: out:
1897: ehci_flush_qh(q);
1898: return again;
1899: }
1900:
1901:
1902: static int ehci_state_writeback(EHCIQueue *q, int async)
1903: {
1904: int again = 0;
1905:
1906: /* Write back the QTD from the QH area */
1907: ehci_trace_qtd(q, NLPTR_GET(q->qtdaddr), (EHCIqtd*) &q->qh.next_qtd);
1908: put_dwords(q->ehci, NLPTR_GET(q->qtdaddr), (uint32_t *) &q->qh.next_qtd,
1909: sizeof(EHCIqtd) >> 2);
1910:
1911: /*
1912: * EHCI specs say go horizontal here.
1913: *
1914: * We can also advance the queue here for performance reasons. We
1915: * need to take care to only take that shortcut in case we've
1916: * processed the qtd just written back without errors, i.e. halt
1917: * bit is clear.
1918: */
1919: if (q->qh.token & QTD_TOKEN_HALT) {
1920: ehci_set_state(q->ehci, async, EST_HORIZONTALQH);
1921: again = 1;
1922: } else {
1923: ehci_set_state(q->ehci, async, EST_ADVANCEQUEUE);
1924: again = 1;
1925: }
1926: return again;
1927: }
1928:
1929: /*
1930: * This is the state machine that is common to both async and periodic
1931: */
1932:
1933: static void ehci_advance_state(EHCIState *ehci,
1934: int async)
1935: {
1936: EHCIQueue *q = NULL;
1937: int again;
1938:
1939: do {
1940: switch(ehci_get_state(ehci, async)) {
1941: case EST_WAITLISTHEAD:
1942: again = ehci_state_waitlisthead(ehci, async);
1943: break;
1944:
1945: case EST_FETCHENTRY:
1946: again = ehci_state_fetchentry(ehci, async);
1947: break;
1948:
1949: case EST_FETCHQH:
1950: q = ehci_state_fetchqh(ehci, async);
1951: again = q ? 1 : 0;
1952: break;
1953:
1954: case EST_FETCHITD:
1955: again = ehci_state_fetchitd(ehci, async);
1956: break;
1957:
1958: case EST_FETCHSITD:
1959: again = ehci_state_fetchsitd(ehci, async);
1960: break;
1961:
1962: case EST_ADVANCEQUEUE:
1963: again = ehci_state_advqueue(q, async);
1964: break;
1965:
1966: case EST_FETCHQTD:
1967: again = ehci_state_fetchqtd(q, async);
1968: break;
1969:
1970: case EST_HORIZONTALQH:
1971: again = ehci_state_horizqh(q, async);
1972: break;
1973:
1974: case EST_EXECUTE:
1975: again = ehci_state_execute(q, async);
1976: break;
1977:
1978: case EST_EXECUTING:
1979: assert(q != NULL);
1980: again = ehci_state_executing(q, async);
1981: break;
1982:
1983: case EST_WRITEBACK:
1984: assert(q != NULL);
1985: again = ehci_state_writeback(q, async);
1986: break;
1987:
1988: default:
1989: fprintf(stderr, "Bad state!\n");
1990: again = -1;
1991: assert(0);
1992: break;
1993: }
1994:
1995: if (again < 0) {
1996: fprintf(stderr, "processing error - resetting ehci HC\n");
1997: ehci_reset(ehci);
1998: again = 0;
1999: }
2000: }
2001: while (again);
2002:
2003: ehci_commit_interrupt(ehci);
2004: }
2005:
2006: static void ehci_advance_async_state(EHCIState *ehci)
2007: {
2008: const int async = 1;
2009:
2010: switch(ehci_get_state(ehci, async)) {
2011: case EST_INACTIVE:
2012: if (!(ehci->usbcmd & USBCMD_ASE)) {
2013: break;
2014: }
2015: ehci_set_usbsts(ehci, USBSTS_ASS);
2016: ehci_set_state(ehci, async, EST_ACTIVE);
2017: // No break, fall through to ACTIVE
2018:
2019: case EST_ACTIVE:
2020: if ( !(ehci->usbcmd & USBCMD_ASE)) {
2021: ehci_queues_rip_all(ehci, async);
2022: ehci_clear_usbsts(ehci, USBSTS_ASS);
2023: ehci_set_state(ehci, async, EST_INACTIVE);
2024: break;
2025: }
2026:
2027: /* make sure guest has acknowledged the doorbell interrupt */
2028: /* TO-DO: is this really needed? */
2029: if (ehci->usbsts & USBSTS_IAA) {
2030: DPRINTF("IAA status bit still set.\n");
2031: break;
2032: }
2033:
2034: /* check that address register has been set */
2035: if (ehci->asynclistaddr == 0) {
2036: break;
2037: }
2038:
2039: ehci_set_state(ehci, async, EST_WAITLISTHEAD);
2040: ehci_advance_state(ehci, async);
2041:
2042: /* If the doorbell is set, the guest wants to make a change to the
2043: * schedule. The host controller needs to release cached data.
2044: * (section 4.8.2)
2045: */
2046: if (ehci->usbcmd & USBCMD_IAAD) {
2047: /* Remove all unseen qhs from the async qhs queue */
2048: ehci_queues_rip_unused(ehci, async, 1);
2049: DPRINTF("ASYNC: doorbell request acknowledged\n");
2050: ehci->usbcmd &= ~USBCMD_IAAD;
2051: ehci_set_interrupt(ehci, USBSTS_IAA);
2052: }
2053: break;
2054:
2055: default:
2056: /* this should only be due to a developer mistake */
2057: fprintf(stderr, "ehci: Bad asynchronous state %d. "
2058: "Resetting to active\n", ehci->astate);
2059: assert(0);
2060: }
2061: }
2062:
2063: static void ehci_advance_periodic_state(EHCIState *ehci)
2064: {
2065: uint32_t entry;
2066: uint32_t list;
2067: const int async = 0;
2068:
2069: // 4.6
2070:
2071: switch(ehci_get_state(ehci, async)) {
2072: case EST_INACTIVE:
2073: if ( !(ehci->frindex & 7) && (ehci->usbcmd & USBCMD_PSE)) {
2074: ehci_set_usbsts(ehci, USBSTS_PSS);
2075: ehci_set_state(ehci, async, EST_ACTIVE);
2076: // No break, fall through to ACTIVE
2077: } else
2078: break;
2079:
2080: case EST_ACTIVE:
2081: if ( !(ehci->frindex & 7) && !(ehci->usbcmd & USBCMD_PSE)) {
2082: ehci_queues_rip_all(ehci, async);
2083: ehci_clear_usbsts(ehci, USBSTS_PSS);
2084: ehci_set_state(ehci, async, EST_INACTIVE);
2085: break;
2086: }
2087:
2088: list = ehci->periodiclistbase & 0xfffff000;
2089: /* check that register has been set */
2090: if (list == 0) {
2091: break;
2092: }
2093: list |= ((ehci->frindex & 0x1ff8) >> 1);
2094:
2095: pci_dma_read(&ehci->dev, list, &entry, sizeof entry);
2096: entry = le32_to_cpu(entry);
2097:
2098: DPRINTF("PERIODIC state adv fr=%d. [%08X] -> %08X\n",
2099: ehci->frindex / 8, list, entry);
2100: ehci_set_fetch_addr(ehci, async,entry);
2101: ehci_set_state(ehci, async, EST_FETCHENTRY);
2102: ehci_advance_state(ehci, async);
2103: ehci_queues_rip_unused(ehci, async, 0);
2104: break;
2105:
2106: default:
2107: /* this should only be due to a developer mistake */
2108: fprintf(stderr, "ehci: Bad periodic state %d. "
2109: "Resetting to active\n", ehci->pstate);
2110: assert(0);
2111: }
2112: }
2113:
2114: static void ehci_frame_timer(void *opaque)
2115: {
2116: EHCIState *ehci = opaque;
2117: int64_t expire_time, t_now;
2118: uint64_t ns_elapsed;
2119: int frames;
2120: int i;
2121: int skipped_frames = 0;
2122:
2123: t_now = qemu_get_clock_ns(vm_clock);
2124: expire_time = t_now + (get_ticks_per_sec() / ehci->freq);
2125:
2126: ns_elapsed = t_now - ehci->last_run_ns;
2127: frames = ns_elapsed / FRAME_TIMER_NS;
2128:
2129: for (i = 0; i < frames; i++) {
2130: if ( !(ehci->usbsts & USBSTS_HALT)) {
2131: ehci->frindex += 8;
2132:
2133: if (ehci->frindex == 0x00002000) {
2134: ehci_set_interrupt(ehci, USBSTS_FLR);
2135: }
2136:
2137: if (ehci->frindex == 0x00004000) {
2138: ehci_set_interrupt(ehci, USBSTS_FLR);
2139: ehci->frindex = 0;
2140: }
2141: }
2142:
2143: if (frames - i > ehci->maxframes) {
2144: skipped_frames++;
2145: } else {
2146: ehci_advance_periodic_state(ehci);
2147: }
2148:
2149: ehci->last_run_ns += FRAME_TIMER_NS;
2150: }
2151:
2152: #if 0
2153: if (skipped_frames) {
2154: DPRINTF("WARNING - EHCI skipped %d frames\n", skipped_frames);
2155: }
2156: #endif
2157:
2158: /* Async is not inside loop since it executes everything it can once
2159: * called
2160: */
2161: ehci_advance_async_state(ehci);
2162:
2163: qemu_mod_timer(ehci->frame_timer, expire_time);
2164: }
2165:
2166:
2167: static const MemoryRegionOps ehci_mem_ops = {
2168: .old_mmio = {
2169: .read = { ehci_mem_readb, ehci_mem_readw, ehci_mem_readl },
2170: .write = { ehci_mem_writeb, ehci_mem_writew, ehci_mem_writel },
2171: },
2172: .endianness = DEVICE_LITTLE_ENDIAN,
2173: };
2174:
2175: static int usb_ehci_initfn(PCIDevice *dev);
2176:
2177: static USBPortOps ehci_port_ops = {
2178: .attach = ehci_attach,
2179: .detach = ehci_detach,
2180: .child_detach = ehci_child_detach,
2181: .wakeup = ehci_wakeup,
2182: .complete = ehci_async_complete_packet,
2183: };
2184:
2185: static USBBusOps ehci_bus_ops = {
2186: .register_companion = ehci_register_companion,
2187: };
2188:
2189: static const VMStateDescription vmstate_ehci = {
2190: .name = "ehci",
2191: .unmigratable = 1,
2192: };
2193:
2194: static Property ehci_properties[] = {
2195: DEFINE_PROP_UINT32("freq", EHCIState, freq, FRAME_TIMER_FREQ),
2196: DEFINE_PROP_UINT32("maxframes", EHCIState, maxframes, 128),
2197: DEFINE_PROP_END_OF_LIST(),
2198: };
2199:
2200: static void ehci_class_init(ObjectClass *klass, void *data)
2201: {
2202: DeviceClass *dc = DEVICE_CLASS(klass);
2203: PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2204:
2205: k->init = usb_ehci_initfn;
2206: k->vendor_id = PCI_VENDOR_ID_INTEL;
2207: k->device_id = PCI_DEVICE_ID_INTEL_82801D; /* ich4 */
2208: k->revision = 0x10;
2209: k->class_id = PCI_CLASS_SERIAL_USB;
2210: dc->vmsd = &vmstate_ehci;
2211: dc->props = ehci_properties;
2212: }
2213:
2214: static TypeInfo ehci_info = {
2215: .name = "usb-ehci",
2216: .parent = TYPE_PCI_DEVICE,
2217: .instance_size = sizeof(EHCIState),
2218: .class_init = ehci_class_init,
2219: };
2220:
2221: static void ich9_ehci_class_init(ObjectClass *klass, void *data)
2222: {
2223: DeviceClass *dc = DEVICE_CLASS(klass);
2224: PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
2225:
2226: k->init = usb_ehci_initfn;
2227: k->vendor_id = PCI_VENDOR_ID_INTEL;
2228: k->device_id = PCI_DEVICE_ID_INTEL_82801I_EHCI1;
2229: k->revision = 0x03;
2230: k->class_id = PCI_CLASS_SERIAL_USB;
2231: dc->vmsd = &vmstate_ehci;
2232: dc->props = ehci_properties;
2233: }
2234:
2235: static TypeInfo ich9_ehci_info = {
2236: .name = "ich9-usb-ehci1",
2237: .parent = TYPE_PCI_DEVICE,
2238: .instance_size = sizeof(EHCIState),
2239: .class_init = ich9_ehci_class_init,
2240: };
2241:
2242: static int usb_ehci_initfn(PCIDevice *dev)
2243: {
2244: EHCIState *s = DO_UPCAST(EHCIState, dev, dev);
2245: uint8_t *pci_conf = s->dev.config;
2246: int i;
2247:
2248: pci_set_byte(&pci_conf[PCI_CLASS_PROG], 0x20);
2249:
2250: /* capabilities pointer */
2251: pci_set_byte(&pci_conf[PCI_CAPABILITY_LIST], 0x00);
2252: //pci_set_byte(&pci_conf[PCI_CAPABILITY_LIST], 0x50);
2253:
2254: pci_set_byte(&pci_conf[PCI_INTERRUPT_PIN], 4); /* interrupt pin D */
2255: pci_set_byte(&pci_conf[PCI_MIN_GNT], 0);
2256: pci_set_byte(&pci_conf[PCI_MAX_LAT], 0);
2257:
2258: // pci_conf[0x50] = 0x01; // power management caps
2259:
2260: pci_set_byte(&pci_conf[USB_SBRN], USB_RELEASE_2); // release number (2.1.4)
2261: pci_set_byte(&pci_conf[0x61], 0x20); // frame length adjustment (2.1.5)
2262: pci_set_word(&pci_conf[0x62], 0x00); // port wake up capability (2.1.6)
2263:
2264: pci_conf[0x64] = 0x00;
2265: pci_conf[0x65] = 0x00;
2266: pci_conf[0x66] = 0x00;
2267: pci_conf[0x67] = 0x00;
2268: pci_conf[0x68] = 0x01;
2269: pci_conf[0x69] = 0x00;
2270: pci_conf[0x6a] = 0x00;
2271: pci_conf[0x6b] = 0x00; // USBLEGSUP
2272: pci_conf[0x6c] = 0x00;
2273: pci_conf[0x6d] = 0x00;
2274: pci_conf[0x6e] = 0x00;
2275: pci_conf[0x6f] = 0xc0; // USBLEFCTLSTS
2276:
2277: // 2.2 host controller interface version
2278: s->mmio[0x00] = (uint8_t) OPREGBASE;
2279: s->mmio[0x01] = 0x00;
2280: s->mmio[0x02] = 0x00;
2281: s->mmio[0x03] = 0x01; // HC version
2282: s->mmio[0x04] = NB_PORTS; // Number of downstream ports
2283: s->mmio[0x05] = 0x00; // No companion ports at present
2284: s->mmio[0x06] = 0x00;
2285: s->mmio[0x07] = 0x00;
2286: s->mmio[0x08] = 0x80; // We can cache whole frame, not 64-bit capable
2287: s->mmio[0x09] = 0x68; // EECP
2288: s->mmio[0x0a] = 0x00;
2289: s->mmio[0x0b] = 0x00;
2290:
2291: s->irq = s->dev.irq[3];
2292:
2293: usb_bus_new(&s->bus, &ehci_bus_ops, &s->dev.qdev);
2294: for(i = 0; i < NB_PORTS; i++) {
2295: usb_register_port(&s->bus, &s->ports[i], s, i, &ehci_port_ops,
2296: USB_SPEED_MASK_HIGH);
2297: s->ports[i].dev = 0;
2298: }
2299:
2300: s->frame_timer = qemu_new_timer_ns(vm_clock, ehci_frame_timer, s);
2301: QTAILQ_INIT(&s->aqueues);
2302: QTAILQ_INIT(&s->pqueues);
2303:
2304: qemu_register_reset(ehci_reset, s);
2305:
2306: memory_region_init_io(&s->mem, &ehci_mem_ops, s, "ehci", MMIO_SIZE);
2307: pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mem);
2308:
2309: return 0;
2310: }
2311:
2312: static void ehci_register_types(void)
2313: {
2314: type_register_static(&ehci_info);
2315: type_register_static(&ich9_ehci_info);
2316: }
2317:
2318: type_init(ehci_register_types)
2319:
2320: /*
2321: * vim: expandtab ts=4
2322: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.