hcd-dwc3.c 24 KB

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