PCI: device discovery
This commit is contained in:
parent
57d6a5f2bb
commit
998a1d30cf
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue