@@ -3,8 +3,10 @@ use bit_field::BitField;
33use core:: fmt:: Formatter ;
44
55mod msi;
6+ mod msix;
67
78pub use msi:: { MsiCapability , MultipleMessageSupport , TriggerMode } ;
9+ pub use msix:: MsixCapability ;
810
911#[ derive( Clone ) ]
1012pub struct PciCapabilityAddress {
@@ -52,16 +54,18 @@ pub enum PciCapability {
5254 /// PCI Express capability, Cap ID = `0x10`
5355 PciExpress ( PciCapabilityAddress ) ,
5456 /// MSI-X capability, Cap ID = `0x11`
55- MsiX ( PciCapabilityAddress ) ,
57+ MsiX ( MsixCapability ) ,
5658 /// Unknown capability
57- Unknown {
58- address : PciCapabilityAddress ,
59- id : u8 ,
60- } ,
59+ Unknown { address : PciCapabilityAddress , id : u8 } ,
6160}
6261
6362impl PciCapability {
64- fn parse ( id : u8 , address : PciCapabilityAddress , extension : u16 ) -> Option < PciCapability > {
63+ fn parse (
64+ id : u8 ,
65+ address : PciCapabilityAddress ,
66+ extension : u16 ,
67+ access : & impl ConfigRegionAccess ,
68+ ) -> Option < PciCapability > {
6569 match id {
6670 0x00 => None , // null capability
6771 0x01 => Some ( PciCapability :: PowerManagement ( address) ) ,
@@ -79,7 +83,7 @@ impl PciCapability {
7983 0x0D => Some ( PciCapability :: BridgeSubsystemVendorId ( address) ) ,
8084 0x0E => Some ( PciCapability :: AGP3 ( address) ) ,
8185 0x10 => Some ( PciCapability :: PciExpress ( address) ) ,
82- 0x11 => Some ( PciCapability :: MsiX ( address) ) ,
86+ 0x11 => Some ( PciCapability :: MsiX ( MsixCapability :: new ( address, extension , access ) ) ) ,
8387 _ => Some ( PciCapability :: Unknown { address, id } ) ,
8488 }
8589 }
@@ -92,16 +96,8 @@ pub struct CapabilityIterator<'a, T: ConfigRegionAccess> {
9296}
9397
9498impl < ' a , T : ConfigRegionAccess > CapabilityIterator < ' a , T > {
95- pub ( crate ) fn new (
96- address : PciAddress ,
97- offset : u16 ,
98- access : & ' a T ,
99- ) -> CapabilityIterator < ' a , T > {
100- CapabilityIterator {
101- address,
102- offset,
103- access,
104- }
99+ pub ( crate ) fn new ( address : PciAddress , offset : u16 , access : & ' a T ) -> CapabilityIterator < ' a , T > {
100+ CapabilityIterator { address, offset, access }
105101 }
106102}
107103
@@ -119,11 +115,9 @@ impl<'a, T: ConfigRegionAccess> Iterator for CapabilityIterator<'a, T> {
119115 let extension = data. get_bits ( 16 ..32 ) as u16 ;
120116 let cap = PciCapability :: parse (
121117 id as u8 ,
122- PciCapabilityAddress {
123- address : self . address ,
124- offset : self . offset ,
125- } ,
118+ PciCapabilityAddress { address : self . address , offset : self . offset } ,
126119 extension,
120+ self . access ,
127121 ) ;
128122 self . offset = next_ptr as u16 ;
129123 if let Some ( cap) = cap {
0 commit comments