xref: /openbmc/qemu/hw/usb/hcd-dwc3.c (revision 6016b7b4)
1 /*
2  * QEMU model of the USB DWC3 host controller emulation.
3  *
4  * This model defines global register space of DWC3 controller. Global
5  * registers control the AXI/AHB interfaces properties, external FIFO support
6  * and event count support. All of which are unimplemented at present. We are
7  * only supporting core reset and read of ID register.
8  *
9  * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal<fnu.vikram@xilinx.com>
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a copy
12  * of this software and associated documentation files (the "Software"), to deal
13  * in the Software without restriction, including without limitation the rights
14  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15  * copies of the Software, and to permit persons to whom the Software is
16  * furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included in
19  * all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27  * THE SOFTWARE.
28  */
29 
30 #include "qemu/osdep.h"
31 #include "hw/sysbus.h"
32 #include "hw/register.h"
33 #include "qemu/bitops.h"
34 #include "qom/object.h"
35 #include "migration/vmstate.h"
36 #include "hw/qdev-properties.h"
37 #include "hw/usb/hcd-dwc3.h"
38 #include "qapi/error.h"
39 
40 #ifndef USB_DWC3_ERR_DEBUG
41 #define USB_DWC3_ERR_DEBUG 0
42 #endif
43 
44 #define HOST_MODE           1
45 #define FIFO_LEN         0x1000
46 
47 REG32(GSBUSCFG0, 0x00)
48     FIELD(GSBUSCFG0, DATRDREQINFO, 28, 4)
49     FIELD(GSBUSCFG0, DESRDREQINFO, 24, 4)
50     FIELD(GSBUSCFG0, DATWRREQINFO, 20, 4)
51     FIELD(GSBUSCFG0, DESWRREQINFO, 16, 4)
52     FIELD(GSBUSCFG0, RESERVED_15_12, 12, 4)
53     FIELD(GSBUSCFG0, DATBIGEND, 11, 1)
54     FIELD(GSBUSCFG0, DESBIGEND, 10, 1)
55     FIELD(GSBUSCFG0, RESERVED_9_8, 8, 2)
56     FIELD(GSBUSCFG0, INCR256BRSTENA, 7, 1)
57     FIELD(GSBUSCFG0, INCR128BRSTENA, 6, 1)
58     FIELD(GSBUSCFG0, INCR64BRSTENA, 5, 1)
59     FIELD(GSBUSCFG0, INCR32BRSTENA, 4, 1)
60     FIELD(GSBUSCFG0, INCR16BRSTENA, 3, 1)
61     FIELD(GSBUSCFG0, INCR8BRSTENA, 2, 1)
62     FIELD(GSBUSCFG0, INCR4BRSTENA, 1, 1)
63     FIELD(GSBUSCFG0, INCRBRSTENA, 0, 1)
64 REG32(GSBUSCFG1, 0x04)
65     FIELD(GSBUSCFG1, RESERVED_31_13, 13, 19)
66     FIELD(GSBUSCFG1, EN1KPAGE, 12, 1)
67     FIELD(GSBUSCFG1, PIPETRANSLIMIT, 8, 4)
68     FIELD(GSBUSCFG1, RESERVED_7_0, 0, 8)
69 REG32(GTXTHRCFG, 0x08)
70     FIELD(GTXTHRCFG, RESERVED_31, 31, 1)
71     FIELD(GTXTHRCFG, RESERVED_30, 30, 1)
72     FIELD(GTXTHRCFG, USBTXPKTCNTSEL, 29, 1)
73     FIELD(GTXTHRCFG, RESERVED_28, 28, 1)
74     FIELD(GTXTHRCFG, USBTXPKTCNT, 24, 4)
75     FIELD(GTXTHRCFG, USBMAXTXBURSTSIZE, 16, 8)
76     FIELD(GTXTHRCFG, RESERVED_15, 15, 1)
77     FIELD(GTXTHRCFG, RESERVED_14, 14, 1)
78     FIELD(GTXTHRCFG, RESERVED_13_11, 11, 3)
79     FIELD(GTXTHRCFG, RESERVED_10_0, 0, 11)
80 REG32(GRXTHRCFG, 0x0c)
81     FIELD(GRXTHRCFG, RESERVED_31_30, 30, 2)
82     FIELD(GRXTHRCFG, USBRXPKTCNTSEL, 29, 1)
83     FIELD(GRXTHRCFG, RESERVED_28, 28, 1)
84     FIELD(GRXTHRCFG, USBRXPKTCNT, 24, 4)
85     FIELD(GRXTHRCFG, USBMAXRXBURSTSIZE, 19, 5)
86     FIELD(GRXTHRCFG, RESERVED_18_16, 16, 3)
87     FIELD(GRXTHRCFG, RESERVED_15, 15, 1)
88     FIELD(GRXTHRCFG, RESERVED_14_13, 13, 2)
89     FIELD(GRXTHRCFG, RESVISOCOUTSPC, 0, 13)
90 REG32(GCTL, 0x10)
91     FIELD(GCTL, PWRDNSCALE, 19, 13)
92     FIELD(GCTL, MASTERFILTBYPASS, 18, 1)
93     FIELD(GCTL, BYPSSETADDR, 17, 1)
94     FIELD(GCTL, U2RSTECN, 16, 1)
95     FIELD(GCTL, FRMSCLDWN, 14, 2)
96     FIELD(GCTL, PRTCAPDIR, 12, 2)
97     FIELD(GCTL, CORESOFTRESET, 11, 1)
98     FIELD(GCTL, U1U2TIMERSCALE, 9, 1)
99     FIELD(GCTL, DEBUGATTACH, 8, 1)
100     FIELD(GCTL, RAMCLKSEL, 6, 2)
101     FIELD(GCTL, SCALEDOWN, 4, 2)
102     FIELD(GCTL, DISSCRAMBLE, 3, 1)
103     FIELD(GCTL, U2EXIT_LFPS, 2, 1)
104     FIELD(GCTL, GBLHIBERNATIONEN, 1, 1)
105     FIELD(GCTL, DSBLCLKGTNG, 0, 1)
106 REG32(GPMSTS, 0x14)
107 REG32(GSTS, 0x18)
108     FIELD(GSTS, CBELT, 20, 12)
109     FIELD(GSTS, RESERVED_19_12, 12, 8)
110     FIELD(GSTS, SSIC_IP, 11, 1)
111     FIELD(GSTS, OTG_IP, 10, 1)
112     FIELD(GSTS, BC_IP, 9, 1)
113     FIELD(GSTS, ADP_IP, 8, 1)
114     FIELD(GSTS, HOST_IP, 7, 1)
115     FIELD(GSTS, DEVICE_IP, 6, 1)
116     FIELD(GSTS, CSRTIMEOUT, 5, 1)
117     FIELD(GSTS, BUSERRADDRVLD, 4, 1)
118     FIELD(GSTS, RESERVED_3_2, 2, 2)
119     FIELD(GSTS, CURMOD, 0, 2)
120 REG32(GUCTL1, 0x1c)
121     FIELD(GUCTL1, RESUME_OPMODE_HS_HOST, 10, 1)
122 REG32(GSNPSID, 0x20)
123 REG32(GGPIO, 0x24)
124     FIELD(GGPIO, GPO, 16, 16)
125     FIELD(GGPIO, GPI, 0, 16)
126 REG32(GUID, 0x28)
127 REG32(GUCTL, 0x2c)
128     FIELD(GUCTL, REFCLKPER, 22, 10)
129     FIELD(GUCTL, NOEXTRDL, 21, 1)
130     FIELD(GUCTL, RESERVED_20_18, 18, 3)
131     FIELD(GUCTL, SPRSCTRLTRANSEN, 17, 1)
132     FIELD(GUCTL, RESBWHSEPS, 16, 1)
133     FIELD(GUCTL, RESERVED_15, 15, 1)
134     FIELD(GUCTL, USBHSTINAUTORETRYEN, 14, 1)
135     FIELD(GUCTL, ENOVERLAPCHK, 13, 1)
136     FIELD(GUCTL, EXTCAPSUPPTEN, 12, 1)
137     FIELD(GUCTL, INSRTEXTRFSBODI, 11, 1)
138     FIELD(GUCTL, DTCT, 9, 2)
139     FIELD(GUCTL, DTFT, 0, 9)
140 REG32(GBUSERRADDRLO, 0x30)
141 REG32(GBUSERRADDRHI, 0x34)
142 REG32(GHWPARAMS0, 0x40)
143     FIELD(GHWPARAMS0, GHWPARAMS0_31_24, 24, 8)
144     FIELD(GHWPARAMS0, GHWPARAMS0_23_16, 16, 8)
145     FIELD(GHWPARAMS0, GHWPARAMS0_15_8, 8, 8)
146     FIELD(GHWPARAMS0, GHWPARAMS0_7_6, 6, 2)
147     FIELD(GHWPARAMS0, GHWPARAMS0_5_3, 3, 3)
148     FIELD(GHWPARAMS0, GHWPARAMS0_2_0, 0, 3)
149 REG32(GHWPARAMS1, 0x44)
150     FIELD(GHWPARAMS1, GHWPARAMS1_31, 31, 1)
151     FIELD(GHWPARAMS1, GHWPARAMS1_30, 30, 1)
152     FIELD(GHWPARAMS1, GHWPARAMS1_29, 29, 1)
153     FIELD(GHWPARAMS1, GHWPARAMS1_28, 28, 1)
154     FIELD(GHWPARAMS1, GHWPARAMS1_27, 27, 1)
155     FIELD(GHWPARAMS1, GHWPARAMS1_26, 26, 1)
156     FIELD(GHWPARAMS1, GHWPARAMS1_25_24, 24, 2)
157     FIELD(GHWPARAMS1, GHWPARAMS1_23, 23, 1)
158     FIELD(GHWPARAMS1, GHWPARAMS1_22_21, 21, 2)
159     FIELD(GHWPARAMS1, GHWPARAMS1_20_15, 15, 6)
160     FIELD(GHWPARAMS1, GHWPARAMS1_14_12, 12, 3)
161     FIELD(GHWPARAMS1, GHWPARAMS1_11_9, 9, 3)
162     FIELD(GHWPARAMS1, GHWPARAMS1_8_6, 6, 3)
163     FIELD(GHWPARAMS1, GHWPARAMS1_5_3, 3, 3)
164     FIELD(GHWPARAMS1, GHWPARAMS1_2_0, 0, 3)
165 REG32(GHWPARAMS2, 0x48)
166 REG32(GHWPARAMS3, 0x4c)
167     FIELD(GHWPARAMS3, GHWPARAMS3_31, 31, 1)
168     FIELD(GHWPARAMS3, GHWPARAMS3_30_23, 23, 8)
169     FIELD(GHWPARAMS3, GHWPARAMS3_22_18, 18, 5)
170     FIELD(GHWPARAMS3, GHWPARAMS3_17_12, 12, 6)
171     FIELD(GHWPARAMS3, GHWPARAMS3_11, 11, 1)
172     FIELD(GHWPARAMS3, GHWPARAMS3_10, 10, 1)
173     FIELD(GHWPARAMS3, GHWPARAMS3_9_8, 8, 2)
174     FIELD(GHWPARAMS3, GHWPARAMS3_7_6, 6, 2)
175     FIELD(GHWPARAMS3, GHWPARAMS3_5_4, 4, 2)
176     FIELD(GHWPARAMS3, GHWPARAMS3_3_2, 2, 2)
177     FIELD(GHWPARAMS3, GHWPARAMS3_1_0, 0, 2)
178 REG32(GHWPARAMS4, 0x50)
179     FIELD(GHWPARAMS4, GHWPARAMS4_31_28, 28, 4)
180     FIELD(GHWPARAMS4, GHWPARAMS4_27_24, 24, 4)
181     FIELD(GHWPARAMS4, GHWPARAMS4_23, 23, 1)
182     FIELD(GHWPARAMS4, GHWPARAMS4_22, 22, 1)
183     FIELD(GHWPARAMS4, GHWPARAMS4_21, 21, 1)
184     FIELD(GHWPARAMS4, GHWPARAMS4_20_17, 17, 4)
185     FIELD(GHWPARAMS4, GHWPARAMS4_16_13, 13, 4)
186     FIELD(GHWPARAMS4, GHWPARAMS4_12, 12, 1)
187     FIELD(GHWPARAMS4, GHWPARAMS4_11, 11, 1)
188     FIELD(GHWPARAMS4, GHWPARAMS4_10_9, 9, 2)
189     FIELD(GHWPARAMS4, GHWPARAMS4_8_7, 7, 2)
190     FIELD(GHWPARAMS4, GHWPARAMS4_6, 6, 1)
191     FIELD(GHWPARAMS4, GHWPARAMS4_5_0, 0, 6)
192 REG32(GHWPARAMS5, 0x54)
193     FIELD(GHWPARAMS5, GHWPARAMS5_31_28, 28, 4)
194     FIELD(GHWPARAMS5, GHWPARAMS5_27_22, 22, 6)
195     FIELD(GHWPARAMS5, GHWPARAMS5_21_16, 16, 6)
196     FIELD(GHWPARAMS5, GHWPARAMS5_15_10, 10, 6)
197     FIELD(GHWPARAMS5, GHWPARAMS5_9_4, 4, 6)
198     FIELD(GHWPARAMS5, GHWPARAMS5_3_0, 0, 4)
199 REG32(GHWPARAMS6, 0x58)
200     FIELD(GHWPARAMS6, GHWPARAMS6_31_16, 16, 16)
201     FIELD(GHWPARAMS6, BUSFLTRSSUPPORT, 15, 1)
202     FIELD(GHWPARAMS6, BCSUPPORT, 14, 1)
203     FIELD(GHWPARAMS6, OTG_SS_SUPPORT, 13, 1)
204     FIELD(GHWPARAMS6, ADPSUPPORT, 12, 1)
205     FIELD(GHWPARAMS6, HNPSUPPORT, 11, 1)
206     FIELD(GHWPARAMS6, SRPSUPPORT, 10, 1)
207     FIELD(GHWPARAMS6, GHWPARAMS6_9_8, 8, 2)
208     FIELD(GHWPARAMS6, GHWPARAMS6_7, 7, 1)
209     FIELD(GHWPARAMS6, GHWPARAMS6_6, 6, 1)
210     FIELD(GHWPARAMS6, GHWPARAMS6_5_0, 0, 6)
211 REG32(GHWPARAMS7, 0x5c)
212     FIELD(GHWPARAMS7, GHWPARAMS7_31_16, 16, 16)
213     FIELD(GHWPARAMS7, GHWPARAMS7_15_0, 0, 16)
214 REG32(GDBGFIFOSPACE, 0x60)
215     FIELD(GDBGFIFOSPACE, SPACE_AVAILABLE, 16, 16)
216     FIELD(GDBGFIFOSPACE, RESERVED_15_9, 9, 7)
217     FIELD(GDBGFIFOSPACE, FIFO_QUEUE_SELECT, 0, 9)
218 REG32(GUCTL2, 0x9c)
219     FIELD(GUCTL2, RESERVED_31_26, 26, 6)
220     FIELD(GUCTL2, EN_HP_PM_TIMER, 19, 7)
221     FIELD(GUCTL2, NOLOWPWRDUR, 15, 4)
222     FIELD(GUCTL2, RST_ACTBITLATER, 14, 1)
223     FIELD(GUCTL2, RESERVED_13, 13, 1)
224     FIELD(GUCTL2, DISABLECFC, 11, 1)
225 REG32(GUSB2PHYCFG, 0x100)
226     FIELD(GUSB2PHYCFG, U2_FREECLK_EXISTS, 30, 1)
227     FIELD(GUSB2PHYCFG, ULPI_LPM_WITH_OPMODE_CHK, 29, 1)
228     FIELD(GUSB2PHYCFG, RESERVED_25, 25, 1)
229     FIELD(GUSB2PHYCFG, LSTRD, 22, 3)
230     FIELD(GUSB2PHYCFG, LSIPD, 19, 3)
231     FIELD(GUSB2PHYCFG, ULPIEXTVBUSINDIACTOR, 18, 1)
232     FIELD(GUSB2PHYCFG, ULPIEXTVBUSDRV, 17, 1)
233     FIELD(GUSB2PHYCFG, RESERVED_16, 16, 1)
234     FIELD(GUSB2PHYCFG, ULPIAUTORES, 15, 1)
235     FIELD(GUSB2PHYCFG, RESERVED_14, 14, 1)
236     FIELD(GUSB2PHYCFG, USBTRDTIM, 10, 4)
237     FIELD(GUSB2PHYCFG, XCVRDLY, 9, 1)
238     FIELD(GUSB2PHYCFG, ENBLSLPM, 8, 1)
239     FIELD(GUSB2PHYCFG, PHYSEL, 7, 1)
240     FIELD(GUSB2PHYCFG, SUSPENDUSB20, 6, 1)
241     FIELD(GUSB2PHYCFG, FSINTF, 5, 1)
242     FIELD(GUSB2PHYCFG, ULPI_UTMI_SEL, 4, 1)
243     FIELD(GUSB2PHYCFG, PHYIF, 3, 1)
244     FIELD(GUSB2PHYCFG, TOUTCAL, 0, 3)
245 REG32(GUSB2I2CCTL, 0x140)
246 REG32(GUSB2PHYACC_ULPI, 0x180)
247     FIELD(GUSB2PHYACC_ULPI, RESERVED_31_27, 27, 5)
248     FIELD(GUSB2PHYACC_ULPI, DISUIPIDRVR, 26, 1)
249     FIELD(GUSB2PHYACC_ULPI, NEWREGREQ, 25, 1)
250     FIELD(GUSB2PHYACC_ULPI, VSTSDONE, 24, 1)
251     FIELD(GUSB2PHYACC_ULPI, VSTSBSY, 23, 1)
252     FIELD(GUSB2PHYACC_ULPI, REGWR, 22, 1)
253     FIELD(GUSB2PHYACC_ULPI, REGADDR, 16, 6)
254     FIELD(GUSB2PHYACC_ULPI, EXTREGADDR, 8, 8)
255     FIELD(GUSB2PHYACC_ULPI, REGDATA, 0, 8)
256 REG32(GTXFIFOSIZ0, 0x200)
257     FIELD(GTXFIFOSIZ0, TXFSTADDR_N, 16, 16)
258     FIELD(GTXFIFOSIZ0, TXFDEP_N, 0, 16)
259 REG32(GTXFIFOSIZ1, 0x204)
260     FIELD(GTXFIFOSIZ1, TXFSTADDR_N, 16, 16)
261     FIELD(GTXFIFOSIZ1, TXFDEP_N, 0, 16)
262 REG32(GTXFIFOSIZ2, 0x208)
263     FIELD(GTXFIFOSIZ2, TXFSTADDR_N, 16, 16)
264     FIELD(GTXFIFOSIZ2, TXFDEP_N, 0, 16)
265 REG32(GTXFIFOSIZ3, 0x20c)
266     FIELD(GTXFIFOSIZ3, TXFSTADDR_N, 16, 16)
267     FIELD(GTXFIFOSIZ3, TXFDEP_N, 0, 16)
268 REG32(GTXFIFOSIZ4, 0x210)
269     FIELD(GTXFIFOSIZ4, TXFSTADDR_N, 16, 16)
270     FIELD(GTXFIFOSIZ4, TXFDEP_N, 0, 16)
271 REG32(GTXFIFOSIZ5, 0x214)
272     FIELD(GTXFIFOSIZ5, TXFSTADDR_N, 16, 16)
273     FIELD(GTXFIFOSIZ5, TXFDEP_N, 0, 16)
274 REG32(GRXFIFOSIZ0, 0x280)
275     FIELD(GRXFIFOSIZ0, RXFSTADDR_N, 16, 16)
276     FIELD(GRXFIFOSIZ0, RXFDEP_N, 0, 16)
277 REG32(GRXFIFOSIZ1, 0x284)
278     FIELD(GRXFIFOSIZ1, RXFSTADDR_N, 16, 16)
279     FIELD(GRXFIFOSIZ1, RXFDEP_N, 0, 16)
280 REG32(GRXFIFOSIZ2, 0x288)
281     FIELD(GRXFIFOSIZ2, RXFSTADDR_N, 16, 16)
282     FIELD(GRXFIFOSIZ2, RXFDEP_N, 0, 16)
283 REG32(GEVNTADRLO_0, 0x300)
284 REG32(GEVNTADRHI_0, 0x304)
285 REG32(GEVNTSIZ_0, 0x308)
286     FIELD(GEVNTSIZ_0, EVNTINTRPTMASK, 31, 1)
287     FIELD(GEVNTSIZ_0, RESERVED_30_16, 16, 15)
288     FIELD(GEVNTSIZ_0, EVENTSIZ, 0, 16)
289 REG32(GEVNTCOUNT_0, 0x30c)
290     FIELD(GEVNTCOUNT_0, EVNT_HANDLER_BUSY, 31, 1)
291     FIELD(GEVNTCOUNT_0, RESERVED_30_16, 16, 15)
292     FIELD(GEVNTCOUNT_0, EVNTCOUNT, 0, 16)
293 REG32(GEVNTADRLO_1, 0x310)
294 REG32(GEVNTADRHI_1, 0x314)
295 REG32(GEVNTSIZ_1, 0x318)
296     FIELD(GEVNTSIZ_1, EVNTINTRPTMASK, 31, 1)
297     FIELD(GEVNTSIZ_1, RESERVED_30_16, 16, 15)
298     FIELD(GEVNTSIZ_1, EVENTSIZ, 0, 16)
299 REG32(GEVNTCOUNT_1, 0x31c)
300     FIELD(GEVNTCOUNT_1, EVNT_HANDLER_BUSY, 31, 1)
301     FIELD(GEVNTCOUNT_1, RESERVED_30_16, 16, 15)
302     FIELD(GEVNTCOUNT_1, EVNTCOUNT, 0, 16)
303 REG32(GEVNTADRLO_2, 0x320)
304 REG32(GEVNTADRHI_2, 0x324)
305 REG32(GEVNTSIZ_2, 0x328)
306     FIELD(GEVNTSIZ_2, EVNTINTRPTMASK, 31, 1)
307     FIELD(GEVNTSIZ_2, RESERVED_30_16, 16, 15)
308     FIELD(GEVNTSIZ_2, EVENTSIZ, 0, 16)
309 REG32(GEVNTCOUNT_2, 0x32c)
310     FIELD(GEVNTCOUNT_2, EVNT_HANDLER_BUSY, 31, 1)
311     FIELD(GEVNTCOUNT_2, RESERVED_30_16, 16, 15)
312     FIELD(GEVNTCOUNT_2, EVNTCOUNT, 0, 16)
313 REG32(GEVNTADRLO_3, 0x330)
314 REG32(GEVNTADRHI_3, 0x334)
315 REG32(GEVNTSIZ_3, 0x338)
316     FIELD(GEVNTSIZ_3, EVNTINTRPTMASK, 31, 1)
317     FIELD(GEVNTSIZ_3, RESERVED_30_16, 16, 15)
318     FIELD(GEVNTSIZ_3, EVENTSIZ, 0, 16)
319 REG32(GEVNTCOUNT_3, 0x33c)
320     FIELD(GEVNTCOUNT_3, EVNT_HANDLER_BUSY, 31, 1)
321     FIELD(GEVNTCOUNT_3, RESERVED_30_16, 16, 15)
322     FIELD(GEVNTCOUNT_3, EVNTCOUNT, 0, 16)
323 REG32(GHWPARAMS8, 0x500)
324 REG32(GTXFIFOPRIDEV, 0x510)
325     FIELD(GTXFIFOPRIDEV, RESERVED_31_N, 6, 26)
326     FIELD(GTXFIFOPRIDEV, GTXFIFOPRIDEV, 0, 6)
327 REG32(GTXFIFOPRIHST, 0x518)
328     FIELD(GTXFIFOPRIHST, RESERVED_31_16, 3, 29)
329     FIELD(GTXFIFOPRIHST, GTXFIFOPRIHST, 0, 3)
330 REG32(GRXFIFOPRIHST, 0x51c)
331     FIELD(GRXFIFOPRIHST, RESERVED_31_16, 3, 29)
332     FIELD(GRXFIFOPRIHST, GRXFIFOPRIHST, 0, 3)
333 REG32(GDMAHLRATIO, 0x524)
334     FIELD(GDMAHLRATIO, RESERVED_31_13, 13, 19)
335     FIELD(GDMAHLRATIO, HSTRXFIFO, 8, 5)
336     FIELD(GDMAHLRATIO, RESERVED_7_5, 5, 3)
337     FIELD(GDMAHLRATIO, HSTTXFIFO, 0, 5)
338 REG32(GFLADJ, 0x530)
339     FIELD(GFLADJ, GFLADJ_REFCLK_240MHZDECR_PLS1, 31, 1)
340     FIELD(GFLADJ, GFLADJ_REFCLK_240MHZ_DECR, 24, 7)
341     FIELD(GFLADJ, GFLADJ_REFCLK_LPM_SEL, 23, 1)
342     FIELD(GFLADJ, RESERVED_22, 22, 1)
343     FIELD(GFLADJ, GFLADJ_REFCLK_FLADJ, 8, 14)
344     FIELD(GFLADJ, GFLADJ_30MHZ_SDBND_SEL, 7, 1)
345     FIELD(GFLADJ, GFLADJ_30MHZ, 0, 6)
346 
347 #define DWC3_GLOBAL_OFFSET 0xC100
348 static void reset_csr(USBDWC3 * s)
349 {
350     int i = 0;
351     /*
352      * We reset all CSR regs except GCTL, GUCTL, GSTS, GSNPSID, GGPIO, GUID,
353      * GUSB2PHYCFGn registers and GUSB3PIPECTLn registers. We will skip PHY
354      * register as we don't implement them.
355      */
356     for (i = 0; i < USB_DWC3_R_MAX; i++) {
357         switch (i) {
358         case R_GCTL:
359             break;
360         case R_GSTS:
361             break;
362         case R_GSNPSID:
363             break;
364         case R_GGPIO:
365             break;
366         case R_GUID:
367             break;
368         case R_GUCTL:
369             break;
370         case R_GHWPARAMS0...R_GHWPARAMS7:
371             break;
372         case R_GHWPARAMS8:
373             break;
374         default:
375             register_reset(&s->regs_info[i]);
376             break;
377         }
378     }
379 
380     xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
381 }
382 
383 static void usb_dwc3_gctl_postw(RegisterInfo *reg, uint64_t val64)
384 {
385     USBDWC3 *s = USB_DWC3(reg->opaque);
386 
387     if (ARRAY_FIELD_EX32(s->regs, GCTL, CORESOFTRESET)) {
388         reset_csr(s);
389     }
390 }
391 
392 static void usb_dwc3_guid_postw(RegisterInfo *reg, uint64_t val64)
393 {
394     USBDWC3 *s = USB_DWC3(reg->opaque);
395 
396     s->regs[R_GUID] = s->cfg.dwc_usb3_user;
397 }
398 
399 static const RegisterAccessInfo usb_dwc3_regs_info[] = {
400     {   .name = "GSBUSCFG0",  .addr = A_GSBUSCFG0,
401         .ro = 0xf300,
402         .unimp = 0xffffffff,
403     },{ .name = "GSBUSCFG1",  .addr = A_GSBUSCFG1,
404         .reset = 0x300,
405         .ro = 0xffffe0ff,
406         .unimp = 0xffffffff,
407     },{ .name = "GTXTHRCFG",  .addr = A_GTXTHRCFG,
408         .ro = 0xd000ffff,
409         .unimp = 0xffffffff,
410     },{ .name = "GRXTHRCFG",  .addr = A_GRXTHRCFG,
411         .ro = 0xd007e000,
412         .unimp = 0xffffffff,
413     },{ .name = "GCTL",  .addr = A_GCTL,
414         .reset = 0x30c13004, .post_write = usb_dwc3_gctl_postw,
415     },{ .name = "GPMSTS",  .addr = A_GPMSTS,
416         .ro = 0xfffffff,
417         .unimp = 0xffffffff,
418     },{ .name = "GSTS",  .addr = A_GSTS,
419         .reset = 0x7e800000,
420         .ro = 0xffffffcf,
421         .w1c = 0x30,
422         .unimp = 0xffffffff,
423     },{ .name = "GUCTL1",  .addr = A_GUCTL1,
424         .reset = 0x198a,
425         .ro = 0x7800,
426         .unimp = 0xffffffff,
427     },{ .name = "GSNPSID",  .addr = A_GSNPSID,
428         .reset = 0x5533330a,
429         .ro = 0xffffffff,
430     },{ .name = "GGPIO",  .addr = A_GGPIO,
431         .ro = 0xffff,
432         .unimp = 0xffffffff,
433     },{ .name = "GUID",  .addr = A_GUID,
434         .reset = 0x12345678, .post_write = usb_dwc3_guid_postw,
435     },{ .name = "GUCTL",  .addr = A_GUCTL,
436         .reset = 0x0c808010,
437         .ro = 0x1c8000,
438         .unimp = 0xffffffff,
439     },{ .name = "GBUSERRADDRLO",  .addr = A_GBUSERRADDRLO,
440         .ro = 0xffffffff,
441     },{ .name = "GBUSERRADDRHI",  .addr = A_GBUSERRADDRHI,
442         .ro = 0xffffffff,
443     },{ .name = "GHWPARAMS0",  .addr = A_GHWPARAMS0,
444         .ro = 0xffffffff,
445     },{ .name = "GHWPARAMS1",  .addr = A_GHWPARAMS1,
446         .ro = 0xffffffff,
447     },{ .name = "GHWPARAMS2",  .addr = A_GHWPARAMS2,
448         .ro = 0xffffffff,
449     },{ .name = "GHWPARAMS3",  .addr = A_GHWPARAMS3,
450         .ro = 0xffffffff,
451     },{ .name = "GHWPARAMS4",  .addr = A_GHWPARAMS4,
452         .ro = 0xffffffff,
453     },{ .name = "GHWPARAMS5",  .addr = A_GHWPARAMS5,
454         .ro = 0xffffffff,
455     },{ .name = "GHWPARAMS6",  .addr = A_GHWPARAMS6,
456         .ro = 0xffffffff,
457     },{ .name = "GHWPARAMS7",  .addr = A_GHWPARAMS7,
458         .ro = 0xffffffff,
459     },{ .name = "GDBGFIFOSPACE",  .addr = A_GDBGFIFOSPACE,
460         .reset = 0xa0000,
461         .ro = 0xfffffe00,
462         .unimp = 0xffffffff,
463     },{ .name = "GUCTL2",  .addr = A_GUCTL2,
464         .reset = 0x40d,
465         .ro = 0x2000,
466         .unimp = 0xffffffff,
467     },{ .name = "GUSB2PHYCFG",  .addr = A_GUSB2PHYCFG,
468         .reset = 0x40102410,
469         .ro = 0x1e014030,
470         .unimp = 0xffffffff,
471     },{ .name = "GUSB2I2CCTL",  .addr = A_GUSB2I2CCTL,
472         .ro = 0xffffffff,
473         .unimp = 0xffffffff,
474     },{ .name = "GUSB2PHYACC_ULPI",  .addr = A_GUSB2PHYACC_ULPI,
475         .ro = 0xfd000000,
476         .unimp = 0xffffffff,
477     },{ .name = "GTXFIFOSIZ0",  .addr = A_GTXFIFOSIZ0,
478         .reset = 0x2c7000a,
479         .unimp = 0xffffffff,
480     },{ .name = "GTXFIFOSIZ1",  .addr = A_GTXFIFOSIZ1,
481         .reset = 0x2d10103,
482         .unimp = 0xffffffff,
483     },{ .name = "GTXFIFOSIZ2",  .addr = A_GTXFIFOSIZ2,
484         .reset = 0x3d40103,
485         .unimp = 0xffffffff,
486     },{ .name = "GTXFIFOSIZ3",  .addr = A_GTXFIFOSIZ3,
487         .reset = 0x4d70083,
488         .unimp = 0xffffffff,
489     },{ .name = "GTXFIFOSIZ4",  .addr = A_GTXFIFOSIZ4,
490         .reset = 0x55a0083,
491         .unimp = 0xffffffff,
492     },{ .name = "GTXFIFOSIZ5",  .addr = A_GTXFIFOSIZ5,
493         .reset = 0x5dd0083,
494         .unimp = 0xffffffff,
495     },{ .name = "GRXFIFOSIZ0",  .addr = A_GRXFIFOSIZ0,
496         .reset = 0x1c20105,
497         .unimp = 0xffffffff,
498     },{ .name = "GRXFIFOSIZ1",  .addr = A_GRXFIFOSIZ1,
499         .reset = 0x2c70000,
500         .unimp = 0xffffffff,
501     },{ .name = "GRXFIFOSIZ2",  .addr = A_GRXFIFOSIZ2,
502         .reset = 0x2c70000,
503         .unimp = 0xffffffff,
504     },{ .name = "GEVNTADRLO_0",  .addr = A_GEVNTADRLO_0,
505         .unimp = 0xffffffff,
506     },{ .name = "GEVNTADRHI_0",  .addr = A_GEVNTADRHI_0,
507         .unimp = 0xffffffff,
508     },{ .name = "GEVNTSIZ_0",  .addr = A_GEVNTSIZ_0,
509         .ro = 0x7fff0000,
510         .unimp = 0xffffffff,
511     },{ .name = "GEVNTCOUNT_0",  .addr = A_GEVNTCOUNT_0,
512         .ro = 0x7fff0000,
513         .unimp = 0xffffffff,
514     },{ .name = "GEVNTADRLO_1",  .addr = A_GEVNTADRLO_1,
515         .unimp = 0xffffffff,
516     },{ .name = "GEVNTADRHI_1",  .addr = A_GEVNTADRHI_1,
517         .unimp = 0xffffffff,
518     },{ .name = "GEVNTSIZ_1",  .addr = A_GEVNTSIZ_1,
519         .ro = 0x7fff0000,
520         .unimp = 0xffffffff,
521     },{ .name = "GEVNTCOUNT_1",  .addr = A_GEVNTCOUNT_1,
522         .ro = 0x7fff0000,
523         .unimp = 0xffffffff,
524     },{ .name = "GEVNTADRLO_2",  .addr = A_GEVNTADRLO_2,
525         .unimp = 0xffffffff,
526     },{ .name = "GEVNTADRHI_2",  .addr = A_GEVNTADRHI_2,
527         .unimp = 0xffffffff,
528     },{ .name = "GEVNTSIZ_2",  .addr = A_GEVNTSIZ_2,
529         .ro = 0x7fff0000,
530         .unimp = 0xffffffff,
531     },{ .name = "GEVNTCOUNT_2",  .addr = A_GEVNTCOUNT_2,
532         .ro = 0x7fff0000,
533         .unimp = 0xffffffff,
534     },{ .name = "GEVNTADRLO_3",  .addr = A_GEVNTADRLO_3,
535         .unimp = 0xffffffff,
536     },{ .name = "GEVNTADRHI_3",  .addr = A_GEVNTADRHI_3,
537         .unimp = 0xffffffff,
538     },{ .name = "GEVNTSIZ_3",  .addr = A_GEVNTSIZ_3,
539         .ro = 0x7fff0000,
540         .unimp = 0xffffffff,
541     },{ .name = "GEVNTCOUNT_3",  .addr = A_GEVNTCOUNT_3,
542         .ro = 0x7fff0000,
543         .unimp = 0xffffffff,
544     },{ .name = "GHWPARAMS8",  .addr = A_GHWPARAMS8,
545         .ro = 0xffffffff,
546     },{ .name = "GTXFIFOPRIDEV",  .addr = A_GTXFIFOPRIDEV,
547         .ro = 0xffffffc0,
548         .unimp = 0xffffffff,
549     },{ .name = "GTXFIFOPRIHST",  .addr = A_GTXFIFOPRIHST,
550         .ro = 0xfffffff8,
551         .unimp = 0xffffffff,
552     },{ .name = "GRXFIFOPRIHST",  .addr = A_GRXFIFOPRIHST,
553         .ro = 0xfffffff8,
554         .unimp = 0xffffffff,
555     },{ .name = "GDMAHLRATIO",  .addr = A_GDMAHLRATIO,
556         .ro = 0xffffe0e0,
557         .unimp = 0xffffffff,
558     },{ .name = "GFLADJ",  .addr = A_GFLADJ,
559         .reset = 0xc83f020,
560         .rsvd = 0x40,
561         .ro = 0x400040,
562         .unimp = 0xffffffff,
563     }
564 };
565 
566 static void usb_dwc3_reset(DeviceState *dev)
567 {
568     USBDWC3 *s = USB_DWC3(dev);
569     unsigned int i;
570 
571     for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
572         switch (i) {
573         case R_GHWPARAMS0...R_GHWPARAMS7:
574             break;
575         case R_GHWPARAMS8:
576             break;
577         default:
578             register_reset(&s->regs_info[i]);
579         };
580     }
581 
582     xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
583 }
584 
585 static const MemoryRegionOps usb_dwc3_ops = {
586     .read = register_read_memory,
587     .write = register_write_memory,
588     .endianness = DEVICE_LITTLE_ENDIAN,
589     .valid = {
590         .min_access_size = 4,
591         .max_access_size = 4,
592     },
593 };
594 
595 static void usb_dwc3_realize(DeviceState *dev, Error **errp)
596 {
597     USBDWC3 *s = USB_DWC3(dev);
598     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
599     Error *err = NULL;
600 
601     sysbus_realize(SYS_BUS_DEVICE(&s->sysbus_xhci), &err);
602     if (err) {
603         error_propagate(errp, err);
604         return;
605     }
606 
607     memory_region_add_subregion(&s->iomem, 0,
608          sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->sysbus_xhci), 0));
609     sysbus_init_mmio(sbd, &s->iomem);
610 
611     /*
612      * Device Configuration
613      */
614     s->regs[R_GHWPARAMS0] = 0x40204048 | s->cfg.mode;
615     s->regs[R_GHWPARAMS1] = 0x222493b;
616     s->regs[R_GHWPARAMS2] = 0x12345678;
617     s->regs[R_GHWPARAMS3] = 0x618c088;
618     s->regs[R_GHWPARAMS4] = 0x47822004;
619     s->regs[R_GHWPARAMS5] = 0x4202088;
620     s->regs[R_GHWPARAMS6] = 0x7850c20;
621     s->regs[R_GHWPARAMS7] = 0x0;
622     s->regs[R_GHWPARAMS8] = 0x478;
623 }
624 
625 static void usb_dwc3_init(Object *obj)
626 {
627     USBDWC3 *s = USB_DWC3(obj);
628     RegisterInfoArray *reg_array;
629 
630     memory_region_init(&s->iomem, obj, TYPE_USB_DWC3, DWC3_SIZE);
631     reg_array =
632         register_init_block32(DEVICE(obj), usb_dwc3_regs_info,
633                               ARRAY_SIZE(usb_dwc3_regs_info),
634                               s->regs_info, s->regs,
635                               &usb_dwc3_ops,
636                               USB_DWC3_ERR_DEBUG,
637                               USB_DWC3_R_MAX * 4);
638     memory_region_add_subregion(&s->iomem,
639                                 DWC3_GLOBAL_OFFSET,
640                                 &reg_array->mem);
641     object_initialize_child(obj, "dwc3-xhci", &s->sysbus_xhci,
642                             TYPE_XHCI_SYSBUS);
643     qdev_alias_all_properties(DEVICE(&s->sysbus_xhci), obj);
644 
645     s->cfg.mode = HOST_MODE;
646 }
647 
648 static const VMStateDescription vmstate_usb_dwc3 = {
649     .name = "usb-dwc3",
650     .version_id = 1,
651     .fields = (VMStateField[]) {
652         VMSTATE_UINT32_ARRAY(regs, USBDWC3, USB_DWC3_R_MAX),
653         VMSTATE_UINT8(cfg.mode, USBDWC3),
654         VMSTATE_UINT32(cfg.dwc_usb3_user, USBDWC3),
655         VMSTATE_END_OF_LIST()
656     }
657 };
658 
659 static Property usb_dwc3_properties[] = {
660     DEFINE_PROP_UINT32("DWC_USB3_USERID", USBDWC3, cfg.dwc_usb3_user,
661                        0x12345678),
662     DEFINE_PROP_END_OF_LIST(),
663 };
664 
665 static void usb_dwc3_class_init(ObjectClass *klass, void *data)
666 {
667     DeviceClass *dc = DEVICE_CLASS(klass);
668 
669     dc->reset = usb_dwc3_reset;
670     dc->realize = usb_dwc3_realize;
671     dc->vmsd = &vmstate_usb_dwc3;
672     device_class_set_props(dc, usb_dwc3_properties);
673 }
674 
675 static const TypeInfo usb_dwc3_info = {
676     .name          = TYPE_USB_DWC3,
677     .parent        = TYPE_SYS_BUS_DEVICE,
678     .instance_size = sizeof(USBDWC3),
679     .class_init    = usb_dwc3_class_init,
680     .instance_init = usb_dwc3_init,
681 };
682 
683 static void usb_dwc3_register_types(void)
684 {
685     type_register_static(&usb_dwc3_info);
686 }
687 
688 type_init(usb_dwc3_register_types)
689