From 8b3d1688daac2aaf4e87403ecda5467a01464f81 Mon Sep 17 00:00:00 2001 From: yuyi2439 <68320855+yuyi2439@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:11:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8Apci=E9=A9=B1=E5=8A=A8=E7=9A=84?= =?UTF-8?q?=E8=AF=BB=E5=8F=96acpi=20mcfg=E7=9A=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E4=B8=BA=E4=BB=8E=E6=96=B0=E7=9A=84?= =?UTF-8?q?acpi=E9=A9=B1=E5=8A=A8=E6=9D=A5=E8=AF=BB=E5=8F=96=20(#413)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 把pci驱动的读取acpi mcfg的代码,调整为从新的acpi驱动来读取 --- kernel/src/arch/x86_64/pci/pci.rs | 40 +++++++++++++++-------------- kernel/src/driver/acpi/mod.rs | 1 - kernel/src/driver/acpi/old.rs | 27 ------------------- kernel/src/driver/net/virtio_net.rs | 3 +-- 4 files changed, 22 insertions(+), 49 deletions(-) delete mode 100644 kernel/src/driver/acpi/old.rs diff --git a/kernel/src/arch/x86_64/pci/pci.rs b/kernel/src/arch/x86_64/pci/pci.rs index d4bcd97a..e19227d1 100644 --- a/kernel/src/arch/x86_64/pci/pci.rs +++ b/kernel/src/arch/x86_64/pci/pci.rs @@ -1,17 +1,16 @@ use crate::arch::TraitPciArch; -use crate::driver::acpi::old::mcfg_find_segment; +use crate::driver::acpi::acpi_manager; 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, acpi_system_description_table_header_t, io_in32, io_out32, -}; +use crate::include::bindings::bindings::{acpi_get_MCFG, acpi_iter_SDT, io_in32, io_out32}; use crate::mm::PhysAddr; +use acpi::mcfg::Mcfg; use core::ffi::c_void; -use core::ptr::NonNull; -pub struct X86_64PciArch {} + +pub struct X86_64PciArch; impl TraitPciArch for X86_64PciArch { fn read_config(bus_device_function: &BusDeviceFunction, offset: u8) -> u32 { // 构造pci配置空间地址 @@ -57,19 +56,22 @@ impl TraitPciArch for X86_64PciArch { } //kdebug!("{}",data); //loop{} - let head = NonNull::new(data as *mut acpi_system_description_table_header_t).unwrap(); - let outcome = unsafe { mcfg_find_segment(head).as_ref() }; - for segmentgroupconfiguration in outcome { - if segmentgroupconfiguration.segement_group_number == segement { - return Ok(PciRoot { - physical_address_base: PhysAddr::new( - segmentgroupconfiguration.base_address as usize, - ), - mmio_guard: None, - segement_group_number: segement, - bus_begin: segmentgroupconfiguration.bus_begin, - bus_end: segmentgroupconfiguration.bus_end, - }); + + let binding = acpi_manager() + .tables() + .expect("get acpi_manager table error") + .find_table::(); + 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, + }); + } } } return Err(PciError::SegmentNotFound); diff --git a/kernel/src/driver/acpi/mod.rs b/kernel/src/driver/acpi/mod.rs index 06b5c4ed..9ec99cab 100644 --- a/kernel/src/driver/acpi/mod.rs +++ b/kernel/src/driver/acpi/mod.rs @@ -21,7 +21,6 @@ extern crate acpi; pub mod bus; mod c_adapter; pub mod glue; -pub mod old; pub mod pmtmr; mod sysfs; diff --git a/kernel/src/driver/acpi/old.rs b/kernel/src/driver/acpi/old.rs deleted file mode 100644 index eed6f9ea..00000000 --- a/kernel/src/driver/acpi/old.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::driver::pci::pci::SegmentGroupNumber; -use crate::include::bindings::bindings::acpi_system_description_table_header_t; -use core::ptr::{slice_from_raw_parts_mut, NonNull}; -// MCFG表中的Segement配置部分,开始位置为44+16*n -#[repr(C, packed)] -pub struct SegementConfigurationSpace { - pub base_address: u64, - pub segement_group_number: SegmentGroupNumber, - pub bus_begin: u8, - pub bus_end: u8, - pub reverse: u32, -} - -/// @brief 获取Segement_Configuration_Space的数量并返回对应数量的Segement_Configuration_Space的切片指针 -/// @param head acpi_system_description_table_header_t的指针 -/// @return NonNull<[Segement_Configuration_Space]> -pub fn mcfg_find_segment( - head: NonNull, -) -> NonNull<[SegementConfigurationSpace]> { - let table_length = unsafe { (*head.as_ptr()).Length }; - let number_of_segments = ((table_length - 44) / 16) as u16; - NonNull::new(slice_from_raw_parts_mut( - (head.as_ptr() as usize + 44) as *mut _, - number_of_segments as usize, - )) - .unwrap() -} diff --git a/kernel/src/driver/net/virtio_net.rs b/kernel/src/driver/net/virtio_net.rs index 2b58fb6c..3cca5e51 100644 --- a/kernel/src/driver/net/virtio_net.rs +++ b/kernel/src/driver/net/virtio_net.rs @@ -15,8 +15,7 @@ use crate::{ kobject::{KObjType, KObject, KObjectState}, }, virtio::virtio_impl::HalImpl, - }, - kdebug, kerror, kinfo, + }, kerror, kinfo, libs::spinlock::SpinLock, net::{generate_iface_id, NET_DRIVERS}, syscall::SystemError,