File indexing completed on 2025-05-11 08:24:05
0001
0002
0003
0004
0005
0006
0007
0008 #include <rtems.h>
0009 #include <rtems/pci.h>
0010 #include <rtems/bspIo.h>
0011
0012 static uint8_t pci_number_of_buses = 0xff;
0013
0014 unsigned char pci_bus_count(void)
0015 {
0016 if ( pci_number_of_buses != 0xff ) {
0017 return pci_number_of_buses;
0018 }
0019
0020 uint8_t bus;
0021 uint8_t device;
0022 uint8_t function;
0023 uint8_t number_of_functions;
0024 uint8_t header = 0;
0025 uint8_t buses = 0;
0026 uint32_t vendor = 0;
0027 uint32_t class_rev = 0;
0028
0029 pci_number_of_buses = 0;
0030
0031 for (bus=0; bus < 0xff; bus++) {
0032 for (device=0; device < PCI_MAX_DEVICES; device++) {
0033
0034 pci_read_config_dword(bus, device, 0, PCI_VENDOR_ID, &vendor);
0035 if ( vendor == -1 ) {
0036 continue;
0037 }
0038
0039 pci_read_config_byte(bus, device, 0, PCI_HEADER_TYPE, &header);
0040 number_of_functions = (header & 0x80) ? PCI_MAX_FUNCTIONS : 1;
0041
0042 for ( function=0; function < number_of_functions; function++ ) {
0043 pci_read_config_dword(bus, device, function, PCI_VENDOR_ID, &vendor);
0044 if ( vendor == -1 ) {
0045 continue;
0046 }
0047
0048 pci_read_config_dword(bus, device, function, PCI_CLASS_REVISION, &class_rev);
0049 if ( (class_rev >> 16) == PCI_CLASS_BRIDGE_PCI ) {
0050 pci_read_config_byte(bus, device, function, PCI_SUBORDINATE_BUS, &buses);
0051 if ( buses > pci_number_of_buses ) {
0052 pci_number_of_buses = buses;
0053 }
0054 }
0055 }
0056 }
0057 }
0058
0059 if ( pci_number_of_buses == 0 ) {
0060 printk("pci_bus_count() found 0 busses, assuming 1\n");
0061 pci_number_of_buses = 1;
0062 } else if ( pci_number_of_buses == 0xff ) {
0063 printk("pci_bus_count() found 0xff busses, assuming 1\n");
0064 pci_number_of_buses = 1;
0065 }
0066
0067 return pci_number_of_buses;
0068 }