diff options
Diffstat (limited to 'lib/pci_iomap.c')
| -rw-r--r-- | lib/pci_iomap.c | 48 | 
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/pci_iomap.c b/lib/pci_iomap.c new file mode 100644 index 00000000000..0d83ea8a960 --- /dev/null +++ b/lib/pci_iomap.c @@ -0,0 +1,48 @@ +/* + * Implement the default iomap interfaces + * + * (C) Copyright 2004 Linus Torvalds + */ +#include <linux/pci.h> +#include <linux/io.h> + +#include <linux/export.h> + +#ifdef CONFIG_PCI +/** + * pci_iomap - create a virtual mapping cookie for a PCI BAR + * @dev: PCI device that owns the BAR + * @bar: BAR number + * @maxlen: length of the memory to map + * + * Using this function you will get a __iomem address to your device BAR. + * You can access it using ioread*() and iowrite*(). These functions hide + * the details if this is a MMIO or PIO address space and will just do what + * you expect from them in the correct way. + * + * @maxlen specifies the maximum length to map. If you want to get access to + * the complete BAR without checking for its length first, pass %0 here. + * */ +void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) +{ +	resource_size_t start = pci_resource_start(dev, bar); +	resource_size_t len = pci_resource_len(dev, bar); +	unsigned long flags = pci_resource_flags(dev, bar); + +	if (!len || !start) +		return NULL; +	if (maxlen && len > maxlen) +		len = maxlen; +	if (flags & IORESOURCE_IO) +		return __pci_ioport_map(dev, start, len); +	if (flags & IORESOURCE_MEM) { +		if (flags & IORESOURCE_CACHEABLE) +			return ioremap(start, len); +		return ioremap_nocache(start, len); +	} +	/* What? */ +	return NULL; +} + +EXPORT_SYMBOL(pci_iomap); +#endif /* CONFIG_PCI */  | 
