mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
[POWERPC] Add function to check if address is an IO port
This adds a function that tells you if a given kernel virtual address is hitting a PCI or ISA IO port permanent mapping or not. This is to be used in the next patch to fix iomap APIs to properly unmap things. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
f5d834fc34
commit
6dfbde2091
2 changed files with 43 additions and 0 deletions
|
@ -101,6 +101,29 @@ void pcibios_free_controller(struct pci_controller *phb)
|
||||||
kfree(phb);
|
kfree(phb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pcibios_vaddr_is_ioport(void __iomem *address)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
struct pci_controller *hose;
|
||||||
|
unsigned long size;
|
||||||
|
|
||||||
|
spin_lock(&hose_spinlock);
|
||||||
|
list_for_each_entry(hose, &hose_list, list_node) {
|
||||||
|
#ifdef CONFIG_PPC64
|
||||||
|
size = hose->pci_io_size;
|
||||||
|
#else
|
||||||
|
size = hose->io_resource.end - hose->io_resource.start + 1;
|
||||||
|
#endif
|
||||||
|
if (address >= hose->io_base_virt &&
|
||||||
|
address < (hose->io_base_virt + size)) {
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spin_unlock(&hose_spinlock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the domain number for this bus.
|
* Return the domain number for this bus.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -71,6 +71,14 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
|
||||||
return bus->sysdata;
|
return bus->sysdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int isa_vaddr_is_ioport(void __iomem *address)
|
||||||
|
{
|
||||||
|
/* No specific ISA handling on ppc32 at this stage, it
|
||||||
|
* all goes through PCI
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* These are used for config access before all the PCI probing
|
/* These are used for config access before all the PCI probing
|
||||||
has been done. */
|
has been done. */
|
||||||
int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn,
|
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);
|
||||||
|
|
||||||
extern void isa_bridge_find_early(struct pci_controller *hose);
|
extern void isa_bridge_find_early(struct pci_controller *hose);
|
||||||
|
|
||||||
|
static inline int isa_vaddr_is_ioport(void __iomem *address)
|
||||||
|
{
|
||||||
|
/* Check if address hits the reserved legacy IO range */
|
||||||
|
unsigned long ea = (unsigned long)address;
|
||||||
|
return ea >= ISA_IO_BASE && ea < ISA_IO_END;
|
||||||
|
}
|
||||||
|
|
||||||
extern int pcibios_unmap_io_space(struct pci_bus *bus);
|
extern int pcibios_unmap_io_space(struct pci_bus *bus);
|
||||||
extern int pcibios_map_io_space(struct pci_bus *bus);
|
extern int pcibios_map_io_space(struct pci_bus *bus);
|
||||||
|
|
||||||
|
@ -271,11 +286,16 @@ extern struct pci_controller *
|
||||||
pcibios_alloc_controller(struct device_node *dev);
|
pcibios_alloc_controller(struct device_node *dev);
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
extern unsigned long pci_address_to_pio(phys_addr_t address);
|
extern unsigned long pci_address_to_pio(phys_addr_t address);
|
||||||
|
extern int pcibios_vaddr_is_ioport(void __iomem *address);
|
||||||
#else
|
#else
|
||||||
static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
||||||
{
|
{
|
||||||
return (unsigned long)-1;
|
return (unsigned long)-1;
|
||||||
}
|
}
|
||||||
|
static inline int pcibios_vaddr_is_ioport(void __iomem *address)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue