From 9a3efd499f3a62617e742913c321c0ccb2a5b64c Mon Sep 17 00:00:00 2001 From: Vasilito Date: Thu, 7 May 2026 20:53:44 +0100 Subject: [PATCH] fix: map virtio GPU BAR from pcid handoff Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../P9-virtio-handoff-mmio-map.patch | 42 +++++++++++++++++++ .../P9-virtio-handoff-mmio-map.patch | 42 +++++++++++++++++++ .../source/src/drivers/virtio/mod.rs | 19 +++++---- 3 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 local/patches/redox-drm/P9-virtio-handoff-mmio-map.patch create mode 100644 local/recipes/gpu/redox-drm/P9-virtio-handoff-mmio-map.patch diff --git a/local/patches/redox-drm/P9-virtio-handoff-mmio-map.patch b/local/patches/redox-drm/P9-virtio-handoff-mmio-map.patch new file mode 100644 index 000000000..e54a7cc4f --- /dev/null +++ b/local/patches/redox-drm/P9-virtio-handoff-mmio-map.patch @@ -0,0 +1,42 @@ +--- a/src/drivers/virtio/mod.rs ++++ b/src/drivers/virtio/mod.rs +@@ -4,7 +4,7 @@ use std::sync::Mutex; + + use log::{info, warn}; + use redox_driver_sys::memory::MmioRegion; +-use redox_driver_sys::pci::{PciBarInfo, PciDevice, PciDeviceInfo}; ++use redox_driver_sys::pci::{PciBarInfo, PciDeviceInfo}; + + use crate::driver::{DriverError, DriverEvent, GpuDriver, Result}; + use crate::drivers::interrupt::InterruptHandle; +@@ -32,11 +32,15 @@ fn find_fb_bar(info: &PciDeviceInfo) -> Result { + .ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into())) + } + +-fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result { +- device +- .map_bar(bar.index, bar.addr, bar.size as usize) +- .map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) ++fn map_bar(bar: &PciBarInfo, name: &str) -> Result { ++ MmioRegion::map( ++ bar.addr, ++ bar.size as usize, ++ redox_driver_sys::memory::CacheType::DeviceMemory, ++ redox_driver_sys::memory::MmioProt::READ_WRITE, ++ ) ++ .map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) + } + + impl VirtioDriver { +@@ -47,10 +51,7 @@ impl VirtioDriver { + } + + let fb_bar = find_fb_bar(&info)?; +- let mut device = PciDevice::open_location(&info.location) +- .map_err(|e| DriverError::Pci(format!("open PCI: {e}")))?; +- let _mmio = map_bar(&mut device, &fb_bar, "VirtIO FB BAR")?; +- drop(device); ++ let _mmio = map_bar(&fb_bar, "VirtIO FB BAR")?; + + info!( + "redox-drm: VirtIO GPU at {}: {} MiB BAR at {:#x}", diff --git a/local/recipes/gpu/redox-drm/P9-virtio-handoff-mmio-map.patch b/local/recipes/gpu/redox-drm/P9-virtio-handoff-mmio-map.patch new file mode 100644 index 000000000..e54a7cc4f --- /dev/null +++ b/local/recipes/gpu/redox-drm/P9-virtio-handoff-mmio-map.patch @@ -0,0 +1,42 @@ +--- a/src/drivers/virtio/mod.rs ++++ b/src/drivers/virtio/mod.rs +@@ -4,7 +4,7 @@ use std::sync::Mutex; + + use log::{info, warn}; + use redox_driver_sys::memory::MmioRegion; +-use redox_driver_sys::pci::{PciBarInfo, PciDevice, PciDeviceInfo}; ++use redox_driver_sys::pci::{PciBarInfo, PciDeviceInfo}; + + use crate::driver::{DriverError, DriverEvent, GpuDriver, Result}; + use crate::drivers::interrupt::InterruptHandle; +@@ -32,11 +32,15 @@ fn find_fb_bar(info: &PciDeviceInfo) -> Result { + .ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into())) + } + +-fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result { +- device +- .map_bar(bar.index, bar.addr, bar.size as usize) +- .map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) ++fn map_bar(bar: &PciBarInfo, name: &str) -> Result { ++ MmioRegion::map( ++ bar.addr, ++ bar.size as usize, ++ redox_driver_sys::memory::CacheType::DeviceMemory, ++ redox_driver_sys::memory::MmioProt::READ_WRITE, ++ ) ++ .map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) + } + + impl VirtioDriver { +@@ -47,10 +51,7 @@ impl VirtioDriver { + } + + let fb_bar = find_fb_bar(&info)?; +- let mut device = PciDevice::open_location(&info.location) +- .map_err(|e| DriverError::Pci(format!("open PCI: {e}")))?; +- let _mmio = map_bar(&mut device, &fb_bar, "VirtIO FB BAR")?; +- drop(device); ++ let _mmio = map_bar(&fb_bar, "VirtIO FB BAR")?; + + info!( + "redox-drm: VirtIO GPU at {}: {} MiB BAR at {:#x}", diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs b/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs index f78de0b9c..cfcc40def 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/virtio/mod.rs @@ -4,7 +4,7 @@ use std::sync::Mutex; use log::{info, warn}; use redox_driver_sys::memory::MmioRegion; -use redox_driver_sys::pci::{PciBarInfo, PciDevice, PciDeviceInfo}; +use redox_driver_sys::pci::{PciBarInfo, PciDeviceInfo}; use crate::driver::{DriverError, DriverEvent, GpuDriver, Result}; use crate::drivers::interrupt::InterruptHandle; @@ -32,10 +32,14 @@ fn find_fb_bar(info: &PciDeviceInfo) -> Result { .ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into())) } -fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result { - device - .map_bar(bar.index, bar.addr, bar.size as usize) - .map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) +fn map_bar(bar: &PciBarInfo, name: &str) -> Result { + MmioRegion::map( + bar.addr, + bar.size as usize, + redox_driver_sys::memory::CacheType::DeviceMemory, + redox_driver_sys::memory::MmioProt::READ_WRITE, + ) + .map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) } impl VirtioDriver { @@ -48,10 +52,7 @@ impl VirtioDriver { } let fb_bar = find_fb_bar(&info)?; - let mut device = PciDevice::open_location(&info.location) - .map_err(|e| DriverError::Pci(format!("open PCI: {e}")))?; - let _mmio = map_bar(&mut device, &fb_bar, "VirtIO FB BAR")?; - drop(device); + let _mmio = map_bar(&fb_bar, "VirtIO FB BAR")?; info!( "redox-drm: VirtIO GPU at {}: {} MiB BAR at {:#x}",