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