@@ -414,12 +414,29 @@ void pci_display_device_list()
414414 // Don't list bridges
415415 continue ;
416416 }
417+ bool msi = false, msix = false;
418+ /* Check for MSI/MSI-X capability */
419+ uint16_t status = pci_read16 (list [n ], PCI_STATUS );
420+ if (status & PCI_STATUS_CAPABILITIES_LIST ) {
421+ uint8_t cap = pci_read8 (list [n ], PCI_CAPABILITY_POINTER );
422+ while (cap ) {
423+ uint8_t id = pci_read8 (list [n ], cap + 0x00 );
424+ uint8_t next = pci_read8 (list [n ], cap + 0x01 );
425+ if (id == PCI_CAPABILITY_MSI ) {
426+ msi = true;
427+ } else if (id == PCI_CAPABILITY_MSIX ) {
428+ msix = true;
429+ }
430+ cap = next ;
431+ }
432+ }
417433 dprintf (
418- "%02x:%02x:%02x: %s (%04x:%04x) [%02x:%02x:%02x]\n" ,
434+ "%02x:%02x:%02x: %s (%04x:%04x) [%02x:%02x:%02x] %s%s \n" ,
419435 list [n ].bus_num , list [n ].device_num , list [n ].function_num ,
420436 device_description ,
421437 pci_read (list [n ], PCI_VENDOR_ID ), pci_read (list [n ], PCI_DEVICE_ID ),
422- class , subclass , progif
438+ class , subclass , progif ,
439+ msi ? "MSI" : "" , msix ? "MSI-X" : ""
423440 );
424441 }
425442}
@@ -820,52 +837,52 @@ uint64_t get_bar_size(pci_dev_t dev, int bar_index) {
820837}
821838
822839bool pci_disable_bus_master (pci_dev_t device ) {
823- uint32_t cmd = pci_read (device , PCI_COMMAND );
824- if ((cmd & PCI_COMMAND_BUS_MASTER ) != 0 ) {
825- cmd &= ~PCI_COMMAND_BUS_MASTER ;
826- pci_write (device , PCI_COMMAND , cmd );
827- cmd = pci_read (device , PCI_COMMAND );
828- }
829- return (cmd & PCI_COMMAND_BUS_MASTER ) == 0 ;
840+ uint32_t cmd = pci_read (device , PCI_COMMAND );
841+ if ((cmd & PCI_COMMAND_BUS_MASTER ) != 0 ) {
842+ cmd &= ~PCI_COMMAND_BUS_MASTER ;
843+ pci_write (device , PCI_COMMAND , cmd );
844+ cmd = pci_read (device , PCI_COMMAND );
845+ }
846+ return (cmd & PCI_COMMAND_BUS_MASTER ) == 0 ;
830847}
831848
832849bool pci_enable_iospace (pci_dev_t device ) {
833- uint32_t cmd = pci_read (device , PCI_COMMAND );
834- if ((cmd & PCI_COMMAND_IOSPACE ) == 0 ) {
835- cmd |= PCI_COMMAND_IOSPACE ;
836- pci_write (device , PCI_COMMAND , cmd );
837- cmd = pci_read (device , PCI_COMMAND );
838- }
839- return (cmd & PCI_COMMAND_IOSPACE ) != 0 ;
850+ uint32_t cmd = pci_read (device , PCI_COMMAND );
851+ if ((cmd & PCI_COMMAND_IOSPACE ) == 0 ) {
852+ cmd |= PCI_COMMAND_IOSPACE ;
853+ pci_write (device , PCI_COMMAND , cmd );
854+ cmd = pci_read (device , PCI_COMMAND );
855+ }
856+ return (cmd & PCI_COMMAND_IOSPACE ) != 0 ;
840857}
841858
842859bool pci_enable_memspace (pci_dev_t device ) {
843- uint32_t cmd = pci_read (device , PCI_COMMAND );
844- if ((cmd & PCI_COMMAND_MEMSPACE ) == 0 ) {
845- cmd |= PCI_COMMAND_MEMSPACE ;
846- pci_write (device , PCI_COMMAND , cmd );
847- cmd = pci_read (device , PCI_COMMAND );
848- }
849- return (cmd & PCI_COMMAND_MEMSPACE ) != 0 ;
860+ uint32_t cmd = pci_read (device , PCI_COMMAND );
861+ if ((cmd & PCI_COMMAND_MEMSPACE ) == 0 ) {
862+ cmd |= PCI_COMMAND_MEMSPACE ;
863+ pci_write (device , PCI_COMMAND , cmd );
864+ cmd = pci_read (device , PCI_COMMAND );
865+ }
866+ return (cmd & PCI_COMMAND_MEMSPACE ) != 0 ;
850867}
851868
852869bool pci_disable_iospace (pci_dev_t device ) {
853- uint32_t cmd = pci_read (device , PCI_COMMAND );
854- if ((cmd & PCI_COMMAND_IOSPACE ) != 0 ) {
855- cmd &= ~PCI_COMMAND_IOSPACE ;
856- pci_write (device , PCI_COMMAND , cmd );
857- cmd = pci_read (device , PCI_COMMAND );
858- }
859- return (cmd & PCI_COMMAND_IOSPACE ) == 0 ;
870+ uint32_t cmd = pci_read (device , PCI_COMMAND );
871+ if ((cmd & PCI_COMMAND_IOSPACE ) != 0 ) {
872+ cmd &= ~PCI_COMMAND_IOSPACE ;
873+ pci_write (device , PCI_COMMAND , cmd );
874+ cmd = pci_read (device , PCI_COMMAND );
875+ }
876+ return (cmd & PCI_COMMAND_IOSPACE ) == 0 ;
860877}
861878
862879bool pci_disable_memspace (pci_dev_t device ) {
863- uint32_t cmd = pci_read (device , PCI_COMMAND );
864- if ((cmd & PCI_COMMAND_MEMSPACE ) != 0 ) {
865- cmd &= ~PCI_COMMAND_MEMSPACE ;
866- pci_write (device , PCI_COMMAND , cmd );
867- cmd = pci_read (device , PCI_COMMAND );
868- }
869- return (cmd & PCI_COMMAND_MEMSPACE ) == 0 ;
880+ uint32_t cmd = pci_read (device , PCI_COMMAND );
881+ if ((cmd & PCI_COMMAND_MEMSPACE ) != 0 ) {
882+ cmd &= ~PCI_COMMAND_MEMSPACE ;
883+ pci_write (device , PCI_COMMAND , cmd );
884+ cmd = pci_read (device , PCI_COMMAND );
885+ }
886+ return (cmd & PCI_COMMAND_MEMSPACE ) == 0 ;
870887}
871888
0 commit comments