Re: [PATCH] net: smc91x: Add Atari EtherNAT support
On Thu, 15 Jan 2015, Geert Uytterhoeven wrote: From: Michael Schmitz schmitz...@gmail.com Add Atari specific code to the smc91x Ethernet driver. This code is used on the EtherNAT adapter card for the Atari Falcon extension port. Signed-off-by: Michael Schmitz schm...@debian.org Tested-by: Christian Steigies c...@debian.org [geert: Sort Kconfig entries, split in hard and soft dependencies] Signed-off-by: Geert Uytterhoeven ge...@linux-m68k.org Long gone is the time I had access to hardware with this ethernet chip, but FWIW: Acked-by: Nicolas Pitre n...@fluxnic.net --- drivers/net/ethernet/smsc/Kconfig | 10 ++ drivers/net/ethernet/smsc/smc91x.h | 21 + 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/smsc/Kconfig b/drivers/net/ethernet/smsc/Kconfig index 9468e64e6007bd2e..3e97a8b43147cc7c 100644 --- a/drivers/net/ethernet/smsc/Kconfig +++ b/drivers/net/ethernet/smsc/Kconfig @@ -5,8 +5,9 @@ config NET_VENDOR_SMSC bool SMC (SMSC)/Western Digital devices default y - depends on ARM || ISA || MAC || ARM64 || MIPS || M32R || SUPERH || \ - BLACKFIN || MN10300 || COLDFIRE || XTENSA || NIOS2 || PCI || PCMCIA + depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \ +ISA || M32R || MAC || MIPS || MN10300 || NIOS2 || PCI || \ +PCMCIA || SUPERH || XTENSA ---help--- If you have a network (Ethernet) card belonging to this class, say Y and read the Ethernet-HOWTO, available from @@ -38,8 +39,9 @@ config SMC91X tristate SMC 91C9x/91C1xxx support select CRC32 select MII - depends on (ARM || M32R || SUPERH || MIPS || BLACKFIN || \ - MN10300 || COLDFIRE || ARM64 || XTENSA || NIOS2) (!OF || GPIOLIB) + depends on !OF || GPIOLIB + depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \ +M32R || MIPS || MN10300 || NIOS2 || SUPERH || XTENSA ---help--- This is a driver for SMC's 91x series of Ethernet chipsets, including the SMC91C94 and the SMC91C111. Say Y if you want it diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 2a38dacbbd27fba4..be67baf5f6778d08 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -216,6 +216,27 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) #include unit/smc9.h +#elif defined(CONFIG_ATARI) + +#define SMC_CAN_USE_8BIT1 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 1 +#define SMC_NOWAIT 1 + +#define SMC_inb(a, r) readb((a) + (r)) +#define SMC_inw(a, r) readw((a) + (r)) +#define SMC_inl(a, r) readl((a) + (r)) +#define SMC_outb(v, a, r) writeb(v, (a) + (r)) +#define SMC_outw(v, a, r) writew(v, (a) + (r)) +#define SMC_outl(v, a, r) writel(v, (a) + (r)) +#define SMC_insw(a, r, p, l)readsw((a) + (r), p, l) +#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) +#define SMC_insl(a, r, p, l)readsl((a) + (r), p, l) +#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) + +#define RPC_LSA_DEFAULT RPC_LED_100_10 +#define RPC_LSB_DEFAULT RPC_LED_TX_RX + #elif defined(CONFIG_ARCH_MSM) #define SMC_CAN_USE_8BIT 0 -- 1.9.1 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] net: smc91x: Add Atari EtherNAT support
From: Geert Uytterhoeven ge...@linux-m68k.org Date: Thu, 15 Jan 2015 14:06:15 +0100 From: Michael Schmitz schmitz...@gmail.com Add Atari specific code to the smc91x Ethernet driver. This code is used on the EtherNAT adapter card for the Atari Falcon extension port. Signed-off-by: Michael Schmitz schm...@debian.org Tested-by: Christian Steigies c...@debian.org [geert: Sort Kconfig entries, split in hard and soft dependencies] Signed-off-by: Geert Uytterhoeven ge...@linux-m68k.org Applied to net-next, thanks. -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 07/28] PCI: Pass PCI domain number combined with root bus number
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 wangyij...@huawei.com --- 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,
[PATCH 02/28] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus()
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 wangyij...@huawei.com CC: David Howells dhowe...@redhat.com CC: Tony Luck tony.l...@intel.com CC: Michal Simek mon...@monstr.eu CC: Ralf Baechle r...@linux-mips.org CC: Koichi Yasutake yasutake.koi...@jp.panasonic.com CC: Sebastian Ott seb...@linux.vnet.ibm.com CC: Thomas Gleixner t...@linutronix.de CC: Chris Metcalf cmetc...@ezchip.com CC: Chris Zankel ch...@zankel.net CC: linux-al...@vger.kernel.org CC: linux-ker...@vger.kernel.org CC: linux-m...@linux-mips.org CC: linux-am33-l...@redhat.com CC: linux-s...@vger.kernel.org CC: linux...@vger.kernel.org CC: sparcli...@vger.kernel.org CC: linux-...@vger.kernel.org CC: linux-xte...@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,
Re: linux-next: Tree for Jan 12 (build failures: m68k, ppc)
On Mon, Jan 12, 2015 at 6:59 PM, Guenter Roeck li...@roeck-us.net wrote: Build failures, seen since next-20150109: m68k:allmodconfig powerpc:ppc6xx_defconfig It looks like parisc is also suffering: http://kisskb.ellerman.id.au/kisskb/buildresult/12343847/ Due to: ERROR: __get_user_bad [drivers/gpu/drm/drm.ko] undefined! make[1]: *** [__modpost] Error 1 Caused by commit d34f20d6e2f (drm: Atomic modeset ioctl). Yeah, it needs a get_user() that supports 64-bit data. Hi Geert, I assume you mean m68k, where 64 bit support for get_user has been disabled. The problem on powerpc is different though: __get_user_nocheck() and __get_user_check() use unsigned long __gu_val; followed by __get_user_size(__gu_val, __gu_addr, (size), __gu_err); __get_user_size() fails in if (size sizeof(x)) (x) = __get_user_bad(); Presumably unsigned long is 32 bit on 32 bit powerpc, not 64 bit. Overall, the explicit 64-bit use of get_user() seems to be quite unusual. I noticed you've sent a fix for DRM. Doh, and I was just fixing m68k... Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say programmer or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[git pull] m68k updates for 3.19 (take 2)
Hi Linus, The following changes since commit b1940cd21c0f4abdce101253e860feff547291b0: Linux 3.19-rc3 (2015-01-05 17:05:20 -0800) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git for-linus for you to fetch changes up to f27bd5bfeda5881ce283aa06408c8fa99fb950fa: m68k: Wire up execveat (2015-01-11 11:14:14 +0100) Summary: m68k: Wire up execveat Geert Uytterhoeven (1): m68k: Wire up execveat arch/m68k/include/asm/unistd.h | 2 +- arch/m68k/include/uapi/asm/unistd.h | 1 + arch/m68k/kernel/syscalltable.S | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) Thanks for pulling! Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say programmer or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 0/5] m68k/atari: Remove obsolete IRQ_TYPE_*
On Mon, Jan 12, 2015 at 9:40 AM, Geert Uytterhoeven ge...@linux-m68k.org wrote: IRQ_TYPE_SLOW, IRQ_TYPE_FAST, and IRQ_TYPE_PRIO are no longer used by the Atari platform interrupt code since commit 734085651c9b80aa ([PATCH] m68k: convert atari irq code) in v2.6.18-rc1, so drop them. Note that their values have been reused for different purposes (IRQ_TYPE_NONE, IRQ_TYPE_EDGE_RISING, and IRQ_TYPE_EDGE_FALLING) since commit 6a6de9ef5850d063 ([PATCH] genirq: core) in v2.6.18-rc1. The last patch depends on the first 4 patches. Please either apply the relevant patches (1, 3 or 4; parport has no maintainer) to your trees, or ack them. Applied with maintainers' acks, and queued for 3.20. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say programmer or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] net: smc91x: Add Atari EtherNAT support
From: Michael Schmitz schmitz...@gmail.com Add Atari specific code to the smc91x Ethernet driver. This code is used on the EtherNAT adapter card for the Atari Falcon extension port. Signed-off-by: Michael Schmitz schm...@debian.org Tested-by: Christian Steigies c...@debian.org [geert: Sort Kconfig entries, split in hard and soft dependencies] Signed-off-by: Geert Uytterhoeven ge...@linux-m68k.org --- drivers/net/ethernet/smsc/Kconfig | 10 ++ drivers/net/ethernet/smsc/smc91x.h | 21 + 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/smsc/Kconfig b/drivers/net/ethernet/smsc/Kconfig index 9468e64e6007bd2e..3e97a8b43147cc7c 100644 --- a/drivers/net/ethernet/smsc/Kconfig +++ b/drivers/net/ethernet/smsc/Kconfig @@ -5,8 +5,9 @@ config NET_VENDOR_SMSC bool SMC (SMSC)/Western Digital devices default y - depends on ARM || ISA || MAC || ARM64 || MIPS || M32R || SUPERH || \ - BLACKFIN || MN10300 || COLDFIRE || XTENSA || NIOS2 || PCI || PCMCIA + depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \ + ISA || M32R || MAC || MIPS || MN10300 || NIOS2 || PCI || \ + PCMCIA || SUPERH || XTENSA ---help--- If you have a network (Ethernet) card belonging to this class, say Y and read the Ethernet-HOWTO, available from @@ -38,8 +39,9 @@ config SMC91X tristate SMC 91C9x/91C1xxx support select CRC32 select MII - depends on (ARM || M32R || SUPERH || MIPS || BLACKFIN || \ - MN10300 || COLDFIRE || ARM64 || XTENSA || NIOS2) (!OF || GPIOLIB) + depends on !OF || GPIOLIB + depends on ARM || ARM64 || ATARI_ETHERNAT || BLACKFIN || COLDFIRE || \ + M32R || MIPS || MN10300 || NIOS2 || SUPERH || XTENSA ---help--- This is a driver for SMC's 91x series of Ethernet chipsets, including the SMC91C94 and the SMC91C111. Say Y if you want it diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 2a38dacbbd27fba4..be67baf5f6778d08 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h @@ -216,6 +216,27 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) #include unit/smc9.h +#elif defined(CONFIG_ATARI) + +#define SMC_CAN_USE_8BIT1 +#define SMC_CAN_USE_16BIT 1 +#define SMC_CAN_USE_32BIT 1 +#define SMC_NOWAIT 1 + +#define SMC_inb(a, r) readb((a) + (r)) +#define SMC_inw(a, r) readw((a) + (r)) +#define SMC_inl(a, r) readl((a) + (r)) +#define SMC_outb(v, a, r) writeb(v, (a) + (r)) +#define SMC_outw(v, a, r) writew(v, (a) + (r)) +#define SMC_outl(v, a, r) writel(v, (a) + (r)) +#define SMC_insw(a, r, p, l)readsw((a) + (r), p, l) +#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) +#define SMC_insl(a, r, p, l)readsl((a) + (r), p, l) +#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) + +#define RPC_LSA_DEFAULT RPC_LED_100_10 +#define RPC_LSB_DEFAULT RPC_LED_TX_RX + #elif defined(CONFIG_ARCH_MSM) #define SMC_CAN_USE_8BIT 0 -- 1.9.1 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: linux-next: Tree for Jan 12 (build failures: m68k, ppc)
On 01/15/2015 02:12 AM, Geert Uytterhoeven wrote: On Mon, Jan 12, 2015 at 6:59 PM, Guenter Roeck li...@roeck-us.net wrote: Build failures, seen since next-20150109: m68k:allmodconfig powerpc:ppc6xx_defconfig It looks like parisc is also suffering: http://kisskb.ellerman.id.au/kisskb/buildresult/12343847/ Due to: ERROR: __get_user_bad [drivers/gpu/drm/drm.ko] undefined! make[1]: *** [__modpost] Error 1 Caused by commit d34f20d6e2f (drm: Atomic modeset ioctl). Yeah, it needs a get_user() that supports 64-bit data. Hi Geert, I assume you mean m68k, where 64 bit support for get_user has been disabled. The problem on powerpc is different though: __get_user_nocheck() and __get_user_check() use unsigned long __gu_val; followed by __get_user_size(__gu_val, __gu_addr, (size), __gu_err); __get_user_size() fails in if (size sizeof(x)) (x) = __get_user_bad(); Presumably unsigned long is 32 bit on 32 bit powerpc, not 64 bit. Overall, the explicit 64-bit use of get_user() seems to be quite unusual. I noticed you've sent a fix for DRM. Doh, and I was just fixing m68k... Sorry, should have Cc:'d you. Guenter -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 20/28] PCI/Parisc: Use pci_scan_root_bus() for simplicity
From: Yijing Wang wangyijing0...@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. Signed-off-by: Yijing Wang wangyij...@huawei.com --- drivers/parisc/dino.c| 11 ++- drivers/parisc/lba_pci.c |6 ++ 2 files changed, 4 insertions(+), 13 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..9e3a016 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -1564,15 +1564,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 +1598,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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 22/28] PCI/tegra: Remove redundant tegra_pcie_scan_bus()
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 wangyij...@huawei.com --- drivers/pci/host/pci-tegra.c | 15 --- 1 files changed, 0 insertions(+), 15 deletions(-) diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c index 6f9c29f..d9d1af0 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[] = { -- 1.7.1 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 21/28] PCI/mvebu: Use pci_common_init_dev() to simplify code
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 wangyij...@huawei.com --- 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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 27/28] PCI: Remove platform specific pci_domain_nr()
Now pci_host_bridge holds the domain number, so we could eliminate all platform specific pci_domain_nr(). Signed-off-by: Yijing Wang wangyij...@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 0c7fb81..a482bd6 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 42dc21f..519f121 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -906,23 +906,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
[PATCH 00/28] Refine PCI scan interfaces and make generic pci host bridge
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 (27): 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: Save sysdata in pci_host_bridge drvdata PCI: Introduce pci_host_bridge_ops to setup host bridge 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/powerpc: Rename pcibios_root_bridge_prepare() for better readability 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_init.c|6 +- 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 | 73 ++- arch/powerpc/platforms/pseries/pci.c |2 +- 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 | 48 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
[PATCH 08/28] PCI: Introduce pci_host_assign_domain_nr() to assign domain
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 wangyij...@huawei.com --- drivers/pci/pci.c | 47 +++ include/linux/pci.h |4 2 files changed, 51 insertions(+), 0 deletions(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index c419554..8b35e8e 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -4443,6 +4443,53 @@ int pci_get_new_domain_nr(void) } #ifdef CONFIG_PCI_DOMAINS_GENERIC +void pci_host_assign_domain_nr(struct pci_host_bridge *host) +{ + static int use_dt_domains = -1; + struct device *parent = host-dev.parent; + int domain = of_get_pci_domain_nr(parent-of_node); + + /* +* Check DT domain and use_dt_domains values. +* +* If DT domain property is valid (domain = 0) and +* use_dt_domains != 0, the DT assignment is valid since this means +* we have not previously allocated a domain number by using +* pci_get_new_domain_nr(); we should also update use_dt_domains to +* 1, to indicate that we have just assigned a domain number from +* DT. +* +* If DT domain property value is not valid (ie domain 0), and we +* have not previously assigned a domain number from DT +* (use_dt_domains != 1) we should assign a domain number by +* using the: +* +* pci_get_new_domain_nr() +* +* API and update the use_dt_domains value to keep track of method we +* are using to assign domain numbers (use_dt_domains = 0). +* +* All other combinations imply we have a platform that is trying +* to mix domain numbers obtained from DT and pci_get_new_domain_nr(), +* which is a recipe for domain mishandling and it is prevented by +* invalidating the domain value (domain = -1) and printing a +* corresponding error. +*/ + if (domain = 0 use_dt_domains) { + use_dt_domains = 1; + } else if (domain 0 use_dt_domains != 1) { + use_dt_domains = 0; + domain = pci_get_new_domain_nr(); + } else { + dev_err(parent, Node %s has inconsistent \linux,pci-domain\ property in DT\n, + parent-of_node-full_name); + domain = -1; + } + + host-domain_nr = domain; +} + + void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent) { static int use_dt_domains = -1; 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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 04/28] PCI: Remove deprecated pci_scan_bus_parented()
No one uses pci_scan_bus_parented() any more, remove it. Signed-off-by: Yijing Wang wangyij...@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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 05/28] PCI: Rename pci_scan_bus() to pci_scan_bus_legacy()
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 wangyij...@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 != 0x) (l != 0x)) { 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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of
[PATCH 06/28] PCI: Combine PCI domain and bus number in u32 arg
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 wangyij...@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
[PATCH 01/28] PCI: Rip out pci_bus_add_devices() from pci_scan_bus()
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() It is not correct, resources should be assigned correctly before attaching driver. So we should rip out pci_bus_add_devices() for better code design. After applied this patch, pci_scan_bus() should be used in flow 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 wangyij...@huawei.com CC: David S. Miller da...@davemloft.net CC: Geert Uytterhoeven ge...@linux-m68k.org CC: Guan Xuetao g...@mprc.pku.edu.cn CC: linux-al...@vger.kernel.org CC: linux-m...@lists.linux-m68k.org CC: sparcli...@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 != 0x) (l != 0x)) { 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
[PATCH 09/28] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
We want to make a generic pci_host_bridge, then we could place common PCI infos like domain number in it. 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(). Signed-off-by: Yijing Wang wangyij...@huawei.com --- drivers/pci/host-bridge.c | 78 + drivers/pci/probe.c | 121 +++-- include/linux/pci.h |6 ++- 3 files changed, 134 insertions(+), 71 deletions(-) diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c index 0e5f3c9..c9ee582 100644 --- a/drivers/pci/host-bridge.c +++ b/drivers/pci/host-bridge.c @@ -8,6 +8,84 @@ #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); + + 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, *temp; + 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 argu u32 db. +*/ + 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 +host-busnum == temp-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; + 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); + + 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); +} + 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..2e0b952 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,35 @@ 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_bus *b; + struct pci_host_bridge_window *window; + struct device *parent; struct
[PATCH 15/28] PCI/powerpc: Rename pcibios_root_bridge_prepare() for better readability
Pcibios_root_bridge_prepare() in powerpc is used to set root bus speed. So rename it to pcibios_set_root_bus_speed() for better readability. Signed-off-by: Yijing Wang wangyij...@huawei.com --- arch/powerpc/include/asm/machdep.h |2 +- arch/powerpc/kernel/pci-common.c |4 ++-- arch/powerpc/platforms/pseries/pci.c |2 +- arch/powerpc/platforms/pseries/pseries.h |2 +- arch/powerpc/platforms/pseries/setup.c |2 +- 5 files changed, 6 insertions(+), 6 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..2cf941e 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -769,8 +769,8 @@ 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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 12/28] PCI: Introduce new scan function pci_scan_root_bridge()
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 wangyij...@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 5f748ed..51d69c3 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -2068,6 +2068,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 c06b95d..5592737 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -797,6 +797,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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 14/28] PCI/IA64: Refine pci_acpi_scan_root() with generic pci_host_bridge
From: Yijing Wang wangyijing0...@gmail.com Signed-off-by: Yijing Wang wangyij...@huawei.com --- 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..7736c02 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_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; @@ -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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 11/28] PCI: Introduce pci_host_bridge_ops to setup host bridge
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); /* probe whether pci_host_bridge scan mode is of mode */ void (*phb_probe_mode)(struct pci_host_bridge *); /* platform specific of scan hook to scan pci device */ void (*phb_of_scan_bus)(struct pci_host_bridge *); } Signed-off-by: Yijing Wang wangyij...@huawei.com --- drivers/pci/host-bridge.c | 12 ++-- drivers/pci/probe.c | 19 ++- include/linux/pci.h | 16 ++-- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c index 0b6ba5c..ccbf168 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 98a8d97..5f748ed 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,17 @@ static struct pci_bus *__pci_scan_root_bus( pci_bus_insert_busn_res(b, host-busnum, 255); } - max = pci_scan_child_bus(b); + if (host-ops host-ops-phb_probe_mode) + host-ops-phb_probe_mode(host); - if (!found) - pci_bus_update_busn_res_end(b, max); + if (host-of_scan) { + 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 +2073,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..c06b95d 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -401,13 +401,25 @@ 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); + /* Override domain number by host specific .phv_assign_domain_nr() */ + void (*phb_assign_domain_nr)(struct pci_host_bridge *); + void
[PATCH 19/28] PCI: Introduce pci_bus_child_max_busnr()
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 wangyij...@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 8b35e8e..a05f406 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 da3a071..2970a84 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1176,7 +1176,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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 16/28] PCI/powerpc: Use pci_scan_root_bridge() for simplicity
Now we could use pci_scan_root_bridge() to scan pci buses, provide powerpc specific pci_host_bridge_ops. Signed-off-by: Yijing Wang wangyij...@huawei.com --- arch/powerpc/kernel/pci-common.c | 57 -- 1 files changed, 36 insertions(+), 21 deletions(-) diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 2cf941e..0c7fb81 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -767,7 +767,8 @@ int pci_proc_domain(struct pci_bus *bus) return 1; } -int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) +static int 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); @@ -775,6 +776,27 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) return 0; } +static void pci_host_bridge_probe_mode(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) + host-of_scan = true; +} + +static void pci_host_bridge_of_scan_bus(struct pci_host_bridge *host) +{ + struct pci_controller *hose = dev_get_drvdata(host-dev); + + of_scan_bus(host-dn, bus); +} /* This header fixup will do the resource fixup for all devices as they are * probed, but not for bridge ranges */ @@ -1577,6 +1599,12 @@ 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_probe_mode = pci_host_bridge_probe_mode, + .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 +1612,9 @@ 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_host_bridge *host; struct pci_bus *bus; struct device_node *node = hose-dn; - int mode; pr_debug(PCI: Scanning PHB %s\n, of_node_full_name(node)); @@ -1602,30 +1630,17 @@ 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; + hose-last_busno = host-bus-busn_res.end; /* Platform gets a chance to do some global fixups before * we proceed to resource allocation -- 1.7.1 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 17/28] PCI: Remove weak pcibios_root_bridge_prepare()
Now no one use weak pcibios_root_bridge_prepare(), we could remove it. Signed-off-by: Yijing Wang wangyij...@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 51d69c3..30323ac 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 5592737..da3a071 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -428,8 +428,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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 10/28] PCI: Save sysdata in pci_host_bridge drvdata
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 wangyij...@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 c9ee582..0b6ba5c 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 2e0b952..98a8d97 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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 25/28] PCI: Rename __pci_create_root_bus() to pci_create_root_bus()
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: wangyij...@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 30323ac..0817910 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; @@ -2091,18 +2079,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 2970a84..9ddca3b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -785,9 +785,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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 23/28] PCI/designware: Use pci_scan_root_bus() for simplicity
Use pci_scan_root_bus() instead of pci_create_root_bus() + pci_scan_child_bus() for simplicity. Signed-off-by: Yijing Wang wangyij...@huawei.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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 03/28] xen/PCI: Don't use deprecated function pci_scan_bus_parented()
From: Arnd Bergmann a...@arndb.de Use pci_scan_root_bus() instead of deprecated function pci_scan_bus_parented(). Signed-off-by: Arnd Bergmann a...@arndb.de Signed-off-by: Yijing Wang wangyij...@huawei.com CC: Konrad Rzeszutek Wilk konrad.w...@oracle.com CC: xen-de...@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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 24/28] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus()
Use pci_scan_root_bus() instead of pci_create_root_bus() + pci_scan_child_bus() for simplicity. Signed-off-by: Yijing Wang wangyij...@huawei.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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 26/28] PCI: Export find_pci_host_bridge()
Export find_pci_host_bridge(). Signed-off-by: Yijing Wang wangyij...@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 ccbf168..74f7572 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 9ddca3b..3ebee9d 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -431,6 +431,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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 13/28] PCI/x86: Refine pci_acpi_scan_root() with generic pci_host_bridge
Signed-off-by: Yijing Wang wangyij...@huawei.com --- 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 -- To unsubscribe from this list: send the line unsubscribe linux-m68k in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html