diff --git a/crates/adapter-riscv/src/devices/gpu_setup.rs b/crates/adapter-riscv/src/devices/gpu_setup.rs index 4e2bdf7..63758db 100644 --- a/crates/adapter-riscv/src/devices/gpu_setup.rs +++ b/crates/adapter-riscv/src/devices/gpu_setup.rs @@ -53,28 +53,11 @@ pub fn configure(uart: &Uart, display_pid: ProcessId) { } gpu.init_device(vq_phys); - gpu.setup_framebuffer(cmd_phys, vq_phys, fb_phys, FB_WIDTH, FB_HEIGHT); - - // Fill framebuffer with WHITE and flush — visible test pattern - let fb = fb_phys as *mut u32; - let total = FB_WIDTH.raw() as usize * FB_HEIGHT.raw() as usize; - for i in 0..total { - unsafe { core::ptr::write_volatile(fb.add(i), 0xFFFFFFFF); } + if gpu.setup_framebuffer(cmd_phys, vq_phys, fb_phys, FB_WIDTH, FB_HEIGHT) { + uart.write_str("k-os: VirtIO GPU configured\n"); + } else { + uart.write_str("k-os: VirtIO GPU setup failed (display will be headless)\n"); } - - let queue = hw_virtio::queue::VirtioQueue::new( - hw_virtio::queue::QueueAddrs::from_base(vq_phys), - ); - let dma = hw_virtio::gpu::GpuDmaAddrs { - cmd_pa: types::address::PhysicalAddress::from_raw(cmd_phys), - cmd_va: types::address::VirtualAddress::from_raw(cmd_phys), - resp_pa: types::address::PhysicalAddress::from_raw(cmd_phys + 512), - }; - let mmio = hw_virtio::mmio::DirectMmio::new(gpu.base()); - hw_virtio::gpu::transfer_to_host(&mmio, &queue, &dma, 1, 0, 0, FB_WIDTH.raw() as u32, FB_HEIGHT.raw() as u32); - hw_virtio::gpu::resource_flush(&mmio, &queue, &dma, 1, 0, 0, FB_WIDTH.raw() as u32, FB_HEIGHT.raw() as u32); - - uart.write_str("k-os: VirtIO GPU configured\n"); } fn map_page(pt: &mut mmu::PageTable, va: usize, pa: usize) { diff --git a/crates/bins/display-qemu/Cargo.toml b/crates/bins/display-qemu/Cargo.toml index eca0eff..9d3438d 100644 --- a/crates/bins/display-qemu/Cargo.toml +++ b/crates/bins/display-qemu/Cargo.toml @@ -15,4 +15,5 @@ userspace = { workspace = true } server-framework = { workspace = true } display-server = { workspace = true } driver-framebuffer-virtio = { workspace = true } +driver-framebuffer-mock = { workspace = true } port-framebuffer = { workspace = true } diff --git a/crates/bins/display-qemu/src/main.rs b/crates/bins/display-qemu/src/main.rs index 271f5ea..a2c1be1 100644 --- a/crates/bins/display-qemu/src/main.rs +++ b/crates/bins/display-qemu/src/main.rs @@ -3,14 +3,23 @@ extern crate userspace_rt; -use driver_framebuffer_virtio::VirtioFramebuffer; use types::bounded::CapSlot; #[unsafe(no_mangle)] extern "C" fn main() { - let fb = VirtioFramebuffer::new(); - let mut srv = display_server::server::DisplayServer::new(fb); - let ep = CapSlot::new(0).unwrap(); - server_framework::serve(&mut srv, ep); + let ep = CapSlot::const_new(0); + + if let Some(fb) = driver_framebuffer_virtio::VirtioFramebuffer::try_new() { + let mut srv = display_server::server::DisplayServer::new(fb); + server_framework::serve(&mut srv, ep); + } else { + let fb = driver_framebuffer_mock::MockFramebuffer::new( + types::display::Dimension::new(640), + types::display::Dimension::new(480), + ); + let mut srv = display_server::server::DisplayServer::new(fb); + server_framework::serve(&mut srv, ep); + } + loop { userspace::syscall::yield_now(); } } diff --git a/crates/drivers/framebuffer/virtio/src/lib.rs b/crates/drivers/framebuffer/virtio/src/lib.rs index 5249aad..bd5dd3e 100644 --- a/crates/drivers/framebuffer/virtio/src/lib.rs +++ b/crates/drivers/framebuffer/virtio/src/lib.rs @@ -54,19 +54,22 @@ pub struct VirtioFramebuffer { } impl VirtioFramebuffer { - pub fn new() -> Self { + pub fn try_new() -> Option { let phys = read_phys_info(); + if phys.width == 0 || phys.height == 0 || phys.cmd_pa.raw() == 0 { + return None; + } let width = Dimension::new(phys.width); let height = Dimension::new(phys.height); let stride = phys.width as usize * FB_BPP; - Self { + Some(Self { mmio: GpuMmio, queue: VirtioQueue::new(QueueAddrs::from_base(VQUEUE_VA)), dma: GpuDmaAddrs { cmd_pa: phys.cmd_pa, cmd_va: VirtualAddress::from_raw(CMDBUF_VA), resp_pa: phys.resp_pa }, width, height, stride, - } + }) } } diff --git a/crates/hw-virtio/src/gpu.rs b/crates/hw-virtio/src/gpu.rs index 00601c9..2e277c2 100644 --- a/crates/hw-virtio/src/gpu.rs +++ b/crates/hw-virtio/src/gpu.rs @@ -22,7 +22,7 @@ pub fn create_2d(mmio: &impl MmioAccess, queue: &VirtioQueue, dma: &GpuDmaAddrs, } pub fn attach_backing(mmio: &impl MmioAccess, queue: &VirtioQueue, dma: &GpuDmaAddrs, resource_id: u32, fb_pa: PhysicalAddress, fb_size: u32) -> bool { - write_cmd_header(dma.cmd_va, 0x0106); + write_cmd_header(dma.cmd_va, 0x0104); unsafe { let p = dma.cmd_va.raw() as *mut u8; core::ptr::write_volatile(p.add(24) as *mut u32, resource_id); @@ -60,7 +60,7 @@ pub fn transfer_to_host(mmio: &impl MmioAccess, queue: &VirtioQueue, dma: &GpuDm } pub fn resource_flush(mmio: &impl MmioAccess, queue: &VirtioQueue, dma: &GpuDmaAddrs, resource_id: u32, x: u32, y: u32, w: u32, h: u32) -> bool { - write_cmd_header(dma.cmd_va, 0x0104); + write_cmd_header(dma.cmd_va, 0x0106); unsafe { let p = dma.cmd_va.raw() as *mut u8; core::ptr::write_volatile(p.add(24) as *mut u32, x);