summaryrefslogtreecommitdiff
path: root/na/drivers/uart.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-05-13 15:50:37 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-05-13 15:50:37 +0800
commit7f92ecc3b1dd01dd12c72ba17bc8bf1652495d2c (patch)
treec85e3555994abaa418a9dd48a337210feb3eb12b /na/drivers/uart.cc
parent11053d1cab4fcaac7bf8808bd51647875cee1bf3 (diff)
downloadlume-7f92ecc3b1dd01dd12c72ba17bc8bf1652495d2c.tar.gz
lume-7f92ecc3b1dd01dd12c72ba17bc8bf1652495d2c.tar.xz
feat: enhance UART driver and FDT parser with MMU support and default UART settings
Diffstat (limited to 'na/drivers/uart.cc')
-rw-r--r--na/drivers/uart.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/na/drivers/uart.cc b/na/drivers/uart.cc
index 2e553d6..264ec6a 100644
--- a/na/drivers/uart.cc
+++ b/na/drivers/uart.cc
@@ -16,6 +16,11 @@
static uint64 g_uart_pa = 0;
static uint64 g_uart_size = 0;
static bool g_runtime_mapping_ready = false;
+static bool g_mmu_enabled = false;
+
+extern "C" void console_set_mmu_enabled() {
+ g_mmu_enabled = true;
+}
extern "C" void early_putc(char c) {
if (!g_uart_pa) return;
@@ -25,9 +30,14 @@ extern "C" void early_putc(char c) {
* reachable via the bootstrap fixed direct map from entry.S.
* After activation, switch to the runtime (possibly KASLR-slid) base.
*/
- uint64 uart_va = g_runtime_mapping_ready
- ? pa_to_va(phys_addr(g_uart_pa)).raw
- : boot_pa_to_va(phys_addr(g_uart_pa)).raw;
+ uint64 uart_va = 0;
+ if (g_runtime_mapping_ready) {
+ uart_va = pa_to_va(phys_addr(g_uart_pa)).raw;
+ } else if (!g_mmu_enabled) {
+ uart_va = g_uart_pa;
+ } else {
+ uart_va = boot_pa_to_va(phys_addr(g_uart_pa)).raw;
+ }
volatile auto* uart = reinterpret_cast<volatile uint8*>(uart_va);
*uart = static_cast<uint8>(c);