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-only */
2 
3 #include <device/mmio.h>
4 #include <boot/coreboot_tables.h>
5 #include <console/uart.h>
7 #include <stdint.h>
8 
9 struct tegra210_uart {
10  union {
11  uint32_t thr; // Transmit holding register.
12  uint32_t rbr; // Receive buffer register.
13  uint32_t dll; // Divisor latch lsb.
14  };
15  union {
16  uint32_t ier; // Interrupt enable register.
17  uint32_t dlm; // Divisor latch msb.
18  };
19  union {
20  uint32_t iir; // Interrupt identification register.
21  uint32_t fcr; // FIFO control register.
22  };
23  uint32_t lcr; // Line control register.
24  uint32_t mcr; // Modem control register.
25  uint32_t lsr; // Line status register.
26  uint32_t msr; // Modem status register.
28 
29 static struct tegra210_uart * const uart_ptr =
30  (void *)CONFIG_CONSOLE_SERIAL_TEGRA210_UART_ADDRESS;
31 
32 static void tegra210_uart_tx_flush(void);
33 static int tegra210_uart_tst_byte(void);
34 
35 static void tegra210_uart_init(void)
36 {
37  // Use a hardcoded divisor for now.
38  const unsigned int divisor = 221;
39  const uint8_t line_config = UART8250_LCR_WLS_8; // 8n1
40 
42 
43  // Disable interrupts.
44  write8(&uart_ptr->ier, 0);
45  // Force DTR and RTS to high.
47  // Set line configuration, access divisor latches.
48  write8(&uart_ptr->lcr, UART8250_LCR_DLAB | line_config);
49  // Set the divisor.
50  write8(&uart_ptr->dll, divisor & 0xff);
51  write8(&uart_ptr->dlm, (divisor >> 8) & 0xff);
52  // Hide the divisor latches.
53  write8(&uart_ptr->lcr, line_config);
54  // Enable FIFOs, and clear receive and transmit.
59 }
60 
61 static void tegra210_uart_tx_byte(unsigned char data)
62 {
63  while (!(read8(&uart_ptr->lsr) & UART8250_LSR_THRE));
64  write8(&uart_ptr->thr, data);
65 }
66 
67 static void tegra210_uart_tx_flush(void)
68 {
69  while (!(read8(&uart_ptr->lsr) & UART8250_LSR_TEMT));
70 }
71 
72 static unsigned char tegra210_uart_rx_byte(void)
73 {
75  return 0;
76  return read8(&uart_ptr->rbr);
77 }
78 
79 static int tegra210_uart_tst_byte(void)
80 {
82 }
83 
84 void uart_init(unsigned int idx)
85 {
87 }
88 
89 void uart_tx_byte(unsigned int idx, unsigned char data)
90 {
92 }
93 
94 void uart_tx_flush(unsigned int idx)
95 {
97 }
98 
99 unsigned char uart_rx_byte(unsigned int idx)
100 {
101  return tegra210_uart_rx_byte();
102 }
103 
104 void uart_fill_lb(void *data)
105 {
106  struct lb_serial serial;
108  serial.baseaddr = CONFIG_CONSOLE_SERIAL_TEGRA210_UART_ADDRESS;
109  serial.baud = get_uart_baudrate();
110  serial.regwidth = 4;
111  serial.input_hertz = uart_platform_refclk();
112  serial.uart_pci_addr = CONFIG_UART_PCI_ADDR;
113  lb_add_serial(&serial, data);
114 
116 }
static void write8(void *addr, uint8_t val)
Definition: mmio.h:30
static uint8_t read8(const void *addr)
Definition: mmio.h:12
unsigned int get_uart_baudrate(void)
Definition: bmcinfo.c:167
#define LB_TAG_CONSOLE_SERIAL8250MEM
#define LB_SERIAL_TYPE_MEMORY_MAPPED
void lb_add_console(uint16_t consoletype, void *data)
void lb_add_serial(struct lb_serial *serial, void *data)
unsigned int serial
Definition: edid.c:52
void uart_init(unsigned int idx)
Definition: uart.c:13
void uart_tx_flush(unsigned int idx)
Definition: uart.c:27
unsigned char uart_rx_byte(unsigned int idx)
Definition: uart.c:17
void uart_fill_lb(void *data)
Definition: uart.c:31
void uart_tx_byte(unsigned int idx, unsigned char data)
Definition: uart.c:22
unsigned int uart_platform_refclk(void)
Definition: uart.c:85
struct mtk_uart __packed
static struct tegra210_uart *const uart_ptr
Definition: uart.c:29
static void tegra210_uart_tx_byte(unsigned char data)
Definition: uart.c:61
static void tegra210_uart_tx_flush(void)
Definition: uart.c:67
static int tegra210_uart_tst_byte(void)
Definition: uart.c:79
static void tegra210_uart_init(void)
Definition: uart.c:35
static unsigned char tegra210_uart_rx_byte(void)
Definition: uart.c:72
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8
uint32_t rbr
Definition: uart.c:12
uint32_t fcr
Definition: uart.c:21
uint32_t lcr
Definition: uart.c:23
uint32_t mcr
Definition: uart.c:24
uint32_t msr
Definition: uart.c:26
uint32_t dlm
Definition: uart.c:17
uint32_t dll
Definition: uart.c:13
uint32_t ier
Definition: uart.c:16
uint32_t thr
Definition: uart.c:11
uint32_t lsr
Definition: uart.c:25
uint32_t iir
Definition: uart.c:20
#define UART8250_LCR_WLS_8
Definition: uart8250reg.h:44
#define UART8250_LCR_DLAB
Definition: uart8250reg.h:50
#define UART8250_LSR_DR
Definition: uart8250reg.h:67
#define UART8250_FCR_CLEAR_RCVR
Definition: uart8250reg.h:30
#define UART8250_FCR_CLEAR_XMIT
Definition: uart8250reg.h:31
#define UART8250_LSR_TEMT
Definition: uart8250reg.h:73
#define UART8250_MCR_DTR
Definition: uart8250reg.h:53
#define UART8250_FCR_FIFO_EN
Definition: uart8250reg.h:29
#define UART8250_MCR_RTS
Definition: uart8250reg.h:54
#define UART8250_LSR_THRE
Definition: uart8250reg.h:72