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 REG32(GUSB2RHBCTL, 0x540)
347 FIELD(GUSB2RHBCTL, OVRD_L1TIMEOUT, 0, 4)
348
349 #define DWC3_GLOBAL_OFFSET 0xC100
reset_csr(USBDWC3 * s)350 static void reset_csr(USBDWC3 * s)
351 {
352 int i = 0;
353 /*
354 * We reset all CSR regs except GCTL, GUCTL, GSTS, GSNPSID, GGPIO, GUID,
355 * GUSB2PHYCFGn registers and GUSB3PIPECTLn registers. We will skip PHY
356 * register as we don't implement them.
357 */
358 for (i = 0; i < USB_DWC3_R_MAX; i++) {
359 switch (i) {
360 case R_GCTL:
361 break;
362 case R_GSTS:
363 break;
364 case R_GSNPSID:
365 break;
366 case R_GGPIO:
367 break;
368 case R_GUID:
369 break;
370 case R_GUCTL:
371 break;
372 case R_GHWPARAMS0...R_GHWPARAMS7:
373 break;
374 case R_GHWPARAMS8:
375 break;
376 default:
377 register_reset(&s->regs_info[i]);
378 break;
379 }
380 }
381
382 xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
383 }
384
usb_dwc3_gctl_postw(RegisterInfo * reg,uint64_t val64)385 static void usb_dwc3_gctl_postw(RegisterInfo *reg, uint64_t val64)
386 {
387 USBDWC3 *s = USB_DWC3(reg->opaque);
388
389 if (ARRAY_FIELD_EX32(s->regs, GCTL, CORESOFTRESET)) {
390 reset_csr(s);
391 }
392 }
393
usb_dwc3_guid_postw(RegisterInfo * reg,uint64_t val64)394 static void usb_dwc3_guid_postw(RegisterInfo *reg, uint64_t val64)
395 {
396 USBDWC3 *s = USB_DWC3(reg->opaque);
397
398 s->regs[R_GUID] = s->cfg.dwc_usb3_user;
399 }
400
401 static const RegisterAccessInfo usb_dwc3_regs_info[] = {
402 { .name = "GSBUSCFG0", .addr = A_GSBUSCFG0,
403 .ro = 0xf300,
404 .unimp = 0xffffffff,
405 },{ .name = "GSBUSCFG1", .addr = A_GSBUSCFG1,
406 .reset = 0x300,
407 .ro = 0xffffe0ff,
408 .unimp = 0xffffffff,
409 },{ .name = "GTXTHRCFG", .addr = A_GTXTHRCFG,
410 .ro = 0xd000ffff,
411 .unimp = 0xffffffff,
412 },{ .name = "GRXTHRCFG", .addr = A_GRXTHRCFG,
413 .ro = 0xd007e000,
414 .unimp = 0xffffffff,
415 },{ .name = "GCTL", .addr = A_GCTL,
416 .reset = 0x30c13004, .post_write = usb_dwc3_gctl_postw,
417 },{ .name = "GPMSTS", .addr = A_GPMSTS,
418 .ro = 0xfffffff,
419 .unimp = 0xffffffff,
420 },{ .name = "GSTS", .addr = A_GSTS,
421 .reset = 0x7e800000,
422 .ro = 0xffffffcf,
423 .w1c = 0x30,
424 .unimp = 0xffffffff,
425 },{ .name = "GUCTL1", .addr = A_GUCTL1,
426 .reset = 0x198a,
427 .ro = 0x7800,
428 .unimp = 0xffffffff,
429 },{ .name = "GSNPSID", .addr = A_GSNPSID,
430 .reset = 0x5533330a,
431 .ro = 0xffffffff,
432 },{ .name = "GGPIO", .addr = A_GGPIO,
433 .ro = 0xffff,
434 .unimp = 0xffffffff,
435 },{ .name = "GUID", .addr = A_GUID,
436 .reset = 0x12345678, .post_write = usb_dwc3_guid_postw,
437 },{ .name = "GUCTL", .addr = A_GUCTL,
438 .reset = 0x0c808010,
439 .ro = 0x1c8000,
440 .unimp = 0xffffffff,
441 },{ .name = "GBUSERRADDRLO", .addr = A_GBUSERRADDRLO,
442 .ro = 0xffffffff,
443 },{ .name = "GBUSERRADDRHI", .addr = A_GBUSERRADDRHI,
444 .ro = 0xffffffff,
445 },{ .name = "GHWPARAMS0", .addr = A_GHWPARAMS0,
446 .ro = 0xffffffff,
447 },{ .name = "GHWPARAMS1", .addr = A_GHWPARAMS1,
448 .ro = 0xffffffff,
449 },{ .name = "GHWPARAMS2", .addr = A_GHWPARAMS2,
450 .ro = 0xffffffff,
451 },{ .name = "GHWPARAMS3", .addr = A_GHWPARAMS3,
452 .ro = 0xffffffff,
453 },{ .name = "GHWPARAMS4", .addr = A_GHWPARAMS4,
454 .ro = 0xffffffff,
455 },{ .name = "GHWPARAMS5", .addr = A_GHWPARAMS5,
456 .ro = 0xffffffff,
457 },{ .name = "GHWPARAMS6", .addr = A_GHWPARAMS6,
458 .ro = 0xffffffff,
459 },{ .name = "GHWPARAMS7", .addr = A_GHWPARAMS7,
460 .ro = 0xffffffff,
461 },{ .name = "GDBGFIFOSPACE", .addr = A_GDBGFIFOSPACE,
462 .reset = 0xa0000,
463 .ro = 0xfffffe00,
464 .unimp = 0xffffffff,
465 },{ .name = "GUCTL2", .addr = A_GUCTL2,
466 .reset = 0x40d,
467 .ro = 0x2000,
468 .unimp = 0xffffffff,
469 },{ .name = "GUSB2PHYCFG", .addr = A_GUSB2PHYCFG,
470 .reset = 0x40102410,
471 .ro = 0x1e014030,
472 .unimp = 0xffffffff,
473 },{ .name = "GUSB2I2CCTL", .addr = A_GUSB2I2CCTL,
474 .ro = 0xffffffff,
475 .unimp = 0xffffffff,
476 },{ .name = "GUSB2PHYACC_ULPI", .addr = A_GUSB2PHYACC_ULPI,
477 .ro = 0xfd000000,
478 .unimp = 0xffffffff,
479 },{ .name = "GTXFIFOSIZ0", .addr = A_GTXFIFOSIZ0,
480 .reset = 0x2c7000a,
481 .unimp = 0xffffffff,
482 },{ .name = "GTXFIFOSIZ1", .addr = A_GTXFIFOSIZ1,
483 .reset = 0x2d10103,
484 .unimp = 0xffffffff,
485 },{ .name = "GTXFIFOSIZ2", .addr = A_GTXFIFOSIZ2,
486 .reset = 0x3d40103,
487 .unimp = 0xffffffff,
488 },{ .name = "GTXFIFOSIZ3", .addr = A_GTXFIFOSIZ3,
489 .reset = 0x4d70083,
490 .unimp = 0xffffffff,
491 },{ .name = "GTXFIFOSIZ4", .addr = A_GTXFIFOSIZ4,
492 .reset = 0x55a0083,
493 .unimp = 0xffffffff,
494 },{ .name = "GTXFIFOSIZ5", .addr = A_GTXFIFOSIZ5,
495 .reset = 0x5dd0083,
496 .unimp = 0xffffffff,
497 },{ .name = "GRXFIFOSIZ0", .addr = A_GRXFIFOSIZ0,
498 .reset = 0x1c20105,
499 .unimp = 0xffffffff,
500 },{ .name = "GRXFIFOSIZ1", .addr = A_GRXFIFOSIZ1,
501 .reset = 0x2c70000,
502 .unimp = 0xffffffff,
503 },{ .name = "GRXFIFOSIZ2", .addr = A_GRXFIFOSIZ2,
504 .reset = 0x2c70000,
505 .unimp = 0xffffffff,
506 },{ .name = "GEVNTADRLO_0", .addr = A_GEVNTADRLO_0,
507 .unimp = 0xffffffff,
508 },{ .name = "GEVNTADRHI_0", .addr = A_GEVNTADRHI_0,
509 .unimp = 0xffffffff,
510 },{ .name = "GEVNTSIZ_0", .addr = A_GEVNTSIZ_0,
511 .ro = 0x7fff0000,
512 .unimp = 0xffffffff,
513 },{ .name = "GEVNTCOUNT_0", .addr = A_GEVNTCOUNT_0,
514 .ro = 0x7fff0000,
515 .unimp = 0xffffffff,
516 },{ .name = "GEVNTADRLO_1", .addr = A_GEVNTADRLO_1,
517 .unimp = 0xffffffff,
518 },{ .name = "GEVNTADRHI_1", .addr = A_GEVNTADRHI_1,
519 .unimp = 0xffffffff,
520 },{ .name = "GEVNTSIZ_1", .addr = A_GEVNTSIZ_1,
521 .ro = 0x7fff0000,
522 .unimp = 0xffffffff,
523 },{ .name = "GEVNTCOUNT_1", .addr = A_GEVNTCOUNT_1,
524 .ro = 0x7fff0000,
525 .unimp = 0xffffffff,
526 },{ .name = "GEVNTADRLO_2", .addr = A_GEVNTADRLO_2,
527 .unimp = 0xffffffff,
528 },{ .name = "GEVNTADRHI_2", .addr = A_GEVNTADRHI_2,
529 .unimp = 0xffffffff,
530 },{ .name = "GEVNTSIZ_2", .addr = A_GEVNTSIZ_2,
531 .ro = 0x7fff0000,
532 .unimp = 0xffffffff,
533 },{ .name = "GEVNTCOUNT_2", .addr = A_GEVNTCOUNT_2,
534 .ro = 0x7fff0000,
535 .unimp = 0xffffffff,
536 },{ .name = "GEVNTADRLO_3", .addr = A_GEVNTADRLO_3,
537 .unimp = 0xffffffff,
538 },{ .name = "GEVNTADRHI_3", .addr = A_GEVNTADRHI_3,
539 .unimp = 0xffffffff,
540 },{ .name = "GEVNTSIZ_3", .addr = A_GEVNTSIZ_3,
541 .ro = 0x7fff0000,
542 .unimp = 0xffffffff,
543 },{ .name = "GEVNTCOUNT_3", .addr = A_GEVNTCOUNT_3,
544 .ro = 0x7fff0000,
545 .unimp = 0xffffffff,
546 },{ .name = "GHWPARAMS8", .addr = A_GHWPARAMS8,
547 .ro = 0xffffffff,
548 },{ .name = "GTXFIFOPRIDEV", .addr = A_GTXFIFOPRIDEV,
549 .ro = 0xffffffc0,
550 .unimp = 0xffffffff,
551 },{ .name = "GTXFIFOPRIHST", .addr = A_GTXFIFOPRIHST,
552 .ro = 0xfffffff8,
553 .unimp = 0xffffffff,
554 },{ .name = "GRXFIFOPRIHST", .addr = A_GRXFIFOPRIHST,
555 .ro = 0xfffffff8,
556 .unimp = 0xffffffff,
557 },{ .name = "GDMAHLRATIO", .addr = A_GDMAHLRATIO,
558 .ro = 0xffffe0e0,
559 .unimp = 0xffffffff,
560 },{ .name = "GFLADJ", .addr = A_GFLADJ,
561 .reset = 0xc83f020,
562 .rsvd = 0x40,
563 .ro = 0x400040,
564 .unimp = 0xffffffff,
565 },{ .name = "GUSB2RHBCTL", .addr = A_GUSB2RHBCTL,
566 .rsvd = 0xfffffff0,
567 .unimp = 0xffffffff,
568 }
569 };
570
usb_dwc3_reset(DeviceState * dev)571 static void usb_dwc3_reset(DeviceState *dev)
572 {
573 USBDWC3 *s = USB_DWC3(dev);
574 unsigned int i;
575
576 for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
577 switch (i) {
578 case R_GHWPARAMS0...R_GHWPARAMS7:
579 break;
580 case R_GHWPARAMS8:
581 break;
582 default:
583 register_reset(&s->regs_info[i]);
584 };
585 }
586
587 xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
588 }
589
590 static const MemoryRegionOps usb_dwc3_ops = {
591 .read = register_read_memory,
592 .write = register_write_memory,
593 .endianness = DEVICE_LITTLE_ENDIAN,
594 .valid = {
595 .min_access_size = 4,
596 .max_access_size = 4,
597 },
598 };
599
usb_dwc3_realize(DeviceState * dev,Error ** errp)600 static void usb_dwc3_realize(DeviceState *dev, Error **errp)
601 {
602 USBDWC3 *s = USB_DWC3(dev);
603 SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
604 Error *err = NULL;
605
606 sysbus_realize(SYS_BUS_DEVICE(&s->sysbus_xhci), &err);
607 if (err) {
608 error_propagate(errp, err);
609 return;
610 }
611
612 memory_region_add_subregion(&s->iomem, 0,
613 sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->sysbus_xhci), 0));
614 sysbus_init_mmio(sbd, &s->iomem);
615
616 /*
617 * Device Configuration
618 */
619 s->regs[R_GHWPARAMS0] = 0x40204048 | s->cfg.mode;
620 s->regs[R_GHWPARAMS1] = 0x222493b;
621 s->regs[R_GHWPARAMS2] = 0x12345678;
622 s->regs[R_GHWPARAMS3] = 0x618c088;
623 s->regs[R_GHWPARAMS4] = 0x47822004;
624 s->regs[R_GHWPARAMS5] = 0x4202088;
625 s->regs[R_GHWPARAMS6] = 0x7850c20;
626 s->regs[R_GHWPARAMS7] = 0x0;
627 s->regs[R_GHWPARAMS8] = 0x478;
628 }
629
usb_dwc3_init(Object * obj)630 static void usb_dwc3_init(Object *obj)
631 {
632 USBDWC3 *s = USB_DWC3(obj);
633 RegisterInfoArray *reg_array;
634
635 memory_region_init(&s->iomem, obj, TYPE_USB_DWC3, DWC3_SIZE);
636 reg_array =
637 register_init_block32(DEVICE(obj), usb_dwc3_regs_info,
638 ARRAY_SIZE(usb_dwc3_regs_info),
639 s->regs_info, s->regs,
640 &usb_dwc3_ops,
641 USB_DWC3_ERR_DEBUG,
642 USB_DWC3_R_MAX * 4);
643 memory_region_add_subregion(&s->iomem,
644 DWC3_GLOBAL_OFFSET,
645 ®_array->mem);
646 object_initialize_child(obj, "dwc3-xhci", &s->sysbus_xhci,
647 TYPE_XHCI_SYSBUS);
648 qdev_alias_all_properties(DEVICE(&s->sysbus_xhci), obj);
649
650 s->cfg.mode = HOST_MODE;
651 }
652
653 static const VMStateDescription vmstate_usb_dwc3 = {
654 .name = "usb-dwc3",
655 .version_id = 1,
656 .fields = (const VMStateField[]) {
657 VMSTATE_UINT32_ARRAY(regs, USBDWC3, USB_DWC3_R_MAX),
658 VMSTATE_UINT8(cfg.mode, USBDWC3),
659 VMSTATE_UINT32(cfg.dwc_usb3_user, USBDWC3),
660 VMSTATE_END_OF_LIST()
661 }
662 };
663
664 static const Property usb_dwc3_properties[] = {
665 DEFINE_PROP_UINT32("DWC_USB3_USERID", USBDWC3, cfg.dwc_usb3_user,
666 0x12345678),
667 };
668
usb_dwc3_class_init(ObjectClass * klass,const void * data)669 static void usb_dwc3_class_init(ObjectClass *klass, const void *data)
670 {
671 DeviceClass *dc = DEVICE_CLASS(klass);
672
673 device_class_set_legacy_reset(dc, usb_dwc3_reset);
674 dc->realize = usb_dwc3_realize;
675 dc->vmsd = &vmstate_usb_dwc3;
676 device_class_set_props(dc, usb_dwc3_properties);
677 }
678
679 static const TypeInfo usb_dwc3_info = {
680 .name = TYPE_USB_DWC3,
681 .parent = TYPE_SYS_BUS_DEVICE,
682 .instance_size = sizeof(USBDWC3),
683 .class_init = usb_dwc3_class_init,
684 .instance_init = usb_dwc3_init,
685 };
686
usb_dwc3_register_types(void)687 static void usb_dwc3_register_types(void)
688 {
689 type_register_static(&usb_dwc3_info);
690 }
691
692 type_init(usb_dwc3_register_types)
693