lib: add GENERIC_PCI_IOMAP
Many architectures want a generic pci_iomap but not the rest of iomap.c. Split that to a separate .c file and add a new config symbol. select automatically by GENERIC_IOMAP. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								4673ca8eb3
							
						
					
				
			
			
				commit
				
					
						66eab4df28
					
				
			
		
					 7 changed files with 85 additions and 44 deletions
				
			
		| 
						 | 
				
			
			@ -19,6 +19,8 @@
 | 
			
		|||
#include <asm-generic/iomap.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <asm-generic/pci_iomap.h>
 | 
			
		||||
 | 
			
		||||
#ifndef mmiowb
 | 
			
		||||
#define mmiowb() do {} while (0)
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -283,9 +285,7 @@ static inline void writesb(const void __iomem *addr, const void *buf, int len)
 | 
			
		|||
#define __io_virt(x) ((void __force *) (x))
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_GENERIC_IOMAP
 | 
			
		||||
/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
 | 
			
		||||
struct pci_dev;
 | 
			
		||||
extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
 | 
			
		||||
static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,18 +67,15 @@ extern void ioport_unmap(void __iomem *);
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PCI
 | 
			
		||||
/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
 | 
			
		||||
/* Destroy a virtual mapping cookie for a PCI BAR (memory or IO) */
 | 
			
		||||
struct pci_dev;
 | 
			
		||||
extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
 | 
			
		||||
extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
 | 
			
		||||
#else
 | 
			
		||||
struct pci_dev;
 | 
			
		||||
static inline void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
 | 
			
		||||
{
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
static inline void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
 | 
			
		||||
{ }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <asm-generic/pci_iomap.h>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								include/asm-generic/pci_iomap.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								include/asm-generic/pci_iomap.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
/* Generic I/O port emulation, based on MN10300 code
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
 | 
			
		||||
 * Written by David Howells (dhowells@redhat.com)
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public Licence
 | 
			
		||||
 * as published by the Free Software Foundation; either version
 | 
			
		||||
 * 2 of the Licence, or (at your option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __ASM_GENERIC_PCI_IOMAP_H
 | 
			
		||||
#define __ASM_GENERIC_PCI_IOMAP_H
 | 
			
		||||
 | 
			
		||||
struct pci_dev;
 | 
			
		||||
#ifdef CONFIG_PCI
 | 
			
		||||
/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
 | 
			
		||||
extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
 | 
			
		||||
#else
 | 
			
		||||
static inline void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
 | 
			
		||||
{
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __ASM_GENERIC_IO_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -19,8 +19,12 @@ config RATIONAL
 | 
			
		|||
config GENERIC_FIND_FIRST_BIT
 | 
			
		||||
	bool
 | 
			
		||||
 | 
			
		||||
config GENERIC_PCI_IOMAP
 | 
			
		||||
	bool
 | 
			
		||||
 | 
			
		||||
config GENERIC_IOMAP
 | 
			
		||||
	bool
 | 
			
		||||
	select GENERIC_PCI_IOMAP
 | 
			
		||||
 | 
			
		||||
config CRC_CCITT
 | 
			
		||||
	tristate "CRC-CCITT functions"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ endif
 | 
			
		|||
 | 
			
		||||
lib-$(CONFIG_HOTPLUG) += kobject_uevent.o
 | 
			
		||||
obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
 | 
			
		||||
obj-$(CONFIG_GENERIC_PCI_IOMAP) += pci_iomap.o
 | 
			
		||||
obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o
 | 
			
		||||
obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o
 | 
			
		||||
obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								lib/iomap.c
									
										
									
									
									
								
							
							
						
						
									
										38
									
								
								lib/iomap.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -242,45 +242,11 @@ EXPORT_SYMBOL(ioport_unmap);
 | 
			
		|||
#endif /* CONFIG_HAS_IOPORT */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PCI
 | 
			
		||||
/**
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	if (!len || !start)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	if (maxlen && len > maxlen)
 | 
			
		||||
		len = maxlen;
 | 
			
		||||
	if (flags & IORESOURCE_IO)
 | 
			
		||||
		return ioport_map(start, len);
 | 
			
		||||
	if (flags & IORESOURCE_MEM) {
 | 
			
		||||
		if (flags & IORESOURCE_CACHEABLE)
 | 
			
		||||
			return ioremap(start, len);
 | 
			
		||||
		return ioremap_nocache(start, len);
 | 
			
		||||
	}
 | 
			
		||||
	/* What? */
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Hide the details if this is a MMIO or PIO address space and just do what
 | 
			
		||||
 * you expect in the correct way. */
 | 
			
		||||
void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
 | 
			
		||||
{
 | 
			
		||||
	IO_COND(addr, /* nothing */, iounmap(addr));
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(pci_iomap);
 | 
			
		||||
EXPORT_SYMBOL(pci_iounmap);
 | 
			
		||||
#endif /* CONFIG_PCI */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										48
									
								
								lib/pci_iomap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								lib/pci_iomap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
/**
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	if (!len || !start)
 | 
			
		||||
		return NULL;
 | 
			
		||||
	if (maxlen && len > maxlen)
 | 
			
		||||
		len = maxlen;
 | 
			
		||||
	if (flags & IORESOURCE_IO)
 | 
			
		||||
		return ioport_map(start, len);
 | 
			
		||||
	if (flags & IORESOURCE_MEM) {
 | 
			
		||||
		if (flags & IORESOURCE_CACHEABLE)
 | 
			
		||||
			return ioremap(start, len);
 | 
			
		||||
		return ioremap_nocache(start, len);
 | 
			
		||||
	}
 | 
			
		||||
	/* What? */
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORT_SYMBOL(pci_iomap);
 | 
			
		||||
#endif /* CONFIG_PCI */
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue