devices, vmm: Move GED device to MMIO region

Move GED device reporting of required device type to scan into an MMIO
region rather than an I/O port.

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford
2020-01-23 11:57:49 +00:00
parent 03108fb88b
commit 5e3c62dc6a
2 changed files with 56 additions and 22 deletions

View File

@@ -192,6 +192,9 @@ pub enum DeviceManagerError {
/// Failed creating IOAPIC.
CreateIoapic(ioapic::Error),
/// Failed to allocate MMIO area
AllocateMMIO,
}
pub type DeviceManagerResult<T> = result::Result<T, DeviceManagerError>;
@@ -749,22 +752,28 @@ impl DeviceManager {
.create_group(PIN_IRQ, ged_irq as InterruptIndex, 1 as InterruptIndex)
.map_err(DeviceManagerError::CreateInterruptGroup)?;
let ged_device = Arc::new(Mutex::new(devices::AcpiGEDDevice::new(
interrupt_group,
ged_irq,
)));
address_manager
let ged_base = address_manager
.allocator
.lock()
.unwrap()
.allocate_io_addresses(Some(GuestAddress(0xb000)), 0x1, None)
.ok_or(DeviceManagerError::AllocateIOPort)?;
.allocate_mmio_addresses(None, devices::AcpiGEDDevice::DEVICE_SIZE, None)
.ok_or(DeviceManagerError::AllocateMMIO)?;
let ged_device = Arc::new(Mutex::new(devices::AcpiGEDDevice::new(
interrupt_group,
ged_irq,
ged_base,
)));
address_manager
.io_bus
.insert(ged_device.clone(), 0xb000, 0x1)
.mmio_bus
.insert(
ged_device.clone(),
ged_base.0,
devices::AcpiGEDDevice::DEVICE_SIZE,
)
.map_err(DeviceManagerError::BusError)?;
Ok(Some(ged_device))
}
@@ -1651,7 +1660,7 @@ impl Drop for DeviceManager {
}
#[cfg(feature = "acpi")]
fn create_ged_device(ged_irq: u32) -> Vec<u8> {
fn create_ged_device(ged_base: u64, ged_irq: u32) -> Vec<u8> {
aml::Device::new(
"_SB_.GED_".into(),
vec![
@@ -1663,7 +1672,12 @@ fn create_ged_device(ged_irq: u32) -> Vec<u8> {
true, true, false, false, ged_irq,
)]),
),
&aml::OpRegion::new("GDST".into(), aml::OpRegionSpace::SystemIO, 0xb000, 0x1),
&aml::OpRegion::new(
"GDST".into(),
aml::OpRegionSpace::SystemMemory,
ged_base as usize,
devices::AcpiGEDDevice::DEVICE_SIZE as usize,
),
&aml::Field::new(
"GDST".into(),
aml::FieldAccessType::Byte,
@@ -1770,14 +1784,21 @@ impl Aml for DeviceManager {
let s5_sleep_data =
aml::Name::new("_S5_".into(), &aml::Package::new(vec![&5u8])).to_aml_bytes();
let ged_data = create_ged_device(
self.ged_notification_device
.as_ref()
.unwrap()
.lock()
.unwrap()
.irq(),
);
let ged_irq = self
.ged_notification_device
.as_ref()
.unwrap()
.lock()
.unwrap()
.irq();
let ged_base = self
.ged_notification_device
.as_ref()
.unwrap()
.lock()
.unwrap()
.device_base();
let ged_data = create_ged_device(ged_base.0, ged_irq);
bytes.extend_from_slice(pci_dsdt_data.as_slice());
bytes.extend_from_slice(mbrd_dsdt_data.as_slice());