diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2005-12-15 15:00:57 +1100 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-01-09 15:05:56 +1100 |
commit | f2c4583a381c584c8c025048071a120cc9562ded (patch) | |
tree | 53d6a1d30a3be72f021738c97853cff55a800070 | |
parent | a04c8780fd234aeeba5e87f7e37beffd05ef21ae (diff) | |
download | blackbird-op-linux-f2c4583a381c584c8c025048071a120cc9562ded.tar.gz blackbird-op-linux-f2c4583a381c584c8c025048071a120cc9562ded.zip |
[PATCH] powerpc: pci_address_to_pio fix
This fixes pci_address_to_pio() to return an unsigned long (to be safe)
and fixes a bug in the implementation that caused it to return a bogus
IO port number
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/kernel/pci_64.c | 11 | ||||
-rw-r--r-- | arch/powerpc/kernel/prom_parse.c | 4 | ||||
-rw-r--r-- | arch/ppc/kernel/pci.c | 10 | ||||
-rw-r--r-- | include/asm-powerpc/pci-bridge.h | 6 | ||||
-rw-r--r-- | include/asm-ppc/pci-bridge.h | 6 |
5 files changed, 20 insertions, 17 deletions
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index f73a16e9867a..fc60a773af7d 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c @@ -1365,16 +1365,17 @@ struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node) #endif /* CONFIG_PPC_MULTIPLATFORM */ -unsigned int pci_address_to_pio(phys_addr_t address) +unsigned long pci_address_to_pio(phys_addr_t address) { struct pci_controller *hose, *tmp; list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { if (address >= hose->io_base_phys && - address < (hose->io_base_phys + hose->pci_io_size)) - return (unsigned int) - ((unsigned long)hose->io_base_virt + - (address - hose->io_base_phys)); + address < (hose->io_base_phys + hose->pci_io_size)) { + unsigned long base = + (unsigned long)hose->io_base_virt - pci_io_base; + return base + (address - hose->io_base_phys); + } } return (unsigned int)-1; } diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 5b764277f470..309ae1d5fa77 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c @@ -503,9 +503,9 @@ static int __of_address_to_resource(struct device_node *dev, u32 *addrp, return -EINVAL; memset(r, 0, sizeof(struct resource)); if (flags & IORESOURCE_IO) { - unsigned int port; + unsigned long port; port = pci_address_to_pio(taddr); - if (port == (unsigned int)-1) + if (port == (unsigned long)-1) return -EINVAL; r->start = port; r->end = port + size - 1; diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c index 8de320308e87..c8b48f171699 100644 --- a/arch/ppc/kernel/pci.c +++ b/arch/ppc/kernel/pci.c @@ -1811,7 +1811,7 @@ void pci_iounmap(struct pci_dev *dev, void __iomem *addr) EXPORT_SYMBOL(pci_iomap); EXPORT_SYMBOL(pci_iounmap); -unsigned int pci_address_to_pio(phys_addr_t address) +unsigned long pci_address_to_pio(phys_addr_t address) { struct pci_controller* hose = hose_head; @@ -1819,9 +1819,11 @@ unsigned int pci_address_to_pio(phys_addr_t address) unsigned int size = hose->io_resource.end - hose->io_resource.start + 1; if (address >= hose->io_base_phys && - address < (hose->io_base_phys + size)) - return (unsigned int)hose->io_base_virt + - (address - hose->io_base_phys); + address < (hose->io_base_phys + size)) { + unsigned long base = + (unsigned long)hose->io_base_virt - _IO_BASE; + return base + (address - hose->io_base_phys); + } return (unsigned int)-1; } diff --git a/include/asm-powerpc/pci-bridge.h b/include/asm-powerpc/pci-bridge.h index 3d94e55f25d6..443c75a16571 100644 --- a/include/asm-powerpc/pci-bridge.h +++ b/include/asm-powerpc/pci-bridge.h @@ -158,11 +158,11 @@ pcibios_alloc_controller(struct device_node *dev); extern void pcibios_free_controller(struct pci_controller *phb); #ifdef CONFIG_PCI -extern unsigned int pci_address_to_pio(phys_addr_t address); +extern unsigned long pci_address_to_pio(phys_addr_t address); #else -static inline unsigned int pci_address_to_pio(phys_addr_t address) +static inline unsigned long pci_address_to_pio(phys_addr_t address) { - return (unsigned int)-1; + return (unsigned long)-1; } #endif diff --git a/include/asm-ppc/pci-bridge.h b/include/asm-ppc/pci-bridge.h index 95672ddfe528..9d5230689b31 100644 --- a/include/asm-ppc/pci-bridge.h +++ b/include/asm-ppc/pci-bridge.h @@ -138,11 +138,11 @@ static inline unsigned char bridge_swizzle(unsigned char pin, extern int pciauto_bus_scan(struct pci_controller *, int); #ifdef CONFIG_PCI -extern unsigned int pci_address_to_pio(phys_addr_t address); +extern unsigned long pci_address_to_pio(phys_addr_t address); #else -static inline unsigned int pci_address_to_pio(phys_addr_t address) +static inline unsigned long pci_address_to_pio(phys_addr_t address) { - return (unsigned int)-1; + return (unsigned long)-1; } #endif |