33use uefi:: Handle ;
44use uefi:: boot:: { OpenProtocolAttributes , OpenProtocolParams , ScopedProtocol , image_handle} ;
55use uefi:: proto:: ProtocolPointer ;
6- use uefi:: proto:: pci:: PciIoAddress ;
76use uefi:: proto:: pci:: root_bridge:: PciRootBridgeIo ;
87
98const RED_HAT_PCI_VENDOR_ID : u16 = 0x1AF4 ;
@@ -22,42 +21,40 @@ pub fn test() {
2221 for pci_handle in pci_handles {
2322 let mut pci_proto = get_open_protocol :: < PciRootBridgeIo > ( pci_handle) ;
2423
25- for bus in 0 ..=255 {
26- for dev in 0 ..32 {
27- for fun in 0 ..8 {
28- let addr = PciIoAddress :: new ( bus, dev, fun) ;
29- let Ok ( reg0) = pci_proto. pci ( ) . read_one :: < u32 > ( addr. with_register ( 0 ) ) else {
30- continue ;
31- } ;
32- if reg0 == 0xFFFFFFFF {
33- continue ; // not a valid device
34- }
35- let reg1 = pci_proto
36- . pci ( )
37- . read_one :: < u32 > ( addr. with_register ( 2 * REG_SIZE ) )
38- . unwrap ( ) ;
39-
40- let vendor_id = ( reg0 & 0xFFFF ) as u16 ;
41- let device_id = ( reg0 >> 16 ) as u16 ;
42- if vendor_id == RED_HAT_PCI_VENDOR_ID {
43- red_hat_dev_cnt += 1 ;
44- }
24+ let devices = pci_proto. enumerate ( ) . unwrap ( ) ;
25+ for fqaddr in devices {
26+ let addr = fqaddr. addr ( ) ;
27+ let Ok ( reg0) = pci_proto. pci ( ) . read_one :: < u32 > ( addr. with_register ( 0 ) ) else {
28+ continue ;
29+ } ;
30+ if reg0 == 0xFFFFFFFF {
31+ continue ; // not a valid device
32+ }
33+ let reg1 = pci_proto
34+ . pci ( )
35+ . read_one :: < u32 > ( addr. with_register ( 2 * REG_SIZE ) )
36+ . unwrap ( ) ;
4537
46- let class_code = ( reg1 >> 24 ) as u8 ;
47- let subclass_code = ( ( reg1 >> 16 ) & 0xFF ) as u8 ;
48- if class_code == MASS_STORAGE_CTRL_CLASS_CODE {
49- mass_storage_ctrl_cnt += 1 ;
38+ let vendor_id = ( reg0 & 0xFFFF ) as u16 ;
39+ let device_id = ( reg0 >> 16 ) as u16 ;
40+ if vendor_id == RED_HAT_PCI_VENDOR_ID {
41+ red_hat_dev_cnt += 1 ;
42+ }
5043
51- if subclass_code == SATA_CTRL_SUBCLASS_CODE {
52- sata_ctrl_cnt += 1 ;
53- }
54- }
44+ let class_code = ( reg1 >> 24 ) as u8 ;
45+ let subclass_code = ( ( reg1 >> 16 ) & 0xFF ) as u8 ;
46+ if class_code == MASS_STORAGE_CTRL_CLASS_CODE {
47+ mass_storage_ctrl_cnt += 1 ;
5548
56- log:: info!(
57- "PCI Device: [{bus}, {dev}, {fun}]: vendor={vendor_id:04X}, device={device_id:04X}, class={class_code:02X}, subclass={subclass_code:02X}"
58- ) ;
49+ if subclass_code == SATA_CTRL_SUBCLASS_CODE {
50+ sata_ctrl_cnt += 1 ;
5951 }
6052 }
53+
54+ let ( bus, dev, fun) = ( addr. bus , addr. dev , addr. fun ) ;
55+ log:: info!(
56+ "PCI Device: [{bus}, {dev}, {fun}]: vendor={vendor_id:04X}, device={device_id:04X}, class={class_code:02X}, subclass={subclass_code:02X}"
57+ ) ;
6158 }
6259 }
6360
0 commit comments