mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 16:26:31 +00:00
bugfix: 修复因rsdp v1 v2版本问题,导致ACPI无法正常初始化的bug (#454)
bugfix: 修复因rsdp v1 v2版本问题,导致ACPI无法正常初始化的bug
This commit is contained in:
@ -4,11 +4,10 @@ use crate::driver::pci::pci::{
|
||||
BusDeviceFunction, PciAddr, PciError, PciRoot, SegmentGroupNumber, PORT_PCI_CONFIG_ADDRESS,
|
||||
PORT_PCI_CONFIG_DATA,
|
||||
};
|
||||
use crate::include::bindings::bindings::{acpi_get_MCFG, acpi_iter_SDT, io_in32, io_out32};
|
||||
use crate::include::bindings::bindings::{io_in32, io_out32};
|
||||
use crate::mm::PhysAddr;
|
||||
|
||||
use acpi::mcfg::Mcfg;
|
||||
use core::ffi::c_void;
|
||||
|
||||
pub struct X86_64PciArch;
|
||||
impl TraitPciArch for X86_64PciArch {
|
||||
@ -45,33 +44,20 @@ impl TraitPciArch for X86_64PciArch {
|
||||
}
|
||||
|
||||
fn ecam_root(segement: SegmentGroupNumber) -> Result<PciRoot, PciError> {
|
||||
let mut data: usize = 0;
|
||||
let data_point = &mut data;
|
||||
unsafe {
|
||||
acpi_iter_SDT(Some(acpi_get_MCFG), data_point as *mut usize as *mut c_void);
|
||||
};
|
||||
// 防止无PCIE的机器找不到MCFG Table导致的错误
|
||||
if data == 0 {
|
||||
return Err(PciError::McfgTableNotFound);
|
||||
}
|
||||
//kdebug!("{}",data);
|
||||
//loop{}
|
||||
|
||||
let binding = acpi_manager()
|
||||
let mcfg = acpi_manager()
|
||||
.tables()
|
||||
.expect("get acpi_manager table error")
|
||||
.find_table::<Mcfg>();
|
||||
if let Ok(mcfg) = binding {
|
||||
for mcfg_entry in mcfg.entries() {
|
||||
if mcfg_entry.pci_segment_group == segement {
|
||||
return Ok(PciRoot {
|
||||
physical_address_base: PhysAddr::new(mcfg_entry.base_address as usize),
|
||||
mmio_guard: None,
|
||||
segement_group_number: segement,
|
||||
bus_begin: mcfg_entry.bus_number_start,
|
||||
bus_end: mcfg_entry.bus_number_end,
|
||||
});
|
||||
}
|
||||
.find_table::<Mcfg>()
|
||||
.map_err(|_| PciError::McfgTableNotFound)?;
|
||||
for mcfg_entry in mcfg.entries() {
|
||||
if mcfg_entry.pci_segment_group == segement {
|
||||
return Ok(PciRoot {
|
||||
physical_address_base: PhysAddr::new(mcfg_entry.base_address as usize),
|
||||
mmio_guard: None,
|
||||
segement_group_number: segement,
|
||||
bus_begin: mcfg_entry.bus_number_start,
|
||||
bus_end: mcfg_entry.bus_number_end,
|
||||
});
|
||||
}
|
||||
}
|
||||
return Err(PciError::SegmentNotFound);
|
||||
|
Reference in New Issue
Block a user