On Wednesday 06 July 2022 12:43:08 Pali Rohár wrote: > By default on PPC32 are PCI bus numbers unique across all PCI domains. > So system could have only 256 PCI buses independently of available > PCI domains. > > This is due to filling DT property pci-OF-bus-map which does not reflect > multi-domain setup. > > On all powerpc platforms except chrp and powermac there is no DT property > pci-OF-bus-map anymore and therefore it is possible on non-chrp/powermac > platforms to avoid this limitation of maximal number of 256 PCI buses in > system even on multi-domain setup. > > But avoiding this limitation would mean that all PCI and PCIe devices would > be present on completely different BDF addresses as every PCI domain starts > numbering PCI bueses from zero (instead of the last bus number of previous > enumerated PCI domain). Such change could break existing software which > expects fixed PCI bus numbers. > > So add a new config option CONFIG_PPC_PCI_BUS_NUM_DOMAIN_DEPENDENT which > enables this change. By default it is disabled. It cause that initial value > of hose->first_busno is zero. > > Signed-off-by: Pali Rohár <pali@xxxxxxxxxx> > --- > arch/powerpc/Kconfig | 11 +++++++++++ > arch/powerpc/kernel/pci_32.c | 6 ++++++ > 2 files changed, 17 insertions(+) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index be68c1f02b79..f66084bc1dfe 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -370,6 +370,17 @@ config PPC_DCR > depends on PPC_DCR_NATIVE || PPC_DCR_MMIO > default y > > +config PPC_PCI_BUS_NUM_DOMAIN_DEPENDENT > + depends on PPC32 > + depends on !PPC_PMAC && !PPC_CHRP > + bool "Assign PCI bus numbers from zero individually for each PCI domain" > + help > + By default on PPC32 were PCI bus numbers unique across all PCI domains. > + So system could have only 256 PCI buses independently of available > + PCI domains. When this option is enabled then PCI bus numbers are > + PCI domain dependent and each PCI controller on own domain can have > + 256 PCI buses, like it is on other Linux architectures. > + What do you think, would it be possible to set default value of this option to enabled? > config PPC_OF_PLATFORM_PCI > bool > depends on PCI > diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c > index 2f7284b68f06..433965bf37b4 100644 > --- a/arch/powerpc/kernel/pci_32.c > +++ b/arch/powerpc/kernel/pci_32.c > @@ -239,7 +239,9 @@ void pcibios_setup_phb_io_space(struct pci_controller *hose) > static int __init pcibios_init(void) > { > struct pci_controller *hose, *tmp; > +#ifndef CONFIG_PPC_PCI_BUS_NUM_DOMAIN_DEPENDENT > int next_busno = 0; > +#endif > > printk(KERN_INFO "PCI: Probing PCI hardware\n"); > > @@ -248,13 +250,17 @@ static int __init pcibios_init(void) > > /* Scan all of the recorded PCI controllers. */ > list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { > +#ifndef CONFIG_PPC_PCI_BUS_NUM_DOMAIN_DEPENDENT > if (pci_assign_all_buses) > hose->first_busno = next_busno; > +#endif > hose->last_busno = 0xff; > pcibios_scan_phb(hose); > pci_bus_add_devices(hose->bus); > +#ifndef CONFIG_PPC_PCI_BUS_NUM_DOMAIN_DEPENDENT > if (pci_assign_all_buses || next_busno <= hose->last_busno) > next_busno = hose->last_busno + pcibios_assign_bus_offset; > +#endif > } > > #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_CHRP) > -- > 2.20.1 >