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>
 | 
					#include <asm-generic/iomap.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm-generic/pci_iomap.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef mmiowb
 | 
					#ifndef mmiowb
 | 
				
			||||||
#define mmiowb() do {} while (0)
 | 
					#define mmiowb() do {} while (0)
 | 
				
			||||||
#endif
 | 
					#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))
 | 
					#define __io_virt(x) ((void __force *) (x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_GENERIC_IOMAP
 | 
					#ifndef CONFIG_GENERIC_IOMAP
 | 
				
			||||||
/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
 | 
					 | 
				
			||||||
struct pci_dev;
 | 
					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)
 | 
					static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,18 +67,15 @@ extern void ioport_unmap(void __iomem *);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PCI
 | 
					#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;
 | 
					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 *);
 | 
					extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
struct pci_dev;
 | 
					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)
 | 
					static inline void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
 | 
				
			||||||
{ }
 | 
					{ }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm-generic/pci_iomap.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#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
 | 
					config GENERIC_FIND_FIRST_BIT
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config GENERIC_PCI_IOMAP
 | 
				
			||||||
 | 
						bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config GENERIC_IOMAP
 | 
					config GENERIC_IOMAP
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
 | 
						select GENERIC_PCI_IOMAP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config CRC_CCITT
 | 
					config CRC_CCITT
 | 
				
			||||||
	tristate "CRC-CCITT functions"
 | 
						tristate "CRC-CCITT functions"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,7 @@ endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lib-$(CONFIG_HOTPLUG) += kobject_uevent.o
 | 
					lib-$(CONFIG_HOTPLUG) += kobject_uevent.o
 | 
				
			||||||
obj-$(CONFIG_GENERIC_IOMAP) += iomap.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_HAS_IOMEM) += iomap_copy.o devres.o
 | 
				
			||||||
obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o
 | 
					obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o
 | 
				
			||||||
obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.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 */
 | 
					#endif /* CONFIG_HAS_IOPORT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PCI
 | 
					#ifdef CONFIG_PCI
 | 
				
			||||||
/**
 | 
					/* Hide the details if this is a MMIO or PIO address space and just do what
 | 
				
			||||||
 * pci_iomap - create a virtual mapping cookie for a PCI BAR
 | 
					 * you expect in the correct way. */
 | 
				
			||||||
 * @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;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
 | 
					void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	IO_COND(addr, /* nothing */, iounmap(addr));
 | 
						IO_COND(addr, /* nothing */, iounmap(addr));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(pci_iomap);
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(pci_iounmap);
 | 
					EXPORT_SYMBOL(pci_iounmap);
 | 
				
			||||||
#endif /* CONFIG_PCI */
 | 
					#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