fix: map virtio GPU BAR from pcid handoff

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-05-07 20:53:44 +01:00
parent a6d6caac68
commit 9a3efd499f
3 changed files with 94 additions and 9 deletions
@@ -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<PciBarInfo> {
.ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into()))
}
-fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result<MmioRegion> {
- 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> {
+ 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}",
@@ -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<PciBarInfo> {
.ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into()))
}
-fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result<MmioRegion> {
- 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> {
+ 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}",
@@ -4,7 +4,7 @@ use std::sync::Mutex;
use log::{info, warn}; use log::{info, warn};
use redox_driver_sys::memory::MmioRegion; 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::driver::{DriverError, DriverEvent, GpuDriver, Result};
use crate::drivers::interrupt::InterruptHandle; use crate::drivers::interrupt::InterruptHandle;
@@ -32,10 +32,14 @@ fn find_fb_bar(info: &PciDeviceInfo) -> Result<PciBarInfo> {
.ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into())) .ok_or_else(|| DriverError::Pci("VirtIO GPU has no valid framebuffer BAR".into()))
} }
fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result<MmioRegion> { fn map_bar(bar: &PciBarInfo, name: &str) -> Result<MmioRegion> {
device MmioRegion::map(
.map_bar(bar.index, bar.addr, bar.size as usize) bar.addr,
.map_err(|e| DriverError::Mmio(format!("failed to map {name}: {e}"))) 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 { impl VirtioDriver {
@@ -48,10 +52,7 @@ impl VirtioDriver {
} }
let fb_bar = find_fb_bar(&info)?; let fb_bar = find_fb_bar(&info)?;
let mut device = PciDevice::open_location(&info.location) let _mmio = map_bar(&fb_bar, "VirtIO FB BAR")?;
.map_err(|e| DriverError::Pci(format!("open PCI: {e}")))?;
let _mmio = map_bar(&mut device, &fb_bar, "VirtIO FB BAR")?;
drop(device);
info!( info!(
"redox-drm: VirtIO GPU at {}: {} MiB BAR at {:#x}", "redox-drm: VirtIO GPU at {}: {} MiB BAR at {:#x}",