Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/lib/pci_iomap.c

  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  * */
 27 void __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 }
 49 EXPORT_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  * */
 67 void __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 }
 94 EXPORT_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  * */
110 void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
111 {
112         return pci_iomap_range(dev, bar, 0, maxlen);
113 }
114 EXPORT_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  * */
131 void __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 }
135 EXPORT_SYMBOL_GPL(pci_iomap_wc);
136 #endif /* CONFIG_PCI */
137 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us