Statistics
| Branch: | Revision:

root / hw / usb / hcd-ehci.h @ 20c57043

History | View | Annotate | Download (11.2 kB)

1 0bf96f94 Gerd Hoffmann
/*
2 0bf96f94 Gerd Hoffmann
 * QEMU USB EHCI Emulation
3 0bf96f94 Gerd Hoffmann
 *
4 0bf96f94 Gerd Hoffmann
 * This library is free software; you can redistribute it and/or
5 0bf96f94 Gerd Hoffmann
 * modify it under the terms of the GNU Lesser General Public
6 0bf96f94 Gerd Hoffmann
 * License as published by the Free Software Foundation; either
7 0bf96f94 Gerd Hoffmann
 * version 2 of the License, or(at your option) any later version.
8 0bf96f94 Gerd Hoffmann
 *
9 0bf96f94 Gerd Hoffmann
 * This library is distributed in the hope that it will be useful,
10 0bf96f94 Gerd Hoffmann
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 0bf96f94 Gerd Hoffmann
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 0bf96f94 Gerd Hoffmann
 * Lesser General Public License for more details.
13 0bf96f94 Gerd Hoffmann
 *
14 0bf96f94 Gerd Hoffmann
 * You should have received a copy of the GNU General Public License
15 0bf96f94 Gerd Hoffmann
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 0bf96f94 Gerd Hoffmann
 */
17 cb9c377f Paolo Bonzini
#ifndef HW_USB_EHCI_H
18 cb9c377f Paolo Bonzini
#define HW_USB_EHCI_H 1
19 0bf96f94 Gerd Hoffmann
20 0bf96f94 Gerd Hoffmann
#include "hw/hw.h"
21 1de7afc9 Paolo Bonzini
#include "qemu/timer.h"
22 0bf96f94 Gerd Hoffmann
#include "hw/usb.h"
23 83c9089e Paolo Bonzini
#include "monitor/monitor.h"
24 0bf96f94 Gerd Hoffmann
#include "trace.h"
25 9c17d615 Paolo Bonzini
#include "sysemu/dma.h"
26 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
27 5aa3ca9f Andreas Färber
#include "hw/pci/pci.h"
28 5aa3ca9f Andreas Färber
#include "hw/sysbus.h"
29 0bf96f94 Gerd Hoffmann
30 0bf96f94 Gerd Hoffmann
#ifndef EHCI_DEBUG
31 0bf96f94 Gerd Hoffmann
#define EHCI_DEBUG   0
32 0bf96f94 Gerd Hoffmann
#endif
33 0bf96f94 Gerd Hoffmann
34 0bf96f94 Gerd Hoffmann
#if EHCI_DEBUG
35 0bf96f94 Gerd Hoffmann
#define DPRINTF printf
36 0bf96f94 Gerd Hoffmann
#else
37 0bf96f94 Gerd Hoffmann
#define DPRINTF(...)
38 0bf96f94 Gerd Hoffmann
#endif
39 0bf96f94 Gerd Hoffmann
40 0bf96f94 Gerd Hoffmann
#define MMIO_SIZE        0x1000
41 0bf96f94 Gerd Hoffmann
#define CAPA_SIZE        0x10
42 0bf96f94 Gerd Hoffmann
43 0bf96f94 Gerd Hoffmann
#define PORTSC               0x0044
44 0bf96f94 Gerd Hoffmann
#define PORTSC_BEGIN         PORTSC
45 0bf96f94 Gerd Hoffmann
#define PORTSC_END           (PORTSC + 4 * NB_PORTS)
46 0bf96f94 Gerd Hoffmann
47 0bf96f94 Gerd Hoffmann
#define NB_PORTS         6        /* Number of downstream ports */
48 0bf96f94 Gerd Hoffmann
49 0bf96f94 Gerd Hoffmann
typedef struct EHCIPacket EHCIPacket;
50 0bf96f94 Gerd Hoffmann
typedef struct EHCIQueue EHCIQueue;
51 0bf96f94 Gerd Hoffmann
typedef struct EHCIState EHCIState;
52 0bf96f94 Gerd Hoffmann
53 0bf96f94 Gerd Hoffmann
/*  EHCI spec version 1.0 Section 3.3
54 0bf96f94 Gerd Hoffmann
 */
55 0bf96f94 Gerd Hoffmann
typedef struct EHCIitd {
56 0bf96f94 Gerd Hoffmann
    uint32_t next;
57 0bf96f94 Gerd Hoffmann
58 0bf96f94 Gerd Hoffmann
    uint32_t transact[8];
59 0bf96f94 Gerd Hoffmann
#define ITD_XACT_ACTIVE          (1 << 31)
60 0bf96f94 Gerd Hoffmann
#define ITD_XACT_DBERROR         (1 << 30)
61 0bf96f94 Gerd Hoffmann
#define ITD_XACT_BABBLE          (1 << 29)
62 0bf96f94 Gerd Hoffmann
#define ITD_XACT_XACTERR         (1 << 28)
63 0bf96f94 Gerd Hoffmann
#define ITD_XACT_LENGTH_MASK     0x0fff0000
64 0bf96f94 Gerd Hoffmann
#define ITD_XACT_LENGTH_SH       16
65 0bf96f94 Gerd Hoffmann
#define ITD_XACT_IOC             (1 << 15)
66 0bf96f94 Gerd Hoffmann
#define ITD_XACT_PGSEL_MASK      0x00007000
67 0bf96f94 Gerd Hoffmann
#define ITD_XACT_PGSEL_SH        12
68 0bf96f94 Gerd Hoffmann
#define ITD_XACT_OFFSET_MASK     0x00000fff
69 0bf96f94 Gerd Hoffmann
70 0bf96f94 Gerd Hoffmann
    uint32_t bufptr[7];
71 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_MASK          0xfffff000
72 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_SH            12
73 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_EP_MASK       0x00000f00
74 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_EP_SH         8
75 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_DEVADDR_MASK  0x0000007f
76 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_DEVADDR_SH    0
77 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_DIRECTION     (1 << 11)
78 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_MAXPKT_MASK   0x000007ff
79 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_MAXPKT_SH     0
80 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_MULT_MASK     0x00000003
81 0bf96f94 Gerd Hoffmann
#define ITD_BUFPTR_MULT_SH       0
82 0bf96f94 Gerd Hoffmann
} EHCIitd;
83 0bf96f94 Gerd Hoffmann
84 0bf96f94 Gerd Hoffmann
/*  EHCI spec version 1.0 Section 3.4
85 0bf96f94 Gerd Hoffmann
 */
86 0bf96f94 Gerd Hoffmann
typedef struct EHCIsitd {
87 0bf96f94 Gerd Hoffmann
    uint32_t next;                  /* Standard next link pointer */
88 0bf96f94 Gerd Hoffmann
    uint32_t epchar;
89 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_IO              (1 << 31)
90 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_PORTNUM_MASK    0x7f000000
91 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_PORTNUM_SH      24
92 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_HUBADD_MASK     0x007f0000
93 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_HUBADDR_SH      16
94 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_EPNUM_MASK      0x00000f00
95 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_EPNUM_SH        8
96 0bf96f94 Gerd Hoffmann
#define SITD_EPCHAR_DEVADDR_MASK    0x0000007f
97 0bf96f94 Gerd Hoffmann
98 0bf96f94 Gerd Hoffmann
    uint32_t uframe;
99 0bf96f94 Gerd Hoffmann
#define SITD_UFRAME_CMASK_MASK      0x0000ff00
100 0bf96f94 Gerd Hoffmann
#define SITD_UFRAME_CMASK_SH        8
101 0bf96f94 Gerd Hoffmann
#define SITD_UFRAME_SMASK_MASK      0x000000ff
102 0bf96f94 Gerd Hoffmann
103 0bf96f94 Gerd Hoffmann
    uint32_t results;
104 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_IOC              (1 << 31)
105 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_PGSEL            (1 << 30)
106 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_TBYTES_MASK      0x03ff0000
107 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_TYBYTES_SH       16
108 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_CPROGMASK_MASK   0x0000ff00
109 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_CPROGMASK_SH     8
110 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_ACTIVE           (1 << 7)
111 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_ERR              (1 << 6)
112 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_DBERR            (1 << 5)
113 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_BABBLE           (1 << 4)
114 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_XACTERR          (1 << 3)
115 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_MISSEDUF         (1 << 2)
116 0bf96f94 Gerd Hoffmann
#define SITD_RESULTS_SPLITXSTATE      (1 << 1)
117 0bf96f94 Gerd Hoffmann
118 0bf96f94 Gerd Hoffmann
    uint32_t bufptr[2];
119 0bf96f94 Gerd Hoffmann
#define SITD_BUFPTR_MASK              0xfffff000
120 0bf96f94 Gerd Hoffmann
#define SITD_BUFPTR_CURROFF_MASK      0x00000fff
121 0bf96f94 Gerd Hoffmann
#define SITD_BUFPTR_TPOS_MASK         0x00000018
122 0bf96f94 Gerd Hoffmann
#define SITD_BUFPTR_TPOS_SH           3
123 0bf96f94 Gerd Hoffmann
#define SITD_BUFPTR_TCNT_MASK         0x00000007
124 0bf96f94 Gerd Hoffmann
125 0bf96f94 Gerd Hoffmann
    uint32_t backptr;                 /* Standard next link pointer */
126 0bf96f94 Gerd Hoffmann
} EHCIsitd;
127 0bf96f94 Gerd Hoffmann
128 0bf96f94 Gerd Hoffmann
/*  EHCI spec version 1.0 Section 3.5
129 0bf96f94 Gerd Hoffmann
 */
130 0bf96f94 Gerd Hoffmann
typedef struct EHCIqtd {
131 0bf96f94 Gerd Hoffmann
    uint32_t next;                    /* Standard next link pointer */
132 0bf96f94 Gerd Hoffmann
    uint32_t altnext;                 /* Standard next link pointer */
133 0bf96f94 Gerd Hoffmann
    uint32_t token;
134 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_DTOGGLE             (1 << 31)
135 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_TBYTES_MASK         0x7fff0000
136 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_TBYTES_SH           16
137 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_IOC                 (1 << 15)
138 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_CPAGE_MASK          0x00007000
139 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_CPAGE_SH            12
140 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_CERR_MASK           0x00000c00
141 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_CERR_SH             10
142 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_PID_MASK            0x00000300
143 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_PID_SH              8
144 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_ACTIVE              (1 << 7)
145 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_HALT                (1 << 6)
146 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_DBERR               (1 << 5)
147 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_BABBLE              (1 << 4)
148 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_XACTERR             (1 << 3)
149 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_MISSEDUF            (1 << 2)
150 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_SPLITXSTATE         (1 << 1)
151 0bf96f94 Gerd Hoffmann
#define QTD_TOKEN_PING                (1 << 0)
152 0bf96f94 Gerd Hoffmann
153 0bf96f94 Gerd Hoffmann
    uint32_t bufptr[5];               /* Standard buffer pointer */
154 0bf96f94 Gerd Hoffmann
#define QTD_BUFPTR_MASK               0xfffff000
155 0bf96f94 Gerd Hoffmann
#define QTD_BUFPTR_SH                 12
156 0bf96f94 Gerd Hoffmann
} EHCIqtd;
157 0bf96f94 Gerd Hoffmann
158 0bf96f94 Gerd Hoffmann
/*  EHCI spec version 1.0 Section 3.6
159 0bf96f94 Gerd Hoffmann
 */
160 0bf96f94 Gerd Hoffmann
typedef struct EHCIqh {
161 0bf96f94 Gerd Hoffmann
    uint32_t next;                    /* Standard next link pointer */
162 0bf96f94 Gerd Hoffmann
163 0bf96f94 Gerd Hoffmann
    /* endpoint characteristics */
164 0bf96f94 Gerd Hoffmann
    uint32_t epchar;
165 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_RL_MASK             0xf0000000
166 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_RL_SH               28
167 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_C                   (1 << 27)
168 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_MPLEN_MASK          0x07FF0000
169 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_MPLEN_SH            16
170 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_H                   (1 << 15)
171 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_DTC                 (1 << 14)
172 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_EPS_MASK            0x00003000
173 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_EPS_SH              12
174 0bf96f94 Gerd Hoffmann
#define EHCI_QH_EPS_FULL              0
175 0bf96f94 Gerd Hoffmann
#define EHCI_QH_EPS_LOW               1
176 0bf96f94 Gerd Hoffmann
#define EHCI_QH_EPS_HIGH              2
177 0bf96f94 Gerd Hoffmann
#define EHCI_QH_EPS_RESERVED          3
178 0bf96f94 Gerd Hoffmann
179 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_EP_MASK             0x00000f00
180 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_EP_SH               8
181 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_I                   (1 << 7)
182 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_DEVADDR_MASK        0x0000007f
183 0bf96f94 Gerd Hoffmann
#define QH_EPCHAR_DEVADDR_SH          0
184 0bf96f94 Gerd Hoffmann
185 0bf96f94 Gerd Hoffmann
    /* endpoint capabilities */
186 0bf96f94 Gerd Hoffmann
    uint32_t epcap;
187 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_MULT_MASK            0xc0000000
188 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_MULT_SH              30
189 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_PORTNUM_MASK         0x3f800000
190 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_PORTNUM_SH           23
191 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_HUBADDR_MASK         0x007f0000
192 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_HUBADDR_SH           16
193 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_CMASK_MASK           0x0000ff00
194 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_CMASK_SH             8
195 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_SMASK_MASK           0x000000ff
196 0bf96f94 Gerd Hoffmann
#define QH_EPCAP_SMASK_SH             0
197 0bf96f94 Gerd Hoffmann
198 0bf96f94 Gerd Hoffmann
    uint32_t current_qtd;             /* Standard next link pointer */
199 0bf96f94 Gerd Hoffmann
    uint32_t next_qtd;                /* Standard next link pointer */
200 0bf96f94 Gerd Hoffmann
    uint32_t altnext_qtd;
201 0bf96f94 Gerd Hoffmann
#define QH_ALTNEXT_NAKCNT_MASK        0x0000001e
202 0bf96f94 Gerd Hoffmann
#define QH_ALTNEXT_NAKCNT_SH          1
203 0bf96f94 Gerd Hoffmann
204 0bf96f94 Gerd Hoffmann
    uint32_t token;                   /* Same as QTD token */
205 0bf96f94 Gerd Hoffmann
    uint32_t bufptr[5];               /* Standard buffer pointer */
206 0bf96f94 Gerd Hoffmann
#define BUFPTR_CPROGMASK_MASK         0x000000ff
207 0bf96f94 Gerd Hoffmann
#define BUFPTR_FRAMETAG_MASK          0x0000001f
208 0bf96f94 Gerd Hoffmann
#define BUFPTR_SBYTES_MASK            0x00000fe0
209 0bf96f94 Gerd Hoffmann
#define BUFPTR_SBYTES_SH              5
210 0bf96f94 Gerd Hoffmann
} EHCIqh;
211 0bf96f94 Gerd Hoffmann
212 0bf96f94 Gerd Hoffmann
/*  EHCI spec version 1.0 Section 3.7
213 0bf96f94 Gerd Hoffmann
 */
214 0bf96f94 Gerd Hoffmann
typedef struct EHCIfstn {
215 0bf96f94 Gerd Hoffmann
    uint32_t next;                    /* Standard next link pointer */
216 0bf96f94 Gerd Hoffmann
    uint32_t backptr;                 /* Standard next link pointer */
217 0bf96f94 Gerd Hoffmann
} EHCIfstn;
218 0bf96f94 Gerd Hoffmann
219 0bf96f94 Gerd Hoffmann
enum async_state {
220 0bf96f94 Gerd Hoffmann
    EHCI_ASYNC_NONE = 0,
221 0bf96f94 Gerd Hoffmann
    EHCI_ASYNC_INITIALIZED,
222 0bf96f94 Gerd Hoffmann
    EHCI_ASYNC_INFLIGHT,
223 0bf96f94 Gerd Hoffmann
    EHCI_ASYNC_FINISHED,
224 0bf96f94 Gerd Hoffmann
};
225 0bf96f94 Gerd Hoffmann
226 0bf96f94 Gerd Hoffmann
struct EHCIPacket {
227 0bf96f94 Gerd Hoffmann
    EHCIQueue *queue;
228 0bf96f94 Gerd Hoffmann
    QTAILQ_ENTRY(EHCIPacket) next;
229 0bf96f94 Gerd Hoffmann
230 0bf96f94 Gerd Hoffmann
    EHCIqtd qtd;           /* copy of current QTD (being worked on) */
231 0bf96f94 Gerd Hoffmann
    uint32_t qtdaddr;      /* address QTD read from                 */
232 0bf96f94 Gerd Hoffmann
233 0bf96f94 Gerd Hoffmann
    USBPacket packet;
234 0bf96f94 Gerd Hoffmann
    QEMUSGList sgl;
235 0bf96f94 Gerd Hoffmann
    int pid;
236 0bf96f94 Gerd Hoffmann
    enum async_state async;
237 0bf96f94 Gerd Hoffmann
};
238 0bf96f94 Gerd Hoffmann
239 0bf96f94 Gerd Hoffmann
struct EHCIQueue {
240 0bf96f94 Gerd Hoffmann
    EHCIState *ehci;
241 0bf96f94 Gerd Hoffmann
    QTAILQ_ENTRY(EHCIQueue) next;
242 0bf96f94 Gerd Hoffmann
    uint32_t seen;
243 0bf96f94 Gerd Hoffmann
    uint64_t ts;
244 0bf96f94 Gerd Hoffmann
    int async;
245 0bf96f94 Gerd Hoffmann
    int transact_ctr;
246 0bf96f94 Gerd Hoffmann
247 0bf96f94 Gerd Hoffmann
    /* cached data from guest - needs to be flushed
248 0bf96f94 Gerd Hoffmann
     * when guest removes an entry (doorbell, handshake sequence)
249 0bf96f94 Gerd Hoffmann
     */
250 0bf96f94 Gerd Hoffmann
    EHCIqh qh;             /* copy of current QH (being worked on) */
251 0bf96f94 Gerd Hoffmann
    uint32_t qhaddr;       /* address QH read from                 */
252 0bf96f94 Gerd Hoffmann
    uint32_t qtdaddr;      /* address QTD read from                */
253 bbbc39cc Hans de Goede
    int last_pid;          /* pid of last packet executed          */
254 0bf96f94 Gerd Hoffmann
    USBDevice *dev;
255 0bf96f94 Gerd Hoffmann
    QTAILQ_HEAD(pkts_head, EHCIPacket) packets;
256 0bf96f94 Gerd Hoffmann
};
257 0bf96f94 Gerd Hoffmann
258 0bf96f94 Gerd Hoffmann
typedef QTAILQ_HEAD(EHCIQueueHead, EHCIQueue) EHCIQueueHead;
259 0bf96f94 Gerd Hoffmann
260 0bf96f94 Gerd Hoffmann
struct EHCIState {
261 0bf96f94 Gerd Hoffmann
    USBBus bus;
262 0bf96f94 Gerd Hoffmann
    qemu_irq irq;
263 0bf96f94 Gerd Hoffmann
    MemoryRegion mem;
264 df32fd1c Paolo Bonzini
    AddressSpace *as;
265 0bf96f94 Gerd Hoffmann
    MemoryRegion mem_caps;
266 0bf96f94 Gerd Hoffmann
    MemoryRegion mem_opreg;
267 0bf96f94 Gerd Hoffmann
    MemoryRegion mem_ports;
268 0bf96f94 Gerd Hoffmann
    int companion_count;
269 0bf96f94 Gerd Hoffmann
    uint16_t capsbase;
270 0bf96f94 Gerd Hoffmann
    uint16_t opregbase;
271 0bf96f94 Gerd Hoffmann
272 0bf96f94 Gerd Hoffmann
    /* properties */
273 0bf96f94 Gerd Hoffmann
    uint32_t maxframes;
274 0bf96f94 Gerd Hoffmann
275 0bf96f94 Gerd Hoffmann
    /*
276 0bf96f94 Gerd Hoffmann
     *  EHCI spec version 1.0 Section 2.3
277 0bf96f94 Gerd Hoffmann
     *  Host Controller Operational Registers
278 0bf96f94 Gerd Hoffmann
     */
279 0bf96f94 Gerd Hoffmann
    uint8_t caps[CAPA_SIZE];
280 0bf96f94 Gerd Hoffmann
    union {
281 0bf96f94 Gerd Hoffmann
        uint32_t opreg[PORTSC_BEGIN/sizeof(uint32_t)];
282 0bf96f94 Gerd Hoffmann
        struct {
283 0bf96f94 Gerd Hoffmann
            uint32_t usbcmd;
284 0bf96f94 Gerd Hoffmann
            uint32_t usbsts;
285 0bf96f94 Gerd Hoffmann
            uint32_t usbintr;
286 0bf96f94 Gerd Hoffmann
            uint32_t frindex;
287 0bf96f94 Gerd Hoffmann
            uint32_t ctrldssegment;
288 0bf96f94 Gerd Hoffmann
            uint32_t periodiclistbase;
289 0bf96f94 Gerd Hoffmann
            uint32_t asynclistaddr;
290 0bf96f94 Gerd Hoffmann
            uint32_t notused[9];
291 0bf96f94 Gerd Hoffmann
            uint32_t configflag;
292 0bf96f94 Gerd Hoffmann
        };
293 0bf96f94 Gerd Hoffmann
    };
294 0bf96f94 Gerd Hoffmann
    uint32_t portsc[NB_PORTS];
295 0bf96f94 Gerd Hoffmann
296 0bf96f94 Gerd Hoffmann
    /*
297 0bf96f94 Gerd Hoffmann
     *  Internal states, shadow registers, etc
298 0bf96f94 Gerd Hoffmann
     */
299 0bf96f94 Gerd Hoffmann
    QEMUTimer *frame_timer;
300 0bf96f94 Gerd Hoffmann
    QEMUBH *async_bh;
301 0bf96f94 Gerd Hoffmann
    uint32_t astate;         /* Current state in asynchronous schedule */
302 0bf96f94 Gerd Hoffmann
    uint32_t pstate;         /* Current state in periodic schedule     */
303 0bf96f94 Gerd Hoffmann
    USBPort ports[NB_PORTS];
304 0bf96f94 Gerd Hoffmann
    USBPort *companion_ports[NB_PORTS];
305 0bf96f94 Gerd Hoffmann
    uint32_t usbsts_pending;
306 0bf96f94 Gerd Hoffmann
    uint32_t usbsts_frindex;
307 0bf96f94 Gerd Hoffmann
    EHCIQueueHead aqueues;
308 0bf96f94 Gerd Hoffmann
    EHCIQueueHead pqueues;
309 0bf96f94 Gerd Hoffmann
310 0bf96f94 Gerd Hoffmann
    /* which address to look at next */
311 0bf96f94 Gerd Hoffmann
    uint32_t a_fetch_addr;
312 0bf96f94 Gerd Hoffmann
    uint32_t p_fetch_addr;
313 0bf96f94 Gerd Hoffmann
314 0bf96f94 Gerd Hoffmann
    USBPacket ipacket;
315 0bf96f94 Gerd Hoffmann
    QEMUSGList isgl;
316 0bf96f94 Gerd Hoffmann
317 0bf96f94 Gerd Hoffmann
    uint64_t last_run_ns;
318 0bf96f94 Gerd Hoffmann
    uint32_t async_stepdown;
319 80826240 Hans de Goede
    uint32_t periodic_sched_active;
320 0bf96f94 Gerd Hoffmann
    bool int_req_by_async;
321 0bf96f94 Gerd Hoffmann
};
322 0bf96f94 Gerd Hoffmann
323 0bf96f94 Gerd Hoffmann
extern const VMStateDescription vmstate_ehci;
324 0bf96f94 Gerd Hoffmann
325 d4614cc3 Andreas Färber
void usb_ehci_init(EHCIState *s, DeviceState *dev);
326 08f4c90b Andreas Färber
void usb_ehci_realize(EHCIState *s, DeviceState *dev, Error **errp);
327 cb9c377f Paolo Bonzini
328 5aa3ca9f Andreas Färber
#define TYPE_PCI_EHCI "pci-ehci-usb"
329 5aa3ca9f Andreas Färber
#define PCI_EHCI(obj) OBJECT_CHECK(EHCIPCIState, (obj), TYPE_PCI_EHCI)
330 5aa3ca9f Andreas Färber
331 5aa3ca9f Andreas Färber
typedef struct EHCIPCIState {
332 5aa3ca9f Andreas Färber
    /*< private >*/
333 5aa3ca9f Andreas Färber
    PCIDevice pcidev;
334 5aa3ca9f Andreas Färber
    /*< public >*/
335 5aa3ca9f Andreas Färber
336 5aa3ca9f Andreas Färber
    EHCIState ehci;
337 5aa3ca9f Andreas Färber
} EHCIPCIState;
338 5aa3ca9f Andreas Färber
339 5aa3ca9f Andreas Färber
340 5aa3ca9f Andreas Färber
#define TYPE_SYS_BUS_EHCI "sysbus-ehci-usb"
341 aee7499a Andreas Färber
#define TYPE_EXYNOS4210_EHCI "exynos4210-ehci-usb"
342 20c57043 Andreas Färber
#define TYPE_TEGRA2_EHCI "tegra2-ehci-usb"
343 aee7499a Andreas Färber
344 5aa3ca9f Andreas Färber
#define SYS_BUS_EHCI(obj) \
345 5aa3ca9f Andreas Färber
    OBJECT_CHECK(EHCISysBusState, (obj), TYPE_SYS_BUS_EHCI)
346 4a434367 Andreas Färber
#define SYS_BUS_EHCI_CLASS(class) \
347 4a434367 Andreas Färber
    OBJECT_CLASS_CHECK(SysBusEHCIClass, (class), TYPE_SYS_BUS_EHCI)
348 4a434367 Andreas Färber
#define SYS_BUS_EHCI_GET_CLASS(obj) \
349 4a434367 Andreas Färber
    OBJECT_GET_CLASS(SysBusEHCIClass, (obj), TYPE_SYS_BUS_EHCI)
350 5aa3ca9f Andreas Färber
351 5aa3ca9f Andreas Färber
typedef struct EHCISysBusState {
352 5aa3ca9f Andreas Färber
    /*< private >*/
353 5aa3ca9f Andreas Färber
    SysBusDevice parent_obj;
354 5aa3ca9f Andreas Färber
    /*< public >*/
355 5aa3ca9f Andreas Färber
356 5aa3ca9f Andreas Färber
    EHCIState ehci;
357 5aa3ca9f Andreas Färber
} EHCISysBusState;
358 5aa3ca9f Andreas Färber
359 4a434367 Andreas Färber
typedef struct SysBusEHCIClass {
360 4a434367 Andreas Färber
    /*< private >*/
361 4a434367 Andreas Färber
    SysBusDeviceClass parent_class;
362 4a434367 Andreas Färber
    /*< public >*/
363 4a434367 Andreas Färber
364 4a434367 Andreas Färber
    uint16_t capsbase;
365 4a434367 Andreas Färber
    uint16_t opregbase;
366 4a434367 Andreas Färber
} SysBusEHCIClass;
367 4a434367 Andreas Färber
368 cb9c377f Paolo Bonzini
#endif