feat: devices via caps (BootInfo, init assigns devices, drivers map MMIO/DMA themselves, IRQ-driven input); drop boot device wiring and info pages; headless display fallback
This commit is contained in:
@@ -15,9 +15,18 @@ const VIRTIO_IRQ_BASE: u16 = 1;
|
||||
const VIRTIO_SLOT_SIZE: usize = 0x1000;
|
||||
const VIRTIO_SLOTS: usize = VIRTIO_SIZE / VIRTIO_SLOT_SIZE;
|
||||
|
||||
pub const BOARD_DEVICES: usize = 1 + VIRTIO_SLOTS;
|
||||
|
||||
/// What each entry of `devices()` is, for init's BootInfo.
|
||||
pub fn kinds() -> [u64; BOARD_DEVICES] {
|
||||
let mut kinds = [types::bootinfo::KIND_VIRTIO; BOARD_DEVICES];
|
||||
kinds[0] = types::bootinfo::KIND_UART_16550;
|
||||
kinds
|
||||
}
|
||||
|
||||
/// Every device userspace may drive: the UART and each VirtIO MMIO slot.
|
||||
/// The PLIC, CLINT and RAM stay the kernel's.
|
||||
pub fn devices() -> Option<[kernel::BoardDevice; 1 + VIRTIO_SLOTS]> {
|
||||
pub fn devices() -> Option<[kernel::BoardDevice; BOARD_DEVICES]> {
|
||||
use types::{address::PhysicalAddress, bounded::PageCount, id::IrqId};
|
||||
let one = PageCount::new(1)?;
|
||||
let device = |base: usize, irq: u16| kernel::BoardDevice {
|
||||
@@ -25,7 +34,7 @@ pub fn devices() -> Option<[kernel::BoardDevice; 1 + VIRTIO_SLOTS]> {
|
||||
pages: one,
|
||||
irq: Some(IrqId::from_raw(irq)),
|
||||
};
|
||||
let mut all = [device(UART_BASE, UART_IRQ); 1 + VIRTIO_SLOTS];
|
||||
let mut all = [device(UART_BASE, UART_IRQ); BOARD_DEVICES];
|
||||
for (i, d) in all.iter_mut().skip(1).enumerate() {
|
||||
*d = device(
|
||||
VIRTIO_BASE + i * VIRTIO_SLOT_SIZE,
|
||||
|
||||
Reference in New Issue
Block a user