pci.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //! PCI transport for VirtIO.
  2. pub mod bus;
  3. use super::DeviceType;
  4. /// The PCI vendor ID for VirtIO devices.
  5. const VIRTIO_VENDOR_ID: u16 = 0x1af4;
  6. /// The offset to add to a VirtIO device ID to get the corresponding PCI device ID.
  7. const PCI_DEVICE_ID_OFFSET: u16 = 0x1040;
  8. const TRANSITIONAL_NETWORK: u16 = 0x1000;
  9. const TRANSITIONAL_BLOCK: u16 = 0x1001;
  10. const TRANSITIONAL_MEMORY_BALLOONING: u16 = 0x1002;
  11. const TRANSITIONAL_CONSOLE: u16 = 0x1003;
  12. const TRANSITIONAL_SCSI_HOST: u16 = 0x1004;
  13. const TRANSITIONAL_ENTROPY_SOURCE: u16 = 0x1005;
  14. const TRANSITIONAL_9P_TRANSPORT: u16 = 0x1009;
  15. fn device_type(pci_device_id: u16) -> DeviceType {
  16. match pci_device_id {
  17. TRANSITIONAL_NETWORK => DeviceType::Network,
  18. TRANSITIONAL_BLOCK => DeviceType::Block,
  19. TRANSITIONAL_MEMORY_BALLOONING => DeviceType::MemoryBalloon,
  20. TRANSITIONAL_CONSOLE => DeviceType::Console,
  21. TRANSITIONAL_SCSI_HOST => DeviceType::ScsiHost,
  22. TRANSITIONAL_ENTROPY_SOURCE => DeviceType::EntropySource,
  23. TRANSITIONAL_9P_TRANSPORT => DeviceType::_9P,
  24. id if id >= PCI_DEVICE_ID_OFFSET => DeviceType::from(id - PCI_DEVICE_ID_OFFSET),
  25. _ => DeviceType::Invalid,
  26. }
  27. }
  28. #[cfg(test)]
  29. mod tests {
  30. use super::*;
  31. #[test]
  32. fn transitional_device_ids() {
  33. assert_eq!(device_type(0x1000), DeviceType::Network);
  34. assert_eq!(device_type(0x1002), DeviceType::MemoryBalloon);
  35. assert_eq!(device_type(0x1009), DeviceType::_9P);
  36. }
  37. #[test]
  38. fn offset_device_ids() {
  39. assert_eq!(device_type(0x1045), DeviceType::MemoryBalloon);
  40. assert_eq!(device_type(0x1049), DeviceType::_9P);
  41. assert_eq!(device_type(0x1058), DeviceType::Memory);
  42. assert_eq!(device_type(0x1040), DeviceType::Invalid);
  43. assert_eq!(device_type(0x1059), DeviceType::Invalid);
  44. }
  45. }