coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
usb.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <delay.h>
6 #include <soc/usb.h>
7 #include <soc/clock.h>
8 #include <types.h>
9 
10 /* USB BASE ADDRESS */
11 #define USB_HOST0_DWC3_BASE 0x758C100
12 #define USB3_USB30_QSCRATCH_BASE 0x7678800
13 #define USB2_FEMTO_PHY_PRI_BASE 0x007A000
14 #define USB_HOST1_DWC3_BASE 0x78CC100
15 #define USB2_USB30_QSCRATCH_BASE 0x79B8800
16 #define USB2_FEMTO_PHY_SEC_BASE 0x007C000
17 
18 struct usb_qscratch {
19  u8 rsvd0[8];
21 
22 };
23 check_member(usb_qscratch, qscratch_cfg_reg, 0x08);
24 
26  u8 rsvd1[116];
30  u8 rsvd2[12];
38  u8 rsvd4[24];
40  u8 rsvd5[36];
42 };
43 check_member(usb_usb2_phy_dig, utmi_ctrl5, 0x74);
44 check_member(usb_usb2_phy_dig, phy_ctrl1, 0x8C);
45 check_member(usb_usb2_phy_dig, override_x0, 0x98);
46 check_member(usb_usb2_phy_dig, tcsr_ctrl, 0xC0);
47 check_member(usb_usb2_phy_dig, refclk_ctrl, 0xE8);
48 
49 struct usb_dwc3 {
50  u32 sbuscfg0;
51  u32 sbuscfg1;
52  u32 txthrcfg;
53  u32 rxthrcfg;
54  u32 ctl;
55  u32 pmsts;
56  u32 sts;
57  u32 uctl1;
58  u32 snpsid;
59  u32 gpio;
60  u32 uid;
61  u32 uctl;
63  u64 prtbimap;
64  u8 reserved1[32];
66  u32 dbgltssm;
67  u32 dbglnmcc;
68  u32 dbgbmu;
69  u32 dbglspmux;
70  u32 dbglsp;
75  u8 reserved2[112];
77  u8 reserved3[60];
79  u8 reserved4[60];
81  u8 reserved5[60];
83  u8 reserved6[60];
84 };
85 check_member(usb_dwc3, usb3pipectl, 0x1c0);
86 
87 struct usb_dwc3_cfg {
88  struct usb_dwc3 *usb_host_dwc3;
93  u32 *usb3_bcr;
95 };
96 
97 static struct usb_dwc3_cfg usb_host_base[2] = {
98  [HSUSB_SS_PORT_0] = {
101  .usb2_phy_bcr = (void *)GCC_USB_HS_PHY_CFG_AHB_BCR,
103  .usb3_bcr = (void *)GCC_USB_30_BCR,
105  },
106  [HSUSB_HS_PORT_1] = {
107  .usb_host_dwc3 = (void *)USB_HOST1_DWC3_BASE,
109  .usb2_phy_bcr = (void *)GCC_QUSB2_PHY_BCR,
111  .usb3_bcr = (void *)GCC_USB_HS_BCR,
113  },
114 };
115 
117 {
118  struct usb_dwc3_cfg *dwc3 = &usb_host_base[port];
119 
120  /* Put Core in Reset */
121  printk(BIOS_INFO, "Starting DWC3 reset for USB%d\n", port);
122 
123  /* Assert Core reset */
124  clock_reset_bcr(dwc3->usb3_bcr, 1);
125 }
126 
128 {
129  /* Override disconnect & squelch threshold values */
132 
133  /* Override HS transmitter Pre-emphasis values */
136 
137  /* Override HS transmitter Rise/Fall time values */
140 
141  /* Override FS/LS Source impedance values */
144 }
145 
146 static void hs_usb_phy_init(struct usb_dwc3_cfg *dwc3)
147 {
155 
156  if (dwc3->board_data)
157  /* Override board specific PHY tuning values */
159 
164  udelay(20);
166  write8(&dwc3->usb2_phy_dig->phy_ctrl2,
168 }
169 
170 static void setup_dwc3(struct usb_dwc3 *dwc3)
171 {
172  /* core exits U1/U2/U3 only in PHY power state P1/P2/P3 respectively */
173  clrsetbits32(&dwc3->usb3pipectl,
176 
180 
181  /* configure controller in Host mode */
184  printk(BIOS_INFO, "Configure USB in Host mode\n");
185 }
186 
187 /* Initialization of DWC3 Core and PHY */
189 {
190  struct usb_dwc3_cfg *dwc3 = &usb_host_base[port];
191  u32 val;
192 
193  printk(BIOS_INFO, "Setting up USB HOST%d controller.\n", port);
194 
195  dwc3->board_data = board_data;
196 
197  /* Clear core reset. */
198  clock_reset_bcr(dwc3->usb3_bcr, 0);
199 
200  if (port == HSUSB_SS_PORT_0) {
201  /* Set PHY reset. */
202  setbits32(&dwc3->usb2_phy_bcr, BIT(1));
203  udelay(15);
204  /* Clear PHY reset. */
205  clrbits32(&dwc3->usb2_phy_bcr, BIT(1));
206  } else {
207  clock_reset_bcr(dwc3->usb2_phy_bcr, 1);
208  udelay(15);
209  clock_reset_bcr(dwc3->usb2_phy_bcr, 0);
210  }
211  udelay(100);
212 
213  /* Initialize PHYs */
214  hs_usb_phy_init(dwc3);
215 
216  if (port == HSUSB_SS_PORT_0) {
217  /* Set PHY POR reset. */
218  setbits32(&dwc3->usb2_phy_por_bcr, BIT(0));
219  val = read8(&dwc3->usb2_phy_dig->ctrl_common0);
220  val &= ~(0x4);
222  udelay(20);
223  /* Clear PHY POR reset. */
224  clrbits32(&dwc3->usb2_phy_por_bcr, BIT(0));
225  } else {
227  val = read8(&dwc3->usb2_phy_dig->ctrl_common0);
228  val &= ~(0x4);
230  udelay(20);
232  }
233  udelay(100);
234 
235  setup_dwc3(dwc3->usb_host_dwc3);
236 
237  /*
238  * Below sequence is used when dwc3 operates without
239  * SSPHY and only HS/FS/LS modes are supported.
240  */
241 
242  /* Configure dwc3 to use UTMI clock as PIPE clock not present */
245  udelay(2);
248  udelay(3);
251 
252  printk(BIOS_INFO, "DWC3 and PHY setup finished\n");
253 }
static void write8(void *addr, uint8_t val)
Definition: mmio.h:30
static uint8_t read8(const void *addr)
Definition: mmio.h:12
#define printk(level,...)
Definition: stdlib.h:16
#define BIT(nr)
Definition: ec_commands.h:45
port
Definition: i915.h:29
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#define clrbits32(addr, clear)
Definition: mmio.h:26
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define DWC3_GUSB3PIPECTL_DELAYP1TRANS
Definition: usb_common.h:11
#define DWC3_GCTL_PRTCAP_HOST
Definition: usb_common.h:15
#define PIPE3_PHYSTATUS_SW
Definition: usb_common.h:7
#define PIPE_UTMI_CLK_DIS
Definition: usb_common.h:8
#define DWC3_GCTL_U2EXIT_LFPS
Definition: usb_common.h:28
#define PIPE_UTMI_CLK_SEL
Definition: usb_common.h:6
#define DWC3_GUSB3PIPECTL_UX_EXIT_IN_PX
Definition: usb_common.h:12
void setup_usb_host(void)
Definition: usb.c:153
check_member(utmip_ctlr, pmc_wakeup, 0x84c - 0x800)
void clock_reset_bcr(void *bcr_addr, bool assert)
Definition: clock.c:54
#define DWC3_GCTL_PRTCAP_OTG
Definition: usb.c:42
#define DWC3_GCTL_SCALEDOWN_MASK
Definition: usb.c:54
#define DWC3_GCTL_DISSCRAMBLE
Definition: usb.c:55
#define DWC3_GCTL_DSBLCLKGTNG
Definition: usb.c:56
#define DWC3_GCTL_PRTCAPDIR(n)
Definition: usb.c:41
#define GCC_USB_30_BCR
Definition: clock.h:18
#define GCC_QUSB2_PHY_BCR
Definition: clock.h:21
#define GCC_USB_HS_BCR
Definition: clock.h:17
#define GCC_USB_HS_PHY_CFG_AHB_BCR
USB BCR registers.
Definition: clock.h:16
#define GCC_USB2_HS_PHY_ONLY_BCR
Definition: clock.h:20
#define GCC_USB2A_PHY_BCR
Definition: clock.h:19
#define USB2PHY_TCSR_CTRL
Definition: usb.h:34
#define QUSB2PHY_HS_PHY_CTRL_COMMON0
Definition: usb.h:42
#define USB2PHY_HS_PHY_CTRL1
Definition: usb.h:41
#define USB2PHY_PARAMETER_OVERRIDE_X1
Definition: usb.h:38
#define USB2PHY_PARAMETER_OVERRIDE_X2
Definition: usb.h:39
#define USB2PHY_PARAMETER_OVERRIDE_X0
Definition: usb.h:37
usb_port
Definition: usb.h:56
@ HSUSB_SS_PORT_0
Definition: usb.h:57
@ HSUSB_HS_PORT_1
Definition: usb.h:58
#define USB2PHY_UTMI_CTRL5_POR_CLEAR
Definition: usb.h:45
#define USB2PHY_UTMI_CTRL5
Definition: usb.h:36
#define USB2PHY_REFCLK_CTRL
Definition: usb.h:35
#define USB2PHY_HS_PHY_CTRL2_SUSPEND_N_SEL
Definition: usb.h:46
#define QUSB2PHY_HS_PHY_CTRL_COMMON1
Definition: usb.h:43
#define USB2PHY_PARAMETER_OVERRIDE_X3
Definition: usb.h:40
#define USB2PHY_HS_PHY_CTRL2
Definition: usb.h:44
#define USB2_FEMTO_PHY_PRI_BASE
Definition: usb.c:13
#define USB_HOST1_DWC3_BASE
Definition: usb.c:14
static struct usb_dwc3_cfg usb_host_base[2]
Definition: usb.c:97
#define USB2_FEMTO_PHY_SEC_BASE
Definition: usb.c:16
static void usb2_phy_override_phy_params(struct usb_dwc3_cfg *dwc3)
Definition: usb.c:127
static void hs_usb_phy_init(struct usb_dwc3_cfg *dwc3)
Definition: usb.c:146
#define USB3_USB30_QSCRATCH_BASE
Definition: usb.c:12
void reset_usb(enum usb_port port)
Definition: usb.c:116
static void setup_dwc3(struct usb_dwc3 *dwc3)
Definition: usb.c:170
#define USB2_USB30_QSCRATCH_BASE
Definition: usb.c:15
#define USB_HOST0_DWC3_BASE
Definition: usb.c:11
uint64_t u64
Definition: stdint.h:54
uint32_t u32
Definition: stdint.h:51
uint8_t u8
Definition: stdint.h:45
u8 parameter_override_x2
Definition: snps_usb_phy.h:10
u8 parameter_override_x0
Definition: snps_usb_phy.h:8
u8 parameter_override_x3
Definition: snps_usb_phy.h:11
u8 parameter_override_x1
Definition: snps_usb_phy.h:9
u32 * usb2_phy_bcr
Definition: usb.c:91
struct usb_usb2_phy_dig * usb2_phy_dig
Definition: usb.c:89
struct usb_board_data * board_data
Definition: usb.c:94
struct usb_dwc3 * usb_host_dwc3
Definition: usb.c:47
u32 * usb3_bcr
Definition: usb.c:48
u32 * usb2_phy_por_bcr
Definition: usb.c:92
struct usb_qscratch * usb_qscratch_reg
Definition: usb.c:90
Definition: usb.c:9
u32 usb2phycfg
Definition: usb.c:36
u8 reserved4[60]
Definition: usb.c:39
u32 sts
Definition: usb.c:16
u64 prtbimap_fs
Definition: usb.c:34
u64 buserraddr
Definition: usb.c:22
u32 dbgfifospace
Definition: usb.c:25
u32 txthrcfg
Definition: usb.c:12
u32 dbgltssm
Definition: usb.c:26
u8 reserved6[60]
Definition: usb.c:78
u32 dbgbmu
Definition: usb.c:28
u32 uctl1
Definition: usb.c:17
u32 sbuscfg1
Definition: usb.c:11
u32 uctl
Definition: usb.c:21
u32 gpio
Definition: usb.c:19
u32 uid
Definition: usb.c:20
u64 prtbimap
Definition: usb.c:23
u32 rxthrcfg
Definition: usb.c:13
u64 prtbimap_hs
Definition: usb.c:33
u32 ctl
Definition: usb.c:14
u32 pmsts
Definition: usb.c:15
u32 dbgepinfo1
Definition: usb.c:32
u32 dbglspmux
Definition: usb.c:29
u32 dbglnmcc
Definition: usb.c:27
u32 usb3pipectl
Definition: usb.c:40
u8 reserved5[60]
Definition: usb.c:41
u32 usb2i2cctl
Definition: usb.c:73
u32 dbgepinfo0
Definition: usb.c:31
u8 reserved1[32]
Definition: usb.c:24
u32 dbglsp
Definition: usb.c:30
u32 usb2phyacc
Definition: usb.c:38
u32 snpsid
Definition: usb.c:18
u32 sbuscfg0
Definition: usb.c:10
u8 reserved3[124]
Definition: usb.c:37
u8 reserved2[112]
Definition: usb.c:35
u32 * qscratch_cfg_reg
Definition: usb.c:20
u8 rsvd0[8]
Definition: usb.c:19
u8 rsvd1[116]
Definition: usb.c:26
u8 rsvd5[36]
Definition: usb.c:40
u32 phy_ctrl2
Definition: usb.c:32
u32 tcsr_ctrl
Definition: usb.c:39
u32 phy_ctrl1
Definition: usb.c:31
u8 rsvd4[24]
Definition: usb.c:38
u32 override_x2
Definition: usb.c:36
u32 override_x0
Definition: usb.c:34
u32 utmi_ctrl5
Definition: usb.c:27
u32 override_x3
Definition: usb.c:37
u8 rsvd2[12]
Definition: usb.c:30
u32 ctrl_common0
Definition: usb.c:28
u32 override_x1
Definition: usb.c:35
u32 ctrl_common1
Definition: usb.c:29
u32 refclk_ctrl
Definition: usb.c:41
u8 val
Definition: sys.c:300
void udelay(uint32_t us)
Definition: udelay.c:15