pci_iomap.c 2.2 KB
Newer Older
M
Michael S. Tsirkin 已提交
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * 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
/**
M
Michael S. Tsirkin 已提交
13
 * pci_iomap_range - create a virtual mapping cookie for a PCI BAR
M
Michael S. Tsirkin 已提交
14 15
 * @dev: PCI device that owns the BAR
 * @bar: BAR number
M
Michael S. Tsirkin 已提交
16 17
 * @offset: map memory at the given offset in BAR
 * @maxlen: max length of the memory to map
M
Michael S. Tsirkin 已提交
18 19 20 21 22 23 24
 *
 * 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
M
Michael S. Tsirkin 已提交
25
 * the complete BAR from offset to the end, pass %0 here.
M
Michael S. Tsirkin 已提交
26
 * */
M
Michael S. Tsirkin 已提交
27 28 29 30
void __iomem *pci_iomap_range(struct pci_dev *dev,
			      int bar,
			      unsigned long offset,
			      unsigned long maxlen)
M
Michael S. Tsirkin 已提交
31 32 33 34 35
{
	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);

M
Michael S. Tsirkin 已提交
36
	if (len <= offset || !start)
M
Michael S. Tsirkin 已提交
37
		return NULL;
M
Michael S. Tsirkin 已提交
38 39
	len -= offset;
	start += offset;
M
Michael S. Tsirkin 已提交
40 41 42
	if (maxlen && len > maxlen)
		len = maxlen;
	if (flags & IORESOURCE_IO)
43
		return __pci_ioport_map(dev, start, len);
M
Michael S. Tsirkin 已提交
44 45 46 47 48 49 50 51
	if (flags & IORESOURCE_MEM) {
		if (flags & IORESOURCE_CACHEABLE)
			return ioremap(start, len);
		return ioremap_nocache(start, len);
	}
	/* What? */
	return NULL;
}
M
Michael S. Tsirkin 已提交
52
EXPORT_SYMBOL(pci_iomap_range);
M
Michael S. Tsirkin 已提交
53

M
Michael S. Tsirkin 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
/**
 * 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)
{
	return pci_iomap_range(dev, bar, 0, maxlen);
}
M
Michael S. Tsirkin 已提交
72 73
EXPORT_SYMBOL(pci_iomap);
#endif /* CONFIG_PCI */