1/* 2 * Implement the default iomap interfaces 3 * 4 * (C) Copyright 2004 Linus Torvalds 5 */ 6#include <linux/pci.h> 7#include <linux/io.h> 8 9#include <linux/export.h> 10 11#ifdef CONFIG_PCI 12/** 13 * pci_iomap_range - create a virtual mapping cookie for a PCI BAR 14 * @dev: PCI device that owns the BAR 15 * @bar: BAR number 16 * @offset: map memory at the given offset in BAR 17 * @maxlen: max length of the memory to map 18 * 19 * Using this function you will get a __iomem address to your device BAR. 20 * You can access it using ioread*() and iowrite*(). These functions hide 21 * the details if this is a MMIO or PIO address space and will just do what 22 * you expect from them in the correct way. 23 * 24 * @maxlen specifies the maximum length to map. If you want to get access to 25 * the complete BAR from offset to the end, pass %0 here. 26 * */ 27void __iomem *pci_iomap_range(struct pci_dev *dev, 28 int bar, 29 unsigned long offset, 30 unsigned long maxlen) 31{ 32 resource_size_t start = pci_resource_start(dev, bar); 33 resource_size_t len = pci_resource_len(dev, bar); 34 unsigned long flags = pci_resource_flags(dev, bar); 35 36 if (len <= offset || !start) 37 return NULL; 38 len -= offset; 39 start += offset; 40 if (maxlen && len > maxlen) 41 len = maxlen; 42 if (flags & IORESOURCE_IO) 43 return __pci_ioport_map(dev, start, len); 44 if (flags & IORESOURCE_MEM) 45 return ioremap(start, len); 46 /* What? */ 47 return NULL; 48} 49EXPORT_SYMBOL(pci_iomap_range); 50 51/** 52 * pci_iomap_wc_range - create a virtual WC mapping cookie for a PCI BAR 53 * @dev: PCI device that owns the BAR 54 * @bar: BAR number 55 * @offset: map memory at the given offset in BAR 56 * @maxlen: max length of the memory to map 57 * 58 * Using this function you will get a __iomem address to your device BAR. 59 * You can access it using ioread*() and iowrite*(). These functions hide 60 * the details if this is a MMIO or PIO address space and will just do what 61 * you expect from them in the correct way. When possible write combining 62 * is used. 63 * 64 * @maxlen specifies the maximum length to map. If you want to get access to 65 * the complete BAR from offset to the end, pass %0 here. 66 * */ 67void __iomem *pci_iomap_wc_range(struct pci_dev *dev, 68 int bar, 69 unsigned long offset, 70 unsigned long maxlen) 71{ 72 resource_size_t start = pci_resource_start(dev, bar); 73 resource_size_t len = pci_resource_len(dev, bar); 74 unsigned long flags = pci_resource_flags(dev, bar); 75 76 77 if (flags & IORESOURCE_IO) 78 return NULL; 79 80 if (len <= offset || !start) 81 return NULL; 82 83 len -= offset; 84 start += offset; 85 if (maxlen && len > maxlen) 86 len = maxlen; 87 88 if (flags & IORESOURCE_MEM) 89 return ioremap_wc(start, len); 90 91 /* What? */ 92 return NULL; 93} 94EXPORT_SYMBOL_GPL(pci_iomap_wc_range); 95 96/** 97 * pci_iomap - create a virtual mapping cookie for a PCI BAR 98 * @dev: PCI device that owns the BAR 99 * @bar: BAR number 100 * @maxlen: length of the memory to map 101 * 102 * Using this function you will get a __iomem address to your device BAR. 103 * You can access it using ioread*() and iowrite*(). These functions hide 104 * the details if this is a MMIO or PIO address space and will just do what 105 * you expect from them in the correct way. 106 * 107 * @maxlen specifies the maximum length to map. If you want to get access to 108 * the complete BAR without checking for its length first, pass %0 here. 109 * */ 110void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) 111{ 112 return pci_iomap_range(dev, bar, 0, maxlen); 113} 114EXPORT_SYMBOL(pci_iomap); 115 116/** 117 * pci_iomap_wc - create a virtual WC mapping cookie for a PCI BAR 118 * @dev: PCI device that owns the BAR 119 * @bar: BAR number 120 * @maxlen: length of the memory to map 121 * 122 * Using this function you will get a __iomem address to your device BAR. 123 * You can access it using ioread*() and iowrite*(). These functions hide 124 * the details if this is a MMIO or PIO address space and will just do what 125 * you expect from them in the correct way. When possible write combining 126 * is used. 127 * 128 * @maxlen specifies the maximum length to map. If you want to get access to 129 * the complete BAR without checking for its length first, pass %0 here. 130 * */ 131void __iomem *pci_iomap_wc(struct pci_dev *dev, int bar, unsigned long maxlen) 132{ 133 return pci_iomap_wc_range(dev, bar, 0, maxlen); 134} 135EXPORT_SYMBOL_GPL(pci_iomap_wc); 136#endif /* CONFIG_PCI */ 137