Commit f2c4583a authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Paul Mackerras

[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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent a04c8780
...@@ -1365,16 +1365,17 @@ struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node) ...@@ -1365,16 +1365,17 @@ struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node)
#endif /* CONFIG_PPC_MULTIPLATFORM */ #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; struct pci_controller *hose, *tmp;
list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
if (address >= hose->io_base_phys && if (address >= hose->io_base_phys &&
address < (hose->io_base_phys + hose->pci_io_size)) address < (hose->io_base_phys + hose->pci_io_size)) {
return (unsigned int) unsigned long base =
((unsigned long)hose->io_base_virt + (unsigned long)hose->io_base_virt - pci_io_base;
(address - hose->io_base_phys)); return base + (address - hose->io_base_phys);
}
} }
return (unsigned int)-1; return (unsigned int)-1;
} }
......
...@@ -503,9 +503,9 @@ static int __of_address_to_resource(struct device_node *dev, u32 *addrp, ...@@ -503,9 +503,9 @@ static int __of_address_to_resource(struct device_node *dev, u32 *addrp,
return -EINVAL; return -EINVAL;
memset(r, 0, sizeof(struct resource)); memset(r, 0, sizeof(struct resource));
if (flags & IORESOURCE_IO) { if (flags & IORESOURCE_IO) {
unsigned int port; unsigned long port;
port = pci_address_to_pio(taddr); port = pci_address_to_pio(taddr);
if (port == (unsigned int)-1) if (port == (unsigned long)-1)
return -EINVAL; return -EINVAL;
r->start = port; r->start = port;
r->end = port + size - 1; r->end = port + size - 1;
......
...@@ -1811,7 +1811,7 @@ void pci_iounmap(struct pci_dev *dev, void __iomem *addr) ...@@ -1811,7 +1811,7 @@ void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
EXPORT_SYMBOL(pci_iomap); EXPORT_SYMBOL(pci_iomap);
EXPORT_SYMBOL(pci_iounmap); 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; struct pci_controller* hose = hose_head;
...@@ -1819,9 +1819,11 @@ unsigned int pci_address_to_pio(phys_addr_t address) ...@@ -1819,9 +1819,11 @@ unsigned int pci_address_to_pio(phys_addr_t address)
unsigned int size = hose->io_resource.end - unsigned int size = hose->io_resource.end -
hose->io_resource.start + 1; hose->io_resource.start + 1;
if (address >= hose->io_base_phys && if (address >= hose->io_base_phys &&
address < (hose->io_base_phys + size)) address < (hose->io_base_phys + size)) {
return (unsigned int)hose->io_base_virt + unsigned long base =
(address - hose->io_base_phys); (unsigned long)hose->io_base_virt - _IO_BASE;
return base + (address - hose->io_base_phys);
} }
return (unsigned int)-1; return (unsigned int)-1;
} }
......
...@@ -158,11 +158,11 @@ pcibios_alloc_controller(struct device_node *dev); ...@@ -158,11 +158,11 @@ pcibios_alloc_controller(struct device_node *dev);
extern void pcibios_free_controller(struct pci_controller *phb); extern void pcibios_free_controller(struct pci_controller *phb);
#ifdef CONFIG_PCI #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 #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 #endif
......
...@@ -138,11 +138,11 @@ static inline unsigned char bridge_swizzle(unsigned char pin, ...@@ -138,11 +138,11 @@ static inline unsigned char bridge_swizzle(unsigned char pin,
extern int pciauto_bus_scan(struct pci_controller *, int); extern int pciauto_bus_scan(struct pci_controller *, int);
#ifdef CONFIG_PCI #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 #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 #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment