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 
8 struct tegra124_uart {
9  union {
10  uint32_t thr; // Transmit holding register.
11  uint32_t rbr; // Receive buffer register.
12  uint32_t dll; // Divisor latch lsb.
13  };
14  union {
15  uint32_t ier; // Interrupt enable register.
16  uint32_t dlm; // Divisor latch msb.
17  };
18  union {
19  uint32_t iir; // Interrupt identification register.
20  uint32_t fcr; // FIFO control register.
21  };
22  uint32_t lcr; // Line control register.
23  uint32_t mcr; // Modem control register.
24  uint32_t lsr; // Line status register.
25  uint32_t msr; // Modem status register.
27 
28 static void tegra124_uart_tx_flush(struct tegra124_uart *uart_ptr);
30 
32 {
33  // Use a hardcoded divisor for now.
34  const unsigned int divisor = 221;
35  const uint8_t line_config = UART8250_LCR_WLS_8; // 8n1
36 
38 
39  // Disable interrupts.
40  write8(&uart_ptr->ier, 0);
41  // Force DTR and RTS to high.
43  // Set line configuration, access divisor latches.
44  write8(&uart_ptr->lcr, UART8250_LCR_DLAB | line_config);
45  // Set the divisor.
46  write8(&uart_ptr->dll, divisor & 0xff);
47  write8(&uart_ptr->dlm, (divisor >> 8) & 0xff);
48  // Hide the divisor latches.
49  write8(&uart_ptr->lcr, line_config);
50  // Enable FIFOs, and clear receive and transmit.
53 }
54 
55 static unsigned char tegra124_uart_rx_byte(struct tegra124_uart *uart_ptr)
56 {
58  return 0;
59  return read8(&uart_ptr->rbr);
60 }
61 
62 static void tegra124_uart_tx_byte(struct tegra124_uart *uart_ptr, unsigned char data)
63 {
64  while (!(read8(&uart_ptr->lsr) & UART8250_LSR_THRE));
65  write8(&uart_ptr->thr, data);
66 }
67 
69 {
70  while (!(read8(&uart_ptr->lsr) & UART8250_LSR_TEMT));
71 }
72 
74 {
76 }
77 
78 uintptr_t uart_platform_base(unsigned int idx)
79 {
80  //Default to UART A
81  unsigned int base = 0x70006000;
82  //UARTs A - E are mapped as index 0 - 4
83  if ((idx < 5)) {
84  if (idx != 1) { //not UART B
85  base += idx * 0x100;
86  } else {
87  base += 0x40;
88  }
89  }
90  return base;
91 }
92 
93 void uart_init(unsigned int idx)
94 {
97 }
98 
99 unsigned char uart_rx_byte(unsigned int idx)
100 {
103 }
104 
105 void uart_tx_byte(unsigned int idx, unsigned char data)
106 {
109 }
110 
111 void uart_tx_flush(unsigned int idx)
112 {
115 }
116 
117 void uart_fill_lb(void *data)
118 {
119  struct lb_serial serial;
121  serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
122  serial.baud = get_uart_baudrate();
123  serial.regwidth = 4;
124  serial.input_hertz = uart_platform_refclk();
125  serial.uart_pci_addr = CONFIG_UART_PCI_ADDR;
126  lb_add_serial(&serial, data);
127 
129 }
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)
static void * uart_platform_baseptr(unsigned int idx)
Definition: uart.h:57
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
uintptr_t uart_platform_base(unsigned int idx)
Definition: uart.c:8
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
uintptr_t base
Definition: uart.c:17
unsigned int uart_platform_refclk(void)
Definition: uart.c:85
struct mtk_uart __packed
static struct mtk_uart *const uart_ptr
Definition: uart.c:67
static void tegra124_uart_init(struct tegra124_uart *uart_ptr)
Definition: uart.c:31
static void tegra124_uart_tx_flush(struct tegra124_uart *uart_ptr)
Definition: uart.c:68
static int tegra124_uart_tst_byte(struct tegra124_uart *uart_ptr)
Definition: uart.c:73
static void tegra124_uart_tx_byte(struct tegra124_uart *uart_ptr, unsigned char data)
Definition: uart.c:62
static unsigned char tegra124_uart_rx_byte(struct tegra124_uart *uart_ptr)
Definition: uart.c:55
unsigned int uint32_t
Definition: stdint.h:14
unsigned long uintptr_t
Definition: stdint.h:21
unsigned char uint8_t
Definition: stdint.h:8
uint32_t mcr
Definition: uart.c:29
uint32_t thr
Definition: uart.c:14
uint32_t ier
Definition: uart.c:19
uint32_t dlm
Definition: uart.c:20
uint32_t lsr
Definition: uart.c:33
uint32_t rbr
Definition: uart.c:15
uint32_t dll
Definition: uart.c:16
uint32_t lcr
Definition: uart.c:27
uint32_t fcr
Definition: uart.c:24
uint32_t fcr
Definition: uart.c:20
uint32_t dlm
Definition: uart.c:16
uint32_t thr
Definition: uart.c:10
uint32_t mcr
Definition: uart.c:23
uint32_t dll
Definition: uart.c:12
uint32_t rbr
Definition: uart.c:11
uint32_t lsr
Definition: uart.c:24
uint32_t lcr
Definition: uart.c:22
uint32_t iir
Definition: uart.c:19
uint32_t ier
Definition: uart.c:15
uint32_t msr
Definition: uart.c:25
#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