Thread (15 messages) 15 messages, 5 authors, 2021-05-14

Re: [RFC v2 1/7] PCI: Introduce pci_host_bridge::domain_nr

flat view

From: Rob Herring <robh@kernel.org>
Date: 2021-05-04 14:35:21
Also in: linux-arm-kernel, linux-mips, linux-pci, lkml

On Tue, May 4, 2021 at 12:16 AM Mike Rapoport [off-list ref] wrote:
On Mon, May 03, 2021 at 10:46:29PM +0800, Boqun Feng wrote:
quoted
Currently we retrieve the PCI domain number of the host bridge from the
bus sysdata (or pci_config_window if PCI_DOMAINS_GENERIC=y). Actually
we have the information at PCI host bridge probing time, and it makes
sense that we store it into pci_host_bridge. One benefit of doing so is
the requirement for supporting PCI on Hyper-V for ARM64, because the
host bridge of Hyper-V doesnt' have pci_config_window, whereas ARM64 is
a PCI_DOMAINS_GENERIC=y arch, so we cannot retrieve the PCI domain
number from pci_config_window on ARM64 Hyper-V guest.

As the preparation for ARM64 Hyper-V PCI support, we introduce the
domain_nr in pci_host_bridge, and set it properly at probing time, then
for PCI_DOMAINS_GENERIC=y archs, bus domain numbers are set by the
bridge domain_nr.

Signed-off-by: Boqun Feng <redacted>
---
 arch/arm/kernel/bios32.c              |  2 ++
 arch/arm/mach-dove/pcie.c             |  2 ++
 arch/arm/mach-mv78xx0/pcie.c          |  2 ++
 arch/arm/mach-orion5x/pci.c           |  2 ++
 arch/arm64/kernel/pci.c               |  3 +--
 arch/mips/pci/pci-legacy.c            |  2 ++
 arch/mips/pci/pci-xtalk-bridge.c      |  2 ++
 drivers/pci/controller/pci-ftpci100.c |  2 ++
 drivers/pci/controller/pci-mvebu.c    |  2 ++
 drivers/pci/pci.c                     |  4 ++--
 drivers/pci/probe.c                   |  7 ++++++-
 include/linux/pci.h                   | 11 ++++++++---
 12 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index e7ef2b5bea9c..4942cd681e41 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -471,6 +471,8 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
                              bridge->sysdata = sys;
                              bridge->busnr = sys->busnr;
                              bridge->ops = hw->ops;
+                             if (IS_ENABLED(CONFIG_PCI_DOMAINS_GENERIC))
+                                     bridge->domain_nr = pci_bus_find_domain_nr(sys, parent);

                              ret = pci_scan_root_bus_bridge(bridge);
                      }
diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c
index ee91ac6b5ebf..92eb8484b49b 100644
--- a/arch/arm/mach-dove/pcie.c
+++ b/arch/arm/mach-dove/pcie.c
@@ -167,6 +167,8 @@ dove_pcie_scan_bus(int nr, struct pci_host_bridge *bridge)
      bridge->sysdata = sys;
      bridge->busnr = sys->busnr;
      bridge->ops = &pcie_ops;
+     if (IS_ENABLED(CONFIG_PCI_DOMAINS_GENERIC))
+             bridge->domain_nr = pci_bus_find_domain_nr(sys, NULL);
The check for CONFIG_PCI_DOMAINS_GENERIC is excessive because there is a
stub for pci_bus_find_domain_nr().

I'm not an expert in PCI, but maybe the repeated assignment of
bridge->domain_nr can live in the generic code, say, in
pci_scan_root_bus_bridge(). E.g. it will set the domain_nr when it is zero.
Yes. There's zero reason h/w drivers should care what the domain_nr is.

There's another issue with domains you should be aware of:

https://lore.kernel.org/linux-pci/20210425152155.mstuxndsoqdbdape@pali/ (local)

That may need to be fixed first because deferred probing could cause
the domain to increment each time you retry probe.

Rob
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help