Revert "devices, vmm: Move GED device to MMIO region"

This reverts commit 5e3c62dc6a.
This commit is contained in:
Rob Bradford 2020-01-24 10:36:39 +00:00 committed by Sebastien Boeuf
parent 6120d0fb1b
commit 57ed006992
2 changed files with 21 additions and 55 deletions

View File

@ -5,7 +5,6 @@
use std::sync::Arc; use std::sync::Arc;
use vm_device::interrupt::InterruptSourceGroup; use vm_device::interrupt::InterruptSourceGroup;
use vm_memory::GuestAddress;
use vmm_sys_util::eventfd::EventFd; use vmm_sys_util::eventfd::EventFd;
use BusDevice; use BusDevice;
use HotPlugNotificationFlags; use HotPlugNotificationFlags;
@ -61,22 +60,14 @@ pub struct AcpiGEDDevice {
interrupt: Arc<Box<dyn InterruptSourceGroup>>, interrupt: Arc<Box<dyn InterruptSourceGroup>>,
notification_type: HotPlugNotificationFlags, notification_type: HotPlugNotificationFlags,
ged_irq: u32, ged_irq: u32,
device_base: GuestAddress,
} }
impl AcpiGEDDevice { impl AcpiGEDDevice {
pub const DEVICE_SIZE: u64 = 1; pub fn new(interrupt: Arc<Box<dyn InterruptSourceGroup>>, ged_irq: u32) -> AcpiGEDDevice {
pub fn new(
interrupt: Arc<Box<dyn InterruptSourceGroup>>,
ged_irq: u32,
device_base: GuestAddress,
) -> AcpiGEDDevice {
AcpiGEDDevice { AcpiGEDDevice {
interrupt, interrupt,
notification_type: HotPlugNotificationFlags::NO_DEVICES_CHANGED, notification_type: HotPlugNotificationFlags::NO_DEVICES_CHANGED,
ged_irq, ged_irq,
device_base,
} }
} }
@ -91,13 +82,9 @@ impl AcpiGEDDevice {
pub fn irq(&self) -> u32 { pub fn irq(&self) -> u32 {
self.ged_irq self.ged_irq
} }
pub fn device_base(&self) -> GuestAddress {
self.device_base
}
} }
// MMIO region reports what type of notification was made // I/O port reports what type of notification was made
impl BusDevice for AcpiGEDDevice { impl BusDevice for AcpiGEDDevice {
// Spec has all fields as zero // Spec has all fields as zero
fn read(&mut self, _base: u64, _offset: u64, data: &mut [u8]) { fn read(&mut self, _base: u64, _offset: u64, data: &mut [u8]) {

View File

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