Re: [PATCH-RFC 02/10] lib: add GENERIC_PCI_IOMAP
From: Stephen Rothwell <hidden>
Date: 2011-11-25 00:55:34
Also in:
linux-alpha, linux-arch, linux-m68k, linux-mips
Hi Michael, On Thu, 24 Nov 2011 22:17:02 +0200 "Michael S. Tsirkin" [off-list ref] wrote:
quoted hunk ↗ jump to hunk
diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 9120887..c8a67345 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h@@ -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,6 @@ 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) { }
Just wondering why you move pci_iomap but not pic_iounmap. And also if pci_iounmap is meant to stay here, then the "struct pci_dev" should probably stay as well.
quoted hunk ↗ jump to hunk
diff --git a/include/asm-generic/iomap.h b/include/asm-generic/iomap.h index 98dcd76..fdcddcb 100644 --- a/include/asm-generic/iomap.h +++ b/include/asm-generic/iomap.h@@ -69,16 +69,13 @@ extern void ioport_unmap(void __iomem *); #ifdef CONFIG_PCI /* 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); extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
Ditto with pci_iounmap. Also the comment above really belongs with pci_iomap.
quoted hunk ↗ jump to hunk
diff --git a/include/asm-generic/pci_iomap.h b/include/asm-generic/pci_iomap.h new file mode 100644 index 0000000..e08b3bd --- /dev/null +++ b/include/asm-generic/pci_iomap.h@@ -0,0 +1,26 @@ +/* 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 + +#ifdef CONFIG_PCI +/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ +struct pci_dev;
You could move this struct declaration above the ifdef and remove the duplicate below.
quoted hunk ↗ jump to hunk
+extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max); +#else +struct pci_dev; +static inline void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) +{ + return NULL; +} +#endif + +#endif /* __ASM_GENERIC_IO_H */diff --git a/lib/iomap.c b/lib/iomap.c index 5dbcb4b..ada922a 100644 --- a/lib/iomap.c +++ b/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);
Ditto with pci_iounmap
quoted hunk ↗ jump to hunk
diff --git a/lib/pci_iomap.c b/lib/pci_iomap.c new file mode 100644 index 0000000..40b26cb --- /dev/null +++ b/lib/pci_iomap.c@@ -0,0 +1,48 @@ +/* + * Implement the default iomap interfaces + * + * (C) Copyright 2004 Linus Torvalds + */ +#include <linux/pci.h> +#include <linux/io.h> + +#include <linux/module.h>
If this is relative to (at least) v3.2-rc1, then you should use export.h instead of module.h -- Cheers, Stephen Rothwell sfr@canb.auug.org.au http://www.canb.auug.org.au/~sfr/
Attachments
- (unnamed) [application/pgp-signature] 836 bytes