* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
@ 2015-01-21 0:29 Yijing Wang
2015-01-21 0:29 ` [PATCH v2 01/30] PCI: Rip out pci_bus_add_devices() from pci_scan_bus() Yijing Wang
` (32 more replies)
0 siblings, 33 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:29 UTC (permalink / raw)
To: linux-arm-kernel
v1->v2:
Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
Arnd. Refresh some patch description log, and add a new patch to fix
build warning in ia64.
This series is based on Bjorn's pci-next branch.
Patch 1-4 ripped out pci_bus_add_devices() from pci scan interfaces
for better pci scan flow.
Patch 5-11 make a generic pci_host_bridge to hold pci_host_bridge
related informations, and introduce a pci_host_bridge_ops to
support platform host drivers provide its own pci_host_bridge
related operations to setup pci_host_bridge during pci enumeration.
Patch 12-28 apply the new pci scan interfaces to platform pci host
bridge drivers.
Now in kernel, we scan pci bus use the following ways:
1. pci_scan_bus.
parent = NULL, default io/mem/bus resources
call pci_bus_add_devices()
2. pci_scan_bus_parented() + pci_bus_add_devices()
default io/mem/bus resources, only used by xen
3. pci_scan_root_bus() + pci_bus_add_devices()
4. pci_create_root_bus() + pci_scan_child_bus() + pci_bus_add_devices()
5. pci_create_root_bus() + xx_of_scan_bus() + pci_bus_add_devices()
And we have a lot of arch specific pci_domain_nr() and other platform
specific weak function like pcibios_root_bridge_prepare().
After applied this series, we have following scan interfaces:
1. pci_scan_bus_legacy()
parent = NULL, default io/mem/bus resources.
for legacy pci scan
2. pci_scan_root_bus()
for callers provide its own parent and io/mem/bus resources
but no platform specific pci_host_bridge operations
3. pci_scan_root_bridge()
for callers provide its own parent and io/mem/bus resources
and pci_host_bridge_ops.
Besides, above pci scan interfaces all need addtionally call pci_bus_add_devices()
to set match_driver true and try to attach drivers.
Also we could eliminate all arch specific pci_domain_nr() after applied this series.
I tested this series on x86 (with or without ACPI).
Comments and tests are warmly welcome!
Arnd Bergmann (1):
xen/PCI: Don't use deprecated function pci_scan_bus_parented()
Yijing Wang (29):
PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
PCI: Remove deprecated pci_scan_bus_parented()
PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
PCI: Combine PCI domain and bus number in u32 arg
PCI: Pass PCI domain number combined with root bus number
PCI: Introduce pci_host_assign_domain_nr() to assign domain
PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
PCI: Introduce pci_host_bridge_list to manage host bridges
PCI: Save sysdata in pci_host_bridge drvdata
PCI: Introduce pci_host_bridge_ops to support host specific
operations
PCI: Introduce new scan function pci_scan_root_bridge()
PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
PCI/IA64: Fix the build warning about pci_domain_nr()
PCI/powerpc: Rename pcibios_root_bridge_prepare()
PCI/powerpc: Use pci_scan_root_bridge() for simplicity
PCI: Remove weak pcibios_root_bridge_prepare()
PCI/sparc: Use pci_scan_root_bridge() for simplicity
PCI: Introduce pci_bus_child_max_busnr()
PCI/Parisc: Use pci_scan_root_bus() for simplicity
PCI/mvebu: Use pci_common_init_dev() to simplify code
PCI/tegra: Remove redundant tegra_pcie_scan_bus()
PCI/designware: Use pci_scan_root_bus() for simplicity
PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
PCI: Export find_pci_host_bridge()
PCI: Remove platform specific pci_domain_nr()
PCI: Remove pci_bus_assign_domain_nr()
arch/alpha/include/asm/pci.h | 2 -
arch/alpha/kernel/pci.c | 7 +-
arch/alpha/kernel/sys_nautilus.c | 4 +-
arch/frv/mb93090-mb00/pci-vdk.c | 6 +-
arch/ia64/include/asm/pci.h | 1 -
arch/ia64/pci/pci.c | 34 +++---
arch/ia64/sn/kernel/io_acpi_init.c | 6 +-
arch/ia64/sn/kernel/io_init.c | 8 +-
arch/m68k/coldfire/pci.c | 3 +-
arch/microblaze/pci/pci-common.c | 17 +--
arch/mips/include/asm/pci.h | 2 -
arch/mips/pci/pci.c | 5 +-
arch/mn10300/unit-asb2305/pci.c | 5 +-
arch/powerpc/include/asm/machdep.h | 2 +-
arch/powerpc/kernel/pci-common.c | 77 ++++++------
arch/powerpc/platforms/pseries/pci.c | 8 +-
arch/powerpc/platforms/pseries/pseries.h | 2 +-
arch/powerpc/platforms/pseries/setup.c | 2 +-
arch/s390/pci/pci.c | 13 +--
arch/sh/drivers/pci/pci.c | 6 +-
arch/sh/include/asm/pci.h | 2 -
arch/sparc/kernel/leon_pci.c | 1 +
arch/sparc/kernel/pci.c | 50 ++++----
arch/sparc/kernel/pcic.c | 4 +-
arch/tile/include/asm/pci.h | 2 -
arch/tile/kernel/pci.c | 6 +-
arch/tile/kernel/pci_gx.c | 7 +-
arch/unicore32/kernel/pci.c | 13 +--
arch/x86/include/asm/pci.h | 6 -
arch/x86/pci/acpi.c | 38 +++---
arch/x86/pci/common.c | 4 +-
arch/xtensa/kernel/pci.c | 2 +
drivers/parisc/dino.c | 11 +--
drivers/parisc/lba_pci.c | 7 +-
drivers/pci/host-bridge.c | 90 ++++++++++++++-
drivers/pci/host/pci-mvebu.c | 18 +---
drivers/pci/host/pci-tegra.c | 16 ---
drivers/pci/host/pci-xgene.c | 3 +-
drivers/pci/host/pcie-designware.c | 4 +-
drivers/pci/hotplug/acpiphp_glue.c | 29 +-----
drivers/pci/hotplug/ibmphp_core.c | 6 +-
drivers/pci/pci.c | 42 ++++++-
drivers/pci/probe.c | 196 ++++++++++++------------------
drivers/pci/xen-pcifront.c | 11 ++-
include/linux/pci.h | 47 +++++---
include/uapi/linux/pci.h | 3 +
46 files changed, 424 insertions(+), 404 deletions(-)
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 01/30] PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
@ 2015-01-21 0:29 ` Yijing Wang
2015-01-21 0:29 ` [PATCH v2 02/30] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus() Yijing Wang
` (31 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:29 UTC (permalink / raw)
To: linux-arm-kernel
Pci_bus_add_devices() should not be placed in pci_scan_bus().
Now pci device will be added to driver core once its
creation. All things left in pci_bus_add_devices() are
driver attachment and other trivial sysfs things.
Pci_scan_bus() should be the function responsible for
scanning PCI devices, not including driver attachment.
Other, some callers(m68k,unicore32,alpha) of pci_scan_bus()
will call pci_bus_size_bridges() and pci_bus_assign_resources()
after pci_scan_bus().
E.g.
In m68k
mcf_pci_init()
pci_scan_bus()
...
pci_bus_add_devices() --- try to attach driver
pci_fixup_irqs()
pci_bus_size_bridges()
pci_bus_assign_resources()
Above code flow make pci scan logic obscure, resources should
be assigned correctly before attaching driver. Because
pci_scan_bus() mostly be called in system boot path, when
before drivers are loaded(in module_init), so no pci scan
issues will occur. Most pci_scan_bus() callers additionally
call pci_bus_size_bridges() and pci_bus_assign_resources()
after pci_scan_bus(), we could rip out pci_bus_add_devices()
for better code readability. After applied this patch,
pci_scan_bus() should be used like:
pci_scan_bus() (mandatory)
pci_fixup_irqs() (optional)
pci_bus_size_bridges() (optional)
pci_pci_bus_assign_resources() (optional)
pci_bus_add_devices() (mandatory)
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Geert Uytterhoeven <geert@linux-m68k.org>
CC: Guan Xuetao <gxt@mprc.pku.edu.cn>
CC: Richard Henderson <rth@twiddle.net>
CC: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
CC: Matt Turner <mattst88@gmail.com>
CC: linux-alpha at vger.kernel.org
CC: linux-m68k at lists.linux-m68k.org
CC: sparclinux at vger.kernel.org
---
arch/alpha/kernel/sys_nautilus.c | 1 +
arch/m68k/coldfire/pci.c | 1 +
arch/sparc/kernel/pcic.c | 2 ++
arch/unicore32/kernel/pci.c | 11 +++--------
drivers/pci/hotplug/ibmphp_core.c | 6 ++++--
drivers/pci/probe.c | 1 -
6 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c
index 837c0fa..4ae4a40 100644
--- a/arch/alpha/kernel/sys_nautilus.c
+++ b/arch/alpha/kernel/sys_nautilus.c
@@ -253,6 +253,7 @@ nautilus_init_pci(void)
for the root bus, so just clear it. */
bus->self = NULL;
pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq);
+ pci_bus_add_devices(bus);
}
/*
diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c
index df96792..d45f087 100644
--- a/arch/m68k/coldfire/pci.c
+++ b/arch/m68k/coldfire/pci.c
@@ -319,6 +319,7 @@ static int __init mcf_pci_init(void)
pci_fixup_irqs(pci_common_swizzle, mcf_pci_map_irq);
pci_bus_size_bridges(rootbus);
pci_bus_assign_resources(rootbus);
+ pci_bus_add_devices(rootbus);
return 0;
}
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index 6cc78c2..7a82fe2 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -391,6 +391,8 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic *pcic)
struct linux_pbm_info *pbm = &pcic->pbm;
pbm->pci_bus = pci_scan_bus(pbm->pci_first_busno, &pcic_ops, pbm);
+ if (pbm->pci_bus)
+ pci_bus_add_devices(pbm->pci_bus);
#if 0 /* deadwood transplanted from sparc64 */
pci_fill_in_pbm_cookies(pbm->pci_bus, pbm, pbm->prom_node);
pci_record_assignments(pbm, pbm->pci_bus);
diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c
index 374a055..3d82024 100644
--- a/arch/unicore32/kernel/pci.c
+++ b/arch/unicore32/kernel/pci.c
@@ -266,17 +266,12 @@ static int __init pci_common_init(void)
pci_fixup_irqs(pci_common_swizzle, pci_puv3_map_irq);
if (!pci_has_flag(PCI_PROBE_ONLY)) {
- /*
- * Size the bridge windows.
- */
+ /* Size the bridge windows. */
pci_bus_size_bridges(puv3_bus);
-
- /*
- * Assign resources.
- */
+ /* Assign resources. */
pci_bus_assign_resources(puv3_bus);
}
-
+ pci_bus_add_devices(puv3_bus);
return 0;
}
subsys_initcall(pci_common_init);
diff --git a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c
index 96c5c72..86e3bfd 100644
--- a/drivers/pci/hotplug/ibmphp_core.c
+++ b/drivers/pci/hotplug/ibmphp_core.c
@@ -738,7 +738,7 @@ static void ibm_unconfigure_device(struct pci_func *func)
*/
static u8 bus_structure_fixup(u8 busno)
{
- struct pci_bus *bus;
+ struct pci_bus *bus, *b;
struct pci_dev *dev;
u16 l;
@@ -765,7 +765,9 @@ static u8 bus_structure_fixup(u8 busno)
(l != 0x0000) && (l != 0xffff)) {
debug("%s - Inside bus_structure_fixup()\n",
__func__);
- pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
+ b = pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
+ if (b)
+ pci_bus_add_devices(b);
break;
}
}
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 23212f8..053c0f4 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2123,7 +2123,6 @@ struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
b = pci_create_root_bus(NULL, bus, ops, sysdata, &resources);
if (b) {
pci_scan_child_bus(b);
- pci_bus_add_devices(b);
} else {
pci_free_resource_list(&resources);
}
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 02/30] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
2015-01-21 0:29 ` [PATCH v2 01/30] PCI: Rip out pci_bus_add_devices() from pci_scan_bus() Yijing Wang
@ 2015-01-21 0:29 ` Yijing Wang
2015-01-21 0:29 ` [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented() Yijing Wang
` (30 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:29 UTC (permalink / raw)
To: linux-arm-kernel
Just like pci_scan_bus(), we also should rip out
pci_bus_add_devices() from pci_scan_root_bus().
Lots platforms first call pci_scan_root_bus(), but
after that, they call pci_bus_size_bridges() and
pci_bus_assign_resources(). Place pci_bus_add_devices()
in pci_scan_root_bus() hurts PCI scan logic.
For arm hw_pci->scan() functions which call
pci_scan_root_bus(), it's no need to change anything,
because pci_bus_add_devices() will be called later
in pci_common_init_dev().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Richard Henderson <rth@twiddle.net>
CC: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
CC: Matt Turner <mattst88@gmail.com>
CC: David Howells <dhowells@redhat.com>
CC: Tony Luck <tony.luck@intel.com>
CC: Michal Simek <monstr@monstr.eu>
CC: Ralf Baechle <ralf@linux-mips.org>
CC: Koichi Yasutake <yasutake.koichi@jp.panasonic.com>
CC: Sebastian Ott <sebott@linux.vnet.ibm.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Chris Metcalf <cmetcalf@ezchip.com>
CC: Chris Zankel <chris@zankel.net>
CC: Max Filippov <jcmvbkbc@gmail.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: linux-alpha at vger.kernel.org
CC: linux-kernel at vger.kernel.org
CC: linux-mips at linux-mips.org
CC: linux-am33-list at redhat.com
CC: linux-s390 at vger.kernel.org
CC: linux-sh at vger.kernel.org
CC: sparclinux at vger.kernel.org
CC: linux-xtensa at linux-xtensa.org
---
arch/alpha/kernel/pci.c | 2 ++
arch/frv/mb93090-mb00/pci-vdk.c | 6 ++++--
arch/ia64/sn/kernel/io_init.c | 1 +
arch/microblaze/pci/pci-common.c | 1 +
arch/mips/pci/pci.c | 1 +
arch/mn10300/unit-asb2305/pci.c | 5 ++++-
arch/s390/pci/pci.c | 2 +-
arch/sh/drivers/pci/pci.c | 1 +
arch/sparc/kernel/leon_pci.c | 1 +
arch/tile/kernel/pci.c | 2 ++
arch/tile/kernel/pci_gx.c | 2 ++
arch/x86/pci/common.c | 1 +
arch/xtensa/kernel/pci.c | 2 ++
drivers/pci/probe.c | 1 -
14 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index 076c35c..97f9730 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -334,6 +334,8 @@ common_init_pci(void)
bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops,
hose, &resources);
+ if (bus)
+ pci_bus_add_devices(bus);
hose->bus = bus;
hose->need_domain_info = need_domain_info;
next_busno = bus->busn_res.end + 1;
diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c
index efa5d65..2b36044 100644
--- a/arch/frv/mb93090-mb00/pci-vdk.c
+++ b/arch/frv/mb93090-mb00/pci-vdk.c
@@ -316,6 +316,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
int __init pcibios_init(void)
{
+ struct pci_bus *bus;
struct pci_ops *dir = NULL;
LIST_HEAD(resources);
@@ -383,12 +384,13 @@ int __init pcibios_init(void)
printk("PCI: Probing PCI hardware\n");
pci_add_resource(&resources, &pci_ioport_resource);
pci_add_resource(&resources, &pci_iomem_resource);
- pci_scan_root_bus(NULL, 0, pci_root_ops, NULL, &resources);
+ bus = pci_scan_root_bus(NULL, 0, pci_root_ops, NULL, &resources);
pcibios_irq_init();
pcibios_fixup_irqs();
pcibios_resource_survey();
-
+ if (bus)
+ pci_bus_add_devices(bus);
return 0;
}
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index 0b5ce82..63b43a6 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -272,6 +272,7 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
kfree(res);
kfree(controller);
}
+ pci_bus_add_devices(bus);
}
/*
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index b30e41c..009b271 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -1351,6 +1351,7 @@ static void pcibios_scan_phb(struct pci_controller *hose)
hose->bus = bus;
hose->last_busno = bus->busn_res.end;
+ pci_bus_add_devices(bus);
}
static int __init pcibios_init(void)
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index 1bf60b1..9eb54b5 100644
--- a/arch/mips/pci/pci.c
+++ b/arch/mips/pci/pci.c
@@ -114,6 +114,7 @@ static void pcibios_scanbus(struct pci_controller *hose)
pci_bus_size_bridges(bus);
pci_bus_assign_resources(bus);
}
+ pci_bus_add_devices(bus);
}
}
diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c
index 6b4339f..860aa35 100644
--- a/arch/mn10300/unit-asb2305/pci.c
+++ b/arch/mn10300/unit-asb2305/pci.c
@@ -345,6 +345,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
*/
static int __init pcibios_init(void)
{
+ struct pci_bus *bus;
resource_size_t io_offset, mem_offset;
LIST_HEAD(resources);
@@ -376,11 +377,13 @@ static int __init pcibios_init(void)
pci_add_resource_offset(&resources, &pci_ioport_resource, io_offset);
pci_add_resource_offset(&resources, &pci_iomem_resource, mem_offset);
- pci_scan_root_bus(NULL, 0, &pci_direct_ampci, NULL, &resources);
+ bus = pci_scan_root_bus(NULL, 0, &pci_direct_ampci, NULL, &resources);
pcibios_irq_init();
pcibios_fixup_irqs();
pcibios_resource_survey();
+ if (bus)
+ pci_bus_add_devices(bus);
return 0;
}
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 3290f11..0b32769 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -756,7 +756,7 @@ static int zpci_scan_bus(struct zpci_dev *zdev)
zpci_cleanup_bus_resources(zdev);
return -EIO;
}
-
+ pci_bus_add_devices(zdev->bus);
zdev->bus->max_bus_speed = zdev->max_bus_speed;
return 0;
}
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c
index 1bc09ee..efc1051 100644
--- a/arch/sh/drivers/pci/pci.c
+++ b/arch/sh/drivers/pci/pci.c
@@ -69,6 +69,7 @@ static void pcibios_scanbus(struct pci_channel *hose)
pci_bus_size_bridges(bus);
pci_bus_assign_resources(bus);
+ pci_bus_add_devices(bus);
} else {
pci_free_resource_list(&resources);
}
diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c
index 899b720..2971076 100644
--- a/arch/sparc/kernel/leon_pci.c
+++ b/arch/sparc/kernel/leon_pci.c
@@ -40,6 +40,7 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)
/* Assign devices with resources */
pci_assign_unassigned_resources();
+ pci_bus_add_devices(root_bus);
} else {
pci_free_resource_list(&resources);
}
diff --git a/arch/tile/kernel/pci.c b/arch/tile/kernel/pci.c
index f70c789..83d3e30 100644
--- a/arch/tile/kernel/pci.c
+++ b/arch/tile/kernel/pci.c
@@ -339,6 +339,8 @@ int __init pcibios_init(void)
struct pci_bus *next_bus;
struct pci_dev *dev;
+ pci_bus_add_devices(root_bus);
+
list_for_each_entry(dev, &root_bus->devices, bus_list) {
/*
* Find the PCI host controller, ie. the 1st
diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index 2c95f37..d7a0729 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -916,6 +916,8 @@ int __init pcibios_init(void)
/* Configure the max_payload_size values for this domain. */
fixup_read_and_payload_sizes(controller);
+ pci_bus_add_devices(root_bus);
+
/* Alloc a PIO region for PCI memory access for each RC port. */
ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
if (ret < 0) {
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 7b20bcc..300d39e 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -475,6 +475,7 @@ void pcibios_scan_root(int busnum)
pci_free_resource_list(&resources);
kfree(sd);
}
+ pci_bus_add_devices(bus);
}
void __init pcibios_set_cache_line_size(void)
diff --git a/arch/xtensa/kernel/pci.c b/arch/xtensa/kernel/pci.c
index 5b34033..f2ae64e 100644
--- a/arch/xtensa/kernel/pci.c
+++ b/arch/xtensa/kernel/pci.c
@@ -185,6 +185,8 @@ static int __init pcibios_init(void)
pci_controller_apertures(pci_ctrl, &resources);
bus = pci_scan_root_bus(NULL, pci_ctrl->first_busno,
pci_ctrl->ops, pci_ctrl, &resources);
+ if (bus)
+ pci_bus_add_devices(bus);
pci_ctrl->bus = bus;
pci_ctrl->last_busno = bus->busn_res.end;
if (next_busno <= pci_ctrl->last_busno)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 053c0f4..7cf577f 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2087,7 +2087,6 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
if (!found)
pci_bus_update_busn_res_end(b, max);
- pci_bus_add_devices(b);
return b;
}
EXPORT_SYMBOL(pci_scan_root_bus);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
2015-01-21 0:29 ` [PATCH v2 01/30] PCI: Rip out pci_bus_add_devices() from pci_scan_bus() Yijing Wang
2015-01-21 0:29 ` [PATCH v2 02/30] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus() Yijing Wang
@ 2015-01-21 0:29 ` Yijing Wang
2015-01-22 20:25 ` Konrad Rzeszutek Wilk
2015-01-21 0:29 ` [PATCH v2 04/30] PCI: Remove deprecated pci_scan_bus_parented() Yijing Wang
` (29 subsequent siblings)
32 siblings, 1 reply; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:29 UTC (permalink / raw)
To: linux-arm-kernel
From: Arnd Bergmann <arnd@arndb.de>
Use pci_scan_root_bus() instead of deprecated function
pci_scan_bus_parented().
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
CC: xen-devel at lists.xenproject.org
---
drivers/pci/xen-pcifront.c | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
index b1ffebe..240ddbc 100644
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -446,6 +446,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
unsigned int domain, unsigned int bus)
{
struct pci_bus *b;
+ LIST_HEAD(resources);
struct pcifront_sd *sd = NULL;
struct pci_bus_entry *bus_entry = NULL;
int err = 0;
@@ -470,17 +471,20 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
err = -ENOMEM;
goto err_out;
}
+ pci_add_resource(&resources, &ioport_resource);
+ pci_add_resource(&resources, &iomem_resource);
pcifront_init_sd(sd, domain, bus, pdev);
pci_lock_rescan_remove();
- b = pci_scan_bus_parented(&pdev->xdev->dev, bus,
- &pcifront_bus_ops, sd);
+ b = pci_scan_root_bus(&pdev->xdev->dev, bus,
+ &pcifront_bus_ops, sd, &resources);
if (!b) {
dev_err(&pdev->xdev->dev,
"Error creating PCI Frontend Bus!\n");
err = -ENOMEM;
pci_unlock_rescan_remove();
+ pci_free_resource_list(&resources);
goto err_out;
}
@@ -488,7 +492,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
list_add(&bus_entry->list, &pdev->root_buses);
- /* pci_scan_bus_parented skips devices which do not have a have
+ /* pci_scan_root_bus skips devices which do not have a have
* devfn==0. The pcifront_scan_bus enumerates all devfn. */
err = pcifront_scan_bus(pdev, domain, bus, b);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 04/30] PCI: Remove deprecated pci_scan_bus_parented()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (2 preceding siblings ...)
2015-01-21 0:29 ` [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented() Yijing Wang
@ 2015-01-21 0:29 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 05/30] PCI: Rename pci_scan_bus() to pci_scan_bus_legacy() Yijing Wang
` (28 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:29 UTC (permalink / raw)
To: linux-arm-kernel
No one uses pci_scan_bus_parented() any more,
remove it.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/probe.c | 19 -------------------
include/linux/pci.h | 2 --
2 files changed, 0 insertions(+), 21 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 7cf577f..e44de73 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2091,25 +2091,6 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
}
EXPORT_SYMBOL(pci_scan_root_bus);
-/* Deprecated; use pci_scan_root_bus() instead */
-struct pci_bus *pci_scan_bus_parented(struct device *parent,
- int bus, struct pci_ops *ops, void *sysdata)
-{
- LIST_HEAD(resources);
- struct pci_bus *b;
-
- pci_add_resource(&resources, &ioport_resource);
- pci_add_resource(&resources, &iomem_resource);
- pci_add_resource(&resources, &busn_resource);
- b = pci_create_root_bus(parent, bus, ops, sysdata, &resources);
- if (b)
- pci_scan_child_bus(b);
- else
- pci_free_resource_list(&resources);
- return b;
-}
-EXPORT_SYMBOL(pci_scan_bus_parented);
-
struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
void *sysdata)
{
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 360a966..55b2c81 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -769,8 +769,6 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
void pcibios_scan_specific_bus(int busn);
struct pci_bus *pci_find_bus(int domain, int busnr);
void pci_bus_add_devices(const struct pci_bus *bus);
-struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus,
- struct pci_ops *ops, void *sysdata);
struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
struct pci_ops *ops, void *sysdata,
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 05/30] PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (3 preceding siblings ...)
2015-01-21 0:29 ` [PATCH v2 04/30] PCI: Remove deprecated pci_scan_bus_parented() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 06/30] PCI: Combine PCI domain and bus number in u32 arg Yijing Wang
` (27 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Pci_scan_bus() is called by legacy pci host drivers,
the legacy host drivers mean they use NULL as parent
device, use all IO/MEM as default resources. Rename
pci_scan_bus() to pci_scan_bus_legacy() for better
readability.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
arch/alpha/kernel/sys_nautilus.c | 2 +-
arch/m68k/coldfire/pci.c | 2 +-
arch/sparc/kernel/pcic.c | 2 +-
arch/unicore32/kernel/pci.c | 2 +-
drivers/pci/hotplug/ibmphp_core.c | 2 +-
drivers/pci/probe.c | 4 ++--
include/linux/pci.h | 2 +-
7 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c
index 4ae4a40..2c864bb 100644
--- a/arch/alpha/kernel/sys_nautilus.c
+++ b/arch/alpha/kernel/sys_nautilus.c
@@ -206,7 +206,7 @@ nautilus_init_pci(void)
unsigned long memtop = max_low_pfn << PAGE_SHIFT;
/* Scan our single hose. */
- bus = pci_scan_bus(0, alpha_mv.pci_ops, hose);
+ bus = pci_scan_bus_legacy(0, alpha_mv.pci_ops, hose);
hose->bus = bus;
pcibios_claim_one_bus(bus);
diff --git a/arch/m68k/coldfire/pci.c b/arch/m68k/coldfire/pci.c
index d45f087..0ef4dd4 100644
--- a/arch/m68k/coldfire/pci.c
+++ b/arch/m68k/coldfire/pci.c
@@ -312,7 +312,7 @@ static int __init mcf_pci_init(void)
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(msecs_to_jiffies(200));
- rootbus = pci_scan_bus(0, &mcf_pci_ops, NULL);
+ rootbus = pci_scan_bus_legacy(0, &mcf_pci_ops, NULL);
rootbus->resource[0] = &mcf_pci_io;
rootbus->resource[1] = &mcf_pci_mem;
diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c
index 7a82fe2..f7edc97 100644
--- a/arch/sparc/kernel/pcic.c
+++ b/arch/sparc/kernel/pcic.c
@@ -390,7 +390,7 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic *pcic)
{
struct linux_pbm_info *pbm = &pcic->pbm;
- pbm->pci_bus = pci_scan_bus(pbm->pci_first_busno, &pcic_ops, pbm);
+ pbm->pci_bus = pci_scan_bus_legacy(pbm->pci_first_busno, &pcic_ops, pbm);
if (pbm->pci_bus)
pci_bus_add_devices(pbm->pci_bus);
#if 0 /* deadwood transplanted from sparc64 */
diff --git a/arch/unicore32/kernel/pci.c b/arch/unicore32/kernel/pci.c
index 3d82024..2e238b4 100644
--- a/arch/unicore32/kernel/pci.c
+++ b/arch/unicore32/kernel/pci.c
@@ -258,7 +258,7 @@ static int __init pci_common_init(void)
pci_puv3_preinit();
- puv3_bus = pci_scan_bus(0, &pci_puv3_ops, NULL);
+ puv3_bus = pci_scan_bus_legacy(0, &pci_puv3_ops, NULL);
if (!puv3_bus)
panic("PCI: unable to scan bus!");
diff --git a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c
index 86e3bfd..4ade1b4 100644
--- a/drivers/pci/hotplug/ibmphp_core.c
+++ b/drivers/pci/hotplug/ibmphp_core.c
@@ -765,7 +765,7 @@ static u8 bus_structure_fixup(u8 busno)
(l != 0x0000) && (l != 0xffff)) {
debug("%s - Inside bus_structure_fixup()\n",
__func__);
- b = pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
+ b = pci_scan_bus_legacy(busno, ibmphp_pci_bus->ops, NULL);
if (b)
pci_bus_add_devices(b);
break;
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index e44de73..ed894cb 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2091,7 +2091,7 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
}
EXPORT_SYMBOL(pci_scan_root_bus);
-struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
+struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops,
void *sysdata)
{
LIST_HEAD(resources);
@@ -2108,7 +2108,7 @@ struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops,
}
return b;
}
-EXPORT_SYMBOL(pci_scan_bus);
+EXPORT_SYMBOL(pci_scan_bus_legacy);
/**
* pci_rescan_bus_bridge_resize - scan a PCI bus for devices.
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 55b2c81..a6fa2f1 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -769,7 +769,7 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
void pcibios_scan_specific_bus(int busn);
struct pci_bus *pci_find_bus(int domain, int busnr);
void pci_bus_add_devices(const struct pci_bus *bus);
-struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata);
+struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops, void *sysdata);
struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 06/30] PCI: Combine PCI domain and bus number in u32 arg
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (4 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 05/30] PCI: Rename pci_scan_bus() to pci_scan_bus_legacy() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 07/30] PCI: Pass PCI domain number combined with root bus number Yijing Wang
` (26 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Currently, we use int type for bus number in
pci_create_root_bus(), pci_scan_root_bus() and
pci_scan_bus_legacy. Because PCI bus number
always <= 255, so we could change the bus number
argument type to u32, and combine PCI domain and
bus number in one. Also add a domain member in
pci_host_bridge to save domain number. Finally,
we could eliminate lots of the platform specific
pci_domain_nr() in the last of the series.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/probe.c | 16 +++++++++-------
include/linux/pci.h | 7 ++++---
include/uapi/linux/pci.h | 3 +++
3 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ed894cb..50f58b3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1889,7 +1889,7 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
{
}
-struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
{
int error;
@@ -1900,6 +1900,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
resource_size_t offset;
char bus_addr[64];
char *fmt;
+ u8 bus = PCI_BUSNUM(db);
b = pci_alloc_bus(NULL);
if (!b)
@@ -1920,6 +1921,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
if (!bridge)
goto err_out;
+ bridge->domain = PCI_DOMAIN(db);
bridge->dev.parent = parent;
bridge->dev.release = pci_release_host_bridge_dev;
dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
@@ -2057,7 +2059,7 @@ void pci_bus_release_busn_res(struct pci_bus *b)
res, ret ? "can not be" : "is");
}
-struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
{
struct pci_host_bridge_window *window;
@@ -2071,15 +2073,15 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
break;
}
- b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
+ b = pci_create_root_bus(parent, db, ops, sysdata, resources);
if (!b)
return NULL;
if (!found) {
dev_info(&b->dev,
"No busn resource found for root bus, will use [bus %02x-ff]\n",
- bus);
- pci_bus_insert_busn_res(b, bus, 255);
+ PCI_BUSNUM(db));
+ pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
}
max = pci_scan_child_bus(b);
@@ -2091,7 +2093,7 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
}
EXPORT_SYMBOL(pci_scan_root_bus);
-struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops,
+struct pci_bus *pci_scan_bus_legacy(u32 db, struct pci_ops *ops,
void *sysdata)
{
LIST_HEAD(resources);
@@ -2100,7 +2102,7 @@ struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops,
pci_add_resource(&resources, &ioport_resource);
pci_add_resource(&resources, &iomem_resource);
pci_add_resource(&resources, &busn_resource);
- b = pci_create_root_bus(NULL, bus, ops, sysdata, &resources);
+ b = pci_create_root_bus(NULL, db, ops, sysdata, &resources);
if (b) {
pci_scan_child_bus(b);
} else {
diff --git a/include/linux/pci.h b/include/linux/pci.h
index a6fa2f1..c771508 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -402,6 +402,7 @@ struct pci_host_bridge_window {
};
struct pci_host_bridge {
+ u16 domain;
struct device dev;
struct pci_bus *bus; /* root bus */
struct list_head windows; /* pci_host_bridge_windows */
@@ -769,14 +770,14 @@ void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
void pcibios_scan_specific_bus(int busn);
struct pci_bus *pci_find_bus(int domain, int busnr);
void pci_bus_add_devices(const struct pci_bus *bus);
-struct pci_bus *pci_scan_bus_legacy(int bus, struct pci_ops *ops, void *sysdata);
-struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_scan_bus_legacy(u32 dombus, struct pci_ops *ops, void *sysdata);
+struct pci_bus *pci_create_root_bus(struct device *parent, u32 dombus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int busmax);
int pci_bus_update_busn_res_end(struct pci_bus *b, int busmax);
void pci_bus_release_busn_res(struct pci_bus *b);
-struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
+struct pci_bus *pci_scan_root_bus(struct device *parent, u32 dombus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
diff --git a/include/uapi/linux/pci.h b/include/uapi/linux/pci.h
index 3c292bc..89c6f15 100644
--- a/include/uapi/linux/pci.h
+++ b/include/uapi/linux/pci.h
@@ -30,6 +30,9 @@
#define PCI_DEVFN(slot, func) ((((slot) & 0x1f) << 3) | ((func) & 0x07))
#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f)
#define PCI_FUNC(devfn) ((devfn) & 0x07)
+#define PCI_DOMAIN(db) ((db) >> 16)
+#define PCI_BUSNUM(db) ((db) & 0xffff)
+#define PCI_DOMBUS(domain, bus) (((domain) << 16) | (bus))
/* Ioctls for /proc/bus/pci/X/Y nodes. */
#define PCIIOC_BASE ('P' << 24 | 'C' << 16 | 'I' << 8)
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 07/30] PCI: Pass PCI domain number combined with root bus number
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (5 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 06/30] PCI: Combine PCI domain and bus number in u32 arg Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 08/30] PCI: Introduce pci_host_assign_domain_nr() to assign domain Yijing Wang
` (25 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now we could pass PCI domain combined with bus number
in u32 argu. Because in arm/arm64, PCI domain number
is assigned by pci_bus_assign_domain_nr(). So we leave
pci_scan_root_bus() and pci_create_root_bus() in arm/arm64
unchanged. A new function pci_host_assign_domain_nr()
will be introduced for arm/arm64 to assign domain number
in later patch.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Richard Henderson <rth@twiddle.net>
CC: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
CC: Matt Turner <mattst88@gmail.com>
CC: Tony Luck <tony.luck@intel.com>
CC: Fenghua Yu <fenghua.yu@intel.com>
CC: Michal Simek <monstr@monstr.eu>
CC: Ralf Baechle <ralf@linux-mips.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
CC: Paul Mackerras <paulus@samba.org>
CC: Michael Ellerman <mpe@ellerman.id.au>
CC: Sebastian Ott <sebott@linux.vnet.ibm.com>
CC: Gerald Schaefer <gerald.schaefer@de.ibm.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Chris Metcalf <cmetcalf@ezchip.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
CC: linux-alpha at vger.kernel.org
CC: linux-kernel at vger.kernel.org
CC: linux-ia64 at vger.kernel.org
CC: linux-mips at linux-mips.org
CC: linuxppc-dev at lists.ozlabs.org
CC: linux-s390 at vger.kernel.org
CC: linux-sh at vger.kernel.org
CC: sparclinux at vger.kernel.org
CC: xen-devel at lists.xenproject.org
---
arch/alpha/kernel/pci.c | 5 +++--
arch/alpha/kernel/sys_nautilus.c | 3 ++-
arch/ia64/pci/pci.c | 4 ++--
arch/ia64/sn/kernel/io_init.c | 5 +++--
arch/microblaze/pci/pci-common.c | 5 +++--
arch/mips/pci/pci.c | 4 ++--
arch/powerpc/kernel/pci-common.c | 5 +++--
arch/s390/pci/pci.c | 5 +++--
arch/sh/drivers/pci/pci.c | 5 +++--
arch/sparc/kernel/pci.c | 5 +++--
arch/tile/kernel/pci.c | 4 ++--
arch/tile/kernel/pci_gx.c | 5 +++--
arch/x86/pci/acpi.c | 6 +++---
arch/x86/pci/common.c | 3 ++-
drivers/pci/xen-pcifront.c | 5 +++--
15 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
index 97f9730..b15f9f2 100644
--- a/arch/alpha/kernel/pci.c
+++ b/arch/alpha/kernel/pci.c
@@ -332,8 +332,9 @@ common_init_pci(void)
pci_add_resource_offset(&resources, hose->mem_space,
hose->mem_space->start);
- bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops,
- hose, &resources);
+ bus = pci_scan_root_bus(NULL,
+ PCI_DOMBUS(hose->index, next_busno), alpha_mv.pci_ops,
+ hose, &resources);
if (bus)
pci_bus_add_devices(bus);
hose->bus = bus;
diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c
index 2c864bb..f7bfdf3 100644
--- a/arch/alpha/kernel/sys_nautilus.c
+++ b/arch/alpha/kernel/sys_nautilus.c
@@ -206,7 +206,8 @@ nautilus_init_pci(void)
unsigned long memtop = max_low_pfn << PAGE_SHIFT;
/* Scan our single hose. */
- bus = pci_scan_bus_legacy(0, alpha_mv.pci_ops, hose);
+ bus = pci_scan_bus_legacy(PCI_DOMBUS(hose->index, 0),
+ alpha_mv.pci_ops, hose);
hose->bus = bus;
pcibios_claim_one_bus(bus);
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 291a582..e457015 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -465,8 +465,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
* should handle the case here, but it appears that IA64 hasn't
* such quirk. So we just ignore the case now.
*/
- pbus = pci_create_root_bus(NULL, bus, &pci_root_ops, controller,
- &info->resources);
+ pbus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, bus),
+ &pci_root_ops, controller, &info->resources);
if (!pbus) {
pci_free_resource_list(&info->resources);
__release_pci_root_info(info);
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index 63b43a6..bcdc5b8 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -266,8 +266,9 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
pci_add_resource_offset(&resources, &res[1],
prom_bussoft_ptr->bs_legacy_mem);
- bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, controller,
- &resources);
+ bus = pci_scan_root_bus(NULL,
+ PCI_DOMBUS(controller->segment, busnum),
+ &pci_root_ops, controller, &resources);
if (bus == NULL) {
kfree(res);
kfree(controller);
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 009b271..890bd36 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -1339,8 +1339,9 @@ static void pcibios_scan_phb(struct pci_controller *hose)
pcibios_setup_phb_resources(hose, &resources);
- bus = pci_scan_root_bus(hose->parent, hose->first_busno,
- hose->ops, hose, &resources);
+ bus = pci_scan_root_bus(hose->parent,
+ PCI_DOMBUS(hose->global_number, hose->first_busno),
+ hose->ops, hose, &resources);
if (bus == NULL) {
pr_err("Failed to create bus for PCI domain %04x\n",
hose->global_number);
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index 9eb54b5..980755a 100644
--- a/arch/mips/pci/pci.c
+++ b/arch/mips/pci/pci.c
@@ -92,8 +92,8 @@ static void pcibios_scanbus(struct pci_controller *hose)
pci_add_resource_offset(&resources,
hose->mem_resource, hose->mem_offset);
pci_add_resource_offset(&resources, hose->io_resource, hose->io_offset);
- bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
- &resources);
+ bus = pci_scan_root_bus(NULL, PCI_DOMBUS(hose->index, next_busno),
+ hose->pci_ops, hose, &resources);
if (!bus)
pci_free_resource_list(&resources);
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 37d512d..927c3dd 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -1602,8 +1602,9 @@ void pcibios_scan_phb(struct pci_controller *hose)
pci_add_resource(&resources, &hose->busn);
/* Create an empty bus for the toplevel */
- bus = pci_create_root_bus(hose->parent, hose->first_busno,
- hose->ops, hose, &resources);
+ bus = pci_create_root_bus(hose->parent,
+ PCI_DOMBUS(hose->global_number, hose->first_busno),
+ hose->ops, hose, &resources);
if (bus == NULL) {
pr_err("Failed to create bus for PCI domain %04x\n",
hose->global_number);
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 0b32769..612decf 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -750,8 +750,9 @@ static int zpci_scan_bus(struct zpci_dev *zdev)
if (ret)
return ret;
- zdev->bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
- zdev, &resources);
+ zdev->bus = pci_scan_root_bus(NULL,
+ PCI_DOMBUS(zdev->domain, ZPCI_BUS_NR), &pci_root_ops,
+ zdev, &resources);
if (!zdev->bus) {
zpci_cleanup_bus_resources(zdev);
return -EIO;
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c
index efc1051..7ee0772 100644
--- a/arch/sh/drivers/pci/pci.c
+++ b/arch/sh/drivers/pci/pci.c
@@ -52,8 +52,9 @@ static void pcibios_scanbus(struct pci_channel *hose)
pci_add_resource_offset(&resources, res, offset);
}
- bus = pci_scan_root_bus(NULL, next_busno, hose->pci_ops, hose,
- &resources);
+ bus = pci_scan_root_bus(NULL,
+ PCI_DOMBUS(hose->index, next_busno),
+ hose->pci_ops, hose, &resources);
hose->bus = bus;
need_domain_info = need_domain_info || hose->index;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index b36365f..d798b42 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -664,8 +664,9 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
pbm->busn.end = pbm->pci_last_busno;
pbm->busn.flags = IORESOURCE_BUS;
pci_add_resource(&resources, &pbm->busn);
- bus = pci_create_root_bus(parent, pbm->pci_first_busno, pbm->pci_ops,
- pbm, &resources);
+ bus = pci_create_root_bus(parent,
+ PCI_DOMBUS(pbm->index, pbm->pci_first_busno),
+ pbm->pci_ops, pbm, &resources);
if (!bus) {
printk(KERN_ERR "Failed to create bus for %s\n",
node->full_name);
diff --git a/arch/tile/kernel/pci.c b/arch/tile/kernel/pci.c
index 83d3e30..2603db5 100644
--- a/arch/tile/kernel/pci.c
+++ b/arch/tile/kernel/pci.c
@@ -306,8 +306,8 @@ int __init pcibios_init(void)
pci_add_resource(&resources, &ioport_resource);
pci_add_resource(&resources, &iomem_resource);
- bus = pci_scan_root_bus(NULL, 0, controller->ops,
- controller, &resources);
+ bus = pci_scan_root_bus(NULL, PCI_DOMBUS(controller->index, 0),
+ controller->ops, controller, &resources);
controller->root_bus = bus;
controller->last_busno = bus->busn_res.end;
}
diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index d7a0729..1e6ff84 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -881,8 +881,9 @@ int __init pcibios_init(void)
controller->mem_offset);
pci_add_resource(&resources, &controller->io_space);
controller->first_busno = next_busno;
- bus = pci_scan_root_bus(NULL, next_busno, controller->ops,
- controller, &resources);
+ bus = pci_scan_root_bus(NULL,
+ PCI_DOMBUS(controller->index, next_busno),
+ controller->ops, controller, &resources);
controller->root_bus = bus;
next_busno = bus->busn_res.end + 1;
}
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index cfd1b13..8edea63 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -536,9 +536,9 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
}
if (!setup_mcfg_map(info, domain, (u8)root->secondary.start,
- (u8)root->secondary.end, root->mcfg_addr))
- bus = pci_create_root_bus(NULL, busnum, &pci_root_ops,
- sd, &resources);
+ (u8)root->secondary.end, root->mcfg_addr))
+ bus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, busnum),
+ &pci_root_ops, sd, &resources);
if (bus) {
pci_scan_child_bus(bus);
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 300d39e..d6879ee 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -470,7 +470,8 @@ void pcibios_scan_root(int busnum)
sd->node = x86_pci_root_bus_node(busnum);
x86_pci_root_bus_resources(busnum, &resources);
printk(KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n", busnum);
- bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, sd, &resources);
+ bus = pci_scan_root_bus(NULL, PCI_DOMBUS(0, busnum),
+ &pci_root_ops, sd, &resources);
if (!bus) {
pci_free_resource_list(&resources);
kfree(sd);
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
index 240ddbc..a010dfa 100644
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -477,8 +477,9 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
pci_lock_rescan_remove();
- b = pci_scan_root_bus(&pdev->xdev->dev, bus,
- &pcifront_bus_ops, sd, &resources);
+ b = pci_scan_root_bus(&pdev->xdev->dev,
+ PCI_DOMBUS(sd->domain, bus),
+ &pcifront_bus_ops, sd, &resources);
if (!b) {
dev_err(&pdev->xdev->dev,
"Error creating PCI Frontend Bus!\n");
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 08/30] PCI: Introduce pci_host_assign_domain_nr() to assign domain
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (6 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 07/30] PCI: Pass PCI domain number combined with root bus number Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus() Yijing Wang
` (24 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Introduce pci_host_assign_domain_nr() to assign domain
number for pci_host_bridge. Later we will remove
pci_bus_assign_domain_nr().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/pci.c | 14 +++++++++++---
include/linux/pci.h | 4 ++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index c419554..3e10772 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4443,10 +4443,10 @@ int pci_get_new_domain_nr(void)
}
#ifdef CONFIG_PCI_DOMAINS_GENERIC
-void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent)
+static int pci_assign_domain_nr(struct device *dev)
{
static int use_dt_domains = -1;
- int domain = of_get_pci_domain_nr(parent->of_node);
+ int domain = of_get_pci_domain_nr(dev->of_node);
/*
* Check DT domain and use_dt_domains values.
@@ -4484,8 +4484,16 @@ void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent)
parent->of_node->full_name);
domain = -1;
}
+}
- bus->domain_nr = domain;
+void pci_host_assign_domain_nr(struct pci_host_bridge *host)
+{
+ host->domain = pci_assign_domain_nr(host->dev.parent);
+}
+
+void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent)
+{
+ bus->domain_nr = pci_assign_domain_nr(parent);
}
#endif
#endif
diff --git a/include/linux/pci.h b/include/linux/pci.h
index c771508..1b9c799 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1316,11 +1316,15 @@ static inline int pci_domain_nr(struct pci_bus *bus)
return bus->domain_nr;
}
void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent);
+void pci_host_assign_domain_nr(struct pci_host_bridge *host);
#else
static inline void pci_bus_assign_domain_nr(struct pci_bus *bus,
struct device *parent)
{
}
+static inline void pci_host_assign_domain_nr(struct pci_host_bridge *host)
+{
+}
#endif
/* some architectures require additional setup to direct VGA traffic */
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (7 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 08/30] PCI: Introduce pci_host_assign_domain_nr() to assign domain Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 10/30] PCI: Introduce pci_host_bridge_list to manage host bridges Yijing Wang
` (23 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
This patch separate pci_host_bridge creation out
of pci_create_root_bus(), and try to make a generic
pci_host_bridge, then we could place generic PCI
infos like domain number in it. Also Ripping out
pci_host_bridge creation from pci_create_root_bus()
make code more better readability. Further more,
we could use the generic pci_host_bridge to hold
host bridge specific operations like
pcibios_root_bridge_prepare(). The changes are
transparent to platform host bridge drivers.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/host-bridge.c | 56 ++++++++++++++++++++++
drivers/pci/probe.c | 115 ++++++++++++++++++++-------------------------
include/linux/pci.h | 5 ++-
3 files changed, 111 insertions(+), 65 deletions(-)
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0e5f3c9..8897581 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -8,6 +8,62 @@
#include "pci.h"
+static void pci_release_host_bridge_dev(struct device *dev)
+{
+ struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
+
+ if (bridge->release_fn)
+ bridge->release_fn(bridge);
+
+ pci_free_resource_list(&bridge->windows);
+ kfree(bridge);
+}
+
+struct pci_host_bridge *pci_create_host_bridge(
+ struct device *parent, u32 db, struct list_head *resources)
+{
+ int error;
+ int bus = PCI_BUSNUM(db);
+ int domain = PCI_DOMAIN(db);
+ struct pci_host_bridge *host;
+ struct pci_host_bridge_window *window, *n;
+
+ host = kzalloc(sizeof(*host), GFP_KERNEL);
+ if (!host)
+ return NULL;
+
+ host->busnum = bus;
+ host->domain = domain;
+ /* If support CONFIG_PCI_DOMAINS_GENERIC, use
+ * pci_host_assign_domain_nr() to assign domain
+ * number instead PCI_DOMAIN(db).
+ */
+ pci_host_assign_domain_nr(host);
+
+ host->dev.parent = parent;
+ INIT_LIST_HEAD(&host->windows);
+ host->dev.release = pci_release_host_bridge_dev;
+ dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
+ host->busnum);
+
+ error = device_register(&host->dev);
+ if (error) {
+ put_device(&host->dev);
+ return NULL;
+ }
+
+ list_for_each_entry_safe(window, n, resources, list)
+ list_move_tail(&window->list, &host->windows);
+
+ return host;
+}
+EXPORT_SYMBOL(pci_create_host_bridge);
+
+void pci_free_host_bridge(struct pci_host_bridge *host)
+{
+ device_unregister(&host->dev);
+}
+
static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
{
while (bus->parent)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 50f58b3..8f97872 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -502,31 +502,6 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
return b;
}
-static void pci_release_host_bridge_dev(struct device *dev)
-{
- struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
-
- if (bridge->release_fn)
- bridge->release_fn(bridge);
-
- pci_free_resource_list(&bridge->windows);
-
- kfree(bridge);
-}
-
-static struct pci_host_bridge *pci_alloc_host_bridge(struct pci_bus *b)
-{
- struct pci_host_bridge *bridge;
-
- bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
- if (!bridge)
- return NULL;
-
- INIT_LIST_HEAD(&bridge->windows);
- bridge->bus = b;
- return bridge;
-}
-
static const unsigned char pcix_bus_speed[] = {
PCI_SPEED_UNKNOWN, /* 0 */
PCI_SPEED_66MHz_PCIX, /* 1 */
@@ -1889,54 +1864,41 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
{
}
-struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
- struct pci_ops *ops, void *sysdata, struct list_head *resources)
+static struct pci_bus *__pci_create_root_bus(
+ struct pci_host_bridge *bridge, struct pci_ops *ops,
+ void *sysdata)
{
int error;
- struct pci_host_bridge *bridge;
struct pci_bus *b, *b2;
- struct pci_host_bridge_window *window, *n;
+ struct pci_host_bridge_window *window;
+ struct device *parent;
struct resource *res;
resource_size_t offset;
char bus_addr[64];
char *fmt;
- u8 bus = PCI_BUSNUM(db);
+ parent = bridge->dev.parent;
b = pci_alloc_bus(NULL);
if (!b)
return NULL;
b->sysdata = sysdata;
b->ops = ops;
- b->number = b->busn_res.start = bus;
+ b->number = b->busn_res.start = bridge->busnum;
pci_bus_assign_domain_nr(b, parent);
- b2 = pci_find_bus(pci_domain_nr(b), bus);
+ b2 = pci_find_bus(pci_domain_nr(b), b->number);
if (b2) {
/* If we already got to this bus through a different bridge, ignore it */
dev_dbg(&b2->dev, "bus already known\n");
goto err_out;
}
- bridge = pci_alloc_host_bridge(b);
- if (!bridge)
- goto err_out;
-
- bridge->domain = PCI_DOMAIN(db);
- bridge->dev.parent = parent;
- bridge->dev.release = pci_release_host_bridge_dev;
- dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
+ bridge->bus = b;
+ b->bridge = get_device(&bridge->dev);
error = pcibios_root_bridge_prepare(bridge);
- if (error) {
- kfree(bridge);
+ if (error)
goto err_out;
- }
- error = device_register(&bridge->dev);
- if (error) {
- put_device(&bridge->dev);
- goto err_out;
- }
- b->bridge = get_device(&bridge->dev);
device_enable_async_suspend(b->bridge);
pci_set_bus_of_node(b);
@@ -1945,10 +1907,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
b->dev.class = &pcibus_class;
b->dev.parent = b->bridge;
- dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
+ dev_set_name(&b->dev, "%04x:%02x", bridge->domain,
+ b->number);
error = device_register(&b->dev);
if (error)
- goto class_dev_reg_err;
+ goto err_out;
pcibios_add_bus(b);
@@ -1961,12 +1924,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
/* Add initial resources to the bus */
- list_for_each_entry_safe(window, n, resources, list) {
- list_move_tail(&window->list, &bridge->windows);
+ list_for_each_entry(window, &bridge->windows, list) {
res = window->res;
offset = window->offset;
if (res->flags & IORESOURCE_BUS)
- pci_bus_insert_busn_res(b, bus, res->end);
+ pci_bus_insert_busn_res(b, b->number, res->end);
else
pci_bus_add_resource(b, res, 0);
if (offset) {
@@ -1988,14 +1950,23 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
return b;
-class_dev_reg_err:
- put_device(&bridge->dev);
- device_unregister(&bridge->dev);
err_out:
kfree(b);
return NULL;
}
+struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
+ struct pci_ops *ops, void *sysdata, struct list_head *resources)
+{
+ struct pci_host_bridge *host;
+
+ host = pci_create_host_bridge(parent, db, resources);
+ if (!host)
+ return NULL;
+
+ return __pci_create_root_bus(host, ops, sysdata);
+}
+
int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
{
struct resource *res = &b->busn_res;
@@ -2059,29 +2030,33 @@ void pci_bus_release_busn_res(struct pci_bus *b)
res, ret ? "can not be" : "is");
}
-struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
- struct pci_ops *ops, void *sysdata, struct list_head *resources)
+static struct pci_bus *__pci_scan_root_bus(
+ struct pci_host_bridge *host, struct pci_ops *ops,
+ void *sysdata)
{
+
struct pci_host_bridge_window *window;
bool found = false;
struct pci_bus *b;
int max;
- list_for_each_entry(window, resources, list)
+ list_for_each_entry(window, &host->windows, list)
if (window->res->flags & IORESOURCE_BUS) {
found = true;
break;
}
- b = pci_create_root_bus(parent, db, ops, sysdata, resources);
- if (!b)
+ b = __pci_create_root_bus(host, ops, sysdata);
+ if (!b) {
+ pci_free_host_bridge(host);
return NULL;
+ }
if (!found) {
dev_info(&b->dev,
"No busn resource found for root bus, will use [bus %02x-ff]\n",
- PCI_BUSNUM(db));
- pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
+ host->busnum);
+ pci_bus_insert_busn_res(b, b->number, 255);
}
max = pci_scan_child_bus(b);
@@ -2091,6 +2066,18 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
return b;
}
+
+struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
+ struct pci_ops *ops, void *sysdata, struct list_head *resources)
+{
+ struct pci_host_bridge *host;
+
+ host = pci_create_host_bridge(parent, db, resources);
+ if (!host)
+ return NULL;
+
+ return __pci_scan_root_bus(host, ops, sysdata);
+}
EXPORT_SYMBOL(pci_scan_root_bus);
struct pci_bus *pci_scan_bus_legacy(u32 db, struct pci_ops *ops,
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 1b9c799..d991bd2 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -403,6 +403,7 @@ struct pci_host_bridge_window {
struct pci_host_bridge {
u16 domain;
+ u16 busnum;
struct device dev;
struct pci_bus *bus; /* root bus */
struct list_head windows; /* pci_host_bridge_windows */
@@ -416,7 +417,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
void *release_data);
int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
-
+struct pci_host_bridge *pci_create_host_bridge(
+ struct device *parent, u32 dombus, struct list_head *resources);
/*
* The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
* to P2P or CardBus bridge windows) go in a table. Additional ones (for
@@ -774,6 +776,7 @@ struct pci_bus *pci_scan_bus_legacy(u32 dombus, struct pci_ops *ops, void *sysda
struct pci_bus *pci_create_root_bus(struct device *parent, u32 dombus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
+void pci_free_host_bridge(struct pci_host_bridge *host);
int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int busmax);
int pci_bus_update_busn_res_end(struct pci_bus *b, int busmax);
void pci_bus_release_busn_res(struct pci_bus *b);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 10/30] PCI: Introduce pci_host_bridge_list to manage host bridges
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (8 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 11/30] PCI: Save sysdata in pci_host_bridge drvdata Yijing Wang
` (22 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Introduce pci_host_bridge_list to manage pci host
bridges in system, so we could detect whether
the host in domain:bus is alreay registered.
Then we could remove bus alreay exist test in
__pci_create_root_bus().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/host-bridge.c | 24 +++++++++++++++++++++++-
drivers/pci/probe.c | 8 +-------
include/linux/pci.h | 1 +
3 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 8897581..0de21d5 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -8,6 +8,9 @@
#include "pci.h"
+static LIST_HEAD(pci_host_bridge_list);
+static DEFINE_MUTEX(phb_mutex);
+
static void pci_release_host_bridge_dev(struct device *dev)
{
struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
@@ -25,7 +28,7 @@ struct pci_host_bridge *pci_create_host_bridge(
int error;
int bus = PCI_BUSNUM(db);
int domain = PCI_DOMAIN(db);
- struct pci_host_bridge *host;
+ struct pci_host_bridge *host, *temp;
struct pci_host_bridge_window *window, *n;
host = kzalloc(sizeof(*host), GFP_KERNEL);
@@ -40,6 +43,18 @@ struct pci_host_bridge *pci_create_host_bridge(
*/
pci_host_assign_domain_nr(host);
+ mutex_lock(&phb_mutex);
+ list_for_each_entry(temp, &pci_host_bridge_list, list)
+ if (temp->domain == host->domain
+ && temp->busnum == host->busnum) {
+ dev_dbg(&host->dev, "pci host bridge pci%04x:%02x exist\n",
+ host->domain, host->busnum);
+ mutex_unlock(&phb_mutex);
+ kfree(host);
+ return NULL;
+ }
+ mutex_unlock(&phb_mutex);
+
host->dev.parent = parent;
INIT_LIST_HEAD(&host->windows);
host->dev.release = pci_release_host_bridge_dev;
@@ -55,12 +70,19 @@ struct pci_host_bridge *pci_create_host_bridge(
list_for_each_entry_safe(window, n, resources, list)
list_move_tail(&window->list, &host->windows);
+ mutex_lock(&phb_mutex);
+ list_add_tail(&host->list, &pci_host_bridge_list);
+ mutex_unlock(&phb_mutex);
return host;
}
EXPORT_SYMBOL(pci_create_host_bridge);
void pci_free_host_bridge(struct pci_host_bridge *host)
{
+ mutex_lock(&phb_mutex);
+ list_del(&host->list);
+ mutex_unlock(&phb_mutex);
+
device_unregister(&host->dev);
}
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 8f97872..4015841 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1869,7 +1869,7 @@ static struct pci_bus *__pci_create_root_bus(
void *sysdata)
{
int error;
- struct pci_bus *b, *b2;
+ struct pci_bus *b;
struct pci_host_bridge_window *window;
struct device *parent;
struct resource *res;
@@ -1886,12 +1886,6 @@ static struct pci_bus *__pci_create_root_bus(
b->ops = ops;
b->number = b->busn_res.start = bridge->busnum;
pci_bus_assign_domain_nr(b, parent);
- b2 = pci_find_bus(pci_domain_nr(b), b->number);
- if (b2) {
- /* If we already got to this bus through a different bridge, ignore it */
- dev_dbg(&b2->dev, "bus already known\n");
- goto err_out;
- }
bridge->bus = b;
b->bridge = get_device(&bridge->dev);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index d991bd2..5ee0033 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -406,6 +406,7 @@ struct pci_host_bridge {
u16 busnum;
struct device dev;
struct pci_bus *bus; /* root bus */
+ struct list_head list;
struct list_head windows; /* pci_host_bridge_windows */
void (*release_fn)(struct pci_host_bridge *);
void *release_data;
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 11/30] PCI: Save sysdata in pci_host_bridge drvdata
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (9 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 10/30] PCI: Introduce pci_host_bridge_list to manage host bridges Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 12/30] PCI: Introduce pci_host_bridge_ops to support host specific operations Yijing Wang
` (21 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Save platform specific sysdata in pci_host_bridge
drvdata, host bridge specific operation need to
access it before the pci bus creation.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/host-bridge.c | 4 +++-
drivers/pci/probe.c | 18 ++++++++----------
include/linux/pci.h | 3 ++-
3 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 0de21d5..91b354b 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,7 +23,8 @@ static void pci_release_host_bridge_dev(struct device *dev)
}
struct pci_host_bridge *pci_create_host_bridge(
- struct device *parent, u32 db, struct list_head *resources)
+ struct device *parent, u32 db,
+ struct list_head *resources, void *sysdata)
{
int error;
int bus = PCI_BUSNUM(db);
@@ -58,6 +59,7 @@ struct pci_host_bridge *pci_create_host_bridge(
host->dev.parent = parent;
INIT_LIST_HEAD(&host->windows);
host->dev.release = pci_release_host_bridge_dev;
+ dev_set_drvdata(&host->dev, sysdata);
dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
host->busnum);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4015841..103ef69 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1865,8 +1865,7 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
}
static struct pci_bus *__pci_create_root_bus(
- struct pci_host_bridge *bridge, struct pci_ops *ops,
- void *sysdata)
+ struct pci_host_bridge *bridge, struct pci_ops *ops)
{
int error;
struct pci_bus *b;
@@ -1882,7 +1881,7 @@ static struct pci_bus *__pci_create_root_bus(
if (!b)
return NULL;
- b->sysdata = sysdata;
+ b->sysdata = dev_get_drvdata(&bridge->dev);
b->ops = ops;
b->number = b->busn_res.start = bridge->busnum;
pci_bus_assign_domain_nr(b, parent);
@@ -1954,11 +1953,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
{
struct pci_host_bridge *host;
- host = pci_create_host_bridge(parent, db, resources);
+ host = pci_create_host_bridge(parent, db, resources, sysdata);
if (!host)
return NULL;
- return __pci_create_root_bus(host, ops, sysdata);
+ return __pci_create_root_bus(host, ops);
}
int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
@@ -2025,8 +2024,7 @@ void pci_bus_release_busn_res(struct pci_bus *b)
}
static struct pci_bus *__pci_scan_root_bus(
- struct pci_host_bridge *host, struct pci_ops *ops,
- void *sysdata)
+ struct pci_host_bridge *host, struct pci_ops *ops)
{
struct pci_host_bridge_window *window;
@@ -2040,7 +2038,7 @@ static struct pci_bus *__pci_scan_root_bus(
break;
}
- b = __pci_create_root_bus(host, ops, sysdata);
+ b = __pci_create_root_bus(host, ops);
if (!b) {
pci_free_host_bridge(host);
return NULL;
@@ -2066,11 +2064,11 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
{
struct pci_host_bridge *host;
- host = pci_create_host_bridge(parent, db, resources);
+ host = pci_create_host_bridge(parent, db, resources, sysdata);
if (!host)
return NULL;
- return __pci_scan_root_bus(host, ops, sysdata);
+ return __pci_scan_root_bus(host, ops);
}
EXPORT_SYMBOL(pci_scan_root_bus);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 5ee0033..3ee8436 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -419,7 +419,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
struct pci_host_bridge *pci_create_host_bridge(
- struct device *parent, u32 dombus, struct list_head *resources);
+ struct device *parent, u32 dombus,
+ struct list_head *resources, void *sysdata);
/*
* The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
* to P2P or CardBus bridge windows) go in a table. Additional ones (for
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 12/30] PCI: Introduce pci_host_bridge_ops to support host specific operations
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (10 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 11/30] PCI: Save sysdata in pci_host_bridge drvdata Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 13/30] PCI: Introduce new scan function pci_scan_root_bridge() Yijing Wang
` (20 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now we have weak functions like pcibios_root_bridge_prepare()
to setup pci host bridge, We could introduce pci_host_bridge_ops
which contain host bridge specific ops to setup pci_host_bridge.
Then host bridge driver could add pci_host_bridge_ops hooks
intead of weak function to setup pci_host_bridge.
This patch add following pci_host_bridge_ops hooks:
pci_host_bridge_ops {
/* set root bus speed, some platform need this like powerpc */
void (*phb_set_root_bus_speed)(struct pci_host_bridge *host);
/* setup pci_host_bridge before pci_host_bridge be added to driver core */
int (*phb_prepare)(struct pci_host_bridge *host);
/* platform specific of scan hook to scan pci device */
void (*phb_of_scan_bus)(struct pci_host_bridge *);
}
We could easily extend it to support different host bridge
specific operations.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/host-bridge.c | 12 ++++++++++--
drivers/pci/probe.c | 17 +++++++++++------
include/linux/pci.h | 12 ++++++++++--
3 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 91b354b..26cefce 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -23,8 +23,8 @@ static void pci_release_host_bridge_dev(struct device *dev)
}
struct pci_host_bridge *pci_create_host_bridge(
- struct device *parent, u32 db,
- struct list_head *resources, void *sysdata)
+ struct device *parent, u32 db, struct list_head *resources,
+ void *sysdata, struct pci_host_bridge_ops *ops)
{
int error;
int bus = PCI_BUSNUM(db);
@@ -56,6 +56,7 @@ struct pci_host_bridge *pci_create_host_bridge(
}
mutex_unlock(&phb_mutex);
+ host->ops = ops;
host->dev.parent = parent;
INIT_LIST_HEAD(&host->windows);
host->dev.release = pci_release_host_bridge_dev;
@@ -63,6 +64,13 @@ struct pci_host_bridge *pci_create_host_bridge(
dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
host->busnum);
+ if (host->ops && host->ops->phb_prepare) {
+ error = host->ops->phb_prepare(host);
+ if(error) {
+ kfree(host);
+ return NULL;
+ }
+ }
error = device_register(&host->dev);
if (error) {
put_device(&host->dev);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 103ef69..ca53c37 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1888,6 +1888,8 @@ static struct pci_bus *__pci_create_root_bus(
bridge->bus = b;
b->bridge = get_device(&bridge->dev);
+ if (bridge->ops && bridge->ops->phb_set_root_bus_speed)
+ bridge->ops->phb_set_root_bus_speed(bridge);
error = pcibios_root_bridge_prepare(bridge);
if (error)
goto err_out;
@@ -1953,7 +1955,7 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
{
struct pci_host_bridge *host;
- host = pci_create_host_bridge(parent, db, resources, sysdata);
+ host = pci_create_host_bridge(parent, db, resources, sysdata, NULL);
if (!host)
return NULL;
@@ -2051,10 +2053,13 @@ static struct pci_bus *__pci_scan_root_bus(
pci_bus_insert_busn_res(b, b->number, 255);
}
- max = pci_scan_child_bus(b);
-
- if (!found)
- pci_bus_update_busn_res_end(b, max);
+ if (host->ops && host->ops->phb_of_scan_bus) {
+ host->ops->phb_of_scan_bus(host);
+ } else {
+ max = pci_scan_child_bus(b);
+ if (!found)
+ pci_bus_update_busn_res_end(b, max);
+ }
return b;
}
@@ -2064,7 +2069,7 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
{
struct pci_host_bridge *host;
- host = pci_create_host_bridge(parent, db, resources, sysdata);
+ host = pci_create_host_bridge(parent, db, resources, sysdata, NULL);
if (!host)
return NULL;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 3ee8436..817756a 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -401,6 +401,13 @@ struct pci_host_bridge_window {
resource_size_t offset; /* bus address + offset = CPU address */
};
+struct pci_host_bridge;
+struct pci_host_bridge_ops {
+ void (*phb_set_root_bus_speed)(struct pci_host_bridge *host);
+ int (*phb_prepare)(struct pci_host_bridge *host);
+ void (*phb_of_scan_bus)(struct pci_host_bridge *);
+};
+
struct pci_host_bridge {
u16 domain;
u16 busnum;
@@ -408,6 +415,7 @@ struct pci_host_bridge {
struct pci_bus *bus; /* root bus */
struct list_head list;
struct list_head windows; /* pci_host_bridge_windows */
+ struct pci_host_bridge_ops *ops;
void (*release_fn)(struct pci_host_bridge *);
void *release_data;
};
@@ -419,8 +427,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
struct pci_host_bridge *pci_create_host_bridge(
- struct device *parent, u32 dombus,
- struct list_head *resources, void *sysdata);
+ struct device *parent, u32 dombus, struct list_head *resources,
+ void *sysdata, struct pci_host_bridge_ops *ops);
/*
* The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
* to P2P or CardBus bridge windows) go in a table. Additional ones (for
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 13/30] PCI: Introduce new scan function pci_scan_root_bridge()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (11 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 12/30] PCI: Introduce pci_host_bridge_ops to support host specific operations Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 14/30] PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge Yijing Wang
` (19 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Introduce new scan function pci_scan_root_bridge() to
support host bridge drivers that need to provide platform
own pci_host_bridge_ops.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/probe.c | 21 +++++++++++++++++++++
include/linux/pci.h | 3 +++
2 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ca53c37..c23ca8a 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2064,6 +2064,27 @@ static struct pci_bus *__pci_scan_root_bus(
return b;
}
+struct pci_host_bridge *pci_scan_root_bridge(struct device *parent,
+ u32 db, struct pci_ops *ops, void *sysdata,
+ struct list_head *resources, struct pci_host_bridge_ops *phb_ops)
+{
+ struct pci_host_bridge *host;
+ struct pci_bus *bus;
+
+ host = pci_create_host_bridge(parent, db, resources,
+ sysdata, phb_ops);
+ if (!host)
+ return NULL;
+
+ bus = __pci_scan_root_bus(host, ops);
+ if (!bus)
+ pci_free_host_bridge(host);
+
+ return host;
+}
+EXPORT_SYMBOL(pci_scan_root_bridge);
+
+
struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
{
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 817756a..e60c59a 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -793,6 +793,9 @@ void pci_bus_release_busn_res(struct pci_bus *b);
struct pci_bus *pci_scan_root_bus(struct device *parent, u32 dombus,
struct pci_ops *ops, void *sysdata,
struct list_head *resources);
+struct pci_host_bridge *pci_scan_root_bridge(struct device *parent,
+ u32 dombus, struct pci_ops *ops, void *sysdata,
+ struct list_head *resources, struct pci_host_bridge_ops *phb_ops);
struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
int busnr);
void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 14/30] PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (12 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 13/30] PCI: Introduce new scan function pci_scan_root_bridge() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 15/30] PCI/IA64: " Yijing Wang
` (18 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: x86 at kernel.org
---
arch/x86/pci/acpi.c | 36 ++++++++++++++++++++----------------
1 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 8edea63..f9a55c2 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -467,6 +467,18 @@ static void probe_pci_root_info(struct pci_root_info *info,
info);
}
+static int pci_host_bridge_prepare(struct pci_host_bridge *bridge)
+{
+ struct pci_sysdata *sd = dev_get_drvdata(&bridge->dev);
+
+ ACPI_COMPANION_SET(&bridge->dev, sd->companion);
+ return 0;
+}
+
+static struct pci_host_bridge_ops phb_ops = {
+ .phb_prepare = pci_host_bridge_prepare,
+};
+
struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
{
struct acpi_device *device = root->device;
@@ -475,6 +487,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
int busnum = root->secondary.start;
LIST_HEAD(resources);
struct pci_bus *bus;
+ struct pci_host_bridge *host = NULL;
struct pci_sysdata *sd;
int node;
@@ -537,14 +550,13 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
if (!setup_mcfg_map(info, domain, (u8)root->secondary.start,
(u8)root->secondary.end, root->mcfg_addr))
- bus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, busnum),
- &pci_root_ops, sd, &resources);
-
- if (bus) {
- pci_scan_child_bus(bus);
- pci_set_host_bridge_release(
- to_pci_host_bridge(bus->bridge),
- release_pci_root_info, info);
+ host = pci_scan_root_bridge(NULL, PCI_DOMBUS(domain, busnum),
+ &pci_root_ops, sd, &resources, &phb_ops);
+
+ if (host) {
+ bus = host->bus;
+ pci_set_host_bridge_release(host, release_pci_root_info,
+ info);
} else {
pci_free_resource_list(&resources);
__release_pci_root_info(info);
@@ -566,14 +578,6 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
return bus;
}
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
-{
- struct pci_sysdata *sd = bridge->bus->sysdata;
-
- ACPI_COMPANION_SET(&bridge->dev, sd->companion);
- return 0;
-}
-
int __init pci_acpi_init(void)
{
struct pci_dev *dev = NULL;
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 15/30] PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (13 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 14/30] PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 16/30] PCI/IA64: Fix the build warning about pci_domain_nr() Yijing Wang
` (17 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
From: Yijing Wang <wangyijing0307@gmail.com>
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Tony Luck <tony.luck@intel.com>
CC: Fenghua Yu <fenghua.yu@intel.com>
CC: linux-ia64 at vger.kernel.org
---
arch/ia64/pci/pci.c | 34 ++++++++++++++++++----------------
1 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index e457015..b86b318 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -420,6 +420,18 @@ probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device,
return 0;
}
+static int pci_host_bridge_prepare(struct pci_host_bridge *bridge)
+{
+ struct pci_controller *controller = bridge->bus->sysdata;
+
+ ACPI_COMPANION_SET(&bridge->dev, controller->companion);
+ return 0;
+}
+
+static struct pci_host_bridge_ops phb_ops = {
+ .phb_prepare = pci_host_bridge_prepare,
+};
+
struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
{
struct acpi_device *device = root->device;
@@ -428,7 +440,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
struct pci_controller *controller;
struct pci_root_info *info = NULL;
int busnum = root->secondary.start;
- struct pci_bus *pbus;
+ struct pci_host_bridge *host;
int ret;
controller = alloc_pci_controller(domain);
@@ -465,26 +477,16 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
* should handle the case here, but it appears that IA64 hasn't
* such quirk. So we just ignore the case now.
*/
- pbus = pci_create_root_bus(NULL, PCI_DOMBUS(domain, bus),
- &pci_root_ops, controller, &info->resources);
- if (!pbus) {
+ host = pci_scan_root_bridge(NULL, PCI_DOMBUS(domain, bus),
+ &pci_root_ops, controller, &info->resources, &phb_ops);
+ if (!host) {
pci_free_resource_list(&info->resources);
__release_pci_root_info(info);
return NULL;
}
- pci_set_host_bridge_release(to_pci_host_bridge(pbus->bridge),
- release_pci_root_info, info);
- pci_scan_child_bus(pbus);
- return pbus;
-}
-
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
-{
- struct pci_controller *controller = bridge->bus->sysdata;
-
- ACPI_COMPANION_SET(&bridge->dev, controller->companion);
- return 0;
+ pci_set_host_bridge_release(host, release_pci_root_info, info);
+ return host->bus;
}
static int is_valid_resource(struct pci_dev *dev, int idx)
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 16/30] PCI/IA64: Fix the build warning about pci_domain_nr()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (14 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 15/30] PCI/IA64: " Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 17/30] PCI/powerpc: Rename pcibios_root_bridge_prepare() Yijing Wang
` (16 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Should pass pci_bus * instead of pci_dev * to pci_domain_nr().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Tony Luck <tony.luck@intel.com>
CC: Fenghua Yu <fenghua.yu@intel.com>
CC: linux-ia64 at vger.kernel.org
---
arch/ia64/sn/kernel/io_acpi_init.c | 6 +++---
arch/ia64/sn/kernel/io_init.c | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c
index 0640739..2fd7414 100644
--- a/arch/ia64/sn/kernel/io_acpi_init.c
+++ b/arch/ia64/sn/kernel/io_acpi_init.c
@@ -364,12 +364,12 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL,
&segment);
if (ACPI_SUCCESS(status)) {
- if (segment != pci_domain_nr(dev)) {
+ if (segment != pci_domain_nr(dev->bus)) {
acpi_get_name(rootbus_handle, ACPI_FULL_PATHNAME,
&name_buffer);
printk(KERN_ERR
"%s: Segment number mismatch, 0x%llx vs 0x%x for: %s\n",
- __func__, segment, pci_domain_nr(dev),
+ __func__, segment, pci_domain_nr(dev->bus),
(char *)name_buffer.pointer);
kfree(name_buffer.pointer);
return 1;
@@ -407,7 +407,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
/* Build up the pcidev_info.pdi_slot_host_handle */
host_devfn = get_host_devfn(pcidev_match.handle, rootbus_handle);
(*pcidev_info)->pdi_slot_host_handle =
- ((unsigned long) pci_domain_nr(dev) << 40) |
+ ((unsigned long) pci_domain_nr(dev->bus) << 40) |
/* bus == 0 */
host_devfn;
return 0;
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
index bcdc5b8..a97fad4 100644
--- a/arch/ia64/sn/kernel/io_init.c
+++ b/arch/ia64/sn/kernel/io_init.c
@@ -164,7 +164,7 @@ sn_io_slot_fixup(struct pci_dev *dev)
panic("%s: Unable to alloc memory for sn_irq_info", __func__);
/* Call to retrieve pci device information needed by kernel. */
- status = sal_get_pcidev_info((u64) pci_domain_nr(dev),
+ status = sal_get_pcidev_info((u64) pci_domain_nr(dev->bus),
(u64) dev->bus->number,
dev->devfn,
(u64) __pa(pcidev_info),
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 17/30] PCI/powerpc: Rename pcibios_root_bridge_prepare()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (15 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 16/30] PCI/IA64: Fix the build warning about pci_domain_nr() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 18/30] PCI/powerpc: Use pci_scan_root_bridge() for simplicity Yijing Wang
` (15 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Pcibios_root_bridge_prepare() in powerpc is used
to set root bus speed. Rename it to
pcibios_set_root_bus_speed() for better readability.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
CC: linuxppc-dev at lists.ozlabs.org
---
arch/powerpc/include/asm/machdep.h | 2 +-
arch/powerpc/kernel/pci-common.c | 6 +++---
arch/powerpc/platforms/pseries/pci.c | 2 +-
arch/powerpc/platforms/pseries/pseries.h | 2 +-
arch/powerpc/platforms/pseries/setup.c | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
index c8175a3..8e7f2a8 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -129,7 +129,7 @@ struct machdep_calls {
void (*pcibios_fixup)(void);
int (*pci_probe_mode)(struct pci_bus *);
void (*pci_irq_fixup)(struct pci_dev *dev);
- int (*pcibios_root_bridge_prepare)(struct pci_host_bridge
+ int (*pcibios_set_root_bus_speed)(struct pci_host_bridge
*bridge);
/* To setup PHBs when using automatic OF platform driver for PCI */
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 927c3dd..c11bfed 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -769,9 +769,9 @@ int pci_proc_domain(struct pci_bus *bus)
int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
{
- if (ppc_md.pcibios_root_bridge_prepare)
- return ppc_md.pcibios_root_bridge_prepare(bridge);
-
+ if (ppc_md.pcibios_set_root_bus_speed)
+ return ppc_md.pcibios_set_root_bus_speed(bridge);
+
return 0;
}
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c
index fe16a50..af685d6 100644
--- a/arch/powerpc/platforms/pseries/pci.c
+++ b/arch/powerpc/platforms/pseries/pci.c
@@ -110,7 +110,7 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
fixup_winbond_82c105);
-int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
+int pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
{
struct device_node *dn, *pdn;
struct pci_bus *bus;
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index 1796c54..5d0be3a 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -63,7 +63,7 @@ extern int dlpar_detach_node(struct device_node *);
/* PCI root bridge prepare function override for pseries */
struct pci_host_bridge;
-int pseries_root_bridge_prepare(struct pci_host_bridge *bridge);
+int pseries_set_root_bus_speed(struct pci_host_bridge *bridge);
unsigned long pseries_memory_block_size(void);
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index e445b67..b196c0d 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -496,7 +496,7 @@ static void __init pSeries_setup_arch(void)
ppc_md.enable_pmcs = power4_enable_pmcs;
}
- ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
+ ppc_md.pcibios_set_root_bus_speed = pseries_set_root_bus_speed;
if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
long rc;
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 18/30] PCI/powerpc: Use pci_scan_root_bridge() for simplicity
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (16 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 17/30] PCI/powerpc: Rename pcibios_root_bridge_prepare() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 19/30] PCI: Remove weak pcibios_root_bridge_prepare() Yijing Wang
` (14 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now we could use pci_scan_root_bridge() to scan
pci buses, provide powerpc specific pci_host_bridge_ops.
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
CC: linuxppc-dev at lists.ozlabs.org
---
arch/powerpc/include/asm/machdep.h | 2 +-
arch/powerpc/kernel/pci-common.c | 63 +++++++++++++++++-------------
arch/powerpc/platforms/pseries/pci.c | 8 ++--
arch/powerpc/platforms/pseries/pseries.h | 2 +-
4 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h
index 8e7f2a8..b811d12 100644
--- a/arch/powerpc/include/asm/machdep.h
+++ b/arch/powerpc/include/asm/machdep.h
@@ -129,7 +129,7 @@ struct machdep_calls {
void (*pcibios_fixup)(void);
int (*pci_probe_mode)(struct pci_bus *);
void (*pci_irq_fixup)(struct pci_dev *dev);
- int (*pcibios_set_root_bus_speed)(struct pci_host_bridge
+ void (*pcibios_set_root_bus_speed)(struct pci_host_bridge
*bridge);
/* To setup PHBs when using automatic OF platform driver for PCI */
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index c11bfed..1f44df9 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -767,14 +767,33 @@ int pci_proc_domain(struct pci_bus *bus)
return 1;
}
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
+static void pci_host_bridge_set_root_bus_speed(
+ struct pci_host_bridge *bridge)
{
if (ppc_md.pcibios_set_root_bus_speed)
- return ppc_md.pcibios_set_root_bus_speed(bridge);
-
- return 0;
+ ppc_md.pcibios_set_root_bus_speed(bridge);
}
+static void pci_host_bridge_of_scan_bus(struct pci_host_bridge *host)
+{
+ int mode = PCI_PROBE_NORMAL;
+ struct pci_bus *bus = host->bus;
+ struct pci_controller *hose = dev_get_drvdata(&host->dev);
+
+ /* Get probe mode and perform scan */
+ if (hose->dn && ppc_md.pci_probe_mode)
+ mode = ppc_md.pci_probe_mode(bus);
+
+ pr_debug(" probe mode: %d\n", mode);
+ if (mode == PCI_PROBE_DEVTREE)
+ of_scan_bus(hose->dn, bus);
+
+ if (mode == PCI_PROBE_NORMAL) {
+ pci_bus_update_busn_res_end(bus, 255);
+ hose->last_busno = pci_scan_child_bus(bus);
+ pci_bus_update_busn_res_end(bus, hose->last_busno);
+ }
+}
/* This header fixup will do the resource fixup for all devices as they are
* probed, but not for bridge ranges
*/
@@ -1577,6 +1596,11 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
return of_node_get(hose->dn);
}
+static struct pci_host_bridge_ops phb_ops = {
+ .phb_set_root_bus_speed = pci_host_bridge_set_root_bus_speed,
+ .phb_of_scan_bus = pci_host_bridge_of_scan_bus,
+};
+
/**
* pci_scan_phb - Given a pci_controller, setup and scan the PCI bus
* @hose: Pointer to the PCI host controller instance structure
@@ -1584,9 +1608,8 @@ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
void pcibios_scan_phb(struct pci_controller *hose)
{
LIST_HEAD(resources);
- struct pci_bus *bus;
+ struct pci_host_bridge *host;
struct device_node *node = hose->dn;
- int mode;
pr_debug("PCI: Scanning PHB %s\n", of_node_full_name(node));
@@ -1602,30 +1625,16 @@ void pcibios_scan_phb(struct pci_controller *hose)
pci_add_resource(&resources, &hose->busn);
/* Create an empty bus for the toplevel */
- bus = pci_create_root_bus(hose->parent,
+ host = pci_scan_root_bridge(hose->parent,
PCI_DOMBUS(hose->global_number, hose->first_busno),
- hose->ops, hose, &resources);
- if (bus == NULL) {
- pr_err("Failed to create bus for PCI domain %04x\n",
+ hose->ops, hose, &resources, &phb_ops);
+ if (host == NULL) {
+ pr_err("Failed to create host bridge for PCI domain %04x\n",
hose->global_number);
pci_free_resource_list(&resources);
return;
}
- hose->bus = bus;
-
- /* Get probe mode and perform scan */
- mode = PCI_PROBE_NORMAL;
- if (node && ppc_md.pci_probe_mode)
- mode = ppc_md.pci_probe_mode(bus);
- pr_debug(" probe mode: %d\n", mode);
- if (mode == PCI_PROBE_DEVTREE)
- of_scan_bus(node, bus);
-
- if (mode == PCI_PROBE_NORMAL) {
- pci_bus_update_busn_res_end(bus, 255);
- hose->last_busno = pci_scan_child_bus(bus);
- pci_bus_update_busn_res_end(bus, hose->last_busno);
- }
+ hose->bus = host->bus;
/* Platform gets a chance to do some global fixups before
* we proceed to resource allocation
@@ -1634,9 +1643,9 @@ void pcibios_scan_phb(struct pci_controller *hose)
ppc_md.pcibios_fixup_phb(hose);
/* Configure PCI Express settings */
- if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
+ if (host->bus && !pci_has_flag(PCI_PROBE_ONLY)) {
struct pci_bus *child;
- list_for_each_entry(child, &bus->children, node)
+ list_for_each_entry(child, &host->bus->children, node)
pcie_bus_configure_settings(child);
}
}
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c
index af685d6..89ff79c 100644
--- a/arch/powerpc/platforms/pseries/pci.c
+++ b/arch/powerpc/platforms/pseries/pci.c
@@ -110,7 +110,7 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
fixup_winbond_82c105);
-int pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
+void pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
{
struct device_node *dn, *pdn;
struct pci_bus *bus;
@@ -121,7 +121,7 @@ int pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
dn = pcibios_get_phb_of_node(bus);
if (!dn)
- return 0;
+ return;
for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) {
rc = of_property_read_u32_array(pdn,
@@ -135,7 +135,7 @@ int pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
if (rc) {
pr_debug("no ibm,pcie-link-speed-stats property\n");
- return 0;
+ return;
}
switch (pcie_link_speed_stats[0]) {
@@ -168,5 +168,5 @@ int pseries_set_root_bus_speed(struct pci_host_bridge *bridge)
break;
}
- return 0;
+ return;
}
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index 5d0be3a..9aa9c13 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -63,7 +63,7 @@ extern int dlpar_detach_node(struct device_node *);
/* PCI root bridge prepare function override for pseries */
struct pci_host_bridge;
-int pseries_set_root_bus_speed(struct pci_host_bridge *bridge);
+void pseries_set_root_bus_speed(struct pci_host_bridge *bridge);
unsigned long pseries_memory_block_size(void);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 19/30] PCI: Remove weak pcibios_root_bridge_prepare()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (17 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 18/30] PCI/powerpc: Use pci_scan_root_bridge() for simplicity Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 20/30] PCI/sparc: Use pci_scan_root_bridge() for simplicity Yijing Wang
` (13 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now no one use weak pcibios_root_bridge_prepare(),
we could remove it.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/probe.c | 15 ---------------
include/linux/pci.h | 2 --
2 files changed, 0 insertions(+), 17 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index c23ca8a..79b5aca 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1844,18 +1844,6 @@ unsigned int pci_scan_child_bus(struct pci_bus *bus)
}
EXPORT_SYMBOL_GPL(pci_scan_child_bus);
-/**
- * pcibios_root_bridge_prepare - Platform-specific host bridge setup.
- * @bridge: Host bridge to set up.
- *
- * Default empty implementation. Replace with an architecture-specific setup
- * routine, if necessary.
- */
-int __weak pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
-{
- return 0;
-}
-
void __weak pcibios_add_bus(struct pci_bus *bus)
{
}
@@ -1890,9 +1878,6 @@ static struct pci_bus *__pci_create_root_bus(
b->bridge = get_device(&bridge->dev);
if (bridge->ops && bridge->ops->phb_set_root_bus_speed)
bridge->ops->phb_set_root_bus_speed(bridge);
- error = pcibios_root_bridge_prepare(bridge);
- if (error)
- goto err_out;
device_enable_async_suspend(b->bridge);
pci_set_bus_of_node(b);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index e60c59a..e81cd9b 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -424,8 +424,6 @@ struct pci_host_bridge {
void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
void (*release_fn)(struct pci_host_bridge *),
void *release_data);
-
-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);
struct pci_host_bridge *pci_create_host_bridge(
struct device *parent, u32 dombus, struct list_head *resources,
void *sysdata, struct pci_host_bridge_ops *ops);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 20/30] PCI/sparc: Use pci_scan_root_bridge() for simplicity
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (18 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 19/30] PCI: Remove weak pcibios_root_bridge_prepare() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 21/30] PCI: Introduce pci_bus_child_max_busnr() Yijing Wang
` (12 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now we could use pci_scan_root_bridge() to scan
pci buses, provide sparc specific pci_host_bridge_ops.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: sparclinux at vger.kernel.org
---
arch/sparc/kernel/pci.c | 32 ++++++++++++++++++++++----------
1 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index d798b42..0ff5093 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -647,12 +647,25 @@ static void pci_claim_bus_resources(struct pci_bus *bus)
pci_claim_bus_resources(child_bus);
}
+static void pci_host_bridge_of_scan_bus(
+ struct pci_host_bridge *host)
+{
+ struct pci_pbm_info *pbm = dev_get_drvdata(&host->dev);
+ struct device_node *node = pbm->op->dev.of_node;
+
+ pci_of_scan_bus(pbm, node, host->bus);
+}
+
+static struct pci_host_bridge_ops phb_ops = {
+ .phb_of_scan_bus = pci_host_bridge_of_scan_bus,
+};
+
struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
struct device *parent)
{
LIST_HEAD(resources);
struct device_node *node = pbm->op->dev.of_node;
- struct pci_bus *bus;
+ struct pci_host_bridge *host;
printk("PCI: Scanning PBM %s\n", node->full_name);
@@ -664,23 +677,22 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
pbm->busn.end = pbm->pci_last_busno;
pbm->busn.flags = IORESOURCE_BUS;
pci_add_resource(&resources, &pbm->busn);
- bus = pci_create_root_bus(parent,
+ host = pci_scan_root_bridge(parent,
PCI_DOMBUS(pbm->index, pbm->pci_first_busno),
- pbm->pci_ops, pbm, &resources);
- if (!bus) {
- printk(KERN_ERR "Failed to create bus for %s\n",
+ pbm->pci_ops, pbm, &resources, &phb_ops);
+ if (!host) {
+ printk(KERN_ERR "Failed to create host bridge for %s\n",
node->full_name);
pci_free_resource_list(&resources);
return NULL;
}
- pci_of_scan_bus(pbm, node, bus);
- pci_bus_add_devices(bus);
- pci_bus_register_of_sysfs(bus);
+ pci_bus_add_devices(host->bus);
+ pci_bus_register_of_sysfs(host->bus);
- pci_claim_bus_resources(bus);
+ pci_claim_bus_resources(host->bus);
- return bus;
+ return host->bus;
}
void pcibios_fixup_bus(struct pci_bus *pbus)
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 21/30] PCI: Introduce pci_bus_child_max_busnr()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (19 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 20/30] PCI/sparc: Use pci_scan_root_bridge() for simplicity Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 22/30] PCI/Parisc: Use pci_scan_root_bus() for simplicity Yijing Wang
` (11 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Sometimes, we need to know the highest reserved
busnr for children bus. Because parent's
bus->busn_res could have padding in it.
This function return the max child busnr as
pci_scan_child_bus().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/hotplug/acpiphp_glue.c | 29 +----------------------------
drivers/pci/pci.c | 25 ++++++++++++++++++++++++-
include/linux/pci.h | 2 +-
3 files changed, 26 insertions(+), 30 deletions(-)
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index bcb90e4..84f2584 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -397,33 +397,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
acpi_unlock_hp_context();
}
-/**
- * acpiphp_max_busnr - return the highest reserved bus number under the given bus.
- * @bus: bus to start search with
- */
-static unsigned char acpiphp_max_busnr(struct pci_bus *bus)
-{
- struct pci_bus *tmp;
- unsigned char max, n;
-
- /*
- * pci_bus_max_busnr will return the highest
- * reserved busnr for all these children.
- * that is equivalent to the bus->subordinate
- * value. We don't want to use the parent's
- * bus->subordinate value because it could have
- * padding in it.
- */
- max = bus->busn_res.start;
-
- list_for_each_entry(tmp, &bus->children, node) {
- n = pci_bus_max_busnr(tmp);
- if (n > max)
- max = n;
- }
- return max;
-}
-
static void acpiphp_set_acpi_region(struct acpiphp_slot *slot)
{
struct acpiphp_func *func;
@@ -489,7 +462,7 @@ static void enable_slot(struct acpiphp_slot *slot)
LIST_HEAD(add_list);
acpiphp_rescan_slot(slot);
- max = acpiphp_max_busnr(bus);
+ max = pci_bus_child_max_busnr(bus);
for (pass = 0; pass < 2; pass++) {
list_for_each_entry(dev, &bus->devices, bus_list) {
if (PCI_SLOT(dev->devfn) != slot->device)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 3e10772..06d41b1 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -121,7 +121,30 @@ unsigned char pci_bus_max_busnr(struct pci_bus *bus)
}
return max;
}
-EXPORT_SYMBOL_GPL(pci_bus_max_busnr);
+
+unsigned char pci_bus_child_max_busnr(struct pci_bus *bus)
+{
+ struct pci_bus *tmp;
+ unsigned char max, n;
+
+ /*
+ * pci_bus_max_busnr will return the highest
+ * reserved busnr for all these children.
+ * that is equivalent to the bus->subordinate
+ * value. We don't want to use the parent's
+ * bus->subordinate value because it could have
+ * padding in it.
+ */
+ max = bus->busn_res.start;
+
+ list_for_each_entry(tmp, &bus->children, node) {
+ n = pci_bus_max_busnr(tmp);
+ if (n > max)
+ max = n;
+ }
+ return max;
+}
+EXPORT_SYMBOL_GPL(pci_bus_child_max_busnr);
#ifdef CONFIG_HAS_IOMEM
void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index e81cd9b..4c4c9e4 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1172,7 +1172,7 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev *, void *),
void *userdata);
int pci_cfg_space_size(struct pci_dev *dev);
-unsigned char pci_bus_max_busnr(struct pci_bus *bus);
+unsigned char pci_bus_child_max_busnr(struct pci_bus *bus);
void pci_setup_bridge(struct pci_bus *bus);
resource_size_t pcibios_window_alignment(struct pci_bus *bus,
unsigned long type);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 22/30] PCI/Parisc: Use pci_scan_root_bus() for simplicity
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (20 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 21/30] PCI: Introduce pci_bus_child_max_busnr() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code Yijing Wang
` (10 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
From: Yijing Wang <wangyijing0307@gmail.com>
Now pci_bus_add_devices() has been ripped out
from pci_scan_root_bus(), we could use pci_scan_root_bus()
instead of pci_create_root_bus() + pci_scan_child_bus()
for simplicity. We could also remove the pci bus
resource(dino_current_bus,255) and pci_bus_update_busn_res_end(),
because pci_scan_root_bus() would do the same thing.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: "James E.J. Bottomley" <jejb@parisc-linux.org>
CC: linux-parisc at vger.kernel.org
---
drivers/parisc/dino.c | 11 ++---------
drivers/parisc/lba_pci.c | 7 ++-----
2 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c
index a0580af..e5ee339 100644
--- a/drivers/parisc/dino.c
+++ b/drivers/parisc/dino.c
@@ -977,15 +977,11 @@ static int __init dino_probe(struct parisc_device *dev)
if (dino_dev->hba.gmmio_space.flags)
pci_add_resource(&resources, &dino_dev->hba.gmmio_space);
- dino_dev->hba.bus_num.start = dino_current_bus;
- dino_dev->hba.bus_num.end = 255;
- dino_dev->hba.bus_num.flags = IORESOURCE_BUS;
- pci_add_resource(&resources, &dino_dev->hba.bus_num);
/*
** It's not used to avoid chicken/egg problems
** with configuration accessor functions.
*/
- dino_dev->hba.hba_bus = bus = pci_create_root_bus(&dev->dev,
+ dino_dev->hba.hba_bus = bus = pci_scan_root_bus(&dev->dev,
dino_current_bus, &dino_cfg_ops, NULL, &resources);
if (!bus) {
printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (duplicate bus number %d?)\n",
@@ -996,13 +992,10 @@ static int __init dino_probe(struct parisc_device *dev)
return 0;
}
- max = pci_scan_child_bus(bus);
- pci_bus_update_busn_res_end(bus, max);
-
/* This code *depends* on scanning being single threaded
* if it isn't, this global bus number count will fail
*/
- dino_current_bus = max + 1;
+ dino_current_bus = bus->busn_res.end + 1;
pci_bus_assign_resources(bus);
pci_bus_add_devices(bus);
return 0;
diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
index 37e71ff..254bf1a 100644
--- a/drivers/parisc/lba_pci.c
+++ b/drivers/parisc/lba_pci.c
@@ -1423,7 +1423,6 @@ lba_driver_probe(struct parisc_device *dev)
void *tmp_obj;
char *version;
void __iomem *addr = ioremap_nocache(dev->hpa.start, 4096);
- int max;
/* Read HW Rev First */
func_class = READ_REG32(addr + LBA_FCLASS);
@@ -1564,15 +1563,13 @@ lba_driver_probe(struct parisc_device *dev)
dev->dev.platform_data = lba_dev;
lba_bus = lba_dev->hba.hba_bus =
- pci_create_root_bus(&dev->dev, lba_dev->hba.bus_num.start,
+ pci_scan_root_bus(&dev->dev, lba_dev->hba.bus_num.start,
cfg_ops, NULL, &resources);
if (!lba_bus) {
pci_free_resource_list(&resources);
return 0;
}
- max = pci_scan_child_bus(lba_bus);
-
/* This is in lieu of calling pci_assign_unassigned_resources() */
if (is_pdc_pat()) {
/* assign resources to un-initialized devices */
@@ -1600,7 +1597,7 @@ lba_driver_probe(struct parisc_device *dev)
lba_dev->flags |= LBA_FLAG_SKIP_PROBE;
}
- lba_next_bus = max + 1;
+ lba_next_bus = pci_bus_child_max_busnr(lba_bus) + 1;
pci_bus_add_devices(lba_bus);
/* Whew! Finally done! Tell services we got this one covered. */
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (21 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 22/30] PCI/Parisc: Use pci_scan_root_bus() for simplicity Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-22 17:40 ` Thomas Petazzoni
2015-01-21 0:30 ` [PATCH v2 24/30] PCI/tegra: Remove redundant tegra_pcie_scan_bus() Yijing Wang
` (9 subsequent siblings)
32 siblings, 1 reply; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Mvebu_pcie_scan_bus() is not necessary, we could use
pci_common_init_dev() instead of pci_common_init(),
and pass the device pointer as the parent. Then
pci_scan_root_bus() will be called to scan the pci busses.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
CC: Jason Cooper <jason@lakedaemon.net>
---
drivers/pci/host/pci-mvebu.c | 18 +-----------------
1 files changed, 1 insertions(+), 17 deletions(-)
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index 1309cfb..d5a2b70 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -750,21 +750,6 @@ static int mvebu_pcie_setup(int nr, struct pci_sys_data *sys)
return 1;
}
-static struct pci_bus *mvebu_pcie_scan_bus(int nr, struct pci_sys_data *sys)
-{
- struct mvebu_pcie *pcie = sys_to_pcie(sys);
- struct pci_bus *bus;
-
- bus = pci_create_root_bus(&pcie->pdev->dev, sys->busnr,
- &mvebu_pcie_ops, sys, &sys->resources);
- if (!bus)
- return NULL;
-
- pci_scan_child_bus(bus);
-
- return bus;
-}
-
static resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev,
const struct resource *res,
resource_size_t start,
@@ -808,12 +793,11 @@ static void mvebu_pcie_enable(struct mvebu_pcie *pcie)
hw.nr_controllers = 1;
hw.private_data = (void **)&pcie;
hw.setup = mvebu_pcie_setup;
- hw.scan = mvebu_pcie_scan_bus;
hw.map_irq = of_irq_parse_and_map_pci;
hw.ops = &mvebu_pcie_ops;
hw.align_resource = mvebu_pcie_align_resource;
- pci_common_init(&hw);
+ pci_common_init_dev(&pcie->pdev->dev, &hw);
}
/*
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 24/30] PCI/tegra: Remove redundant tegra_pcie_scan_bus()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (22 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 25/30] PCI/designware: Use pci_scan_root_bus() for simplicity Yijing Wang
` (8 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now pci_scan_root_bus() is almost simliar to
pci_create_root_bus() + pci_scan_child_bus().
So we could use common pci_scan_root_bus() in
pci_common_init_dev() to scan pci busses.
tegra_pcie_scan_bus() is redundant, remove it.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Thierry Reding <thierry.reding@gmail.com>
CC: linux-tegra at vger.kernel.org
---
drivers/pci/host/pci-tegra.c | 16 ----------------
1 files changed, 0 insertions(+), 16 deletions(-)
diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
index 6f9c29f..baed0c5 100644
--- a/drivers/pci/host/pci-tegra.c
+++ b/drivers/pci/host/pci-tegra.c
@@ -679,21 +679,6 @@ static int tegra_pcie_map_irq(const struct pci_dev *pdev, u8 slot, u8 pin)
return irq;
}
-static struct pci_bus *tegra_pcie_scan_bus(int nr, struct pci_sys_data *sys)
-{
- struct tegra_pcie *pcie = sys_to_pcie(sys);
- struct pci_bus *bus;
-
- bus = pci_create_root_bus(pcie->dev, sys->busnr, &tegra_pcie_ops, sys,
- &sys->resources);
- if (!bus)
- return NULL;
-
- pci_scan_child_bus(bus);
-
- return bus;
-}
-
static irqreturn_t tegra_pcie_isr(int irq, void *arg)
{
const char *err_msg[] = {
@@ -1880,7 +1865,6 @@ static int tegra_pcie_enable(struct tegra_pcie *pcie)
hw.private_data = (void **)&pcie;
hw.setup = tegra_pcie_setup;
hw.map_irq = tegra_pcie_map_irq;
- hw.scan = tegra_pcie_scan_bus;
hw.ops = &tegra_pcie_ops;
pci_common_init_dev(pcie->dev, &hw);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 25/30] PCI/designware: Use pci_scan_root_bus() for simplicity
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (23 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 24/30] PCI/tegra: Remove redundant tegra_pcie_scan_bus() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 26/30] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus() Yijing Wang
` (7 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Use pci_scan_root_bus() instead of pci_create_root_bus() +
pci_scan_child_bus() for simplicity.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Mohit Kumar <mohit.kumar@st.com>
CC: Jingoo Han <jg1.han@samsung.com>
---
drivers/pci/host/pcie-designware.c | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index eef3111..d37fe27 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -725,13 +725,11 @@ static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data *sys)
struct pcie_port *pp = sys_to_pcie(sys);
pp->root_bus_nr = sys->busnr;
- bus = pci_create_root_bus(pp->dev, sys->busnr,
+ bus = pci_scan_root_bus(pp->dev, sys->busnr,
&dw_pcie_ops, sys, &sys->resources);
if (!bus)
return NULL;
- pci_scan_child_bus(bus);
-
if (bus && pp->ops->scan_bus)
pp->ops->scan_bus(pp);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 26/30] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (24 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 25/30] PCI/designware: Use pci_scan_root_bus() for simplicity Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 27/30] PCI: Rename __pci_create_root_bus() to pci_create_root_bus() Yijing Wang
` (6 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Use pci_scan_root_bus() instead of pci_create_root_bus() +
pci_scan_child_bus() for simplicity.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
CC: Tanmay Inamdar <tinamdar@apm.com>
---
drivers/pci/host/pci-xgene.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c
index b1d0596..7e46a39 100644
--- a/drivers/pci/host/pci-xgene.c
+++ b/drivers/pci/host/pci-xgene.c
@@ -631,12 +631,11 @@ static int xgene_pcie_probe_bridge(struct platform_device *pdev)
if (ret)
return ret;
- bus = pci_create_root_bus(&pdev->dev, 0,
+ bus = pci_scan_root_bus(&pdev->dev, 0,
&xgene_pcie_ops, port, &res);
if (!bus)
return -ENOMEM;
- pci_scan_child_bus(bus);
pci_assign_unassigned_bus_resources(bus);
pci_bus_add_devices(bus);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 27/30] PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (25 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 26/30] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 28/30] PCI: Export find_pci_host_bridge() Yijing Wang
` (5 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now no one use pci_create_root_bus(), we could remove it
and rename __pci_create_root_bus() to pci_create_root_bus().
Signed-off-by: wangyijing at huawei.com
---
drivers/pci/probe.c | 27 ++++++++-------------------
include/linux/pci.h | 3 ---
2 files changed, 8 insertions(+), 22 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 79b5aca..70e28d9 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1852,7 +1852,7 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
{
}
-static struct pci_bus *__pci_create_root_bus(
+static struct pci_bus *pci_create_root_bus(
struct pci_host_bridge *bridge, struct pci_ops *ops)
{
int error;
@@ -1935,18 +1935,6 @@ err_out:
return NULL;
}
-struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
- struct pci_ops *ops, void *sysdata, struct list_head *resources)
-{
- struct pci_host_bridge *host;
-
- host = pci_create_host_bridge(parent, db, resources, sysdata, NULL);
- if (!host)
- return NULL;
-
- return __pci_create_root_bus(host, ops);
-}
-
int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
{
struct resource *res = &b->busn_res;
@@ -2025,7 +2013,7 @@ static struct pci_bus *__pci_scan_root_bus(
break;
}
- b = __pci_create_root_bus(host, ops);
+ b = pci_create_root_bus(host, ops);
if (!b) {
pci_free_host_bridge(host);
return NULL;
@@ -2087,18 +2075,19 @@ struct pci_bus *pci_scan_bus_legacy(u32 db, struct pci_ops *ops,
void *sysdata)
{
LIST_HEAD(resources);
- struct pci_bus *b;
+ struct pci_host_bridge *host;
pci_add_resource(&resources, &ioport_resource);
pci_add_resource(&resources, &iomem_resource);
pci_add_resource(&resources, &busn_resource);
- b = pci_create_root_bus(NULL, db, ops, sysdata, &resources);
- if (b) {
- pci_scan_child_bus(b);
+ host = pci_create_host_bridge(NULL, db, sysdata, &resources, NULL);
+ if (host) {
+ __pci_scan_root_bus(host, ops);
+ return host->bus;
} else {
pci_free_resource_list(&resources);
}
- return b;
+ return NULL;
}
EXPORT_SYMBOL(pci_scan_bus_legacy);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 4c4c9e4..4d9d471 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -781,9 +781,6 @@ void pcibios_scan_specific_bus(int busn);
struct pci_bus *pci_find_bus(int domain, int busnr);
void pci_bus_add_devices(const struct pci_bus *bus);
struct pci_bus *pci_scan_bus_legacy(u32 dombus, struct pci_ops *ops, void *sysdata);
-struct pci_bus *pci_create_root_bus(struct device *parent, u32 dombus,
- struct pci_ops *ops, void *sysdata,
- struct list_head *resources);
void pci_free_host_bridge(struct pci_host_bridge *host);
int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int busmax);
int pci_bus_update_busn_res_end(struct pci_bus *b, int busmax);
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 28/30] PCI: Export find_pci_host_bridge()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (26 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 27/30] PCI: Rename __pci_create_root_bus() to pci_create_root_bus() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 29/30] PCI: Remove platform specific pci_domain_nr() Yijing Wang
` (4 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Export find_pci_host_bridge().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/host-bridge.c | 2 +-
include/linux/pci.h | 1 +
2 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 26cefce..288ac69 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -104,7 +104,7 @@ static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
return bus;
}
-static struct pci_host_bridge *find_pci_host_bridge(struct pci_bus *bus)
+struct pci_host_bridge *find_pci_host_bridge(struct pci_bus *bus)
{
struct pci_bus *root_bus = find_pci_root_bus(bus);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 4d9d471..2f6b199 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -427,6 +427,7 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,
struct pci_host_bridge *pci_create_host_bridge(
struct device *parent, u32 dombus, struct list_head *resources,
void *sysdata, struct pci_host_bridge_ops *ops);
+struct pci_host_bridge *find_pci_host_bridge(struct pci_bus* bus);
/*
* The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
* to P2P or CardBus bridge windows) go in a table. Additional ones (for
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 29/30] PCI: Remove platform specific pci_domain_nr()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (27 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 28/30] PCI: Export find_pci_host_bridge() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-21 0:30 ` [PATCH v2 30/30] PCI: Remove pci_bus_assign_domain_nr() Yijing Wang
` (3 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now pci_host_bridge holds the domain number,
so we could eliminate all platform specific
pci_domain_nr().
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
arch/alpha/include/asm/pci.h | 2 --
arch/ia64/include/asm/pci.h | 1 -
arch/microblaze/pci/pci-common.c | 11 -----------
arch/mips/include/asm/pci.h | 2 --
arch/powerpc/kernel/pci-common.c | 11 -----------
arch/s390/pci/pci.c | 6 ------
arch/sh/include/asm/pci.h | 2 --
arch/sparc/kernel/pci.c | 17 -----------------
arch/tile/include/asm/pci.h | 2 --
arch/x86/include/asm/pci.h | 6 ------
drivers/pci/pci.c | 8 ++++++++
include/linux/pci.h | 7 ++-----
12 files changed, 10 insertions(+), 65 deletions(-)
diff --git a/arch/alpha/include/asm/pci.h b/arch/alpha/include/asm/pci.h
index f7f680f..63a9a1e 100644
--- a/arch/alpha/include/asm/pci.h
+++ b/arch/alpha/include/asm/pci.h
@@ -95,8 +95,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
return channel ? 15 : 14;
}
-#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
-
static inline int pci_proc_domain(struct pci_bus *bus)
{
struct pci_controller *hose = bus->sysdata;
diff --git a/arch/ia64/include/asm/pci.h b/arch/ia64/include/asm/pci.h
index 52af5ed..1dcea49 100644
--- a/arch/ia64/include/asm/pci.h
+++ b/arch/ia64/include/asm/pci.h
@@ -99,7 +99,6 @@ struct pci_controller {
#define PCI_CONTROLLER(busdev) ((struct pci_controller *) busdev->sysdata)
-#define pci_domain_nr(busdev) (PCI_CONTROLLER(busdev)->segment)
extern struct pci_ops pci_root_ops;
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index 890bd36..81ac523 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -123,17 +123,6 @@ unsigned long pci_address_to_pio(phys_addr_t address)
}
EXPORT_SYMBOL_GPL(pci_address_to_pio);
-/*
- * Return the domain number for this bus.
- */
-int pci_domain_nr(struct pci_bus *bus)
-{
- struct pci_controller *hose = pci_bus_to_host(bus);
-
- return hose->global_number;
-}
-EXPORT_SYMBOL(pci_domain_nr);
-
/* This routine is meant to be used early during boot, when the
* PCI bus numbers have not yet been assigned, and you need to
* issue PCI config cycles to an OF device.
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index 6952962..9546396 100644
--- a/arch/mips/include/asm/pci.h
+++ b/arch/mips/include/asm/pci.h
@@ -121,8 +121,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
}
#endif
-#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
-
static inline int pci_proc_domain(struct pci_bus *bus)
{
struct pci_controller *hose = bus->sysdata;
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 1f44df9..73860ff 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -181,17 +181,6 @@ unsigned long pci_address_to_pio(phys_addr_t address)
}
EXPORT_SYMBOL_GPL(pci_address_to_pio);
-/*
- * Return the domain number for this bus.
- */
-int pci_domain_nr(struct pci_bus *bus)
-{
- struct pci_controller *hose = pci_bus_to_host(bus);
-
- return hose->global_number;
-}
-EXPORT_SYMBOL(pci_domain_nr);
-
/* This routine is meant to be used early during boot, when the
* PCI bus numbers have not yet been assigned, and you need to
* issue PCI config cycles to an OF device.
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 612decf..8ca02f7 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -101,12 +101,6 @@ static struct zpci_dev *get_zdev_by_bus(struct pci_bus *bus)
return (bus && bus->sysdata) ? (struct zpci_dev *) bus->sysdata : NULL;
}
-int pci_domain_nr(struct pci_bus *bus)
-{
- return ((struct zpci_dev *) bus->sysdata)->domain;
-}
-EXPORT_SYMBOL_GPL(pci_domain_nr);
-
int pci_proc_domain(struct pci_bus *bus)
{
return pci_domain_nr(bus);
diff --git a/arch/sh/include/asm/pci.h b/arch/sh/include/asm/pci.h
index 5b45115..4dc3ad6 100644
--- a/arch/sh/include/asm/pci.h
+++ b/arch/sh/include/asm/pci.h
@@ -109,8 +109,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
/* Board-specific fixup routines. */
int pcibios_map_platform_irq(const struct pci_dev *dev, u8 slot, u8 pin);
-#define pci_domain_nr(bus) ((struct pci_channel *)(bus)->sysdata)->index
-
static inline int pci_proc_domain(struct pci_bus *bus)
{
struct pci_channel *hose = bus->sysdata;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index 0ff5093..babfa57 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -900,23 +900,6 @@ int pcibus_to_node(struct pci_bus *pbus)
EXPORT_SYMBOL(pcibus_to_node);
#endif
-/* Return the domain number for this pci bus */
-
-int pci_domain_nr(struct pci_bus *pbus)
-{
- struct pci_pbm_info *pbm = pbus->sysdata;
- int ret;
-
- if (!pbm) {
- ret = -ENXIO;
- } else {
- ret = pbm->index;
- }
-
- return ret;
-}
-EXPORT_SYMBOL(pci_domain_nr);
-
#ifdef CONFIG_PCI_MSI
int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
{
diff --git a/arch/tile/include/asm/pci.h b/arch/tile/include/asm/pci.h
index dfedd7a..23a726e 100644
--- a/arch/tile/include/asm/pci.h
+++ b/arch/tile/include/asm/pci.h
@@ -199,8 +199,6 @@ int __init pcibios_init(void);
void pcibios_fixup_bus(struct pci_bus *bus);
-#define pci_domain_nr(bus) (((struct pci_controller *)(bus)->sysdata)->index)
-
/*
* This decides whether to display the domain number in /proc.
*/
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index 4e370a5..4fe0458 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -29,12 +29,6 @@ extern int noioapicreroute;
#ifdef CONFIG_PCI
#ifdef CONFIG_PCI_DOMAINS
-static inline int pci_domain_nr(struct pci_bus *bus)
-{
- struct pci_sysdata *sd = bus->sysdata;
- return sd->domain;
-}
-
static inline int pci_proc_domain(struct pci_bus *bus)
{
return pci_domain_nr(bus);
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 06d41b1..0af5ef1 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4465,6 +4465,14 @@ int pci_get_new_domain_nr(void)
return atomic_inc_return(&__domain_nr);
}
+int pci_domain_nr(struct pci_bus *bus)
+{
+ struct pci_host_bridge *host = find_pci_host_bridge(bus);
+
+ return host->domain;
+}
+EXPORT_SYMBOL(pci_domain_nr);
+
#ifdef CONFIG_PCI_DOMAINS_GENERIC
static int pci_assign_domain_nr(struct device *dev)
{
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2f6b199..57e7e00 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1310,6 +1310,7 @@ void pci_cfg_access_unlock(struct pci_dev *dev);
#ifdef CONFIG_PCI_DOMAINS
extern int pci_domains_supported;
int pci_get_new_domain_nr(void);
+int pci_domain_nr(struct pci_bus *bus);
#else
enum { pci_domains_supported = 0 };
static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
@@ -1323,15 +1324,11 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }
* domains then this implementation will be used
*/
#ifdef CONFIG_PCI_DOMAINS_GENERIC
-static inline int pci_domain_nr(struct pci_bus *bus)
-{
- return bus->domain_nr;
-}
void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent);
void pci_host_assign_domain_nr(struct pci_host_bridge *host);
#else
static inline void pci_bus_assign_domain_nr(struct pci_bus *bus,
- struct device *parent)
+ struct device *parent)
{
}
static inline void pci_host_assign_domain_nr(struct pci_host_bridge *host)
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 30/30] PCI: Remove pci_bus_assign_domain_nr()
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (28 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 29/30] PCI: Remove platform specific pci_domain_nr() Yijing Wang
@ 2015-01-21 0:30 ` Yijing Wang
2015-01-30 9:10 ` [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (2 subsequent siblings)
32 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-21 0:30 UTC (permalink / raw)
To: linux-arm-kernel
Now we save the domain number in pci_host_bridge,
we could remove pci_bus_assign_domain_nr() and
clean the domain member in pci_bus.
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
drivers/pci/pci.c | 5 -----
drivers/pci/probe.c | 12 ++++--------
include/linux/pci.h | 3 ---
3 files changed, 4 insertions(+), 16 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 0af5ef1..7ad1e59 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4521,11 +4521,6 @@ void pci_host_assign_domain_nr(struct pci_host_bridge *host)
{
host->domain = pci_assign_domain_nr(host->dev.parent);
}
-
-void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent)
-{
- bus->domain_nr = pci_assign_domain_nr(parent);
-}
#endif
#endif
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 70e28d9..dabf4ca 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -480,7 +480,7 @@ void pci_read_bridge_bases(struct pci_bus *child)
}
}
-static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
+static struct pci_bus *pci_alloc_bus(void)
{
struct pci_bus *b;
@@ -495,10 +495,7 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
INIT_LIST_HEAD(&b->resources);
b->max_bus_speed = PCI_SPEED_UNKNOWN;
b->cur_bus_speed = PCI_SPEED_UNKNOWN;
-#ifdef CONFIG_PCI_DOMAINS_GENERIC
- if (parent)
- b->domain_nr = parent->domain_nr;
-#endif
+
return b;
}
@@ -645,7 +642,7 @@ static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
/*
* Allocate a new bus, and inherit stuff from the parent..
*/
- child = pci_alloc_bus(parent);
+ child = pci_alloc_bus();
if (!child)
return NULL;
@@ -1865,14 +1862,13 @@ static struct pci_bus *pci_create_root_bus(
char *fmt;
parent = bridge->dev.parent;
- b = pci_alloc_bus(NULL);
+ b = pci_alloc_bus();
if (!b)
return NULL;
b->sysdata = dev_get_drvdata(&bridge->dev);
b->ops = ops;
b->number = b->busn_res.start = bridge->busnum;
- pci_bus_assign_domain_nr(b, parent);
bridge->bus = b;
b->bridge = get_device(&bridge->dev);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 57e7e00..90fb71a 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -471,9 +471,6 @@ struct pci_bus {
unsigned char primary; /* number of primary bridge */
unsigned char max_bus_speed; /* enum pci_bus_speed */
unsigned char cur_bus_speed; /* enum pci_bus_speed */
-#ifdef CONFIG_PCI_DOMAINS_GENERIC
- int domain_nr;
-#endif
char name[48];
--
1.7.1
^ permalink raw reply related [flat|nested] 46+ messages in thread
* [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code
2015-01-21 0:30 ` [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code Yijing Wang
@ 2015-01-22 17:40 ` Thomas Petazzoni
2015-01-23 2:11 ` Yijing Wang
2015-02-16 17:46 ` Lorenzo Pieralisi
0 siblings, 2 replies; 46+ messages in thread
From: Thomas Petazzoni @ 2015-01-22 17:40 UTC (permalink / raw)
To: linux-arm-kernel
Dear Yijing Wang,
On Wed, 21 Jan 2015 08:30:18 +0800, Yijing Wang wrote:
> Mvebu_pcie_scan_bus() is not necessary, we could use
> pci_common_init_dev() instead of pci_common_init(),
> and pass the device pointer as the parent. Then
> pci_scan_root_bus() will be called to scan the pci busses.
>
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> CC: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> CC: Jason Cooper <jason@lakedaemon.net>
While I'm fine with the change to pci_common_init_dev(), I am not so
sure about the removal of mvebu_pcie_scan_bus(). I vaguely remember
that we intentionally did not use the default function for a specific
reason. Of course, this was a long time ago, and I don't remember the
reason. I would have to take a bit of time to 1/ review the archives of
the discussion surrounding the pcie-mvebu driver, and 2/ test your
patch to validate it works fine on HW.
Thanks!
Thomas
--
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented()
2015-01-21 0:29 ` [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented() Yijing Wang
@ 2015-01-22 20:25 ` Konrad Rzeszutek Wilk
2015-01-23 2:12 ` Yijing Wang
0 siblings, 1 reply; 46+ messages in thread
From: Konrad Rzeszutek Wilk @ 2015-01-22 20:25 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jan 21, 2015 at 08:29:58AM +0800, Yijing Wang wrote:
> From: Arnd Bergmann <arnd@arndb.de>
>
> Use pci_scan_root_bus() instead of deprecated function
> pci_scan_bus_parented().
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> CC: xen-devel at lists.xenproject.org
It looks OK to me thought I need to test it first.
> ---
> drivers/pci/xen-pcifront.c | 10 +++++++---
> 1 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
> index b1ffebe..240ddbc 100644
> --- a/drivers/pci/xen-pcifront.c
> +++ b/drivers/pci/xen-pcifront.c
> @@ -446,6 +446,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
> unsigned int domain, unsigned int bus)
> {
> struct pci_bus *b;
> + LIST_HEAD(resources);
> struct pcifront_sd *sd = NULL;
> struct pci_bus_entry *bus_entry = NULL;
> int err = 0;
> @@ -470,17 +471,20 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
> err = -ENOMEM;
> goto err_out;
> }
> + pci_add_resource(&resources, &ioport_resource);
> + pci_add_resource(&resources, &iomem_resource);
> pcifront_init_sd(sd, domain, bus, pdev);
>
> pci_lock_rescan_remove();
>
> - b = pci_scan_bus_parented(&pdev->xdev->dev, bus,
> - &pcifront_bus_ops, sd);
> + b = pci_scan_root_bus(&pdev->xdev->dev, bus,
> + &pcifront_bus_ops, sd, &resources);
> if (!b) {
> dev_err(&pdev->xdev->dev,
> "Error creating PCI Frontend Bus!\n");
> err = -ENOMEM;
> pci_unlock_rescan_remove();
> + pci_free_resource_list(&resources);
> goto err_out;
> }
>
> @@ -488,7 +492,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
>
> list_add(&bus_entry->list, &pdev->root_buses);
>
> - /* pci_scan_bus_parented skips devices which do not have a have
> + /* pci_scan_root_bus skips devices which do not have a have
> * devfn==0. The pcifront_scan_bus enumerates all devfn. */
> err = pcifront_scan_bus(pdev, domain, bus, b);
>
> --
> 1.7.1
>
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code
2015-01-22 17:40 ` Thomas Petazzoni
@ 2015-01-23 2:11 ` Yijing Wang
2015-02-16 17:46 ` Lorenzo Pieralisi
1 sibling, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-23 2:11 UTC (permalink / raw)
To: linux-arm-kernel
On 2015/1/23 1:40, Thomas Petazzoni wrote:
> Dear Yijing Wang,
>
> On Wed, 21 Jan 2015 08:30:18 +0800, Yijing Wang wrote:
>> Mvebu_pcie_scan_bus() is not necessary, we could use
>> pci_common_init_dev() instead of pci_common_init(),
>> and pass the device pointer as the parent. Then
>> pci_scan_root_bus() will be called to scan the pci busses.
>>
>> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
>> CC: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
>> CC: Jason Cooper <jason@lakedaemon.net>
>
> While I'm fine with the change to pci_common_init_dev(), I am not so
> sure about the removal of mvebu_pcie_scan_bus(). I vaguely remember
> that we intentionally did not use the default function for a specific
> reason. Of course, this was a long time ago, and I don't remember the
> reason. I would have to take a bit of time to 1/ review the archives of
> the discussion surrounding the pcie-mvebu driver, and 2/ test your
> patch to validate it works fine on HW.
Hi Thomas, Thanks for your comments and help to test :)
>
> Thanks!
>
> Thomas
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented()
2015-01-22 20:25 ` Konrad Rzeszutek Wilk
@ 2015-01-23 2:12 ` Yijing Wang
0 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-23 2:12 UTC (permalink / raw)
To: linux-arm-kernel
On 2015/1/23 4:25, Konrad Rzeszutek Wilk wrote:
> On Wed, Jan 21, 2015 at 08:29:58AM +0800, Yijing Wang wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>>
>> Use pci_scan_root_bus() instead of deprecated function
>> pci_scan_bus_parented().
>>
>> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
>> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
>> CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> CC: xen-devel at lists.xenproject.org
>
> It looks OK to me thought I need to test it first.
Thanks!
>> ---
>> drivers/pci/xen-pcifront.c | 10 +++++++---
>> 1 files changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
>> index b1ffebe..240ddbc 100644
>> --- a/drivers/pci/xen-pcifront.c
>> +++ b/drivers/pci/xen-pcifront.c
>> @@ -446,6 +446,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
>> unsigned int domain, unsigned int bus)
>> {
>> struct pci_bus *b;
>> + LIST_HEAD(resources);
>> struct pcifront_sd *sd = NULL;
>> struct pci_bus_entry *bus_entry = NULL;
>> int err = 0;
>> @@ -470,17 +471,20 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
>> err = -ENOMEM;
>> goto err_out;
>> }
>> + pci_add_resource(&resources, &ioport_resource);
>> + pci_add_resource(&resources, &iomem_resource);
>> pcifront_init_sd(sd, domain, bus, pdev);
>>
>> pci_lock_rescan_remove();
>>
>> - b = pci_scan_bus_parented(&pdev->xdev->dev, bus,
>> - &pcifront_bus_ops, sd);
>> + b = pci_scan_root_bus(&pdev->xdev->dev, bus,
>> + &pcifront_bus_ops, sd, &resources);
>> if (!b) {
>> dev_err(&pdev->xdev->dev,
>> "Error creating PCI Frontend Bus!\n");
>> err = -ENOMEM;
>> pci_unlock_rescan_remove();
>> + pci_free_resource_list(&resources);
>> goto err_out;
>> }
>>
>> @@ -488,7 +492,7 @@ static int pcifront_scan_root(struct pcifront_device *pdev,
>>
>> list_add(&bus_entry->list, &pdev->root_buses);
>>
>> - /* pci_scan_bus_parented skips devices which do not have a have
>> + /* pci_scan_root_bus skips devices which do not have a have
>> * devfn==0. The pcifront_scan_bus enumerates all devfn. */
>> err = pcifront_scan_bus(pdev, domain, bus, b);
>>
>> --
>> 1.7.1
>>
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (29 preceding siblings ...)
2015-01-21 0:30 ` [PATCH v2 30/30] PCI: Remove pci_bus_assign_domain_nr() Yijing Wang
@ 2015-01-30 9:10 ` Yijing Wang
2015-01-30 15:45 ` Bjorn Helgaas
2015-02-14 19:45 ` Lorenzo Pieralisi
2015-02-25 23:09 ` Bjorn Helgaas
32 siblings, 1 reply; 46+ messages in thread
From: Yijing Wang @ 2015-01-30 9:10 UTC (permalink / raw)
To: linux-arm-kernel
Hi Bjorn,
Any comments for this series ? I'm so sorry to bother you. :)
On 2015/1/21 8:29, Yijing Wang wrote:
> v1->v2:
> Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
> and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
> Arnd. Refresh some patch description log, and add a new patch to fix
> build warning in ia64.
>
> This series is based on Bjorn's pci-next branch.
>
> Patch 1-4 ripped out pci_bus_add_devices() from pci scan interfaces
> for better pci scan flow.
>
> Patch 5-11 make a generic pci_host_bridge to hold pci_host_bridge
> related informations, and introduce a pci_host_bridge_ops to
> support platform host drivers provide its own pci_host_bridge
> related operations to setup pci_host_bridge during pci enumeration.
>
> Patch 12-28 apply the new pci scan interfaces to platform pci host
> bridge drivers.
>
> Now in kernel, we scan pci bus use the following ways:
> 1. pci_scan_bus.
> parent = NULL, default io/mem/bus resources
> call pci_bus_add_devices()
>
> 2. pci_scan_bus_parented() + pci_bus_add_devices()
> default io/mem/bus resources, only used by xen
>
> 3. pci_scan_root_bus() + pci_bus_add_devices()
>
> 4. pci_create_root_bus() + pci_scan_child_bus() + pci_bus_add_devices()
>
> 5. pci_create_root_bus() + xx_of_scan_bus() + pci_bus_add_devices()
>
> And we have a lot of arch specific pci_domain_nr() and other platform
> specific weak function like pcibios_root_bridge_prepare().
>
> After applied this series, we have following scan interfaces:
>
> 1. pci_scan_bus_legacy()
> parent = NULL, default io/mem/bus resources.
> for legacy pci scan
>
> 2. pci_scan_root_bus()
> for callers provide its own parent and io/mem/bus resources
> but no platform specific pci_host_bridge operations
>
> 3. pci_scan_root_bridge()
> for callers provide its own parent and io/mem/bus resources
> and pci_host_bridge_ops.
>
> Besides, above pci scan interfaces all need addtionally call pci_bus_add_devices()
> to set match_driver true and try to attach drivers.
>
> Also we could eliminate all arch specific pci_domain_nr() after applied this series.
>
> I tested this series on x86 (with or without ACPI).
> Comments and tests are warmly welcome!
>
> Arnd Bergmann (1):
> xen/PCI: Don't use deprecated function pci_scan_bus_parented()
>
> Yijing Wang (29):
> PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
> PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
> PCI: Remove deprecated pci_scan_bus_parented()
> PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
> PCI: Combine PCI domain and bus number in u32 arg
> PCI: Pass PCI domain number combined with root bus number
> PCI: Introduce pci_host_assign_domain_nr() to assign domain
> PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
> PCI: Introduce pci_host_bridge_list to manage host bridges
> PCI: Save sysdata in pci_host_bridge drvdata
> PCI: Introduce pci_host_bridge_ops to support host specific
> operations
> PCI: Introduce new scan function pci_scan_root_bridge()
> PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
> PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
> PCI/IA64: Fix the build warning about pci_domain_nr()
> PCI/powerpc: Rename pcibios_root_bridge_prepare()
> PCI/powerpc: Use pci_scan_root_bridge() for simplicity
> PCI: Remove weak pcibios_root_bridge_prepare()
> PCI/sparc: Use pci_scan_root_bridge() for simplicity
> PCI: Introduce pci_bus_child_max_busnr()
> PCI/Parisc: Use pci_scan_root_bus() for simplicity
> PCI/mvebu: Use pci_common_init_dev() to simplify code
> PCI/tegra: Remove redundant tegra_pcie_scan_bus()
> PCI/designware: Use pci_scan_root_bus() for simplicity
> PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
> PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
> PCI: Export find_pci_host_bridge()
> PCI: Remove platform specific pci_domain_nr()
> PCI: Remove pci_bus_assign_domain_nr()
>
> arch/alpha/include/asm/pci.h | 2 -
> arch/alpha/kernel/pci.c | 7 +-
> arch/alpha/kernel/sys_nautilus.c | 4 +-
> arch/frv/mb93090-mb00/pci-vdk.c | 6 +-
> arch/ia64/include/asm/pci.h | 1 -
> arch/ia64/pci/pci.c | 34 +++---
> arch/ia64/sn/kernel/io_acpi_init.c | 6 +-
> arch/ia64/sn/kernel/io_init.c | 8 +-
> arch/m68k/coldfire/pci.c | 3 +-
> arch/microblaze/pci/pci-common.c | 17 +--
> arch/mips/include/asm/pci.h | 2 -
> arch/mips/pci/pci.c | 5 +-
> arch/mn10300/unit-asb2305/pci.c | 5 +-
> arch/powerpc/include/asm/machdep.h | 2 +-
> arch/powerpc/kernel/pci-common.c | 77 ++++++------
> arch/powerpc/platforms/pseries/pci.c | 8 +-
> arch/powerpc/platforms/pseries/pseries.h | 2 +-
> arch/powerpc/platforms/pseries/setup.c | 2 +-
> arch/s390/pci/pci.c | 13 +--
> arch/sh/drivers/pci/pci.c | 6 +-
> arch/sh/include/asm/pci.h | 2 -
> arch/sparc/kernel/leon_pci.c | 1 +
> arch/sparc/kernel/pci.c | 50 ++++----
> arch/sparc/kernel/pcic.c | 4 +-
> arch/tile/include/asm/pci.h | 2 -
> arch/tile/kernel/pci.c | 6 +-
> arch/tile/kernel/pci_gx.c | 7 +-
> arch/unicore32/kernel/pci.c | 13 +--
> arch/x86/include/asm/pci.h | 6 -
> arch/x86/pci/acpi.c | 38 +++---
> arch/x86/pci/common.c | 4 +-
> arch/xtensa/kernel/pci.c | 2 +
> drivers/parisc/dino.c | 11 +--
> drivers/parisc/lba_pci.c | 7 +-
> drivers/pci/host-bridge.c | 90 ++++++++++++++-
> drivers/pci/host/pci-mvebu.c | 18 +---
> drivers/pci/host/pci-tegra.c | 16 ---
> drivers/pci/host/pci-xgene.c | 3 +-
> drivers/pci/host/pcie-designware.c | 4 +-
> drivers/pci/hotplug/acpiphp_glue.c | 29 +-----
> drivers/pci/hotplug/ibmphp_core.c | 6 +-
> drivers/pci/pci.c | 42 ++++++-
> drivers/pci/probe.c | 196 ++++++++++++------------------
> drivers/pci/xen-pcifront.c | 11 ++-
> include/linux/pci.h | 47 +++++---
> include/uapi/linux/pci.h | 3 +
> 46 files changed, 424 insertions(+), 404 deletions(-)
>
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-01-30 9:10 ` [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
@ 2015-01-30 15:45 ` Bjorn Helgaas
2015-01-31 0:55 ` Yijing Wang
0 siblings, 1 reply; 46+ messages in thread
From: Bjorn Helgaas @ 2015-01-30 15:45 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jan 30, 2015 at 3:10 AM, Yijing Wang <wangyijing@huawei.com> wrote:
> Hi Bjorn,
> Any comments for this series ? I'm so sorry to bother you. :)
It's next in my queue after Wei Yang's powerpc sriov series. Here's
the queue I work from:
https://patchwork.ozlabs.org/project/linux-pci/list/?order=date
Bjorn
> On 2015/1/21 8:29, Yijing Wang wrote:
>> v1->v2:
>> Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
>> and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
>> Arnd. Refresh some patch description log, and add a new patch to fix
>> build warning in ia64.
>>
>> This series is based on Bjorn's pci-next branch.
>>
>> Patch 1-4 ripped out pci_bus_add_devices() from pci scan interfaces
>> for better pci scan flow.
>>
>> Patch 5-11 make a generic pci_host_bridge to hold pci_host_bridge
>> related informations, and introduce a pci_host_bridge_ops to
>> support platform host drivers provide its own pci_host_bridge
>> related operations to setup pci_host_bridge during pci enumeration.
>>
>> Patch 12-28 apply the new pci scan interfaces to platform pci host
>> bridge drivers.
>>
>> Now in kernel, we scan pci bus use the following ways:
>> 1. pci_scan_bus.
>> parent = NULL, default io/mem/bus resources
>> call pci_bus_add_devices()
>>
>> 2. pci_scan_bus_parented() + pci_bus_add_devices()
>> default io/mem/bus resources, only used by xen
>>
>> 3. pci_scan_root_bus() + pci_bus_add_devices()
>>
>> 4. pci_create_root_bus() + pci_scan_child_bus() + pci_bus_add_devices()
>>
>> 5. pci_create_root_bus() + xx_of_scan_bus() + pci_bus_add_devices()
>>
>> And we have a lot of arch specific pci_domain_nr() and other platform
>> specific weak function like pcibios_root_bridge_prepare().
>>
>> After applied this series, we have following scan interfaces:
>>
>> 1. pci_scan_bus_legacy()
>> parent = NULL, default io/mem/bus resources.
>> for legacy pci scan
>>
>> 2. pci_scan_root_bus()
>> for callers provide its own parent and io/mem/bus resources
>> but no platform specific pci_host_bridge operations
>>
>> 3. pci_scan_root_bridge()
>> for callers provide its own parent and io/mem/bus resources
>> and pci_host_bridge_ops.
>>
>> Besides, above pci scan interfaces all need addtionally call pci_bus_add_devices()
>> to set match_driver true and try to attach drivers.
>>
>> Also we could eliminate all arch specific pci_domain_nr() after applied this series.
>>
>> I tested this series on x86 (with or without ACPI).
>> Comments and tests are warmly welcome!
>>
>> Arnd Bergmann (1):
>> xen/PCI: Don't use deprecated function pci_scan_bus_parented()
>>
>> Yijing Wang (29):
>> PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
>> PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
>> PCI: Remove deprecated pci_scan_bus_parented()
>> PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
>> PCI: Combine PCI domain and bus number in u32 arg
>> PCI: Pass PCI domain number combined with root bus number
>> PCI: Introduce pci_host_assign_domain_nr() to assign domain
>> PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
>> PCI: Introduce pci_host_bridge_list to manage host bridges
>> PCI: Save sysdata in pci_host_bridge drvdata
>> PCI: Introduce pci_host_bridge_ops to support host specific
>> operations
>> PCI: Introduce new scan function pci_scan_root_bridge()
>> PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
>> PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
>> PCI/IA64: Fix the build warning about pci_domain_nr()
>> PCI/powerpc: Rename pcibios_root_bridge_prepare()
>> PCI/powerpc: Use pci_scan_root_bridge() for simplicity
>> PCI: Remove weak pcibios_root_bridge_prepare()
>> PCI/sparc: Use pci_scan_root_bridge() for simplicity
>> PCI: Introduce pci_bus_child_max_busnr()
>> PCI/Parisc: Use pci_scan_root_bus() for simplicity
>> PCI/mvebu: Use pci_common_init_dev() to simplify code
>> PCI/tegra: Remove redundant tegra_pcie_scan_bus()
>> PCI/designware: Use pci_scan_root_bus() for simplicity
>> PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
>> PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
>> PCI: Export find_pci_host_bridge()
>> PCI: Remove platform specific pci_domain_nr()
>> PCI: Remove pci_bus_assign_domain_nr()
>>
>> arch/alpha/include/asm/pci.h | 2 -
>> arch/alpha/kernel/pci.c | 7 +-
>> arch/alpha/kernel/sys_nautilus.c | 4 +-
>> arch/frv/mb93090-mb00/pci-vdk.c | 6 +-
>> arch/ia64/include/asm/pci.h | 1 -
>> arch/ia64/pci/pci.c | 34 +++---
>> arch/ia64/sn/kernel/io_acpi_init.c | 6 +-
>> arch/ia64/sn/kernel/io_init.c | 8 +-
>> arch/m68k/coldfire/pci.c | 3 +-
>> arch/microblaze/pci/pci-common.c | 17 +--
>> arch/mips/include/asm/pci.h | 2 -
>> arch/mips/pci/pci.c | 5 +-
>> arch/mn10300/unit-asb2305/pci.c | 5 +-
>> arch/powerpc/include/asm/machdep.h | 2 +-
>> arch/powerpc/kernel/pci-common.c | 77 ++++++------
>> arch/powerpc/platforms/pseries/pci.c | 8 +-
>> arch/powerpc/platforms/pseries/pseries.h | 2 +-
>> arch/powerpc/platforms/pseries/setup.c | 2 +-
>> arch/s390/pci/pci.c | 13 +--
>> arch/sh/drivers/pci/pci.c | 6 +-
>> arch/sh/include/asm/pci.h | 2 -
>> arch/sparc/kernel/leon_pci.c | 1 +
>> arch/sparc/kernel/pci.c | 50 ++++----
>> arch/sparc/kernel/pcic.c | 4 +-
>> arch/tile/include/asm/pci.h | 2 -
>> arch/tile/kernel/pci.c | 6 +-
>> arch/tile/kernel/pci_gx.c | 7 +-
>> arch/unicore32/kernel/pci.c | 13 +--
>> arch/x86/include/asm/pci.h | 6 -
>> arch/x86/pci/acpi.c | 38 +++---
>> arch/x86/pci/common.c | 4 +-
>> arch/xtensa/kernel/pci.c | 2 +
>> drivers/parisc/dino.c | 11 +--
>> drivers/parisc/lba_pci.c | 7 +-
>> drivers/pci/host-bridge.c | 90 ++++++++++++++-
>> drivers/pci/host/pci-mvebu.c | 18 +---
>> drivers/pci/host/pci-tegra.c | 16 ---
>> drivers/pci/host/pci-xgene.c | 3 +-
>> drivers/pci/host/pcie-designware.c | 4 +-
>> drivers/pci/hotplug/acpiphp_glue.c | 29 +-----
>> drivers/pci/hotplug/ibmphp_core.c | 6 +-
>> drivers/pci/pci.c | 42 ++++++-
>> drivers/pci/probe.c | 196 ++++++++++++------------------
>> drivers/pci/xen-pcifront.c | 11 ++-
>> include/linux/pci.h | 47 +++++---
>> include/uapi/linux/pci.h | 3 +
>> 46 files changed, 424 insertions(+), 404 deletions(-)
>>
>>
>> .
>>
>
>
> --
> Thanks!
> Yijing
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-01-30 15:45 ` Bjorn Helgaas
@ 2015-01-31 0:55 ` Yijing Wang
0 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-01-31 0:55 UTC (permalink / raw)
To: linux-arm-kernel
On 2015/1/30 23:45, Bjorn Helgaas wrote:
> On Fri, Jan 30, 2015 at 3:10 AM, Yijing Wang <wangyijing@huawei.com> wrote:
>> Hi Bjorn,
>> Any comments for this series ? I'm so sorry to bother you. :)
>
> It's next in my queue after Wei Yang's powerpc sriov series. Here's
> the queue I work from:
> https://patchwork.ozlabs.org/project/linux-pci/list/?order=date
OK, thanks.
>
> Bjorn
>
>> On 2015/1/21 8:29, Yijing Wang wrote:
>>> v1->v2:
>>> Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
>>> and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
>>> Arnd. Refresh some patch description log, and add a new patch to fix
>>> build warning in ia64.
>>>
>>> This series is based on Bjorn's pci-next branch.
>>>
>>> Patch 1-4 ripped out pci_bus_add_devices() from pci scan interfaces
>>> for better pci scan flow.
>>>
>>> Patch 5-11 make a generic pci_host_bridge to hold pci_host_bridge
>>> related informations, and introduce a pci_host_bridge_ops to
>>> support platform host drivers provide its own pci_host_bridge
>>> related operations to setup pci_host_bridge during pci enumeration.
>>>
>>> Patch 12-28 apply the new pci scan interfaces to platform pci host
>>> bridge drivers.
>>>
>>> Now in kernel, we scan pci bus use the following ways:
>>> 1. pci_scan_bus.
>>> parent = NULL, default io/mem/bus resources
>>> call pci_bus_add_devices()
>>>
>>> 2. pci_scan_bus_parented() + pci_bus_add_devices()
>>> default io/mem/bus resources, only used by xen
>>>
>>> 3. pci_scan_root_bus() + pci_bus_add_devices()
>>>
>>> 4. pci_create_root_bus() + pci_scan_child_bus() + pci_bus_add_devices()
>>>
>>> 5. pci_create_root_bus() + xx_of_scan_bus() + pci_bus_add_devices()
>>>
>>> And we have a lot of arch specific pci_domain_nr() and other platform
>>> specific weak function like pcibios_root_bridge_prepare().
>>>
>>> After applied this series, we have following scan interfaces:
>>>
>>> 1. pci_scan_bus_legacy()
>>> parent = NULL, default io/mem/bus resources.
>>> for legacy pci scan
>>>
>>> 2. pci_scan_root_bus()
>>> for callers provide its own parent and io/mem/bus resources
>>> but no platform specific pci_host_bridge operations
>>>
>>> 3. pci_scan_root_bridge()
>>> for callers provide its own parent and io/mem/bus resources
>>> and pci_host_bridge_ops.
>>>
>>> Besides, above pci scan interfaces all need addtionally call pci_bus_add_devices()
>>> to set match_driver true and try to attach drivers.
>>>
>>> Also we could eliminate all arch specific pci_domain_nr() after applied this series.
>>>
>>> I tested this series on x86 (with or without ACPI).
>>> Comments and tests are warmly welcome!
>>>
>>> Arnd Bergmann (1):
>>> xen/PCI: Don't use deprecated function pci_scan_bus_parented()
>>>
>>> Yijing Wang (29):
>>> PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
>>> PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
>>> PCI: Remove deprecated pci_scan_bus_parented()
>>> PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
>>> PCI: Combine PCI domain and bus number in u32 arg
>>> PCI: Pass PCI domain number combined with root bus number
>>> PCI: Introduce pci_host_assign_domain_nr() to assign domain
>>> PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
>>> PCI: Introduce pci_host_bridge_list to manage host bridges
>>> PCI: Save sysdata in pci_host_bridge drvdata
>>> PCI: Introduce pci_host_bridge_ops to support host specific
>>> operations
>>> PCI: Introduce new scan function pci_scan_root_bridge()
>>> PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
>>> PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
>>> PCI/IA64: Fix the build warning about pci_domain_nr()
>>> PCI/powerpc: Rename pcibios_root_bridge_prepare()
>>> PCI/powerpc: Use pci_scan_root_bridge() for simplicity
>>> PCI: Remove weak pcibios_root_bridge_prepare()
>>> PCI/sparc: Use pci_scan_root_bridge() for simplicity
>>> PCI: Introduce pci_bus_child_max_busnr()
>>> PCI/Parisc: Use pci_scan_root_bus() for simplicity
>>> PCI/mvebu: Use pci_common_init_dev() to simplify code
>>> PCI/tegra: Remove redundant tegra_pcie_scan_bus()
>>> PCI/designware: Use pci_scan_root_bus() for simplicity
>>> PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
>>> PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
>>> PCI: Export find_pci_host_bridge()
>>> PCI: Remove platform specific pci_domain_nr()
>>> PCI: Remove pci_bus_assign_domain_nr()
>>>
>>> arch/alpha/include/asm/pci.h | 2 -
>>> arch/alpha/kernel/pci.c | 7 +-
>>> arch/alpha/kernel/sys_nautilus.c | 4 +-
>>> arch/frv/mb93090-mb00/pci-vdk.c | 6 +-
>>> arch/ia64/include/asm/pci.h | 1 -
>>> arch/ia64/pci/pci.c | 34 +++---
>>> arch/ia64/sn/kernel/io_acpi_init.c | 6 +-
>>> arch/ia64/sn/kernel/io_init.c | 8 +-
>>> arch/m68k/coldfire/pci.c | 3 +-
>>> arch/microblaze/pci/pci-common.c | 17 +--
>>> arch/mips/include/asm/pci.h | 2 -
>>> arch/mips/pci/pci.c | 5 +-
>>> arch/mn10300/unit-asb2305/pci.c | 5 +-
>>> arch/powerpc/include/asm/machdep.h | 2 +-
>>> arch/powerpc/kernel/pci-common.c | 77 ++++++------
>>> arch/powerpc/platforms/pseries/pci.c | 8 +-
>>> arch/powerpc/platforms/pseries/pseries.h | 2 +-
>>> arch/powerpc/platforms/pseries/setup.c | 2 +-
>>> arch/s390/pci/pci.c | 13 +--
>>> arch/sh/drivers/pci/pci.c | 6 +-
>>> arch/sh/include/asm/pci.h | 2 -
>>> arch/sparc/kernel/leon_pci.c | 1 +
>>> arch/sparc/kernel/pci.c | 50 ++++----
>>> arch/sparc/kernel/pcic.c | 4 +-
>>> arch/tile/include/asm/pci.h | 2 -
>>> arch/tile/kernel/pci.c | 6 +-
>>> arch/tile/kernel/pci_gx.c | 7 +-
>>> arch/unicore32/kernel/pci.c | 13 +--
>>> arch/x86/include/asm/pci.h | 6 -
>>> arch/x86/pci/acpi.c | 38 +++---
>>> arch/x86/pci/common.c | 4 +-
>>> arch/xtensa/kernel/pci.c | 2 +
>>> drivers/parisc/dino.c | 11 +--
>>> drivers/parisc/lba_pci.c | 7 +-
>>> drivers/pci/host-bridge.c | 90 ++++++++++++++-
>>> drivers/pci/host/pci-mvebu.c | 18 +---
>>> drivers/pci/host/pci-tegra.c | 16 ---
>>> drivers/pci/host/pci-xgene.c | 3 +-
>>> drivers/pci/host/pcie-designware.c | 4 +-
>>> drivers/pci/hotplug/acpiphp_glue.c | 29 +-----
>>> drivers/pci/hotplug/ibmphp_core.c | 6 +-
>>> drivers/pci/pci.c | 42 ++++++-
>>> drivers/pci/probe.c | 196 ++++++++++++------------------
>>> drivers/pci/xen-pcifront.c | 11 ++-
>>> include/linux/pci.h | 47 +++++---
>>> include/uapi/linux/pci.h | 3 +
>>> 46 files changed, 424 insertions(+), 404 deletions(-)
>>>
>>>
>>> .
>>>
>>
>>
>> --
>> Thanks!
>> Yijing
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
>> the body of a message to majordomo at vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (30 preceding siblings ...)
2015-01-30 9:10 ` [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
@ 2015-02-14 19:45 ` Lorenzo Pieralisi
2015-02-15 1:11 ` Yijing Wang
2015-02-16 1:18 ` Yijing Wang
2015-02-25 23:09 ` Bjorn Helgaas
32 siblings, 2 replies; 46+ messages in thread
From: Lorenzo Pieralisi @ 2015-02-14 19:45 UTC (permalink / raw)
To: linux-arm-kernel
Hi Yijing,
On Wed, Jan 21, 2015 at 12:29:55AM +0000, Yijing Wang wrote:
> v1->v2:
> Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
> and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
> Arnd. Refresh some patch description log, and add a new patch to fix
> build warning in ia64.
>
> This series is based on Bjorn's pci-next branch.
>
> Patch 1-4 ripped out pci_bus_add_devices() from pci scan interfaces
> for better pci scan flow.
>
> Patch 5-11 make a generic pci_host_bridge to hold pci_host_bridge
> related informations, and introduce a pci_host_bridge_ops to
> support platform host drivers provide its own pci_host_bridge
> related operations to setup pci_host_bridge during pci enumeration.
>
> Patch 12-28 apply the new pci scan interfaces to platform pci host
> bridge drivers.
>
> Now in kernel, we scan pci bus use the following ways:
> 1. pci_scan_bus.
> parent = NULL, default io/mem/bus resources
> call pci_bus_add_devices()
>
> 2. pci_scan_bus_parented() + pci_bus_add_devices()
> default io/mem/bus resources, only used by xen
>
> 3. pci_scan_root_bus() + pci_bus_add_devices()
>
> 4. pci_create_root_bus() + pci_scan_child_bus() + pci_bus_add_devices()
>
> 5. pci_create_root_bus() + xx_of_scan_bus() + pci_bus_add_devices()
>
> And we have a lot of arch specific pci_domain_nr() and other platform
> specific weak function like pcibios_root_bridge_prepare().
>
> After applied this series, we have following scan interfaces:
>
> 1. pci_scan_bus_legacy()
> parent = NULL, default io/mem/bus resources.
> for legacy pci scan
>
> 2. pci_scan_root_bus()
> for callers provide its own parent and io/mem/bus resources
> but no platform specific pci_host_bridge operations
>
> 3. pci_scan_root_bridge()
> for callers provide its own parent and io/mem/bus resources
> and pci_host_bridge_ops.
>
> Besides, above pci scan interfaces all need addtionally call pci_bus_add_devices()
> to set match_driver true and try to attach drivers.
>
> Also we could eliminate all arch specific pci_domain_nr() after applied this series.
>
> I tested this series on x86 (with or without ACPI).
> Comments and tests are warmly welcome!
Can you push a public branch out rebased against mainline for us to pull
and test please ?
Thanks !
Lorenzo
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-02-14 19:45 ` Lorenzo Pieralisi
@ 2015-02-15 1:11 ` Yijing Wang
2015-02-16 1:18 ` Yijing Wang
1 sibling, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-02-15 1:11 UTC (permalink / raw)
To: linux-arm-kernel
>> Also we could eliminate all arch specific pci_domain_nr() after applied this series.
>>
>> I tested this series on x86 (with or without ACPI).
>> Comments and tests are warmly welcome!
>
> Can you push a public branch out rebased against mainline for us to pull
> and test please ?
OK, I will rebase it and push it to my github repo today, and send out the git URL, thanks!
Thanks!
Yijing.
>
> Thanks !
> Lorenzo
>
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-02-14 19:45 ` Lorenzo Pieralisi
2015-02-15 1:11 ` Yijing Wang
@ 2015-02-16 1:18 ` Yijing Wang
2015-02-16 3:13 ` Benjamin Herrenschmidt
1 sibling, 1 reply; 46+ messages in thread
From: Yijing Wang @ 2015-02-16 1:18 UTC (permalink / raw)
To: linux-arm-kernel
>> I tested this series on x86 (with or without ACPI).
>> Comments and tests are warmly welcome!
>
> Can you push a public branch out rebased against mainline for us to pull
> and test please ?
Hi Lorenzo, I rebased the series and you could pull it from git at github.com:YijingWang/linux-pci.git for-gen-host-v2
Thank you to help test!
Thanks!
Yijing.
>
> Thanks !
> Lorenzo
>
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-02-16 1:18 ` Yijing Wang
@ 2015-02-16 3:13 ` Benjamin Herrenschmidt
2015-02-16 3:28 ` Yijing Wang
0 siblings, 1 reply; 46+ messages in thread
From: Benjamin Herrenschmidt @ 2015-02-16 3:13 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, 2015-02-16 at 09:18 +0800, Yijing Wang wrote:
> >> I tested this series on x86 (with or without ACPI).
> >> Comments and tests are warmly welcome!
> >
> > Can you push a public branch out rebased against mainline for us to pull
> > and test please ?
>
> Hi Lorenzo, I rebased the series and you could pull it from git at github.com:YijingWang/linux-pci.git for-gen-host-v2
>
> Thank you to help test!
Thanks, I'll try to spend some time reviewing and testing this on
powerpc as well.
Cheers,
Ben.
> Thanks!
> Yijing.
>
> >
> > Thanks !
> > Lorenzo
> >
> >
> > .
> >
>
>
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-02-16 3:13 ` Benjamin Herrenschmidt
@ 2015-02-16 3:28 ` Yijing Wang
0 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-02-16 3:28 UTC (permalink / raw)
To: linux-arm-kernel
On 2015/2/16 11:13, Benjamin Herrenschmidt wrote:
> On Mon, 2015-02-16 at 09:18 +0800, Yijing Wang wrote:
>>>> I tested this series on x86 (with or without ACPI).
>>>> Comments and tests are warmly welcome!
>>>
>>> Can you push a public branch out rebased against mainline for us to pull
>>> and test please ?
>>
>> Hi Lorenzo, I rebased the series and you could pull it from git at github.com:YijingWang/linux-pci.git for-gen-host-v2
>>
>> Thank you to help test!
>
> Thanks, I'll try to spend some time reviewing and testing this on
> powerpc as well.
Thanks very much!
Thanks!
Yijing.
>
> Cheers,
> Ben.
>
>> Thanks!
>> Yijing.
>>
>>>
>>> Thanks !
>>> Lorenzo
>>>
>>>
>>> .
>>>
>>
>>
>
>
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code
2015-01-22 17:40 ` Thomas Petazzoni
2015-01-23 2:11 ` Yijing Wang
@ 2015-02-16 17:46 ` Lorenzo Pieralisi
1 sibling, 0 replies; 46+ messages in thread
From: Lorenzo Pieralisi @ 2015-02-16 17:46 UTC (permalink / raw)
To: linux-arm-kernel
Hi Thomas,
On Thu, Jan 22, 2015 at 05:40:00PM +0000, Thomas Petazzoni wrote:
> Dear Yijing Wang,
>
> On Wed, 21 Jan 2015 08:30:18 +0800, Yijing Wang wrote:
> > Mvebu_pcie_scan_bus() is not necessary, we could use
> > pci_common_init_dev() instead of pci_common_init(),
> > and pass the device pointer as the parent. Then
> > pci_scan_root_bus() will be called to scan the pci busses.
> >
> > Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> > CC: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> > CC: Jason Cooper <jason@lakedaemon.net>
>
> While I'm fine with the change to pci_common_init_dev(), I am not so
> sure about the removal of mvebu_pcie_scan_bus(). I vaguely remember
> that we intentionally did not use the default function for a specific
> reason. Of course, this was a long time ago, and I don't remember the
> reason. I would have to take a bit of time to 1/ review the archives of
> the discussion surrounding the pcie-mvebu driver, and 2/ test your
> patch to validate it works fine on HW.
I guess the reason: by providing the scan pointer to pcibios through
the hw_pci struct you were preventing calling pci_scan_root_bus() in
bios32.c that in turn can add devices before the resources are assigned.
Basically mvebu_pci_scan_bus() was doing what pci_scan_root_bus() does
except for calling pci_bus_add_devices().
Yijing patches remove pci_bus_add_devices() from pci_scan_root_bus() so
his change should be fine and it actually improves the current behaviour
which is quite hard to untangle, and not just on mvebu (I suspect
drivers/pci/host/pcie-xilinx.c can suffer from the same problem).
Lorenzo
>
> Thanks!
>
> Thomas
> --
> Thomas Petazzoni, CTO, Free Electrons
> Embedded Linux, Kernel and Android engineering
> http://free-electrons.com
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
` (31 preceding siblings ...)
2015-02-14 19:45 ` Lorenzo Pieralisi
@ 2015-02-25 23:09 ` Bjorn Helgaas
2015-02-26 0:54 ` Yijing Wang
32 siblings, 1 reply; 46+ messages in thread
From: Bjorn Helgaas @ 2015-02-25 23:09 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jan 21, 2015 at 08:29:55AM +0800, Yijing Wang wrote:
> v1->v2:
> Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
> and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
> Arnd. Refresh some patch description log, and add a new patch to fix
> build warning in ia64.
>
> This series is based on Bjorn's pci-next branch.
Hi Yijing,
Would you mind rebasing this to v4.0-rc1? It doesn't apply quite cleanly
any more.
Thanks,
Bjorn
^ permalink raw reply [flat|nested] 46+ messages in thread
* [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge
2015-02-25 23:09 ` Bjorn Helgaas
@ 2015-02-26 0:54 ` Yijing Wang
0 siblings, 0 replies; 46+ messages in thread
From: Yijing Wang @ 2015-02-26 0:54 UTC (permalink / raw)
To: linux-arm-kernel
On 2015/2/26 7:09, Bjorn Helgaas wrote:
> On Wed, Jan 21, 2015 at 08:29:55AM +0800, Yijing Wang wrote:
>> v1->v2:
>> Split pci_host_bridge_list into a new patch, remove .phb_probe_mode
>> and rework powerpc .phb_of_scan_bus() for simpilicty suggested by
>> Arnd. Refresh some patch description log, and add a new patch to fix
>> build warning in ia64.
>>
>> This series is based on Bjorn's pci-next branch.
>
> Hi Yijing,
>
> Would you mind rebasing this to v4.0-rc1? It doesn't apply quite cleanly
> any more.
OK, I will resend the series based on the v4.0-rc1.
Thanks!
Yijing.
>
> Thanks,
> Bjorn
>
> .
>
--
Thanks!
Yijing
^ permalink raw reply [flat|nested] 46+ messages in thread
end of thread, other threads:[~2015-02-26 0:54 UTC | newest]
Thread overview: 46+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-21 0:29 [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
2015-01-21 0:29 ` [PATCH v2 01/30] PCI: Rip out pci_bus_add_devices() from pci_scan_bus() Yijing Wang
2015-01-21 0:29 ` [PATCH v2 02/30] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus() Yijing Wang
2015-01-21 0:29 ` [PATCH v2 03/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented() Yijing Wang
2015-01-22 20:25 ` Konrad Rzeszutek Wilk
2015-01-23 2:12 ` Yijing Wang
2015-01-21 0:29 ` [PATCH v2 04/30] PCI: Remove deprecated pci_scan_bus_parented() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 05/30] PCI: Rename pci_scan_bus() to pci_scan_bus_legacy() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 06/30] PCI: Combine PCI domain and bus number in u32 arg Yijing Wang
2015-01-21 0:30 ` [PATCH v2 07/30] PCI: Pass PCI domain number combined with root bus number Yijing Wang
2015-01-21 0:30 ` [PATCH v2 08/30] PCI: Introduce pci_host_assign_domain_nr() to assign domain Yijing Wang
2015-01-21 0:30 ` [PATCH v2 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 10/30] PCI: Introduce pci_host_bridge_list to manage host bridges Yijing Wang
2015-01-21 0:30 ` [PATCH v2 11/30] PCI: Save sysdata in pci_host_bridge drvdata Yijing Wang
2015-01-21 0:30 ` [PATCH v2 12/30] PCI: Introduce pci_host_bridge_ops to support host specific operations Yijing Wang
2015-01-21 0:30 ` [PATCH v2 13/30] PCI: Introduce new scan function pci_scan_root_bridge() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 14/30] PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge Yijing Wang
2015-01-21 0:30 ` [PATCH v2 15/30] PCI/IA64: " Yijing Wang
2015-01-21 0:30 ` [PATCH v2 16/30] PCI/IA64: Fix the build warning about pci_domain_nr() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 17/30] PCI/powerpc: Rename pcibios_root_bridge_prepare() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 18/30] PCI/powerpc: Use pci_scan_root_bridge() for simplicity Yijing Wang
2015-01-21 0:30 ` [PATCH v2 19/30] PCI: Remove weak pcibios_root_bridge_prepare() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 20/30] PCI/sparc: Use pci_scan_root_bridge() for simplicity Yijing Wang
2015-01-21 0:30 ` [PATCH v2 21/30] PCI: Introduce pci_bus_child_max_busnr() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 22/30] PCI/Parisc: Use pci_scan_root_bus() for simplicity Yijing Wang
2015-01-21 0:30 ` [PATCH v2 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code Yijing Wang
2015-01-22 17:40 ` Thomas Petazzoni
2015-01-23 2:11 ` Yijing Wang
2015-02-16 17:46 ` Lorenzo Pieralisi
2015-01-21 0:30 ` [PATCH v2 24/30] PCI/tegra: Remove redundant tegra_pcie_scan_bus() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 25/30] PCI/designware: Use pci_scan_root_bus() for simplicity Yijing Wang
2015-01-21 0:30 ` [PATCH v2 26/30] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 27/30] PCI: Rename __pci_create_root_bus() to pci_create_root_bus() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 28/30] PCI: Export find_pci_host_bridge() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 29/30] PCI: Remove platform specific pci_domain_nr() Yijing Wang
2015-01-21 0:30 ` [PATCH v2 30/30] PCI: Remove pci_bus_assign_domain_nr() Yijing Wang
2015-01-30 9:10 ` [PATCH v2 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
2015-01-30 15:45 ` Bjorn Helgaas
2015-01-31 0:55 ` Yijing Wang
2015-02-14 19:45 ` Lorenzo Pieralisi
2015-02-15 1:11 ` Yijing Wang
2015-02-16 1:18 ` Yijing Wang
2015-02-16 3:13 ` Benjamin Herrenschmidt
2015-02-16 3:28 ` Yijing Wang
2015-02-25 23:09 ` Bjorn Helgaas
2015-02-26 0:54 ` Yijing Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).