diff options
| author | Michal Meloun <mmel@FreeBSD.org> | 2025-02-02 14:22:34 +0000 |
|---|---|---|
| committer | Michal Meloun <mmel@FreeBSD.org> | 2026-02-22 21:13:33 +0000 |
| commit | d2dea8b46a8a61359c5185f4af3cc1761139bcb4 (patch) | |
| tree | daad7d3e8b781b1f1b04b44e4d33ebb7be2a105a | |
| parent | dfcd04c4c811096e5183a406d0f001a7c0ffa60a (diff) | |
arm: Add EARLY_PRINTF for ns8250 on arm/aarch64 platforms.
Reviewed by: adrian (previous version)
MFC after: 3 weeks
| -rw-r--r-- | sys/conf/options | 4 | ||||
| -rw-r--r-- | sys/dev/uart/uart_dev_ns8250.c | 42 |
2 files changed, 43 insertions, 3 deletions
diff --git a/sys/conf/options b/sys/conf/options index d5192db59181..4aeb15a489ea 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -1016,3 +1016,7 @@ PRESERVE_EARLY_KENV opt_global.h # Options for the Intel QuickAssist (QAT) driver QAT_DISABLE_SAFE_DC_MODE opt_qat.h + +# EARLY_PRINTF specific options fo NS8250 uart +UART_NS8250_EARLY_REG_IO_WIDTH opt_uart.h +UART_NS8250_EARLY_REG_SHIFT opt_uart.h diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c index c38d50e54ad8..b0c7cd4b44e1 100644 --- a/sys/dev/uart/uart_dev_ns8250.c +++ b/sys/dev/uart/uart_dev_ns8250.c @@ -89,9 +89,7 @@ SYSCTL_INT(_hw, OID_AUTO, uart_noise_threshold, CTLFLAG_RWTUN, * options EARLY_PRINTF=ns8250 */ #if CHECK_EARLY_PRINTF(ns8250) -#if !(defined(__amd64__) || defined(__i386__)) -#error ns8250 early putc is x86 specific as it uses inb/outb -#endif +#if (defined(__amd64__) || defined(__i386__)) static void uart_ns8250_early_putc(int c) { @@ -103,7 +101,45 @@ uart_ns8250_early_putc(int c) continue; outb(tx, c); } +#elif (defined(__arm__) || defined(__aarch64__)) +#ifndef UART_NS8250_EARLY_REG_IO_WIDTH +#error Option 'UART_NS8250_EARLY_REG_IO_WIDTH' is missing. +#endif +#ifndef UART_NS8250_EARLY_REG_SHIFT +#error Option 'UART_NS8250_EARLY_REG_SHIFT' is missing. +#endif + +#if UART_NS8250_EARLY_REG_IO_WIDTH == 1 +#define T uint8_t +#elif UART_NS8250_EARLY_REG_IO_WIDTH == 2 +#define T uint16_t +#elif UART_NS8250_EARLY_REG_IO_WIDTH == 4 +#define T uint32_t + +#else +#error Invalid/unsupported UART_NS8250_EARLY_REG_IO_WIDTH value +#endif + +#include <machine/machdep.h> + +static void +uart_ns8250_early_putc(int c) +{ + volatile T *stat; + volatile T *tx; + + stat = (T *)(socdev_va + (REG_LSR << UART_NS8250_EARLY_REG_SHIFT)); + tx = (T *)(socdev_va + (REG_DATA << UART_NS8250_EARLY_REG_SHIFT)); + + while ((*stat & LSR_THRE) == 0) + continue; + *tx = c & 0xff; +} +#else +#error ns8250 early putc is not implemented for current architecture +#endif early_putc_t *early_putc = uart_ns8250_early_putc; +#undef DTYPE #endif /* EARLY_PRINTF */ /* |
