mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-08 06:57:16 +00:00
dragonball: add device info support for aarch64
Implement generate_virtio_device_info() and get_virtio_mmio_device_info() functions su support the mmio_device_info member, which is used by FDT. Fixes: #4544 Signed-off-by: xuejun-xj <jiyunxue@linux.alibaba.com> Signed-off-by: jingshan <jingshan@linux.alibaba.com>
This commit is contained in:
parent
30da3fb954
commit
7a4183980e
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::sync::{Arc, Mutex, MutexGuard};
|
use std::sync::{Arc, Mutex, MutexGuard};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use arc_swap::ArcSwap;
|
use arc_swap::ArcSwap;
|
||||||
use dbs_address_space::AddressSpace;
|
use dbs_address_space::AddressSpace;
|
||||||
@ -321,6 +322,33 @@ impl DeviceOpContext {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch = "aarch64")]
|
||||||
|
fn generate_virtio_device_info(&self) -> Result<HashMap<(DeviceType, String), MMIODeviceInfo>> {
|
||||||
|
let mut dev_info = HashMap::new();
|
||||||
|
#[cfg(feature = "dbs-virtio-devices")]
|
||||||
|
for (_index, device) in self.virtio_devices.iter().enumerate() {
|
||||||
|
let (mmio_base, mmio_size, irq) = DeviceManager::get_virtio_mmio_device_info(device)?;
|
||||||
|
let dev_type;
|
||||||
|
let device_id;
|
||||||
|
if let Some(mmiov2_device) =
|
||||||
|
device.as_any().downcast_ref::<DbsMmioV2Device>()
|
||||||
|
{
|
||||||
|
dev_type = mmiov2_device.get_device_type();
|
||||||
|
device_id = None;
|
||||||
|
} else {
|
||||||
|
return Err(DeviceMgrError::InvalidOperation);
|
||||||
|
}
|
||||||
|
dev_info.insert(
|
||||||
|
(
|
||||||
|
DeviceType::Virtio(dev_type),
|
||||||
|
format!("virtio-{}@0x{:08x?}", dev_type, mmio_base),
|
||||||
|
),
|
||||||
|
MMIODeviceInfo::new(mmio_base, mmio_size, vec![irq], device_id),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(dev_info)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "hotplug", not(feature = "dbs-upcall")))]
|
#[cfg(all(feature = "hotplug", not(feature = "dbs-upcall")))]
|
||||||
@ -626,6 +654,14 @@ impl DeviceManager {
|
|||||||
ctx.generate_kernel_boot_args(kernel_config)
|
ctx.generate_kernel_boot_args(kernel_config)
|
||||||
.map_err(StartMicroVmError::DeviceManager)?;
|
.map_err(StartMicroVmError::DeviceManager)?;
|
||||||
|
|
||||||
|
#[cfg(target_arch = "aarch64")]
|
||||||
|
{
|
||||||
|
let dev_info = ctx
|
||||||
|
.generate_virtio_device_info()
|
||||||
|
.map_err(StartMicrovmError::DeviceManager)?;
|
||||||
|
self.mmio_device_info.extend(dev_info);
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -679,6 +715,25 @@ impl DeviceManager {
|
|||||||
pub fn get_mmio_device_info(&self) -> Option<&HashMap<(DeviceType, String), MMIODeviceInfo>> {
|
pub fn get_mmio_device_info(&self) -> Option<&HashMap<(DeviceType, String), MMIODeviceInfo>> {
|
||||||
Some(&self.mmio_device_info)
|
Some(&self.mmio_device_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "dbs-virtio-devices")]
|
||||||
|
fn get_virtio_mmio_device_info(device: &Arc<DbsMmioV2Device>) -> Result<(u64, u64, u32)> {
|
||||||
|
let resources = device.get_assigned_resources();
|
||||||
|
let irq = resources
|
||||||
|
.get_legacy_irq()
|
||||||
|
.ok_or(DeviceMgrError::GetDeviceResource)?;
|
||||||
|
|
||||||
|
if let Some(mmio_dev) = device
|
||||||
|
.as_any()
|
||||||
|
.downcast_ref::<DbsMmioV2Device>()
|
||||||
|
{
|
||||||
|
if let Resource::MmioAddressRange { base, size } = mmio_dev.get_mmio_cfg_res() {
|
||||||
|
return Ok((base, size, irq));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(DeviceMgrError::GetDeviceResource)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "dbs-virtio-devices")]
|
#[cfg(feature = "dbs-virtio-devices")]
|
||||||
|
Loading…
Reference in New Issue
Block a user