Hi,
I modify the code like this, and the PCI_INTERRUPT_LINE register is set, and I can bind it to uio_pci_generic:
--- a/src/pciinit.c +++ b/src/pciinit.c @@ -575,6 +575,8 @@ static int pci_bios_init_root_regions(u32 start, u32 end)
pci_bios_init_bus_bases(&busses[0]); - pci_bios_map_device_in_bus(0 /* host bus */); + for (bus = 0; bus<= MaxPCIBus; bus++) { + pci_bios_map_device_in_bus(bus /* host bus */);
No. pci_bios_map_device_in_bus goes down recursively when it finds a bridge, so it should cover all devices already.
- pci_bios_init_device_in_bus(0 /* host bus */); + pci_bios_init_device_in_bus(bus /* host bus */); + }
That is correct. Can be done easier though by just not limiting device initialization to a specific bus like in the attached patch. Does that one work for you?
cheers, Gerd
diff --git a/src/pciinit.c b/src/pciinit.c index 597c8ea..676e35e 100644 --- a/src/pciinit.c +++ b/src/pciinit.c @@ -45,7 +45,7 @@ static struct pci_bus { } *busses; static int busses_count; -static void pci_bios_init_device_in_bus(int bus); +static void pci_bios_init_device_all(void); static void pci_bios_check_device_in_bus(int bus); static void pci_bios_init_bus_bases(struct pci_bus *bus); static void pci_bios_map_device_in_bus(int bus); @@ -254,15 +254,10 @@ static void pci_bios_init_device(struct pci_device *pci) pci_init_device(pci_device_tbl, pci, NULL); } -static void pci_bios_init_device_in_bus(int bus) +static void pci_bios_init_device_all(void) { struct pci_device *pci; foreachpci(pci) { - u8 pci_bus = pci_bdf_to_bus(pci->bdf); - if (pci_bus < bus) - continue; - if (pci_bus > bus) - break; pci_bios_init_device(pci); } } @@ -605,7 +600,7 @@ pci_setup(void) pci_bios_init_bus_bases(&busses[0]); pci_bios_map_device_in_bus(0 /* host bus */); - pci_bios_init_device_in_bus(0 /* host bus */); + pci_bios_init_device_all(); struct pci_device *pci; foreachpci(pci) {