diff options
-rw-r--r-- | arch/powerpc/kernel/pci-common.c | 23 | ||||
-rw-r--r-- | include/asm-powerpc/pci-bridge.h | 20 |
2 files changed, 43 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index fe7d1255e11e..74a8fd450f67 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -101,6 +101,29 @@ void pcibios_free_controller(struct pci_controller *phb) | |||
101 | kfree(phb); | 101 | kfree(phb); |
102 | } | 102 | } |
103 | 103 | ||
104 | int pcibios_vaddr_is_ioport(void __iomem *address) | ||
105 | { | ||
106 | int ret = 0; | ||
107 | struct pci_controller *hose; | ||
108 | unsigned long size; | ||
109 | |||
110 | spin_lock(&hose_spinlock); | ||
111 | list_for_each_entry(hose, &hose_list, list_node) { | ||
112 | #ifdef CONFIG_PPC64 | ||
113 | size = hose->pci_io_size; | ||
114 | #else | ||
115 | size = hose->io_resource.end - hose->io_resource.start + 1; | ||
116 | #endif | ||
117 | if (address >= hose->io_base_virt && | ||
118 | address < (hose->io_base_virt + size)) { | ||
119 | ret = 1; | ||
120 | break; | ||
121 | } | ||
122 | } | ||
123 | spin_unlock(&hose_spinlock); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
104 | /* | 127 | /* |
105 | * Return the domain number for this bus. | 128 | * Return the domain number for this bus. |
106 | */ | 129 | */ |
diff --git a/include/asm-powerpc/pci-bridge.h b/include/asm-powerpc/pci-bridge.h index d53e0eb1de16..e909769b6410 100644 --- a/include/asm-powerpc/pci-bridge.h +++ b/include/asm-powerpc/pci-bridge.h | |||
@@ -71,6 +71,14 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus) | |||
71 | return bus->sysdata; | 71 | return bus->sysdata; |
72 | } | 72 | } |
73 | 73 | ||
74 | static inline int isa_vaddr_is_ioport(void __iomem *address) | ||
75 | { | ||
76 | /* No specific ISA handling on ppc32 at this stage, it | ||
77 | * all goes through PCI | ||
78 | */ | ||
79 | return 0; | ||
80 | } | ||
81 | |||
74 | /* These are used for config access before all the PCI probing | 82 | /* These are used for config access before all the PCI probing |
75 | has been done. */ | 83 | has been done. */ |
76 | int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn, | 84 | int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn, |
@@ -241,6 +249,13 @@ extern void pcibios_free_controller(struct pci_controller *phb); | |||
241 | 249 | ||
242 | extern void isa_bridge_find_early(struct pci_controller *hose); | 250 | extern void isa_bridge_find_early(struct pci_controller *hose); |
243 | 251 | ||
252 | static inline int isa_vaddr_is_ioport(void __iomem *address) | ||
253 | { | ||
254 | /* Check if address hits the reserved legacy IO range */ | ||
255 | unsigned long ea = (unsigned long)address; | ||
256 | return ea >= ISA_IO_BASE && ea < ISA_IO_END; | ||
257 | } | ||
258 | |||
244 | extern int pcibios_unmap_io_space(struct pci_bus *bus); | 259 | extern int pcibios_unmap_io_space(struct pci_bus *bus); |
245 | extern int pcibios_map_io_space(struct pci_bus *bus); | 260 | extern int pcibios_map_io_space(struct pci_bus *bus); |
246 | 261 | ||
@@ -271,11 +286,16 @@ extern struct pci_controller * | |||
271 | pcibios_alloc_controller(struct device_node *dev); | 286 | pcibios_alloc_controller(struct device_node *dev); |
272 | #ifdef CONFIG_PCI | 287 | #ifdef CONFIG_PCI |
273 | extern unsigned long pci_address_to_pio(phys_addr_t address); | 288 | extern unsigned long pci_address_to_pio(phys_addr_t address); |
289 | extern int pcibios_vaddr_is_ioport(void __iomem *address); | ||
274 | #else | 290 | #else |
275 | static inline unsigned long pci_address_to_pio(phys_addr_t address) | 291 | static inline unsigned long pci_address_to_pio(phys_addr_t address) |
276 | { | 292 | { |
277 | return (unsigned long)-1; | 293 | return (unsigned long)-1; |
278 | } | 294 | } |
295 | static inline int pcibios_vaddr_is_ioport(void __iomem *address) | ||
296 | { | ||
297 | return 0; | ||
298 | } | ||
279 | #endif | 299 | #endif |
280 | 300 | ||
281 | 301 | ||