2011-11-24 22:45:20 +04:00
/*
* 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
/**
2013-05-29 06:22:21 +04:00
* pci_iomap_range - create a virtual mapping cookie for a PCI BAR
2011-11-24 22:45:20 +04:00
* @ dev : PCI device that owns the BAR
* @ bar : BAR number
2013-05-29 06:22:21 +04:00
* @ offset : map memory at the given offset in BAR
* @ maxlen : max length of the memory to map
2011-11-24 22:45:20 +04:00
*
* 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
2013-05-29 06:22:21 +04:00
* the complete BAR from offset to the end , pass % 0 here .
2011-11-24 22:45:20 +04:00
* */
2013-05-29 06:22:21 +04:00
void __iomem * pci_iomap_range ( struct pci_dev * dev ,
int bar ,
unsigned long offset ,
unsigned long maxlen )
2011-11-24 22:45:20 +04:00
{
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 ) ;
2013-05-29 06:22:21 +04:00
if ( len < = offset | | ! start )
2011-11-24 22:45:20 +04:00
return NULL ;
2013-05-29 06:22:21 +04:00
len - = offset ;
start + = offset ;
2011-11-24 22:45:20 +04:00
if ( maxlen & & len > maxlen )
len = maxlen ;
if ( flags & IORESOURCE_IO )
2012-01-30 02:20:48 +04:00
return __pci_ioport_map ( dev , start , len ) ;
2011-11-24 22:45:20 +04:00
if ( flags & IORESOURCE_MEM ) {
if ( flags & IORESOURCE_CACHEABLE )
return ioremap ( start , len ) ;
return ioremap_nocache ( start , len ) ;
}
/* What? */
return NULL ;
}
2013-05-29 06:22:21 +04:00
EXPORT_SYMBOL ( pci_iomap_range ) ;
2011-11-24 22:45:20 +04:00
2013-05-29 06:22:21 +04:00
/**
* 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 ) ;
}
2011-11-24 22:45:20 +04:00
EXPORT_SYMBOL ( pci_iomap ) ;
# endif /* CONFIG_PCI */