xref: /openbmc/qemu/hw/usb/hcd-dwc3.c (revision 28ae3179fc52d2e4d870b635c4a412aab99759e7)
18bbe61f3SVikram Garhwal /*
28bbe61f3SVikram Garhwal  * QEMU model of the USB DWC3 host controller emulation.
38bbe61f3SVikram Garhwal  *
48bbe61f3SVikram Garhwal  * This model defines global register space of DWC3 controller. Global
58bbe61f3SVikram Garhwal  * registers control the AXI/AHB interfaces properties, external FIFO support
68bbe61f3SVikram Garhwal  * and event count support. All of which are unimplemented at present. We are
78bbe61f3SVikram Garhwal  * only supporting core reset and read of ID register.
88bbe61f3SVikram Garhwal  *
98bbe61f3SVikram Garhwal  * Copyright (c) 2020 Xilinx Inc. Vikram Garhwal<fnu.vikram@xilinx.com>
108bbe61f3SVikram Garhwal  *
118bbe61f3SVikram Garhwal  * Permission is hereby granted, free of charge, to any person obtaining a copy
128bbe61f3SVikram Garhwal  * of this software and associated documentation files (the "Software"), to deal
138bbe61f3SVikram Garhwal  * in the Software without restriction, including without limitation the rights
148bbe61f3SVikram Garhwal  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
158bbe61f3SVikram Garhwal  * copies of the Software, and to permit persons to whom the Software is
168bbe61f3SVikram Garhwal  * furnished to do so, subject to the following conditions:
178bbe61f3SVikram Garhwal  *
188bbe61f3SVikram Garhwal  * The above copyright notice and this permission notice shall be included in
198bbe61f3SVikram Garhwal  * all copies or substantial portions of the Software.
208bbe61f3SVikram Garhwal  *
218bbe61f3SVikram Garhwal  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
228bbe61f3SVikram Garhwal  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
238bbe61f3SVikram Garhwal  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
248bbe61f3SVikram Garhwal  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
258bbe61f3SVikram Garhwal  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
268bbe61f3SVikram Garhwal  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
278bbe61f3SVikram Garhwal  * THE SOFTWARE.
288bbe61f3SVikram Garhwal  */
298bbe61f3SVikram Garhwal 
308bbe61f3SVikram Garhwal #include "qemu/osdep.h"
318bbe61f3SVikram Garhwal #include "hw/sysbus.h"
328bbe61f3SVikram Garhwal #include "hw/register.h"
338bbe61f3SVikram Garhwal #include "qemu/bitops.h"
348bbe61f3SVikram Garhwal #include "qom/object.h"
358bbe61f3SVikram Garhwal #include "migration/vmstate.h"
368bbe61f3SVikram Garhwal #include "hw/qdev-properties.h"
378bbe61f3SVikram Garhwal #include "hw/usb/hcd-dwc3.h"
388bbe61f3SVikram Garhwal #include "qapi/error.h"
398bbe61f3SVikram Garhwal 
408bbe61f3SVikram Garhwal #ifndef USB_DWC3_ERR_DEBUG
418bbe61f3SVikram Garhwal #define USB_DWC3_ERR_DEBUG 0
428bbe61f3SVikram Garhwal #endif
438bbe61f3SVikram Garhwal 
448bbe61f3SVikram Garhwal #define HOST_MODE           1
458bbe61f3SVikram Garhwal #define FIFO_LEN         0x1000
468bbe61f3SVikram Garhwal 
478bbe61f3SVikram Garhwal REG32(GSBUSCFG0, 0x00)
488bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, DATRDREQINFO, 28, 4)
498bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, DESRDREQINFO, 24, 4)
508bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, DATWRREQINFO, 20, 4)
518bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, DESWRREQINFO, 16, 4)
528bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, RESERVED_15_12, 12, 4)
538bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, DATBIGEND, 11, 1)
548bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, DESBIGEND, 10, 1)
558bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, RESERVED_9_8, 8, 2)
568bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR256BRSTENA, 7, 1)
578bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR128BRSTENA, 6, 1)
588bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR64BRSTENA, 5, 1)
598bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR32BRSTENA, 4, 1)
608bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR16BRSTENA, 3, 1)
618bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR8BRSTENA, 2, 1)
628bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCR4BRSTENA, 1, 1)
638bbe61f3SVikram Garhwal     FIELD(GSBUSCFG0, INCRBRSTENA, 0, 1)
648bbe61f3SVikram Garhwal REG32(GSBUSCFG1, 0x04)
658bbe61f3SVikram Garhwal     FIELD(GSBUSCFG1, RESERVED_31_13, 13, 19)
668bbe61f3SVikram Garhwal     FIELD(GSBUSCFG1, EN1KPAGE, 12, 1)
678bbe61f3SVikram Garhwal     FIELD(GSBUSCFG1, PIPETRANSLIMIT, 8, 4)
688bbe61f3SVikram Garhwal     FIELD(GSBUSCFG1, RESERVED_7_0, 0, 8)
698bbe61f3SVikram Garhwal REG32(GTXTHRCFG, 0x08)
708bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_31, 31, 1)
718bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_30, 30, 1)
728bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, USBTXPKTCNTSEL, 29, 1)
738bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_28, 28, 1)
748bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, USBTXPKTCNT, 24, 4)
758bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, USBMAXTXBURSTSIZE, 16, 8)
768bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_15, 15, 1)
778bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_14, 14, 1)
788bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_13_11, 11, 3)
798bbe61f3SVikram Garhwal     FIELD(GTXTHRCFG, RESERVED_10_0, 0, 11)
808bbe61f3SVikram Garhwal REG32(GRXTHRCFG, 0x0c)
818bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, RESERVED_31_30, 30, 2)
828bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, USBRXPKTCNTSEL, 29, 1)
838bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, RESERVED_28, 28, 1)
848bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, USBRXPKTCNT, 24, 4)
858bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, USBMAXRXBURSTSIZE, 19, 5)
868bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, RESERVED_18_16, 16, 3)
878bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, RESERVED_15, 15, 1)
888bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, RESERVED_14_13, 13, 2)
898bbe61f3SVikram Garhwal     FIELD(GRXTHRCFG, RESVISOCOUTSPC, 0, 13)
908bbe61f3SVikram Garhwal REG32(GCTL, 0x10)
918bbe61f3SVikram Garhwal     FIELD(GCTL, PWRDNSCALE, 19, 13)
928bbe61f3SVikram Garhwal     FIELD(GCTL, MASTERFILTBYPASS, 18, 1)
938bbe61f3SVikram Garhwal     FIELD(GCTL, BYPSSETADDR, 17, 1)
948bbe61f3SVikram Garhwal     FIELD(GCTL, U2RSTECN, 16, 1)
958bbe61f3SVikram Garhwal     FIELD(GCTL, FRMSCLDWN, 14, 2)
968bbe61f3SVikram Garhwal     FIELD(GCTL, PRTCAPDIR, 12, 2)
978bbe61f3SVikram Garhwal     FIELD(GCTL, CORESOFTRESET, 11, 1)
988bbe61f3SVikram Garhwal     FIELD(GCTL, U1U2TIMERSCALE, 9, 1)
998bbe61f3SVikram Garhwal     FIELD(GCTL, DEBUGATTACH, 8, 1)
1008bbe61f3SVikram Garhwal     FIELD(GCTL, RAMCLKSEL, 6, 2)
1018bbe61f3SVikram Garhwal     FIELD(GCTL, SCALEDOWN, 4, 2)
1028bbe61f3SVikram Garhwal     FIELD(GCTL, DISSCRAMBLE, 3, 1)
1038bbe61f3SVikram Garhwal     FIELD(GCTL, U2EXIT_LFPS, 2, 1)
1048bbe61f3SVikram Garhwal     FIELD(GCTL, GBLHIBERNATIONEN, 1, 1)
1058bbe61f3SVikram Garhwal     FIELD(GCTL, DSBLCLKGTNG, 0, 1)
1068bbe61f3SVikram Garhwal REG32(GPMSTS, 0x14)
1078bbe61f3SVikram Garhwal REG32(GSTS, 0x18)
1088bbe61f3SVikram Garhwal     FIELD(GSTS, CBELT, 20, 12)
1098bbe61f3SVikram Garhwal     FIELD(GSTS, RESERVED_19_12, 12, 8)
1108bbe61f3SVikram Garhwal     FIELD(GSTS, SSIC_IP, 11, 1)
1118bbe61f3SVikram Garhwal     FIELD(GSTS, OTG_IP, 10, 1)
1128bbe61f3SVikram Garhwal     FIELD(GSTS, BC_IP, 9, 1)
1138bbe61f3SVikram Garhwal     FIELD(GSTS, ADP_IP, 8, 1)
1148bbe61f3SVikram Garhwal     FIELD(GSTS, HOST_IP, 7, 1)
1158bbe61f3SVikram Garhwal     FIELD(GSTS, DEVICE_IP, 6, 1)
1168bbe61f3SVikram Garhwal     FIELD(GSTS, CSRTIMEOUT, 5, 1)
1178bbe61f3SVikram Garhwal     FIELD(GSTS, BUSERRADDRVLD, 4, 1)
1188bbe61f3SVikram Garhwal     FIELD(GSTS, RESERVED_3_2, 2, 2)
1198bbe61f3SVikram Garhwal     FIELD(GSTS, CURMOD, 0, 2)
1208bbe61f3SVikram Garhwal REG32(GUCTL1, 0x1c)
1218bbe61f3SVikram Garhwal     FIELD(GUCTL1, RESUME_OPMODE_HS_HOST, 10, 1)
1228bbe61f3SVikram Garhwal REG32(GSNPSID, 0x20)
1238bbe61f3SVikram Garhwal REG32(GGPIO, 0x24)
1248bbe61f3SVikram Garhwal     FIELD(GGPIO, GPO, 16, 16)
1258bbe61f3SVikram Garhwal     FIELD(GGPIO, GPI, 0, 16)
1268bbe61f3SVikram Garhwal REG32(GUID, 0x28)
1278bbe61f3SVikram Garhwal REG32(GUCTL, 0x2c)
1288bbe61f3SVikram Garhwal     FIELD(GUCTL, REFCLKPER, 22, 10)
1298bbe61f3SVikram Garhwal     FIELD(GUCTL, NOEXTRDL, 21, 1)
1308bbe61f3SVikram Garhwal     FIELD(GUCTL, RESERVED_20_18, 18, 3)
1318bbe61f3SVikram Garhwal     FIELD(GUCTL, SPRSCTRLTRANSEN, 17, 1)
1328bbe61f3SVikram Garhwal     FIELD(GUCTL, RESBWHSEPS, 16, 1)
1338bbe61f3SVikram Garhwal     FIELD(GUCTL, RESERVED_15, 15, 1)
1348bbe61f3SVikram Garhwal     FIELD(GUCTL, USBHSTINAUTORETRYEN, 14, 1)
1358bbe61f3SVikram Garhwal     FIELD(GUCTL, ENOVERLAPCHK, 13, 1)
1368bbe61f3SVikram Garhwal     FIELD(GUCTL, EXTCAPSUPPTEN, 12, 1)
1378bbe61f3SVikram Garhwal     FIELD(GUCTL, INSRTEXTRFSBODI, 11, 1)
1388bbe61f3SVikram Garhwal     FIELD(GUCTL, DTCT, 9, 2)
1398bbe61f3SVikram Garhwal     FIELD(GUCTL, DTFT, 0, 9)
1408bbe61f3SVikram Garhwal REG32(GBUSERRADDRLO, 0x30)
1418bbe61f3SVikram Garhwal REG32(GBUSERRADDRHI, 0x34)
1428bbe61f3SVikram Garhwal REG32(GHWPARAMS0, 0x40)
1438bbe61f3SVikram Garhwal     FIELD(GHWPARAMS0, GHWPARAMS0_31_24, 24, 8)
1448bbe61f3SVikram Garhwal     FIELD(GHWPARAMS0, GHWPARAMS0_23_16, 16, 8)
1458bbe61f3SVikram Garhwal     FIELD(GHWPARAMS0, GHWPARAMS0_15_8, 8, 8)
1468bbe61f3SVikram Garhwal     FIELD(GHWPARAMS0, GHWPARAMS0_7_6, 6, 2)
1478bbe61f3SVikram Garhwal     FIELD(GHWPARAMS0, GHWPARAMS0_5_3, 3, 3)
1488bbe61f3SVikram Garhwal     FIELD(GHWPARAMS0, GHWPARAMS0_2_0, 0, 3)
1498bbe61f3SVikram Garhwal REG32(GHWPARAMS1, 0x44)
1508bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_31, 31, 1)
1518bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_30, 30, 1)
1528bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_29, 29, 1)
1538bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_28, 28, 1)
1548bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_27, 27, 1)
1558bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_26, 26, 1)
1568bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_25_24, 24, 2)
1578bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_23, 23, 1)
1588bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_22_21, 21, 2)
1598bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_20_15, 15, 6)
1608bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_14_12, 12, 3)
1618bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_11_9, 9, 3)
1628bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_8_6, 6, 3)
1638bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_5_3, 3, 3)
1648bbe61f3SVikram Garhwal     FIELD(GHWPARAMS1, GHWPARAMS1_2_0, 0, 3)
1658bbe61f3SVikram Garhwal REG32(GHWPARAMS2, 0x48)
1668bbe61f3SVikram Garhwal REG32(GHWPARAMS3, 0x4c)
1678bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_31, 31, 1)
1688bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_30_23, 23, 8)
1698bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_22_18, 18, 5)
1708bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_17_12, 12, 6)
1718bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_11, 11, 1)
1728bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_10, 10, 1)
1738bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_9_8, 8, 2)
1748bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_7_6, 6, 2)
1758bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_5_4, 4, 2)
1768bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_3_2, 2, 2)
1778bbe61f3SVikram Garhwal     FIELD(GHWPARAMS3, GHWPARAMS3_1_0, 0, 2)
1788bbe61f3SVikram Garhwal REG32(GHWPARAMS4, 0x50)
1798bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_31_28, 28, 4)
1808bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_27_24, 24, 4)
1818bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_23, 23, 1)
1828bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_22, 22, 1)
1838bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_21, 21, 1)
1848bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_20_17, 17, 4)
1858bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_16_13, 13, 4)
1868bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_12, 12, 1)
1878bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_11, 11, 1)
1888bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_10_9, 9, 2)
1898bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_8_7, 7, 2)
1908bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_6, 6, 1)
1918bbe61f3SVikram Garhwal     FIELD(GHWPARAMS4, GHWPARAMS4_5_0, 0, 6)
1928bbe61f3SVikram Garhwal REG32(GHWPARAMS5, 0x54)
1938bbe61f3SVikram Garhwal     FIELD(GHWPARAMS5, GHWPARAMS5_31_28, 28, 4)
1948bbe61f3SVikram Garhwal     FIELD(GHWPARAMS5, GHWPARAMS5_27_22, 22, 6)
1958bbe61f3SVikram Garhwal     FIELD(GHWPARAMS5, GHWPARAMS5_21_16, 16, 6)
1968bbe61f3SVikram Garhwal     FIELD(GHWPARAMS5, GHWPARAMS5_15_10, 10, 6)
1978bbe61f3SVikram Garhwal     FIELD(GHWPARAMS5, GHWPARAMS5_9_4, 4, 6)
1988bbe61f3SVikram Garhwal     FIELD(GHWPARAMS5, GHWPARAMS5_3_0, 0, 4)
1998bbe61f3SVikram Garhwal REG32(GHWPARAMS6, 0x58)
2008bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, GHWPARAMS6_31_16, 16, 16)
2018bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, BUSFLTRSSUPPORT, 15, 1)
2028bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, BCSUPPORT, 14, 1)
2038bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, OTG_SS_SUPPORT, 13, 1)
2048bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, ADPSUPPORT, 12, 1)
2058bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, HNPSUPPORT, 11, 1)
2068bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, SRPSUPPORT, 10, 1)
2078bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, GHWPARAMS6_9_8, 8, 2)
2088bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, GHWPARAMS6_7, 7, 1)
2098bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, GHWPARAMS6_6, 6, 1)
2108bbe61f3SVikram Garhwal     FIELD(GHWPARAMS6, GHWPARAMS6_5_0, 0, 6)
2118bbe61f3SVikram Garhwal REG32(GHWPARAMS7, 0x5c)
2128bbe61f3SVikram Garhwal     FIELD(GHWPARAMS7, GHWPARAMS7_31_16, 16, 16)
2138bbe61f3SVikram Garhwal     FIELD(GHWPARAMS7, GHWPARAMS7_15_0, 0, 16)
2148bbe61f3SVikram Garhwal REG32(GDBGFIFOSPACE, 0x60)
2158bbe61f3SVikram Garhwal     FIELD(GDBGFIFOSPACE, SPACE_AVAILABLE, 16, 16)
2168bbe61f3SVikram Garhwal     FIELD(GDBGFIFOSPACE, RESERVED_15_9, 9, 7)
2178bbe61f3SVikram Garhwal     FIELD(GDBGFIFOSPACE, FIFO_QUEUE_SELECT, 0, 9)
2188bbe61f3SVikram Garhwal REG32(GUCTL2, 0x9c)
2198bbe61f3SVikram Garhwal     FIELD(GUCTL2, RESERVED_31_26, 26, 6)
2208bbe61f3SVikram Garhwal     FIELD(GUCTL2, EN_HP_PM_TIMER, 19, 7)
2218bbe61f3SVikram Garhwal     FIELD(GUCTL2, NOLOWPWRDUR, 15, 4)
2228bbe61f3SVikram Garhwal     FIELD(GUCTL2, RST_ACTBITLATER, 14, 1)
2238bbe61f3SVikram Garhwal     FIELD(GUCTL2, RESERVED_13, 13, 1)
2248bbe61f3SVikram Garhwal     FIELD(GUCTL2, DISABLECFC, 11, 1)
2258bbe61f3SVikram Garhwal REG32(GUSB2PHYCFG, 0x100)
2268bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, U2_FREECLK_EXISTS, 30, 1)
2278bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, ULPI_LPM_WITH_OPMODE_CHK, 29, 1)
2288bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, RESERVED_25, 25, 1)
2298bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, LSTRD, 22, 3)
2308bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, LSIPD, 19, 3)
2318bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, ULPIEXTVBUSINDIACTOR, 18, 1)
2328bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, ULPIEXTVBUSDRV, 17, 1)
2338bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, RESERVED_16, 16, 1)
2348bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, ULPIAUTORES, 15, 1)
2358bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, RESERVED_14, 14, 1)
2368bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, USBTRDTIM, 10, 4)
2378bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, XCVRDLY, 9, 1)
2388bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, ENBLSLPM, 8, 1)
2398bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, PHYSEL, 7, 1)
2408bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, SUSPENDUSB20, 6, 1)
2418bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, FSINTF, 5, 1)
2428bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, ULPI_UTMI_SEL, 4, 1)
2438bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, PHYIF, 3, 1)
2448bbe61f3SVikram Garhwal     FIELD(GUSB2PHYCFG, TOUTCAL, 0, 3)
2458bbe61f3SVikram Garhwal REG32(GUSB2I2CCTL, 0x140)
2468bbe61f3SVikram Garhwal REG32(GUSB2PHYACC_ULPI, 0x180)
2478bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, RESERVED_31_27, 27, 5)
2488bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, DISUIPIDRVR, 26, 1)
2498bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, NEWREGREQ, 25, 1)
2508bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, VSTSDONE, 24, 1)
2518bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, VSTSBSY, 23, 1)
2528bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, REGWR, 22, 1)
2538bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, REGADDR, 16, 6)
2548bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, EXTREGADDR, 8, 8)
2558bbe61f3SVikram Garhwal     FIELD(GUSB2PHYACC_ULPI, REGDATA, 0, 8)
2568bbe61f3SVikram Garhwal REG32(GTXFIFOSIZ0, 0x200)
2578bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ0, TXFSTADDR_N, 16, 16)
2588bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ0, TXFDEP_N, 0, 16)
2598bbe61f3SVikram Garhwal REG32(GTXFIFOSIZ1, 0x204)
2608bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ1, TXFSTADDR_N, 16, 16)
2618bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ1, TXFDEP_N, 0, 16)
2628bbe61f3SVikram Garhwal REG32(GTXFIFOSIZ2, 0x208)
2638bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ2, TXFSTADDR_N, 16, 16)
2648bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ2, TXFDEP_N, 0, 16)
2658bbe61f3SVikram Garhwal REG32(GTXFIFOSIZ3, 0x20c)
2668bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ3, TXFSTADDR_N, 16, 16)
2678bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ3, TXFDEP_N, 0, 16)
2688bbe61f3SVikram Garhwal REG32(GTXFIFOSIZ4, 0x210)
2698bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ4, TXFSTADDR_N, 16, 16)
2708bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ4, TXFDEP_N, 0, 16)
2718bbe61f3SVikram Garhwal REG32(GTXFIFOSIZ5, 0x214)
2728bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ5, TXFSTADDR_N, 16, 16)
2738bbe61f3SVikram Garhwal     FIELD(GTXFIFOSIZ5, TXFDEP_N, 0, 16)
2748bbe61f3SVikram Garhwal REG32(GRXFIFOSIZ0, 0x280)
2758bbe61f3SVikram Garhwal     FIELD(GRXFIFOSIZ0, RXFSTADDR_N, 16, 16)
2768bbe61f3SVikram Garhwal     FIELD(GRXFIFOSIZ0, RXFDEP_N, 0, 16)
2778bbe61f3SVikram Garhwal REG32(GRXFIFOSIZ1, 0x284)
2788bbe61f3SVikram Garhwal     FIELD(GRXFIFOSIZ1, RXFSTADDR_N, 16, 16)
2798bbe61f3SVikram Garhwal     FIELD(GRXFIFOSIZ1, RXFDEP_N, 0, 16)
2808bbe61f3SVikram Garhwal REG32(GRXFIFOSIZ2, 0x288)
2818bbe61f3SVikram Garhwal     FIELD(GRXFIFOSIZ2, RXFSTADDR_N, 16, 16)
2828bbe61f3SVikram Garhwal     FIELD(GRXFIFOSIZ2, RXFDEP_N, 0, 16)
2838bbe61f3SVikram Garhwal REG32(GEVNTADRLO_0, 0x300)
2848bbe61f3SVikram Garhwal REG32(GEVNTADRHI_0, 0x304)
2858bbe61f3SVikram Garhwal REG32(GEVNTSIZ_0, 0x308)
2868bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_0, EVNTINTRPTMASK, 31, 1)
2878bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_0, RESERVED_30_16, 16, 15)
2888bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_0, EVENTSIZ, 0, 16)
2898bbe61f3SVikram Garhwal REG32(GEVNTCOUNT_0, 0x30c)
2908bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_0, EVNT_HANDLER_BUSY, 31, 1)
2918bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_0, RESERVED_30_16, 16, 15)
2928bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_0, EVNTCOUNT, 0, 16)
2938bbe61f3SVikram Garhwal REG32(GEVNTADRLO_1, 0x310)
2948bbe61f3SVikram Garhwal REG32(GEVNTADRHI_1, 0x314)
2958bbe61f3SVikram Garhwal REG32(GEVNTSIZ_1, 0x318)
2968bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_1, EVNTINTRPTMASK, 31, 1)
2978bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_1, RESERVED_30_16, 16, 15)
2988bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_1, EVENTSIZ, 0, 16)
2998bbe61f3SVikram Garhwal REG32(GEVNTCOUNT_1, 0x31c)
3008bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_1, EVNT_HANDLER_BUSY, 31, 1)
3018bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_1, RESERVED_30_16, 16, 15)
3028bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_1, EVNTCOUNT, 0, 16)
3038bbe61f3SVikram Garhwal REG32(GEVNTADRLO_2, 0x320)
3048bbe61f3SVikram Garhwal REG32(GEVNTADRHI_2, 0x324)
3058bbe61f3SVikram Garhwal REG32(GEVNTSIZ_2, 0x328)
3068bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_2, EVNTINTRPTMASK, 31, 1)
3078bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_2, RESERVED_30_16, 16, 15)
3088bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_2, EVENTSIZ, 0, 16)
3098bbe61f3SVikram Garhwal REG32(GEVNTCOUNT_2, 0x32c)
3108bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_2, EVNT_HANDLER_BUSY, 31, 1)
3118bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_2, RESERVED_30_16, 16, 15)
3128bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_2, EVNTCOUNT, 0, 16)
3138bbe61f3SVikram Garhwal REG32(GEVNTADRLO_3, 0x330)
3148bbe61f3SVikram Garhwal REG32(GEVNTADRHI_3, 0x334)
3158bbe61f3SVikram Garhwal REG32(GEVNTSIZ_3, 0x338)
3168bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_3, EVNTINTRPTMASK, 31, 1)
3178bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_3, RESERVED_30_16, 16, 15)
3188bbe61f3SVikram Garhwal     FIELD(GEVNTSIZ_3, EVENTSIZ, 0, 16)
3198bbe61f3SVikram Garhwal REG32(GEVNTCOUNT_3, 0x33c)
3208bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_3, EVNT_HANDLER_BUSY, 31, 1)
3218bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_3, RESERVED_30_16, 16, 15)
3228bbe61f3SVikram Garhwal     FIELD(GEVNTCOUNT_3, EVNTCOUNT, 0, 16)
3238bbe61f3SVikram Garhwal REG32(GHWPARAMS8, 0x500)
3248bbe61f3SVikram Garhwal REG32(GTXFIFOPRIDEV, 0x510)
3258bbe61f3SVikram Garhwal     FIELD(GTXFIFOPRIDEV, RESERVED_31_N, 6, 26)
3268bbe61f3SVikram Garhwal     FIELD(GTXFIFOPRIDEV, GTXFIFOPRIDEV, 0, 6)
3278bbe61f3SVikram Garhwal REG32(GTXFIFOPRIHST, 0x518)
3288bbe61f3SVikram Garhwal     FIELD(GTXFIFOPRIHST, RESERVED_31_16, 3, 29)
3298bbe61f3SVikram Garhwal     FIELD(GTXFIFOPRIHST, GTXFIFOPRIHST, 0, 3)
3308bbe61f3SVikram Garhwal REG32(GRXFIFOPRIHST, 0x51c)
3318bbe61f3SVikram Garhwal     FIELD(GRXFIFOPRIHST, RESERVED_31_16, 3, 29)
3328bbe61f3SVikram Garhwal     FIELD(GRXFIFOPRIHST, GRXFIFOPRIHST, 0, 3)
3338bbe61f3SVikram Garhwal REG32(GDMAHLRATIO, 0x524)
3348bbe61f3SVikram Garhwal     FIELD(GDMAHLRATIO, RESERVED_31_13, 13, 19)
3358bbe61f3SVikram Garhwal     FIELD(GDMAHLRATIO, HSTRXFIFO, 8, 5)
3368bbe61f3SVikram Garhwal     FIELD(GDMAHLRATIO, RESERVED_7_5, 5, 3)
3378bbe61f3SVikram Garhwal     FIELD(GDMAHLRATIO, HSTTXFIFO, 0, 5)
3388bbe61f3SVikram Garhwal REG32(GFLADJ, 0x530)
3398bbe61f3SVikram Garhwal     FIELD(GFLADJ, GFLADJ_REFCLK_240MHZDECR_PLS1, 31, 1)
3408bbe61f3SVikram Garhwal     FIELD(GFLADJ, GFLADJ_REFCLK_240MHZ_DECR, 24, 7)
3418bbe61f3SVikram Garhwal     FIELD(GFLADJ, GFLADJ_REFCLK_LPM_SEL, 23, 1)
3428bbe61f3SVikram Garhwal     FIELD(GFLADJ, RESERVED_22, 22, 1)
3438bbe61f3SVikram Garhwal     FIELD(GFLADJ, GFLADJ_REFCLK_FLADJ, 8, 14)
3448bbe61f3SVikram Garhwal     FIELD(GFLADJ, GFLADJ_30MHZ_SDBND_SEL, 7, 1)
3458bbe61f3SVikram Garhwal     FIELD(GFLADJ, GFLADJ_30MHZ, 0, 6)
3468bbe61f3SVikram Garhwal 
3478bbe61f3SVikram Garhwal #define DWC3_GLOBAL_OFFSET 0xC100
reset_csr(USBDWC3 * s)3488bbe61f3SVikram Garhwal static void reset_csr(USBDWC3 * s)
3498bbe61f3SVikram Garhwal {
3508bbe61f3SVikram Garhwal     int i = 0;
3518bbe61f3SVikram Garhwal     /*
3528bbe61f3SVikram Garhwal      * We reset all CSR regs except GCTL, GUCTL, GSTS, GSNPSID, GGPIO, GUID,
3538bbe61f3SVikram Garhwal      * GUSB2PHYCFGn registers and GUSB3PIPECTLn registers. We will skip PHY
3548bbe61f3SVikram Garhwal      * register as we don't implement them.
3558bbe61f3SVikram Garhwal      */
3568bbe61f3SVikram Garhwal     for (i = 0; i < USB_DWC3_R_MAX; i++) {
3578bbe61f3SVikram Garhwal         switch (i) {
3588bbe61f3SVikram Garhwal         case R_GCTL:
3598bbe61f3SVikram Garhwal             break;
3608bbe61f3SVikram Garhwal         case R_GSTS:
3618bbe61f3SVikram Garhwal             break;
3628bbe61f3SVikram Garhwal         case R_GSNPSID:
3638bbe61f3SVikram Garhwal             break;
3648bbe61f3SVikram Garhwal         case R_GGPIO:
3658bbe61f3SVikram Garhwal             break;
3668bbe61f3SVikram Garhwal         case R_GUID:
3678bbe61f3SVikram Garhwal             break;
3688bbe61f3SVikram Garhwal         case R_GUCTL:
3698bbe61f3SVikram Garhwal             break;
3708bbe61f3SVikram Garhwal         case R_GHWPARAMS0...R_GHWPARAMS7:
3718bbe61f3SVikram Garhwal             break;
3728bbe61f3SVikram Garhwal         case R_GHWPARAMS8:
3738bbe61f3SVikram Garhwal             break;
3748bbe61f3SVikram Garhwal         default:
3758bbe61f3SVikram Garhwal             register_reset(&s->regs_info[i]);
3768bbe61f3SVikram Garhwal             break;
3778bbe61f3SVikram Garhwal         }
3788bbe61f3SVikram Garhwal     }
3798bbe61f3SVikram Garhwal 
3808bbe61f3SVikram Garhwal     xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
3818bbe61f3SVikram Garhwal }
3828bbe61f3SVikram Garhwal 
usb_dwc3_gctl_postw(RegisterInfo * reg,uint64_t val64)3838bbe61f3SVikram Garhwal static void usb_dwc3_gctl_postw(RegisterInfo *reg, uint64_t val64)
3848bbe61f3SVikram Garhwal {
3858bbe61f3SVikram Garhwal     USBDWC3 *s = USB_DWC3(reg->opaque);
3868bbe61f3SVikram Garhwal 
3878bbe61f3SVikram Garhwal     if (ARRAY_FIELD_EX32(s->regs, GCTL, CORESOFTRESET)) {
3888bbe61f3SVikram Garhwal         reset_csr(s);
3898bbe61f3SVikram Garhwal     }
3908bbe61f3SVikram Garhwal }
3918bbe61f3SVikram Garhwal 
usb_dwc3_guid_postw(RegisterInfo * reg,uint64_t val64)3928bbe61f3SVikram Garhwal static void usb_dwc3_guid_postw(RegisterInfo *reg, uint64_t val64)
3938bbe61f3SVikram Garhwal {
3948bbe61f3SVikram Garhwal     USBDWC3 *s = USB_DWC3(reg->opaque);
3958bbe61f3SVikram Garhwal 
3968bbe61f3SVikram Garhwal     s->regs[R_GUID] = s->cfg.dwc_usb3_user;
3978bbe61f3SVikram Garhwal }
3988bbe61f3SVikram Garhwal 
3998bbe61f3SVikram Garhwal static const RegisterAccessInfo usb_dwc3_regs_info[] = {
4008bbe61f3SVikram Garhwal     {   .name = "GSBUSCFG0",  .addr = A_GSBUSCFG0,
4018bbe61f3SVikram Garhwal         .ro = 0xf300,
4028bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4038bbe61f3SVikram Garhwal     },{ .name = "GSBUSCFG1",  .addr = A_GSBUSCFG1,
4048bbe61f3SVikram Garhwal         .reset = 0x300,
4058bbe61f3SVikram Garhwal         .ro = 0xffffe0ff,
4068bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4078bbe61f3SVikram Garhwal     },{ .name = "GTXTHRCFG",  .addr = A_GTXTHRCFG,
4088bbe61f3SVikram Garhwal         .ro = 0xd000ffff,
4098bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4108bbe61f3SVikram Garhwal     },{ .name = "GRXTHRCFG",  .addr = A_GRXTHRCFG,
4118bbe61f3SVikram Garhwal         .ro = 0xd007e000,
4128bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4138bbe61f3SVikram Garhwal     },{ .name = "GCTL",  .addr = A_GCTL,
4148bbe61f3SVikram Garhwal         .reset = 0x30c13004, .post_write = usb_dwc3_gctl_postw,
4158bbe61f3SVikram Garhwal     },{ .name = "GPMSTS",  .addr = A_GPMSTS,
4168bbe61f3SVikram Garhwal         .ro = 0xfffffff,
4178bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4188bbe61f3SVikram Garhwal     },{ .name = "GSTS",  .addr = A_GSTS,
4198bbe61f3SVikram Garhwal         .reset = 0x7e800000,
4208bbe61f3SVikram Garhwal         .ro = 0xffffffcf,
4218bbe61f3SVikram Garhwal         .w1c = 0x30,
4228bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4238bbe61f3SVikram Garhwal     },{ .name = "GUCTL1",  .addr = A_GUCTL1,
4248bbe61f3SVikram Garhwal         .reset = 0x198a,
4258bbe61f3SVikram Garhwal         .ro = 0x7800,
4268bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4278bbe61f3SVikram Garhwal     },{ .name = "GSNPSID",  .addr = A_GSNPSID,
4288bbe61f3SVikram Garhwal         .reset = 0x5533330a,
4298bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4308bbe61f3SVikram Garhwal     },{ .name = "GGPIO",  .addr = A_GGPIO,
4318bbe61f3SVikram Garhwal         .ro = 0xffff,
4328bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4338bbe61f3SVikram Garhwal     },{ .name = "GUID",  .addr = A_GUID,
4348bbe61f3SVikram Garhwal         .reset = 0x12345678, .post_write = usb_dwc3_guid_postw,
4358bbe61f3SVikram Garhwal     },{ .name = "GUCTL",  .addr = A_GUCTL,
4368bbe61f3SVikram Garhwal         .reset = 0x0c808010,
4378bbe61f3SVikram Garhwal         .ro = 0x1c8000,
4388bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4398bbe61f3SVikram Garhwal     },{ .name = "GBUSERRADDRLO",  .addr = A_GBUSERRADDRLO,
4408bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4418bbe61f3SVikram Garhwal     },{ .name = "GBUSERRADDRHI",  .addr = A_GBUSERRADDRHI,
4428bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4438bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS0",  .addr = A_GHWPARAMS0,
4448bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4458bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS1",  .addr = A_GHWPARAMS1,
4468bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4478bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS2",  .addr = A_GHWPARAMS2,
4488bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4498bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS3",  .addr = A_GHWPARAMS3,
4508bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4518bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS4",  .addr = A_GHWPARAMS4,
4528bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4538bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS5",  .addr = A_GHWPARAMS5,
4548bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4558bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS6",  .addr = A_GHWPARAMS6,
4568bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4578bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS7",  .addr = A_GHWPARAMS7,
4588bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4598bbe61f3SVikram Garhwal     },{ .name = "GDBGFIFOSPACE",  .addr = A_GDBGFIFOSPACE,
4608bbe61f3SVikram Garhwal         .reset = 0xa0000,
4618bbe61f3SVikram Garhwal         .ro = 0xfffffe00,
4628bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4638bbe61f3SVikram Garhwal     },{ .name = "GUCTL2",  .addr = A_GUCTL2,
4648bbe61f3SVikram Garhwal         .reset = 0x40d,
4658bbe61f3SVikram Garhwal         .ro = 0x2000,
4668bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4678bbe61f3SVikram Garhwal     },{ .name = "GUSB2PHYCFG",  .addr = A_GUSB2PHYCFG,
4688bbe61f3SVikram Garhwal         .reset = 0x40102410,
4698bbe61f3SVikram Garhwal         .ro = 0x1e014030,
4708bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4718bbe61f3SVikram Garhwal     },{ .name = "GUSB2I2CCTL",  .addr = A_GUSB2I2CCTL,
4728bbe61f3SVikram Garhwal         .ro = 0xffffffff,
4738bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4748bbe61f3SVikram Garhwal     },{ .name = "GUSB2PHYACC_ULPI",  .addr = A_GUSB2PHYACC_ULPI,
4758bbe61f3SVikram Garhwal         .ro = 0xfd000000,
4768bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4778bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOSIZ0",  .addr = A_GTXFIFOSIZ0,
4788bbe61f3SVikram Garhwal         .reset = 0x2c7000a,
4798bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4808bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOSIZ1",  .addr = A_GTXFIFOSIZ1,
4818bbe61f3SVikram Garhwal         .reset = 0x2d10103,
4828bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4838bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOSIZ2",  .addr = A_GTXFIFOSIZ2,
4848bbe61f3SVikram Garhwal         .reset = 0x3d40103,
4858bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4868bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOSIZ3",  .addr = A_GTXFIFOSIZ3,
4878bbe61f3SVikram Garhwal         .reset = 0x4d70083,
4888bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4898bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOSIZ4",  .addr = A_GTXFIFOSIZ4,
4908bbe61f3SVikram Garhwal         .reset = 0x55a0083,
4918bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4928bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOSIZ5",  .addr = A_GTXFIFOSIZ5,
4938bbe61f3SVikram Garhwal         .reset = 0x5dd0083,
4948bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4958bbe61f3SVikram Garhwal     },{ .name = "GRXFIFOSIZ0",  .addr = A_GRXFIFOSIZ0,
4968bbe61f3SVikram Garhwal         .reset = 0x1c20105,
4978bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
4988bbe61f3SVikram Garhwal     },{ .name = "GRXFIFOSIZ1",  .addr = A_GRXFIFOSIZ1,
4998bbe61f3SVikram Garhwal         .reset = 0x2c70000,
5008bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5018bbe61f3SVikram Garhwal     },{ .name = "GRXFIFOSIZ2",  .addr = A_GRXFIFOSIZ2,
5028bbe61f3SVikram Garhwal         .reset = 0x2c70000,
5038bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5048bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRLO_0",  .addr = A_GEVNTADRLO_0,
5058bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5068bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRHI_0",  .addr = A_GEVNTADRHI_0,
5078bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5088bbe61f3SVikram Garhwal     },{ .name = "GEVNTSIZ_0",  .addr = A_GEVNTSIZ_0,
5098bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5108bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5118bbe61f3SVikram Garhwal     },{ .name = "GEVNTCOUNT_0",  .addr = A_GEVNTCOUNT_0,
5128bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5138bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5148bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRLO_1",  .addr = A_GEVNTADRLO_1,
5158bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5168bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRHI_1",  .addr = A_GEVNTADRHI_1,
5178bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5188bbe61f3SVikram Garhwal     },{ .name = "GEVNTSIZ_1",  .addr = A_GEVNTSIZ_1,
5198bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5208bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5218bbe61f3SVikram Garhwal     },{ .name = "GEVNTCOUNT_1",  .addr = A_GEVNTCOUNT_1,
5228bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5238bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5248bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRLO_2",  .addr = A_GEVNTADRLO_2,
5258bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5268bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRHI_2",  .addr = A_GEVNTADRHI_2,
5278bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5288bbe61f3SVikram Garhwal     },{ .name = "GEVNTSIZ_2",  .addr = A_GEVNTSIZ_2,
5298bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5308bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5318bbe61f3SVikram Garhwal     },{ .name = "GEVNTCOUNT_2",  .addr = A_GEVNTCOUNT_2,
5328bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5338bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5348bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRLO_3",  .addr = A_GEVNTADRLO_3,
5358bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5368bbe61f3SVikram Garhwal     },{ .name = "GEVNTADRHI_3",  .addr = A_GEVNTADRHI_3,
5378bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5388bbe61f3SVikram Garhwal     },{ .name = "GEVNTSIZ_3",  .addr = A_GEVNTSIZ_3,
5398bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5408bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5418bbe61f3SVikram Garhwal     },{ .name = "GEVNTCOUNT_3",  .addr = A_GEVNTCOUNT_3,
5428bbe61f3SVikram Garhwal         .ro = 0x7fff0000,
5438bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5448bbe61f3SVikram Garhwal     },{ .name = "GHWPARAMS8",  .addr = A_GHWPARAMS8,
5458bbe61f3SVikram Garhwal         .ro = 0xffffffff,
5468bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOPRIDEV",  .addr = A_GTXFIFOPRIDEV,
5478bbe61f3SVikram Garhwal         .ro = 0xffffffc0,
5488bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5498bbe61f3SVikram Garhwal     },{ .name = "GTXFIFOPRIHST",  .addr = A_GTXFIFOPRIHST,
5508bbe61f3SVikram Garhwal         .ro = 0xfffffff8,
5518bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5528bbe61f3SVikram Garhwal     },{ .name = "GRXFIFOPRIHST",  .addr = A_GRXFIFOPRIHST,
5538bbe61f3SVikram Garhwal         .ro = 0xfffffff8,
5548bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5558bbe61f3SVikram Garhwal     },{ .name = "GDMAHLRATIO",  .addr = A_GDMAHLRATIO,
5568bbe61f3SVikram Garhwal         .ro = 0xffffe0e0,
5578bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5588bbe61f3SVikram Garhwal     },{ .name = "GFLADJ",  .addr = A_GFLADJ,
5598bbe61f3SVikram Garhwal         .reset = 0xc83f020,
5608bbe61f3SVikram Garhwal         .rsvd = 0x40,
5618bbe61f3SVikram Garhwal         .ro = 0x400040,
5628bbe61f3SVikram Garhwal         .unimp = 0xffffffff,
5638bbe61f3SVikram Garhwal     }
5648bbe61f3SVikram Garhwal };
5658bbe61f3SVikram Garhwal 
usb_dwc3_reset(DeviceState * dev)5668bbe61f3SVikram Garhwal static void usb_dwc3_reset(DeviceState *dev)
5678bbe61f3SVikram Garhwal {
5688bbe61f3SVikram Garhwal     USBDWC3 *s = USB_DWC3(dev);
5698bbe61f3SVikram Garhwal     unsigned int i;
5708bbe61f3SVikram Garhwal 
5718bbe61f3SVikram Garhwal     for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
5728bbe61f3SVikram Garhwal         switch (i) {
5738bbe61f3SVikram Garhwal         case R_GHWPARAMS0...R_GHWPARAMS7:
5748bbe61f3SVikram Garhwal             break;
5758bbe61f3SVikram Garhwal         case R_GHWPARAMS8:
5768bbe61f3SVikram Garhwal             break;
5778bbe61f3SVikram Garhwal         default:
5788bbe61f3SVikram Garhwal             register_reset(&s->regs_info[i]);
5798bbe61f3SVikram Garhwal         };
5808bbe61f3SVikram Garhwal     }
5818bbe61f3SVikram Garhwal 
5828bbe61f3SVikram Garhwal     xhci_sysbus_reset(DEVICE(&s->sysbus_xhci));
5838bbe61f3SVikram Garhwal }
5848bbe61f3SVikram Garhwal 
5858bbe61f3SVikram Garhwal static const MemoryRegionOps usb_dwc3_ops = {
5868bbe61f3SVikram Garhwal     .read = register_read_memory,
5878bbe61f3SVikram Garhwal     .write = register_write_memory,
5888bbe61f3SVikram Garhwal     .endianness = DEVICE_LITTLE_ENDIAN,
5898bbe61f3SVikram Garhwal     .valid = {
5908bbe61f3SVikram Garhwal         .min_access_size = 4,
5918bbe61f3SVikram Garhwal         .max_access_size = 4,
5928bbe61f3SVikram Garhwal     },
5938bbe61f3SVikram Garhwal };
5948bbe61f3SVikram Garhwal 
usb_dwc3_realize(DeviceState * dev,Error ** errp)5958bbe61f3SVikram Garhwal static void usb_dwc3_realize(DeviceState *dev, Error **errp)
5968bbe61f3SVikram Garhwal {
5978bbe61f3SVikram Garhwal     USBDWC3 *s = USB_DWC3(dev);
5988bbe61f3SVikram Garhwal     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
5998bbe61f3SVikram Garhwal     Error *err = NULL;
6008bbe61f3SVikram Garhwal 
6018bbe61f3SVikram Garhwal     sysbus_realize(SYS_BUS_DEVICE(&s->sysbus_xhci), &err);
6028bbe61f3SVikram Garhwal     if (err) {
6038bbe61f3SVikram Garhwal         error_propagate(errp, err);
6048bbe61f3SVikram Garhwal         return;
6058bbe61f3SVikram Garhwal     }
6068bbe61f3SVikram Garhwal 
6078bbe61f3SVikram Garhwal     memory_region_add_subregion(&s->iomem, 0,
6088bbe61f3SVikram Garhwal          sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->sysbus_xhci), 0));
6098bbe61f3SVikram Garhwal     sysbus_init_mmio(sbd, &s->iomem);
6108bbe61f3SVikram Garhwal 
6118bbe61f3SVikram Garhwal     /*
6128bbe61f3SVikram Garhwal      * Device Configuration
6138bbe61f3SVikram Garhwal      */
6148bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS0] = 0x40204048 | s->cfg.mode;
6158bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS1] = 0x222493b;
6168bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS2] = 0x12345678;
6178bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS3] = 0x618c088;
6188bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS4] = 0x47822004;
6198bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS5] = 0x4202088;
6208bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS6] = 0x7850c20;
6218bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS7] = 0x0;
6228bbe61f3SVikram Garhwal     s->regs[R_GHWPARAMS8] = 0x478;
6238bbe61f3SVikram Garhwal }
6248bbe61f3SVikram Garhwal 
usb_dwc3_init(Object * obj)6258bbe61f3SVikram Garhwal static void usb_dwc3_init(Object *obj)
6268bbe61f3SVikram Garhwal {
6278bbe61f3SVikram Garhwal     USBDWC3 *s = USB_DWC3(obj);
6288bbe61f3SVikram Garhwal     RegisterInfoArray *reg_array;
6298bbe61f3SVikram Garhwal 
6308bbe61f3SVikram Garhwal     memory_region_init(&s->iomem, obj, TYPE_USB_DWC3, DWC3_SIZE);
6318bbe61f3SVikram Garhwal     reg_array =
6328bbe61f3SVikram Garhwal         register_init_block32(DEVICE(obj), usb_dwc3_regs_info,
6338bbe61f3SVikram Garhwal                               ARRAY_SIZE(usb_dwc3_regs_info),
6348bbe61f3SVikram Garhwal                               s->regs_info, s->regs,
6358bbe61f3SVikram Garhwal                               &usb_dwc3_ops,
6368bbe61f3SVikram Garhwal                               USB_DWC3_ERR_DEBUG,
6378bbe61f3SVikram Garhwal                               USB_DWC3_R_MAX * 4);
6388bbe61f3SVikram Garhwal     memory_region_add_subregion(&s->iomem,
6398bbe61f3SVikram Garhwal                                 DWC3_GLOBAL_OFFSET,
6408bbe61f3SVikram Garhwal                                 &reg_array->mem);
6418bbe61f3SVikram Garhwal     object_initialize_child(obj, "dwc3-xhci", &s->sysbus_xhci,
6428bbe61f3SVikram Garhwal                             TYPE_XHCI_SYSBUS);
6438bbe61f3SVikram Garhwal     qdev_alias_all_properties(DEVICE(&s->sysbus_xhci), obj);
6448bbe61f3SVikram Garhwal 
6458bbe61f3SVikram Garhwal     s->cfg.mode = HOST_MODE;
6468bbe61f3SVikram Garhwal }
6478bbe61f3SVikram Garhwal 
6488bbe61f3SVikram Garhwal static const VMStateDescription vmstate_usb_dwc3 = {
6498bbe61f3SVikram Garhwal     .name = "usb-dwc3",
6508bbe61f3SVikram Garhwal     .version_id = 1,
6513abedf29SRichard Henderson     .fields = (const VMStateField[]) {
6528bbe61f3SVikram Garhwal         VMSTATE_UINT32_ARRAY(regs, USBDWC3, USB_DWC3_R_MAX),
6538bbe61f3SVikram Garhwal         VMSTATE_UINT8(cfg.mode, USBDWC3),
6548bbe61f3SVikram Garhwal         VMSTATE_UINT32(cfg.dwc_usb3_user, USBDWC3),
6558bbe61f3SVikram Garhwal         VMSTATE_END_OF_LIST()
6568bbe61f3SVikram Garhwal     }
6578bbe61f3SVikram Garhwal };
6588bbe61f3SVikram Garhwal 
6598bbe61f3SVikram Garhwal static Property usb_dwc3_properties[] = {
6608bbe61f3SVikram Garhwal     DEFINE_PROP_UINT32("DWC_USB3_USERID", USBDWC3, cfg.dwc_usb3_user,
6618bbe61f3SVikram Garhwal                        0x12345678),
6628bbe61f3SVikram Garhwal     DEFINE_PROP_END_OF_LIST(),
6638bbe61f3SVikram Garhwal };
6648bbe61f3SVikram Garhwal 
usb_dwc3_class_init(ObjectClass * klass,void * data)6658bbe61f3SVikram Garhwal static void usb_dwc3_class_init(ObjectClass *klass, void *data)
6668bbe61f3SVikram Garhwal {
6678bbe61f3SVikram Garhwal     DeviceClass *dc = DEVICE_CLASS(klass);
6688bbe61f3SVikram Garhwal 
669*e3d08143SPeter Maydell     device_class_set_legacy_reset(dc, usb_dwc3_reset);
6708bbe61f3SVikram Garhwal     dc->realize = usb_dwc3_realize;
6718bbe61f3SVikram Garhwal     dc->vmsd = &vmstate_usb_dwc3;
6728bbe61f3SVikram Garhwal     device_class_set_props(dc, usb_dwc3_properties);
6738bbe61f3SVikram Garhwal }
6748bbe61f3SVikram Garhwal 
6758bbe61f3SVikram Garhwal static const TypeInfo usb_dwc3_info = {
6768bbe61f3SVikram Garhwal     .name          = TYPE_USB_DWC3,
6778bbe61f3SVikram Garhwal     .parent        = TYPE_SYS_BUS_DEVICE,
6788bbe61f3SVikram Garhwal     .instance_size = sizeof(USBDWC3),
6798bbe61f3SVikram Garhwal     .class_init    = usb_dwc3_class_init,
6808bbe61f3SVikram Garhwal     .instance_init = usb_dwc3_init,
6818bbe61f3SVikram Garhwal };
6828bbe61f3SVikram Garhwal 
usb_dwc3_register_types(void)6838bbe61f3SVikram Garhwal static void usb_dwc3_register_types(void)
6848bbe61f3SVikram Garhwal {
6858bbe61f3SVikram Garhwal     type_register_static(&usb_dwc3_info);
6868bbe61f3SVikram Garhwal }
6878bbe61f3SVikram Garhwal 
6888bbe61f3SVikram Garhwal type_init(usb_dwc3_register_types)
689