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:
@@ -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}",
|
||||||
|
|||||||
Reference in New Issue
Block a user