coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
uart.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <device/mmio.h>
4 #include <device/pci_ops.h>
5 #include <device/pci_def.h>
6 #include <fsp/soc_binding.h>
7 #include <commonlib/helpers.h>
8 
9 #include <soc/bootblock.h>
10 #include <soc/gpio_defs.h>
11 #include <soc/uart.h>
12 
13 static uint16_t legacy_uart_ioadr_tab[] = {0x3F8, 0x2F8, 0x3E8, 0x2E8};
14 
15 #define ELEM_OF_UART_TAB ARRAY_SIZE(legacy_uart_ioadr_tab)
16 
17 static void pci_early_hsuart_device_probe(u8 bus, u8 dev, u8 func,
18  u32 mmio_base)
19 {
20  register uint16_t reg16;
21  pci_devfn_t uart_dev = PCI_DEV(bus, dev, func);
22 
23  /* We're using MMIO for HSUARTs. This section is needed for logging
24  * from FSP only
25  */
26  /* Decode IOBASE at IOBA (BAR0). */
27  reg16 = pci_read_config16(uart_dev, PCI_BASE_ADDRESS_0) | mmio_base;
28  pci_write_config16(uart_dev, PCI_BASE_ADDRESS_0, reg16);
29 
30 #if (CONFIG(NON_LEGACY_UART_MODE))
31  /* Decode MMIO at MEMBA (BAR1) */
33  CONFIG_CONSOLE_UART_BASE_ADDRESS +
34  SIZE_OF_HSUART_RES * func);
35 #endif
36 
37  /* Enable memory/io space and allow to initiate
38  * a transaction as a master
39  */
41  pci_read_config16(uart_dev, PCI_COMMAND) |
42 #if (CONFIG(NON_LEGACY_UART_MODE))
44 #endif
46 
47 #if (CONFIG(CONSOLE_SERIAL_230400))
48  /* Change the highest speed to 230400 */
49  uint32_t *psr_reg =
50  (uint32_t *)(CONFIG_CONSOLE_UART_BASE_ADDRESS +
52  *psr_reg >>= 1;
53 #endif
54 }
55 
56 static void early_config_gpio(void)
57 {
58  uint32_t reg32;
59 
60  // HSUART0:
61  // UART0_RXD
62  reg32 = read32(
64  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
66  reg32 &= ~B_PCH_GPIO_PAD_MODE;
67  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_1
71  reg32);
72  }
73  // UART0_TXD
74  reg32 = read32(
76  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
78  reg32 &= ~B_PCH_GPIO_PAD_MODE;
79  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_1
83  reg32);
84  }
85  // UART0_CTS
86  reg32 = read32((void *)PCH_PCR_ADDRESS(PID_GPIOCOM1,
88  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
90  reg32 &= ~B_PCH_GPIO_PAD_MODE;
91  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_2
95  reg32);
96  }
97  // UART0_RTS
98  reg32 = read32((void *)PCH_PCR_ADDRESS(PID_GPIOCOM1,
100  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
102  reg32 &= ~B_PCH_GPIO_PAD_MODE;
103  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_3
107  reg32);
108  }
109 
110  // HSUART1:
111  // UART1_RXD
112  reg32 = read32(
114  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
116  reg32 &= ~B_PCH_GPIO_PAD_MODE;
117  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_1
121  reg32);
122  }
123  // UART1_TXD
124  reg32 = read32(
126  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
128  reg32 &= ~B_PCH_GPIO_PAD_MODE;
129  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_1
133  reg32);
134  }
135  // UART1_CTS
136  reg32 = read32((void *)PCH_PCR_ADDRESS(PID_GPIOCOM1,
138  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
140  reg32 &= ~B_PCH_GPIO_PAD_MODE;
141  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_1
145  reg32);
146  }
147  // UART1_RTS
148  reg32 = read32((void *)PCH_PCR_ADDRESS(PID_GPIOCOM1,
150  if (((reg32 & B_PCH_GPIO_PAD_MODE) >> N_PCH_GPIO_PAD_MODE) !=
152  reg32 &= ~B_PCH_GPIO_PAD_MODE;
153  reg32 |= (UINT32)(V_PCH_GPIO_PAD_MODE_NAT_1
157  reg32);
158  }
159 }
160 
161 void early_uart_init(void)
162 {
163  register int i;
164 
165  /* Check: do we have enough elements to init. ? */
167 
168  /* HSUART(B0:D26:0-1) GPIO init. */
170 
171  for (i = DENVERTON_UARTS_TO_INI - 1; i >= 0; --i) {
172  pci_early_hsuart_device_probe(0, CONFIG_HSUART_DEV, i,
174  }
175 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define PCH_PCR_ADDRESS(Pid, Offset)
Definition: pcr.h:10
@ PID_GPIOCOM1
Definition: pcr.h:18
@ CONFIG
Definition: dsi_common.h:201
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
#define PCI_COMMAND_IO
Definition: pci_def.h:11
#define PCI_COMMAND_MASTER
Definition: pci_def.h:13
#define PCI_COMMAND_MEMORY
Definition: pci_def.h:12
#define PCI_BASE_ADDRESS_0
Definition: pci_def.h:63
#define PCI_COMMAND
Definition: pci_def.h:10
#define PCI_BASE_ADDRESS_1
Definition: pci_def.h:64
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
u32 pci_devfn_t
Definition: pci_type.h:8
static void pci_early_hsuart_device_probe(u8 bus, u8 dev, u8 func, u32 mmio_base)
Definition: uart.c:17
#define ELEM_OF_UART_TAB
Definition: uart.c:15
static uint16_t legacy_uart_ioadr_tab[]
Definition: uart.c:13
void early_uart_init(void)
Definition: uart.c:161
static void early_config_gpio(void)
Definition: uart.c:56
#define R_PAD_CFG_DW0_UART0_RXD
Definition: gpio_defs.h:276
#define V_PCH_GPIO_PAD_MODE_NAT_2
Definition: gpio_defs.h:192
#define R_PAD_CFG_DW0_SATA0_SDOUT
Definition: gpio_defs.h:296
#define R_PAD_CFG_DW0_PCIE_CLKREQ5_N
Definition: gpio_defs.h:264
#define R_PAD_CFG_DW0_UART1_TXD
Definition: gpio_defs.h:288
#define B_PCH_GPIO_PAD_MODE
Definition: gpio_defs.h:188
#define R_PAD_CFG_DW0_UART1_RXD
Definition: gpio_defs.h:284
#define N_PCH_GPIO_PAD_MODE
Definition: gpio_defs.h:189
#define V_PCH_GPIO_PAD_MODE_NAT_1
Definition: gpio_defs.h:191
#define V_PCH_GPIO_PAD_MODE_NAT_3
Definition: gpio_defs.h:193
#define R_PAD_CFG_DW0_UART0_TXD
Definition: gpio_defs.h:280
#define R_PAD_CFG_DW0_SATA1_SDOUT
Definition: gpio_defs.h:292
#define R_PAD_CFG_DW0_SMB3_CLTT_CLK
Definition: gpio_defs.h:260
#define PSR_OFFSET
Definition: uart.h:8
#define BUILD_BUG_ON(condition)
Definition: uart.h:11
#define DENVERTON_UARTS_TO_INI
Definition: uart.h:7
#define SIZE_OF_HSUART_RES
Definition: uart.h:6
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
uint32_t u32
Definition: stdint.h:51
uint8_t u8
Definition: stdint.h:45
Definition: device.h:76