PCI: device discovery

This commit is contained in:
TheOddGarlic 2022-08-12 16:48:22 +03:00
parent 57d6a5f2bb
commit 998a1d30cf
4 changed files with 34 additions and 25 deletions

View file

@ -9,7 +9,10 @@ use core::fmt;
use x86_64::instructions::port::Port; use x86_64::instructions::port::Port;
use super::{vendors::Vendor::{self, *}, PciFullClass, PciClass}; use super::{
vendors::Vendor::{self, *},
PciClass, PciFullClass,
};
// FIXME: Unknown class // FIXME: Unknown class
pub const S3INC_TRIO64V2: DeviceID = DeviceID::new(S3Inc, 0x8900); pub const S3INC_TRIO64V2: DeviceID = DeviceID::new(S3Inc, 0x8900);
@ -41,9 +44,7 @@ impl PciDeviceInfo {
/// Get the bar, 0-indexed /// Get the bar, 0-indexed
pub fn bar(&self, bar: u8) -> u32 { pub fn bar(&self, bar: u8) -> u32 {
assert!(bar < 6); assert!(bar < 6);
unsafe { unsafe { self.io_read(0, 0x10 + bar * 4) }
self.io_read(0, 0x10 + bar * 4)
}
} }
/// Get the interrupt pin /// Get the interrupt pin
@ -95,7 +96,7 @@ impl fmt::Display for PciDeviceInfo {
} }
} }
#[derive(PartialEq, Clone, Eq, Debug)] #[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct DeviceID { pub struct DeviceID {
pub vendor: Vendor, pub vendor: Vendor,
pub id: u16, pub id: u16,
@ -107,21 +108,6 @@ impl DeviceID {
} }
} }
pub fn check_pci_support(device_id: DeviceID) -> bool {
match device_id {
// FIXME: Unknown class
S3INC_TRIO64V2 => true,
// MassStorage_IDE (0x0101)
INTEL_PIIX3_IDE => true,
INTEL_PIIX4_IDE => true,
// Display_VGA (0x0300)
VMWARE_SVGA2 => true,
_ => false,
}
}
pub fn check_device(bus: u8, device: u8) -> Option<PciDeviceInfo> { pub fn check_device(bus: u8, device: u8) -> Option<PciDeviceInfo> {
assert!(device < 32); assert!(device < 32);
let (device_id, vendor_id) = get_ids(bus, device, 0); let (device_id, vendor_id) = get_ids(bus, device, 0);

View file

@ -13,14 +13,37 @@ pub mod piix;
pub use class::*; pub use class::*;
pub use device::*; pub use device::*;
use x86_64::structures::paging::{Mapper, Size4KiB};
use crate::arch::memory::BootInfoFrameAllocator;
use self::piix::Piix;
/// Enumerate PCI devices and run initialisation routines on ones we support /// Enumerate PCI devices and run initialisation routines on ones we support
pub fn init() { pub fn init(mapper: &mut impl Mapper<Size4KiB>, frame_allocator: &mut BootInfoFrameAllocator) {
for bus in 0..=255 { for bus in 0..=255 {
for device in 0..32 { for device in 0..32 {
if let Some(device_info) = device::check_device(bus, device) { if let Some(device_info) = device::check_device(bus, device) {
if !device::check_pci_support(device_info.device_id) { match device_info.device_id {
trace!("PCI device {} on bus {} unsupported", device_info.device, device_info.bus) // FIXME: Unknown class
S3INC_TRIO64V2 => {}
// MassStorage_IDE (0x0101)
INTEL_PIIX3_IDE | INTEL_PIIX4_IDE => {
let mut piix = Piix::new(bus, device).unwrap();
piix.allocate_dma_frame(mapper, frame_allocator).unwrap();
piix.read().unwrap();
}
// Display_VGA (0x0300)
VMWARE_SVGA2 => {}
_ => {
trace!(
"PCI device {} on bus {} unsupported",
device_info.device,
device_info.bus
)
}
} }
} }
} }

View file

@ -6,7 +6,7 @@
use core::fmt::Display; use core::fmt::Display;
#[derive(PartialEq, Debug, Clone, Eq)] #[derive(PartialEq, Debug, Copy, Clone, Eq)]
#[repr(u16)] #[repr(u16)]
pub enum Vendor { pub enum Vendor {
ThreeDfxInteractiveInc = 0x121a, ThreeDfxInteractiveInc = 0x121a,

View file

@ -44,7 +44,7 @@ pub fn kernel_main(
// term.draw_term(); // term.draw_term();
// drop(term); // drop(term);
pci::init(); pci::init(&mut mapper, &mut frame_allocator);
x86_64::instructions::interrupts::without_interrupts(|| { x86_64::instructions::interrupts::without_interrupts(|| {
hardware::init_mouse(); hardware::init_mouse();