// SPDX-FileCopyrightText: 2024 Himbeer // // SPDX-License-Identifier: AGPL-3.0-or-later const std = @import("std"); const debug_console = @import("sbi/debug_console.zig"); const fdt = @import("fdt.zig"); const legacy = @import("sbi/legacy.zig"); const paging = @import("paging.zig"); const uart = @import("uart.zig"); provider: Provider, const Self = @This(); pub const Provider = union(enum) { uart_port: uart.Port.Writer, sbi_debug: debug_console.Writer, sbi_legacy: legacy.Writer, }; pub fn init(kmem: *paging.Table, dt: *const fdt.Tree, allocator: std.mem.Allocator) !void { if (uart.default == null) { try uart.init(kmem, dt, allocator); } } pub fn autoChoose() ?Self { if (uart.default) |uart_con| { return .{ .provider = .{ .uart_port = uart_con.writer() }, }; } if (debug_console.writer()) |sbi_con| { return .{ .provider = .{ .sbi_debug = sbi_con }, }; } else |_| {} if (legacy.writer()) |sbi_legacy_con| { return .{ .provider = .{ .sbi_legacy = sbi_legacy_con }, }; } else |_| {} return null; } pub fn writer(console: *const Self) std.io.AnyWriter { switch (console.provider) { .uart_port => return console.provider.uart_port.any(), .sbi_debug => return console.provider.sbi_debug.any(), .sbi_legacy => return console.provider.sbi_legacy.any(), } }