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
>
6
#include <
drivers/uart/uart8250reg.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.
27
}
__packed
;
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
41
tegra210_uart_tx_flush
();
42
43
// Disable interrupts.
44
write8
(&
uart_ptr
->
ier
, 0);
45
// Force DTR and RTS to high.
46
write8
(&
uart_ptr
->
mcr
,
UART8250_MCR_DTR
|
UART8250_MCR_RTS
);
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.
55
write8
(&
uart_ptr
->
fcr
,
56
UART8250_FCR_FIFO_EN
|
57
UART8250_FCR_CLEAR_RCVR
|
58
UART8250_FCR_CLEAR_XMIT
);
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
{
74
if
(!
tegra210_uart_tst_byte
())
75
return
0;
76
return
read8
(&
uart_ptr
->
rbr
);
77
}
78
79
static
int
tegra210_uart_tst_byte
(
void
)
80
{
81
return
(
read8
(&
uart_ptr
->
lsr
) &
UART8250_LSR_DR
) ==
UART8250_LSR_DR
;
82
}
83
84
void
uart_init
(
unsigned
int
idx)
85
{
86
tegra210_uart_init
();
87
}
88
89
void
uart_tx_byte
(
unsigned
int
idx,
unsigned
char
data)
90
{
91
tegra210_uart_tx_byte
(data);
92
}
93
94
void
uart_tx_flush
(
unsigned
int
idx)
95
{
96
tegra210_uart_tx_flush
();
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
;
107
serial
.type =
LB_SERIAL_TYPE_MEMORY_MAPPED
;
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
115
lb_add_console
(
LB_TAG_CONSOLE_SERIAL8250MEM
, data);
116
}
write8
static void write8(void *addr, uint8_t val)
Definition:
mmio.h:30
read8
static uint8_t read8(const void *addr)
Definition:
mmio.h:12
get_uart_baudrate
unsigned int get_uart_baudrate(void)
Definition:
bmcinfo.c:167
LB_TAG_CONSOLE_SERIAL8250MEM
#define LB_TAG_CONSOLE_SERIAL8250MEM
Definition:
coreboot_tables.h:213
LB_SERIAL_TYPE_MEMORY_MAPPED
#define LB_SERIAL_TYPE_MEMORY_MAPPED
Definition:
coreboot_tables.h:179
coreboot_tables.h
lb_add_console
void lb_add_console(uint16_t consoletype, void *data)
Definition:
coreboot_table.c:110
lb_add_serial
void lb_add_serial(struct lb_serial *serial, void *data)
Definition:
coreboot_table.c:94
uart.h
mmio.h
serial
unsigned int serial
Definition:
edid.c:52
uart_init
void uart_init(unsigned int idx)
Definition:
uart.c:13
uart_tx_flush
void uart_tx_flush(unsigned int idx)
Definition:
uart.c:27
uart_rx_byte
unsigned char uart_rx_byte(unsigned int idx)
Definition:
uart.c:17
uart_fill_lb
void uart_fill_lb(void *data)
Definition:
uart.c:31
uart_tx_byte
void uart_tx_byte(unsigned int idx, unsigned char data)
Definition:
uart.c:22
uart_platform_refclk
unsigned int uart_platform_refclk(void)
Definition:
uart.c:85
__packed
struct mtk_uart __packed
uart_ptr
static struct tegra210_uart *const uart_ptr
Definition:
uart.c:29
tegra210_uart_tx_byte
static void tegra210_uart_tx_byte(unsigned char data)
Definition:
uart.c:61
tegra210_uart_tx_flush
static void tegra210_uart_tx_flush(void)
Definition:
uart.c:67
tegra210_uart_tst_byte
static int tegra210_uart_tst_byte(void)
Definition:
uart.c:79
tegra210_uart_init
static void tegra210_uart_init(void)
Definition:
uart.c:35
tegra210_uart_rx_byte
static unsigned char tegra210_uart_rx_byte(void)
Definition:
uart.c:72
stdint.h
uint32_t
unsigned int uint32_t
Definition:
stdint.h:14
uint8_t
unsigned char uint8_t
Definition:
stdint.h:8
lb_serial
Definition:
coreboot_tables.h:175
tegra210_uart
Definition:
uart.c:9
tegra210_uart::rbr
uint32_t rbr
Definition:
uart.c:12
tegra210_uart::fcr
uint32_t fcr
Definition:
uart.c:21
tegra210_uart::lcr
uint32_t lcr
Definition:
uart.c:23
tegra210_uart::mcr
uint32_t mcr
Definition:
uart.c:24
tegra210_uart::msr
uint32_t msr
Definition:
uart.c:26
tegra210_uart::dlm
uint32_t dlm
Definition:
uart.c:17
tegra210_uart::dll
uint32_t dll
Definition:
uart.c:13
tegra210_uart::ier
uint32_t ier
Definition:
uart.c:16
tegra210_uart::thr
uint32_t thr
Definition:
uart.c:11
tegra210_uart::lsr
uint32_t lsr
Definition:
uart.c:25
tegra210_uart::iir
uint32_t iir
Definition:
uart.c:20
uart8250reg.h
UART8250_LCR_WLS_8
#define UART8250_LCR_WLS_8
Definition:
uart8250reg.h:44
UART8250_LCR_DLAB
#define UART8250_LCR_DLAB
Definition:
uart8250reg.h:50
UART8250_LSR_DR
#define UART8250_LSR_DR
Definition:
uart8250reg.h:67
UART8250_FCR_CLEAR_RCVR
#define UART8250_FCR_CLEAR_RCVR
Definition:
uart8250reg.h:30
UART8250_FCR_CLEAR_XMIT
#define UART8250_FCR_CLEAR_XMIT
Definition:
uart8250reg.h:31
UART8250_LSR_TEMT
#define UART8250_LSR_TEMT
Definition:
uart8250reg.h:73
UART8250_MCR_DTR
#define UART8250_MCR_DTR
Definition:
uart8250reg.h:53
UART8250_FCR_FIFO_EN
#define UART8250_FCR_FIFO_EN
Definition:
uart8250reg.h:29
UART8250_MCR_RTS
#define UART8250_MCR_RTS
Definition:
uart8250reg.h:54
UART8250_LSR_THRE
#define UART8250_LSR_THRE
Definition:
uart8250reg.h:72
src
soc
nvidia
tegra210
uart.c
Generated by
1.9.1