diff options
Diffstat (limited to 'lib/pci_iomap.c')
-rw-r--r-- | lib/pci_iomap.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/lib/pci_iomap.c b/lib/pci_iomap.c index 0d83ea8a9605..bcce5f149310 100644 --- a/lib/pci_iomap.c +++ b/lib/pci_iomap.c | |||
@@ -10,10 +10,11 @@ | |||
10 | 10 | ||
11 | #ifdef CONFIG_PCI | 11 | #ifdef CONFIG_PCI |
12 | /** | 12 | /** |
13 | * pci_iomap - create a virtual mapping cookie for a PCI BAR | 13 | * pci_iomap_range - create a virtual mapping cookie for a PCI BAR |
14 | * @dev: PCI device that owns the BAR | 14 | * @dev: PCI device that owns the BAR |
15 | * @bar: BAR number | 15 | * @bar: BAR number |
16 | * @maxlen: length of the memory to map | 16 | * @offset: map memory at the given offset in BAR |
17 | * @maxlen: max length of the memory to map | ||
17 | * | 18 | * |
18 | * Using this function you will get a __iomem address to your device BAR. | 19 | * Using this function you will get a __iomem address to your device BAR. |
19 | * You can access it using ioread*() and iowrite*(). These functions hide | 20 | * You can access it using ioread*() and iowrite*(). These functions hide |
@@ -21,16 +22,21 @@ | |||
21 | * you expect from them in the correct way. | 22 | * you expect from them in the correct way. |
22 | * | 23 | * |
23 | * @maxlen specifies the maximum length to map. If you want to get access to | 24 | * @maxlen specifies the maximum length to map. If you want to get access to |
24 | * the complete BAR without checking for its length first, pass %0 here. | 25 | * the complete BAR from offset to the end, pass %0 here. |
25 | * */ | 26 | * */ |
26 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | 27 | void __iomem *pci_iomap_range(struct pci_dev *dev, |
28 | int bar, | ||
29 | unsigned long offset, | ||
30 | unsigned long maxlen) | ||
27 | { | 31 | { |
28 | resource_size_t start = pci_resource_start(dev, bar); | 32 | resource_size_t start = pci_resource_start(dev, bar); |
29 | resource_size_t len = pci_resource_len(dev, bar); | 33 | resource_size_t len = pci_resource_len(dev, bar); |
30 | unsigned long flags = pci_resource_flags(dev, bar); | 34 | unsigned long flags = pci_resource_flags(dev, bar); |
31 | 35 | ||
32 | if (!len || !start) | 36 | if (len <= offset || !start) |
33 | return NULL; | 37 | return NULL; |
38 | len -= offset; | ||
39 | start += offset; | ||
34 | if (maxlen && len > maxlen) | 40 | if (maxlen && len > maxlen) |
35 | len = maxlen; | 41 | len = maxlen; |
36 | if (flags & IORESOURCE_IO) | 42 | if (flags & IORESOURCE_IO) |
@@ -43,6 +49,25 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | |||
43 | /* What? */ | 49 | /* What? */ |
44 | return NULL; | 50 | return NULL; |
45 | } | 51 | } |
52 | EXPORT_SYMBOL(pci_iomap_range); | ||
46 | 53 | ||
54 | /** | ||
55 | * pci_iomap - create a virtual mapping cookie for a PCI BAR | ||
56 | * @dev: PCI device that owns the BAR | ||
57 | * @bar: BAR number | ||
58 | * @maxlen: length of the memory to map | ||
59 | * | ||
60 | * Using this function you will get a __iomem address to your device BAR. | ||
61 | * You can access it using ioread*() and iowrite*(). These functions hide | ||
62 | * the details if this is a MMIO or PIO address space and will just do what | ||
63 | * you expect from them in the correct way. | ||
64 | * | ||
65 | * @maxlen specifies the maximum length to map. If you want to get access to | ||
66 | * the complete BAR without checking for its length first, pass %0 here. | ||
67 | * */ | ||
68 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
69 | { | ||
70 | return pci_iomap_range(dev, bar, 0, maxlen); | ||
71 | } | ||
47 | EXPORT_SYMBOL(pci_iomap); | 72 | EXPORT_SYMBOL(pci_iomap); |
48 | #endif /* CONFIG_PCI */ | 73 | #endif /* CONFIG_PCI */ |