PCI resource mmap cleanup
Subsystems (13)
v2 cover PCI resource mmap cleanup
This pursues my previous patch set all the way to its logical conclusion.
It kills off the legacy arch-provided pci_mmap_page_range() completely, along with its vile 'address converted by pci_resource_to_user()' API and the various bugs and other strange behaviour that various architectures had.
In some cases like IA64 I've killed off the odd behaviour *first* in separately reviewable patches, before the final switch over to the generic code which should then basically have no functional effect.
To accommodate the ARM64 maintainers' desire *not* to support mmap through /proc/bus/pci I have separated HAVE_PCI_MMAP from the sysfs implementation, which (as of the last patch in the series) ends up present on *all* platforms with an MMU. I still don't think that's a *good* idea though; it's a generic part of /proc, and nobody ever did answer my question about what *else* we can delete from /proc on ARM64 "because it's a new platform"...
I would very much like the interesting parts of this to go through the arch maintainers' trees. I'd suggest that we can pull everything up to and including patch 19 ("pci: Add I/O BAR support to generic pci_mmap_resource_range()") through the PCI tree, which includes the relatively trivial architectures. Then the others can go through the appropriate arch tree with more careful review and testing.
Once everything's done, then we can apply something like the final patch ("pci: Kill ARCH_GENERIC_PCI_MMAP_RESOURCE"). But that's mostly just there for now as a demonstration of the intended end point.
This is in
git://git.infradead.org/users/dwmw2/random-2.6.git pcimmap
http://git.infradead.org/users/dwmw2/random-2.6.git/shortlog/refs/heads/pcimmap
David Woodhouse (27):
pci: Fix pci_mmap_fits() for HAVE_PCI_RESOURCE_TO_USER platforms
pci: Fix another sanity check bug in /proc/pci mmap
pci: Only allow WC mmap on prefetchable resources
xtensa: Do not mmap PCI BARs to userspace as write-through
pci: Add arch_can_pci_mmap_wc() macro
pci: Move multiple declarations of pci_mmap_page_range() to
<linux/pci.h>
pci: Add arch_can_pci_mmap_io() on architectures which can mmap() I/O
space
pci: Use BAR index in sysfs attr->private instead of resource pointer
pci: Add BAR index argument to pci_mmap_page_range()
pci: Add pci_mmap_resource_range() and use it for ARM64
arm: Use generic pci_mmap_resource_range()
cris: Use generic pci_mmap_resource_range()
mips: Use generic pci_mmap_resource_range()
mn10300: Use generic pci_mmap_resource_range()
parisc: Use generic pci_mmap_resource_range()
sh: Use generic pci_mmap_resource_range()
unicore: Use generic pci_mmap_resource_range()
x86: Use generic pci_mmap_resource_range()
pci: Add I/O BAR support to generic pci_mmap_resource_range()
powerpc: Use generic pci_mmap_resource_range()
microblaze: Use generic pci_mmap_resource_range()
xtensa: Use generic pci_mmap_resource_range()
ia64: Remove redundant valid_mmap_phys_addr_range() from
pci_mmap_page_range()
ia64: Remove redundant checks for WC in pci_mmap_page_range()
ia64: Use generic pci_mmap_resource_range()
sparc: Use generic pci_mmap_resource_range()
pci: Kill ARCH_GENERIC_PCI_MMAP_RESOURCE
Documentation/filesystems/sysfs-pci.txt | 12 ++- arch/arm/include/asm/pci.h | 2 - arch/arm/kernel/bios32.c | 19 ---- arch/cris/arch-v32/drivers/pci/bios.c | 22 ----- arch/cris/include/asm/pci.h | 3 - arch/ia64/include/asm/pci.h | 4 +- arch/ia64/pci/pci.c | 46 ---------- arch/microblaze/include/asm/pci.h | 8 +- arch/microblaze/pci/pci-common.c | 99 ++------------------ arch/mips/include/asm/pci.h | 4 - arch/mips/pci/pci.c | 24 ----- arch/mn10300/include/asm/pci.h | 3 - arch/mn10300/unit-asb2305/pci-asb2305.c | 23 ----- arch/parisc/include/asm/pci.h | 3 - arch/parisc/kernel/pci.c | 28 ------ arch/powerpc/include/asm/pci.h | 9 +- arch/powerpc/kernel/pci-common.c | 105 +++------------------- arch/sh/drivers/pci/pci.c | 21 ----- arch/sh/include/asm/pci.h | 3 +- arch/sparc/include/asm/pci_64.h | 5 +- arch/sparc/kernel/pci.c | 155 -------------------------------- arch/unicore32/include/asm/pci.h | 2 - arch/unicore32/kernel/pci.c | 23 ----- arch/x86/include/asm/pci.h | 6 +- arch/x86/pci/i386.c | 47 ---------- arch/xtensa/include/asm/pci.h | 9 +- arch/xtensa/kernel/pci.c | 112 ++--------------------- drivers/pci/Makefile | 1 + drivers/pci/mmap.c | 67 ++++++++++++++ drivers/pci/pci-sysfs.c | 76 +++++++--------- drivers/pci/pci.h | 4 +- drivers/pci/proc.c | 41 ++++++--- include/linux/pci.h | 30 +++++++ 33 files changed, 211 insertions(+), 805 deletions(-) create mode 100644 drivers/pci/mmap.c
Signature · 1 line
2.9.3
PATCH v2 1/27 pci: Fix pci_mmap_fits() for HAVE_PCI_RESOURCE_TO_USER platforms
From: David Woodhouse <[email protected]>
In the PCI_MMAP_PROCFS case when the address being passed by the user is a 'user visible' resource address based on the bus window, and not the actual contents of the resource, that's what we need to be checking it against.
--- drivers/pci/pci-sysfs.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/pci/pci-sysfs.c +7 -3
@@ -985,15 +985,19 @@ void pci_remove_legacy_files(struct pci_bus *b)int pci_mmap_fits (struct pci_dev *pdev,int resno,struct vm_area_struct *vma,enum pci_mmap_api mmap_api) { -unsigned long nr, start, size, pci_start; +unsigned long nr, start, size; +resource_size_t pci_start =0 , pci_end;if (pci_resource_len (pdev, resno) ==0 )return 0 ; nr =vma_pages (vma); start = vma->vm_pgoff; size = ((pci_resource_len (pdev, resno) -1 ) >>PAGE_SHIFT ) +1 ; - pci_start = (mmap_api ==PCI_MMAP_PROCFS ) ? -pci_resource_start (pdev, resno) >>PAGE_SHIFT :0 ; +if (mmap_api ==PCI_MMAP_PROCFS ) { +pci_resource_to_user (pdev, resno, &pdev->resource[resno], + &pci_start, &pci_end); + pci_start >>=PAGE_SHIFT ; + }if (start >= pci_start && start < pci_start + size && start + nr <= pci_start + size)return 1 ;
Signature · 1 line
2.9.3
PATCH v2 2/27 pci: Fix another sanity check bug in /proc/pci mmap
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
Don't match MMIO maps with I/O BARs and vice versa.
--- drivers/pci/proc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/pci/proc.c +8 -2
@@ -231,14 +231,20 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) {struct pci_dev *dev =PDE_DATA (file_inode (file));struct pci_filp_private *fpriv = file->private_data; -int i, ret, write_combine; +int i, ret, write_combine, res_bit;if (!capable (CAP_SYS_RAWIO ))return -EPERM ; +if (fpriv->mmap_state == pci_mmap_io) + res_bit =IORESOURCE_IO ; +else + res_bit =IORESOURCE_MEM ; +/* Make sure the caller is mapping a real resource for this device */ for (i =0 ; i <PCI_ROM_RESOURCE ; i++) { -if (pci_mmap_fits (dev, i, vma,PCI_MMAP_PROCFS )) +if (dev->resource[i].flags & res_bit && +pci_mmap_fits (dev, i, vma,PCI_MMAP_PROCFS ))break ; }
Signature · 1 line
2.9.3
PATCH v2 3/27 pci: Only allow WC mmap on prefetchable resources
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
The /proc/bus/pci mmap interface allows the user to specify whether they want WC or not. Don't let them do so on non-prefetchable BARs.
--- drivers/pci/proc.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/pci/proc.c +8 -5
@@ -231,7 +231,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) {struct pci_dev *dev =PDE_DATA (file_inode (file));struct pci_filp_private *fpriv = file->private_data; -int i, ret, write_combine, res_bit; +int i, ret, write_combine =0 , res_bit;if (!capable (CAP_SYS_RAWIO ))return -EPERM ;
@@ -251,10 +251,13 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)if (i >=PCI_ROM_RESOURCE )return -ENODEV ; -if (fpriv->mmap_state == pci_mmap_mem) - write_combine = fpriv->write_combine; -else - write_combine =0 ; +if (fpriv->mmap_state == pci_mmap_mem && + fpriv->write_combine) { +if (dev->resource[i].flags &IORESOURCE_PREFETCH ) + write_combine =1 ; +else +return -EINVAL ; + } ret =pci_mmap_page_range (dev, vma, fpriv->mmap_state, write_combine);if (ret <0 )
Signature · 1 line
2.9.3
PATCH v2 4/27 xtensa: Do not mmap PCI BARs to userspace as write-through
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
These should be uncached, not write-through.
--- arch/xtensa/kernel/pci.c | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-)
arch/xtensa/kernel/pci.c +1 -20
@@ -334,25 +334,6 @@ __pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma, }/* -* Set vm_page_prot of VMA, as appropriate for this architecture, for a pci -* device mapping. -*/ -static __inline__void -__pci_mmap_set_pgprot (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -int prot =pgprot_val (vma->vm_page_prot); - -/* Set to write-through */ - prot = (prot & _PAGE_CA_MASK) | _PAGE_CA_WT; -#if 0 -if (!write_combine) - prot |= _PAGE_WRITETHRU; -#endif - vma->vm_page_prot =__pgprot (prot); -} - -/* * Perform the actual remap of the pages for a PCI device mapping, as * appropriate for this architecture. The region in the process to map * is described by vm_start and vm_end members of VMA, the base physical
@@ -372,7 +353,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,if (ret <0 )return ret; -__pci_mmap_set_pgprot (dev, vma, mmap_state, write_combine); + vma->vm_page_prot =pgprot_device (vma->vm_page_prot); ret =io_remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start,vma->vm_page_prot);
Signature · 1 line
2.9.3
PATCH v2 5/27 pci: Add arch_can_pci_mmap_wc() macro
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
Most of the almost-identical versions of pci_mmap_page_range() silently ignore the 'write_combine' argument and give uncached mappings.
Yet we allow the PCIIOC_WRITE_COMBINE ioctl in /proc/bus/pci, expose the 'resourceX_wc' file in sysfs, and allow an attempted mapping to apparently succeed.
To fix this, introduce a macro arch_can_pci_mmap_wc() which indicates whether the platform can do a write-combining mapping. On x86 this ends up being pat_enabled(), while the few other platforms that support it can just set it to a literal '1'.
--- Documentation/filesystems/sysfs-pci.txt | 4 ++++ arch/ia64/include/asm/pci.h | 2 ++ arch/powerpc/include/asm/pci.h | 5 +++-- arch/x86/include/asm/pci.h | 2 ++ drivers/pci/pci-sysfs.c | 4 ++-- drivers/pci/proc.c | 15 ++++++++------- include/linux/pci.h | 4 ++++ 7 files changed, 25 insertions(+), 11 deletions(-)
Documentation/filesystems/sysfs-pci.txt +4 -0
@@ -117,6 +117,10 @@ code must define HAVE_PCI_MMAP and provide a pci_mmap_page_range function. Platforms are free to only support subsets of the mmap functionality, but useful return codes should be provided. +Platforms which support write-combining maps of PCI resources must define +arch_can_pci_mmap_wc() which shall evaluate to non-zero at runtime when +write-combining is permitted. + Legacy resources are protected by the HAVE_PCI_LEGACY define. Platforms wishing to support legacy functionality should define it and provide pci_legacy_read, pci_legacy_write and pci_mmap_legacy_page_range functions.
arch/ia64/include/asm/pci.h +2 -0
@@ -51,6 +51,8 @@ extern unsigned long ia64_max_iommu_merge_mask;#define PCI_DMA_BUS_IS_PHYS (ia64_max_iommu_merge_mask == ~0UL)#define HAVE_PCI_MMAP +#define arch_can_pci_mmap_wc () 1 +extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine);#define HAVE_PCI_LEGACY
arch/powerpc/include/asm/pci.h +3 -2
@@ -81,8 +81,9 @@ struct vm_area_struct;int pci_mmap_page_range (struct pci_dev *pdev,struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine); -/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 +/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() and it does WC */ +#define HAVE_PCI_MMAP 1 +#define arch_can_pci_mmap_wc () 1extern int pci_legacy_read (struct pci_bus *bus,loff_t port,u32 *val,size_t count);
arch/x86/include/asm/pci.h +2 -0
@@ -7,6 +7,7 @@#include <linux/string.h> #include <linux/scatterlist.h> #include <asm/io.h> +#include <asm/pat.h> #include <asm/x86_init.h> #ifdef __KERNEL__
@@ -102,6 +103,7 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);#define HAVE_PCI_MMAP +#define arch_can_pci_mmap_wc () pat_enabled()extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine);
drivers/pci/pci-sysfs.c +2 -2
@@ -1211,9 +1211,9 @@ static int pci_create_resource_files(struct pci_dev *pdev) retval =pci_create_attr (pdev, i,0 );/* for prefetchable resources, create a WC mappable file */ -if (!retval && pdev->resource[i].flags &IORESOURCE_PREFETCH ) +if (!retval &&arch_can_pci_mmap_wc () && + pdev->resource[i].flags &IORESOURCE_PREFETCH ) retval =pci_create_attr (pdev, i,1 ); -if (retval) {pci_remove_resource_files (pdev);return retval;
drivers/pci/proc.c +8 -7
@@ -210,14 +210,15 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,break ;case PCIIOC_WRITE_COMBINE : -if (arg) - fpriv->write_combine =1 ; -else - fpriv->write_combine =0 ; -break ; - +if (arch_can_pci_mmap_wc ()) { +if (arg) + fpriv->write_combine =1 ; +else + fpriv->write_combine =0 ; +break ; + } +/* If arch decided it can't, fall through... */ #endif /* HAVE_PCI_MMAP */ -default : ret = -EINVAL ;break ;
include/linux/pci.h +4 -0
@@ -1626,6 +1626,10 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }#include <asm/pci.h> +#ifndef arch_can_pci_mmap_wc +#define arch_can_pci_mmap_wc () 0 +#endif +#ifndef pci_root_bus_fwnode#define pci_root_bus_fwnode (bus) NULL#endif
Signature · 1 line
2.9.3
PATCH v2 6/27 pci: Move multiple declarations of pci_mmap_page_range() to <linux/pci.h>
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
We can declare it <linux/pci.h> even on platforms where it isn't going to be defined. There's no need to have it littered through the various <asm/pci.h> files.
--- arch/arm/include/asm/pci.h | 2 -- arch/cris/include/asm/pci.h | 3 --- arch/ia64/include/asm/pci.h | 2 -- arch/microblaze/include/asm/pci.h | 3 --- arch/mips/include/asm/pci.h | 3 --- arch/mn10300/include/asm/pci.h | 3 --- arch/parisc/include/asm/pci.h | 3 --- arch/powerpc/include/asm/pci.h | 3 --- arch/sh/include/asm/pci.h | 3 +-- arch/sparc/include/asm/pci_64.h | 4 ---- arch/unicore32/include/asm/pci.h | 2 -- arch/x86/include/asm/pci.h | 4 ---- arch/xtensa/include/asm/pci.h | 4 ---- include/linux/pci.h | 7 +++++++ 14 files changed, 8 insertions(+), 38 deletions(-)
arch/arm/include/asm/pci.h +0 -2
@@ -29,8 +29,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine);static inline int pci_get_legacy_ide_irq (struct pci_dev *dev,int channel) {
arch/cris/include/asm/pci.h +0 -3
@@ -42,9 +42,6 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine); -#endif /* __KERNEL__ */
arch/ia64/include/asm/pci.h +0 -2
@@ -53,8 +53,6 @@ extern unsigned long ia64_max_iommu_merge_mask;#define HAVE_PCI_MMAP #define arch_can_pci_mmap_wc () 1 -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine);#define HAVE_PCI_LEGACY extern int pci_mmap_legacy_page_range(struct pci_bus *bus, struct vm_area_struct *vma,
arch/microblaze/include/asm/pci.h +0 -3
@@ -46,9 +46,6 @@ extern int pci_domain_nr(struct pci_bus *bus);extern int pci_proc_domain (struct pci_bus *bus);struct vm_area_struct ; -/* Map a range of PCI memory or I/O space for a device into user space */ -int pci_mmap_page_range (struct pci_dev *pdev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine);/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ #define HAVE_PCI_MMAP 1
arch/mips/include/asm/pci.h +0 -3
@@ -111,9 +111,6 @@ extern void pcibios_set_master(struct pci_dev *dev);#define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine); -#define HAVE_ARCH_PCI_RESOURCE_TO_USER /*
arch/mn10300/include/asm/pci.h +0 -3
@@ -74,9 +74,6 @@ static inline int pci_controller_num(struct pci_dev *dev) }#define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state, -int write_combine);#endif /* __KERNEL__ */
arch/parisc/include/asm/pci.h +0 -3
@@ -201,7 +201,4 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)#define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine); -#endif /* __ASM_PARISC_PCI_H */
arch/powerpc/include/asm/pci.h +0 -3
@@ -77,9 +77,6 @@ extern int pci_domain_nr(struct pci_bus *bus);extern int pci_proc_domain (struct pci_bus *bus);struct vm_area_struct ; -/* Map a range of PCI memory or I/O space for a device into user space */ -int pci_mmap_page_range (struct pci_dev *pdev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine);/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() and it does WC */ #define HAVE_PCI_MMAP 1
arch/sh/include/asm/pci.h +1 -2
@@ -66,8 +66,7 @@ extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM;struct pci_dev ;#define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine); +extern void pcibios_set_master (struct pci_dev *dev);/* Dynamic DMA mapping stuff.
arch/sparc/include/asm/pci_64.h +0 -4
@@ -45,10 +45,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)#define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define get_pci_unmapped_area get_fb_unmapped_area -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state, -int write_combine); -static inline int pci_get_legacy_ide_irq (struct pci_dev *dev,int channel) {return PCI_IRQ_NONE ;
arch/unicore32/include/asm/pci.h +0 -2
@@ -17,8 +17,6 @@#include <mach/hardware.h> /* for PCIBIOS_MIN_* */ #define HAVE_PCI_MMAP -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine);#endif /* __KERNEL__ */ #endif
arch/x86/include/asm/pci.h +0 -4
@@ -104,10 +104,6 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);#define HAVE_PCI_MMAP #define arch_can_pci_mmap_wc () pat_enabled() -extern int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state, -int write_combine); -#ifdef CONFIG_PCI extern void early_quirks (void );
arch/xtensa/include/asm/pci.h +0 -4
@@ -46,10 +46,6 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1) -/* Map a range of PCI memory or I/O space for a device into user space */ -int pci_mmap_page_range (struct pci_dev *pdev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine); -/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ #define HAVE_PCI_MMAP 1
include/linux/pci.h +7 -0
@@ -1626,6 +1626,13 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }#include <asm/pci.h> +/* Map a range of PCI memory or I/O space for a device into user space. +* Architectures provide this function if they set HAVE_PCI_MMAP, and +* it accepts the 'write_combine' argument when arch_can_pci_mmap_wc() +* evaluates to nonzero. */ +int pci_mmap_page_range (struct pci_dev *pdev,struct vm_area_struct *vma, +enum pci_mmap_state mmap_state,int write_combine); +#ifndef arch_can_pci_mmap_wc#define arch_can_pci_mmap_wc () 0#endif
Signature · 1 line
2.9.3
PATCH v2 7/27 pci: Add arch_can_pci_mmap_io() on architectures which can mmap() I/O space
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
This is relatively esoteric, and knowing that we don't have it makes life easier in some cases rather than just an eventual -EINVAL from pci_mmap_page_range().
--- Documentation/filesystems/sysfs-pci.txt | 3 ++- arch/microblaze/include/asm/pci.h | 3 ++- arch/powerpc/include/asm/pci.h | 1 + arch/sparc/include/asm/pci_64.h | 1 + arch/xtensa/include/asm/pci.h | 3 ++- drivers/pci/pci-sysfs.c | 13 ++++++++----- drivers/pci/proc.c | 11 +++++++---- include/linux/pci.h | 3 +++ 8 files changed, 26 insertions(+), 12 deletions(-)
Documentation/filesystems/sysfs-pci.txt +2 -1
@@ -119,7 +119,8 @@ useful return codes should be provided. Platforms which support write-combining maps of PCI resources must define arch_can_pci_mmap_wc() which shall evaluate to non-zero at runtime when -write-combining is permitted. +write-combining is permitted. Platforms which support maps of I/O resources +define arch_can_pci_mmap_io() similarly. Legacy resources are protected by the HAVE_PCI_LEGACY define. Platforms wishing to support legacy functionality should define it and provide
arch/microblaze/include/asm/pci.h +2 -1
@@ -48,7 +48,8 @@ extern int pci_proc_domain(struct pci_bus *bus);struct vm_area_struct ;/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 +#define HAVE_PCI_MMAP 1 +#define arch_can_pci_mmap_io () 1extern int pci_legacy_read (struct pci_bus *bus,loff_t port,u32 *val,size_t count);
arch/powerpc/include/asm/pci.h +1 -0
@@ -80,6 +80,7 @@ struct vm_area_struct;/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() and it does WC */ #define HAVE_PCI_MMAP 1 +#define arch_can_pci_mmap_io () 1#define arch_can_pci_mmap_wc () 1 extern int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val,
arch/sparc/include/asm/pci_64.h +1 -0
@@ -42,6 +42,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)/* Platform support for /proc/bus/pci/X/Y mmap()s. */ #define HAVE_PCI_MMAP +#define arch_can_pci_mmap_io () 1#define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define get_pci_unmapped_area get_fb_unmapped_area
arch/xtensa/include/asm/pci.h +2 -1
@@ -47,7 +47,8 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1)/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 +#define HAVE_PCI_MMAP 1 +#define arch_can_pci_mmap_io () 1#endif /* __KERNEL__ */
drivers/pci/pci-sysfs.c +8 -5
@@ -1174,11 +1174,14 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine) }else { pdev->res_attr[num] = res_attr;sprintf (res_attr_name,"resource%d" , num); - res_attr->mmap = pci_mmap_resource_uc; - } -if (pci_resource_flags (pdev, num) &IORESOURCE_IO ) { - res_attr->read = pci_read_resource_io; - res_attr->write = pci_write_resource_io; +if (pci_resource_flags (pdev, num) &IORESOURCE_IO ) { + res_attr->read = pci_read_resource_io; + res_attr->write = pci_write_resource_io; +if (arch_can_pci_mmap_io ()) + res_attr->mmap = pci_mmap_resource_uc; + }else { + res_attr->mmap = pci_mmap_resource_uc; + } } res_attr->attr.name = res_attr_name; res_attr->attr.mode =S_IRUSR |S_IWUSR ;
drivers/pci/proc.c +7 -4
@@ -202,6 +202,8 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,#ifdef HAVE_PCI_MMAP case PCIIOC_MMAP_IS_IO : +if (!arch_can_pci_mmap_io ()) +return -EINVAL ; fpriv->mmap_state = pci_mmap_io;break ;
@@ -232,15 +234,16 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) {struct pci_dev *dev =PDE_DATA (file_inode (file));struct pci_filp_private *fpriv = file->private_data; -int i, ret, write_combine =0 , res_bit; +int i, ret, write_combine =0 , res_bit =IORESOURCE_MEM ;if (!capable (CAP_SYS_RAWIO ))return -EPERM ; -if (fpriv->mmap_state == pci_mmap_io) +if (fpriv->mmap_state == pci_mmap_io) { +if (!arch_can_pci_mmap_io ()) +return -EINVAL ; res_bit =IORESOURCE_IO ; -else - res_bit =IORESOURCE_MEM ; + }/* Make sure the caller is mapping a real resource for this device */ for (i =0 ; i <PCI_ROM_RESOURCE ; i++) {
include/linux/pci.h +3 -0
@@ -1636,6 +1636,9 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,#ifndef arch_can_pci_mmap_wc#define arch_can_pci_mmap_wc () 0#endif +#ifndef arch_can_pci_mmap_io +#define arch_can_pci_mmap_io () 0 +#endif #ifndef pci_root_bus_fwnode#define pci_root_bus_fwnode (bus) NULL
Signature · 1 line
2.9.3
PATCH v2 8/27 pci: Use BAR index in sysfs attr->private instead of resource pointer
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
We store the pointer, and then on *every* use of it we loop over the device's resources to find out the index. That's kind of silly.
--- drivers/pci/pci-sysfs.c | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-)
drivers/pci/pci-sysfs.c +14 -24
@@ -1017,26 +1017,20 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, struct vm_area_struct *vma, int write_combine) {struct pci_dev *pdev =to_pci_dev (kobj_to_dev (kobj)); -struct resource *res = attr->private; +int bar = (unsigned long )attr->private;enum pci_mmap_state mmap_type;resource_size_t start, end; -int i; - -for (i =0 ; i <PCI_ROM_RESOURCE ; i++) -if (res == &pdev->resource[i]) -break ; -if (i >=PCI_ROM_RESOURCE ) -return -ENODEV ; +struct resource *res = &pdev->resource[bar];if (res->flags &IORESOURCE_MEM &&iomem_is_exclusive (res->start))return -EINVAL ; -if (!pci_mmap_fits (pdev, i, vma,PCI_MMAP_SYSFS )) { +if (!pci_mmap_fits (pdev, bar, vma,PCI_MMAP_SYSFS )) {WARN (1 ,"process \"%s\" tried to map 0x%08lx bytes at page 0x%08lx on %s BAR %d (start 0x%16Lx, size 0x%16Lx)\n" , current->comm, vma->vm_end-vma->vm_start, vma->vm_pgoff, -pci_name (pdev), i, - (u64 )pci_resource_start (pdev, i), - (u64 )pci_resource_len (pdev, i)); +pci_name (pdev), bar, + (u64 )pci_resource_start (pdev, bar), + (u64 )pci_resource_len (pdev, bar));return -EINVAL ; }
@@ -1044,7 +1038,7 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,* from /proc/bus/pci/ which is a "user visible" value. If this is * different from the resource itself, arch will do necessary fixup. */ -pci_resource_to_user (pdev, i, res, &start, &end); +pci_resource_to_user (pdev, bar, res, &start, &end); vma->vm_pgoff += start >>PAGE_SHIFT ; mmap_type = res->flags &IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;return pci_mmap_page_range (pdev, vma, mmap_type, write_combine);
@@ -1069,22 +1063,18 @@ static ssize_t pci_resource_io(struct file *filp, struct kobject *kobj, loff_t off, size_t count, bool write) {struct pci_dev *pdev =to_pci_dev (kobj_to_dev (kobj)); -struct resource *res = attr->private; +int bar = (unsigned long )attr->private; +struct resource *res;unsigned long port = off; -int i; -for (i =0 ; i <PCI_ROM_RESOURCE ; i++) -if (res == &pdev->resource[i]) -break ; -if (i >=PCI_ROM_RESOURCE ) -return -ENODEV ; + res = &pdev->resource[bar]; - port +=pci_resource_start (pdev, i); + port +=pci_resource_start (pdev, bar); -if (port >pci_resource_end (pdev, i)) +if (port >pci_resource_end (pdev, bar))return 0 ; -if (port + count -1 >pci_resource_end (pdev, i)) +if (port + count -1 >pci_resource_end (pdev, bar))return -EINVAL ;switch (count) {
@@ -1186,7 +1176,7 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine) res_attr->attr.name = res_attr_name; res_attr->attr.mode =S_IRUSR |S_IWUSR ; res_attr->size =pci_resource_len (pdev, num); - res_attr->private = &pdev->resource[num]; + res_attr->private = (void *)(unsigned long )num; retval =sysfs_create_bin_file (&pdev->dev.kobj, res_attr);if (retval)kfree (res_attr);
Signature · 1 line
2.9.3
PATCH v2 9/27 pci: Add BAR index argument to pci_mmap_page_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
In all cases we know which BAR it is. Passing it in means that arch code (or generic code; watch this space) won't have to go looking for it again.
--- arch/arm/kernel/bios32.c | 3 ++- arch/cris/arch-v32/drivers/pci/bios.c | 3 ++- arch/ia64/pci/pci.c | 3 ++- arch/microblaze/pci/pci-common.c | 2 +- arch/mips/pci/pci.c | 3 ++- arch/mn10300/unit-asb2305/pci-asb2305.c | 3 ++- arch/parisc/kernel/pci.c | 3 ++- arch/powerpc/kernel/pci-common.c | 3 ++- arch/sh/drivers/pci/pci.c | 3 ++- arch/sparc/kernel/pci.c | 6 +++--- arch/unicore32/kernel/pci.c | 3 ++- arch/x86/pci/i386.c | 3 ++- arch/xtensa/kernel/pci.c | 3 ++- drivers/pci/pci-sysfs.c | 2 +- drivers/pci/proc.c | 2 +- include/linux/pci.h | 3 ++- 16 files changed, 30 insertions(+), 18 deletions(-)
arch/arm/kernel/bios32.c +2 -1
@@ -597,7 +597,8 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,return start; } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {if (mmap_state == pci_mmap_io)
arch/cris/arch-v32/drivers/pci/bios.c +2 -1
@@ -14,7 +14,8 @@ void pcibios_set_master(struct pci_dev *dev)pci_write_config_byte (dev,PCI_LATENCY_TIMER , lat); } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long prot;
arch/ia64/pci/pci.c +2 -1
@@ -419,7 +419,8 @@ pcibios_align_resource (void *data, const struct resource *res, }int -pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long size = vma->vm_end - vma->vm_start;
arch/microblaze/pci/pci-common.c +1 -1
@@ -278,7 +278,7 @@ pgprot_t pci_phys_mem_access_prot(struct file *file,* * Returns a negative error code on failure, zero on success. */ -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar,struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) { resource_size_t offset =
arch/mips/pci/pci.c +2 -1
@@ -58,7 +58,8 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar, *end = rsrc->start + size; } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long prot;
arch/mn10300/unit-asb2305/pci-asb2305.c +2 -1
@@ -211,7 +211,8 @@ void __init pcibios_resource_survey(void)pcibios_allocate_resources (1 ); } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long prot;
arch/parisc/kernel/pci.c +2 -1
@@ -228,7 +228,8 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long prot;
arch/powerpc/kernel/pci-common.c +2 -1
@@ -513,7 +513,8 @@ pgprot_t pci_phys_mem_access_prot(struct file *file,* * Returns a negative error code on failure, zero on success. */ -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) { resource_size_t offset =
arch/sh/drivers/pci/pci.c +2 -1
@@ -269,7 +269,8 @@ void __ref pcibios_report_status(unsigned int status_mask, int warn) } } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {/*
arch/sparc/kernel/pci.c +3 -3
@@ -862,9 +862,9 @@ static void __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vm* * Returns a negative error code on failure, zero on success. */ -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, -enum pci_mmap_state mmap_state, -int write_combine) +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma, +enum pci_mmap_state mmap_state,int write_combine) {int ret;
arch/unicore32/kernel/pci.c +2 -1
@@ -357,7 +357,8 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)return 0 ; } -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long phys;
arch/x86/pci/i386.c +2 -1
@@ -411,7 +411,8 @@ static const struct vm_operations_struct pci_mmap_ops = { .access = generic_access_phys, }; -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {unsigned long prot;
arch/xtensa/kernel/pci.c +2 -1
@@ -343,7 +343,8 @@ __pci_mmap_make_offset(struct pci_dev *dev, struct vm_area_struct *vma,* * Returns a negative error code on failure, zero on success. */ -int pci_mmap_page_range (struct pci_dev *dev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine) {
drivers/pci/pci-sysfs.c +1 -1
@@ -1041,7 +1041,7 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,pci_resource_to_user (pdev, bar, res, &start, &end); vma->vm_pgoff += start >>PAGE_SHIFT ; mmap_type = res->flags &IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; -return pci_mmap_page_range (pdev, vma, mmap_type, write_combine); +return pci_mmap_page_range (pdev, bar, vma, mmap_type, write_combine); } static int pci_mmap_resource_uc(struct file *filp, struct kobject *kobj,
drivers/pci/proc.c +1 -1
@@ -262,7 +262,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)else return -EINVAL ; } - ret =pci_mmap_page_range (dev, vma, + ret =pci_mmap_page_range (dev, i, vma, fpriv->mmap_state, write_combine);if (ret <0 )return ret;
include/linux/pci.h +2 -1
@@ -1630,7 +1630,8 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }* Architectures provide this function if they set HAVE_PCI_MMAP, and * it accepts the 'write_combine' argument when arch_can_pci_mmap_wc() * evaluates to nonzero. */ -int pci_mmap_page_range (struct pci_dev *pdev,struct vm_area_struct *vma, +int pci_mmap_page_range (struct pci_dev *pdev,int bar, +struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine);#ifndef arch_can_pci_mmap_wc
Signature · 1 line
2.9.3
PATCH v2 10/27 pci: Add pci_mmap_resource_range() and use it for ARM64
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
Starting to leave behind the legacy of the pci_mmap_page_range() interface which takes "user-visible" BAR addresses. This takes just the resource and offset.
For now, both APIs coexist and depending on the platform, one is implemented as a wrapper around the other.
--- Documentation/filesystems/sysfs-pci.txt | 10 ++-- arch/arm64/include/asm/pci.h | 2 + drivers/pci/Makefile | 2 +- drivers/pci/mmap.c | 84 +++++++++++++++++++++++++++++++++ drivers/pci/pci-sysfs.c | 13 ++--- drivers/pci/pci.h | 4 +- include/linux/pci.h | 19 ++++++-- 7 files changed, 114 insertions(+), 20 deletions(-) create mode 100644 drivers/pci/mmap.c
Documentation/filesystems/sysfs-pci.txt +7 -3
@@ -113,9 +113,13 @@ Supporting PCI access on new platforms -------------------------------------- In order to support PCI resource mapping as described above, Linux platform -code must define HAVE_PCI_MMAP and provide a pci_mmap_page_range function. -Platforms are free to only support subsets of the mmap functionality, but -useful return codes should be provided. +code should ideally define ARCH_GENERIC_PCI_MMAP_RESOURCE and use the generic +implementation of that functionality. To support the historical interface of +mmap() through files in /proc/bus/pci, platforms may also set HAVE_PCI_MMAP. + +Alternatively, platforms which set HAVE_PCI_MMAP may provide their own +implementation of pci_mmap_page_range() instead of defining +ARCH_GENERIC_PCI_MMAP_RESOURCE. Platforms which support write-combining maps of PCI resources must define arch_can_pci_mmap_wc() which shall evaluate to non-zero at runtime when
arch/arm64/include/asm/pci.h +2 -0
@@ -22,6 +22,8 @@*/ #define PCI_DMA_BUS_IS_PHYS (0) +#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1 +extern int isa_dma_bridge_buggy;#ifdef CONFIG_PCI
drivers/pci/Makefile +1 -1
@@ -4,7 +4,7 @@ obj-y += access.o bus.o probe.o host-bridge.o remove.o pci.o \ pci-driver.o search.o pci-sysfs.o rom.o setup-res.o \ - irq.o vpd.o setup-bus.o vc.o + irq.o vpd.o setup-bus.o vc.o mmap.o obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_SYSFS) += slot.o
drivers/pci/mmap.c new file +84 -0
84 lines not on this page · raw message
drivers/pci/pci-sysfs.c +3 -10
@@ -980,7 +980,7 @@ void pci_remove_legacy_files(struct pci_bus *b) }#endif /* HAVE_PCI_LEGACY */ -#ifdef HAVE_PCI_MMAP +#if defined(HAVE_PCI_MMAP ) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE )int pci_mmap_fits (struct pci_dev *pdev,int resno,struct vm_area_struct *vma,enum pci_mmap_api mmap_api)
@@ -1019,7 +1019,6 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,struct pci_dev *pdev =to_pci_dev (kobj_to_dev (kobj));int bar = (unsigned long )attr->private;enum pci_mmap_state mmap_type; -resource_size_t start, end;struct resource *res = &pdev->resource[bar];if (res->flags &IORESOURCE_MEM &&iomem_is_exclusive (res->start))
@@ -1033,15 +1032,9 @@ static int pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, (u64)pci_resource_len(pdev, bar));return -EINVAL ; } - -/* pci_mmap_page_range() expects the same kind of entry as coming -* from /proc/bus/pci/ which is a "user visible" value. If this is -* different from the resource itself, arch will do necessary fixup. -*/ -pci_resource_to_user (pdev, bar, res, &start, &end); - vma->vm_pgoff += start >>PAGE_SHIFT ; mmap_type = res->flags &IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; -return pci_mmap_page_range (pdev, bar, vma, mmap_type, write_combine); + +return pci_mmap_resource_range (pdev, bar, vma, mmap_type, write_combine); } static int pci_mmap_resource_uc(struct file *filp, struct kobject *kobj,
drivers/pci/pci.h +2 -2
@@ -21,14 +21,14 @@ void pci_create_firmware_label_files(struct pci_dev *pdev);void pci_remove_firmware_label_files (struct pci_dev *pdev);#endif void pci_cleanup_rom (struct pci_dev *dev); -#ifdef HAVE_PCI_MMAP +enum pci_mmap_api {PCI_MMAP_SYSFS ,/* mmap on /sys/bus/pci/devices/<BDF>/resource<N> */ PCI_MMAP_PROCFS /* mmap on /proc/bus/pci/<BDF> */ };int pci_mmap_fits (struct pci_dev *pdev,int resno,struct vm_area_struct *vmai,enum pci_mmap_api mmap_api); -#endif +int pci_probe_reset_function (struct pci_dev *dev);/**
include/linux/pci.h +15 -4
@@ -1626,10 +1626,21 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }#include <asm/pci.h> -/* Map a range of PCI memory or I/O space for a device into user space. -* Architectures provide this function if they set HAVE_PCI_MMAP, and -* it accepts the 'write_combine' argument when arch_can_pci_mmap_wc() -* evaluates to nonzero. */ +/* These two functions provide almost identical functionality. Depennding +* on the architecture, one will be implemented as a wrapper aroudn the +* other (in drivers/pci/mmap.c). +* +* pci_mmap_resource_range() maps a specific BAR, and vm->vm_pgoff +* is expected to be an offset within that region. +* +* pci_mmap_page_range() is the legacy architecture-specific interface, +* which accepts a "user visible" resource address converted by +* pci_resource_to_user(), as used in the legacy mmap() interface in +* /proc/bus/pci/. +*/ +int pci_mmap_resource_range (struct pci_dev *dev,int bar, +struct vm_area_struct *vma, +enum pci_mmap_state mmap_state,int write_combine);int pci_mmap_page_range (struct pci_dev *pdev,int bar,struct vm_area_struct *vma,enum pci_mmap_state mmap_state,int write_combine);
Signature · 1 line
2.9.3
Re: [PATCH v2 10/27] pci: Add pci_mmap_resource_range() and use it for ARM64
drivers/pci/mmap.c line 61
Quoted 2 lines · David Woodhouse
drivers/pci/mmap.c new file +2
-0+ vma->vm_pgoff += (pci_resource_start (pdev, bar) >>PAGE_SHIFT ); + vma->vm_ops = &pci_phys_vm_ops;
Whitespace error.
David
PATCH v2 11/27 arm: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/arm/include/asm/pci.h | 1 + arch/arm/kernel/bios32.c | 20 -------------------- 2 files changed, 1 insertion(+), 20 deletions(-)
arch/arm/include/asm/pci.h +1 -0
@@ -29,6 +29,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE static inline int pci_get_legacy_ide_irq (struct pci_dev *dev,int channel) {
arch/arm/kernel/bios32.c +0 -20
@@ -597,26 +597,6 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,return start; } -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -if (mmap_state == pci_mmap_io) -return -EINVAL ; - -/* -* Mark this as IO -*/ - vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot); - -if (remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) -return -EAGAIN ; - -return 0 ; -} -void __init pci_map_io_early (unsigned long pfn) {struct map_desc pci_io_desc = {
Signature · 1 line
2.9.3
PATCH v2 12/27 cris: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/cris/arch-v32/drivers/pci/bios.c | 23 ----------------------- arch/cris/include/asm/pci.h | 1 + 2 files changed, 1 insertion(+), 23 deletions(-)
arch/cris/arch-v32/drivers/pci/bios.c +0 -23
@@ -14,29 +14,6 @@ void pcibios_set_master(struct pci_dev *dev)pci_write_config_byte (dev,PCI_LATENCY_TIMER , lat); } -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -unsigned long prot; - -/* Leave vm_pgoff as-is, the PCI space address is the physical -* address on this platform. -*/ - prot =pgprot_val (vma->vm_page_prot); - vma->vm_page_prot =__pgprot (prot); - -/* Write-combine setting is ignored, it is changed via the mtrr -* interfaces on this platform. -*/ -if (remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) -return -EAGAIN ; - -return 0 ; -} -resource_size_t pcibios_align_resource (void *data,const struct resource *res,resource_size_t size,resource_size_t align)
arch/cris/include/asm/pci.h +1 -0
@@ -42,6 +42,7 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */
Signature · 1 line
2.9.3
Re: [PATCH v2 12/27] cris: Use generic pci_mmap_resource_range()
Quoted 3 lines · David Woodhouse
From: David Woodhouse <[email protected]>
Signed-off-by David Woodhouse <[email protected]>
For the CRIS part:
Quoted 53 lines
--- arch/cris/arch-v32/drivers/pci/bios.c | 23 ----------------------- arch/cris/include/asm/pci.h | 1 + 2 files changed, 1 insertion(+), 23 deletions(-)arch/cris/arch-v32/drivers/pci/bios.c +0
-23@@ -14,29 +14,6 @@ void pcibios_set_master(struct pci_dev *dev)pci_write_config_byte (dev,PCI_LATENCY_TIMER , lat); } -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -unsigned long prot; - -/* Leave vm_pgoff as-is, the PCI space address is the physical -* address on this platform. -*/ - prot =pgprot_val (vma->vm_page_prot); - vma->vm_page_prot =__pgprot (prot); - -/* Write-combine setting is ignored, it is changed via the mtrr -* interfaces on this platform. -*/ -if (remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) -return -EAGAIN ; - -return 0 ; -} -resource_size_t pcibios_align_resource (void *data,const struct resource *res,resource_size_t size,resource_size_t align)arch/cris/include/asm/pci.h +1
-0@@ -42,6 +42,7 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */ Signature · 1 line
2.9.3
/^JN - Jesper Nilsson
Signature · 1 line
Jesper Nilsson -- [email protected]
Re: [PATCH v2 12/27] cris: Use generic pci_mmap_resource_range()
Quoted 8 lines · Jesper Nilsson
Quoted 4 lines · David Woodhouse
From: David Woodhouse <[email protected]>
Signed-off-by David Woodhouse <[email protected]>For the CRIS part:
Acked-by Jesper Nilsson <[email protected]>
Thanks. I actually had that once before but it had got lost in the refactoring. Added back now.
PATCH v2 13/27 mips: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/mips/include/asm/pci.h | 2 +- arch/mips/pci/pci.c | 25 ------------------------- 2 files changed, 1 insertion(+), 26 deletions(-)
arch/mips/include/asm/pci.h +1 -1
@@ -110,7 +110,7 @@ extern unsigned long PCIBIOS_MIN_MEM;extern void pcibios_set_master (struct pci_dev *dev);#define HAVE_PCI_MMAP - +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define HAVE_ARCH_PCI_RESOURCE_TO_USER /*
arch/mips/pci/pci.c +0 -25
@@ -57,28 +57,3 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar, *start =fixup_bigphys_addr (rsrc->start, size); *end = rsrc->start + size; } - -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -unsigned long prot; - -/* -* I/O space can be accessed via normal processor loads and stores on -* this platform but for now we elect not to do this and portable -* drivers should not do this anyway. -*/ -if (mmap_state == pci_mmap_io) -return -EINVAL ; - -/* -* Ignore write-combine; for now only return uncached mappings. -*/ - prot =pgprot_val (vma->vm_page_prot); - prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED; - vma->vm_page_prot =__pgprot (prot); - -return remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, vma->vm_page_prot); -}
Signature · 1 line
2.9.3
PATCH v2 14/27 mn10300: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
This was setting vma->vm_flags |= VM_LOCKED. Not sure why...
--- arch/mn10300/include/asm/pci.h | 1 + arch/mn10300/unit-asb2305/pci-asb2305.c | 24 ------------------------ 2 files changed, 1 insertion(+), 24 deletions(-)
arch/mn10300/include/asm/pci.h +1 -0
@@ -74,6 +74,7 @@ static inline int pci_controller_num(struct pci_dev *dev) }#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */
arch/mn10300/unit-asb2305/pci-asb2305.c +0 -24
@@ -210,27 +210,3 @@ void __init pcibios_resource_survey(void)pcibios_allocate_resources (0 );pcibios_allocate_resources (1 ); } - -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -unsigned long prot; - -/* Leave vm_pgoff as-is, the PCI space address is the physical -* address on this platform. -*/ - vma->vm_flags |=VM_LOCKED ; - - prot =pgprot_val (vma->vm_page_prot); - prot &= ~_PAGE_CACHE; - vma->vm_page_prot =__pgprot (prot); - -/* Write-combine setting is ignored */ -if (io_remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) -return -EAGAIN ; - -return 0 ; -}
Signature · 1 line
2.9.3
Re: [PATCH v2 14/27] mn10300: Use generic pci_mmap_resource_range()
Quoted 5 lines · David Woodhouse
From: David Woodhouse <[email protected]>
This was setting
vma->vm_flags|=VM_LOCKED. Not sure why...Signed-off-by David Woodhouse <[email protected]>
PATCH v2 15/27 parisc: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/parisc/include/asm/pci.h | 1 + arch/parisc/kernel/pci.c | 29 ----------------------------- 2 files changed, 1 insertion(+), 29 deletions(-)
arch/parisc/include/asm/pci.h +1 -0
@@ -200,5 +200,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) }#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __ASM_PARISC_PCI_H */
arch/parisc/kernel/pci.c +0 -29
@@ -227,35 +227,6 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,return start; } - -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -unsigned long prot; - -/* -* I/O space can be accessed via normal processor loads and stores on -* this platform but for now we elect not to do this and portable -* drivers should not do this anyway. -*/ -if (mmap_state == pci_mmap_io) -return -EINVAL ; - -if (write_combine) -return -EINVAL ; - -/* -* Ignore write-combine; for now only return uncached mappings. -*/ - prot =pgprot_val (vma->vm_page_prot); - prot |= _PAGE_NO_CACHE; - vma->vm_page_prot =__pgprot (prot); - -return remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, vma->vm_page_prot); -} -/* * A driver is enabling the device. We make sure that all the appropriate * bits are set to allow the device to operate as the driver is expecting.
Signature · 1 line
2.9.3
PATCH v2 16/27 sh: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/sh/drivers/pci/pci.c | 22 ---------------------- arch/sh/include/asm/pci.h | 1 + 2 files changed, 1 insertion(+), 22 deletions(-)
arch/sh/drivers/pci/pci.c +0 -22
@@ -269,28 +269,6 @@ void __ref pcibios_report_status(unsigned int status_mask, int warn) } } -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -/* -* I/O space can be accessed via normal processor loads and stores on -* this platform but for now we elect not to do this and portable -* drivers should not do this anyway. -*/ -if (mmap_state == pci_mmap_io) -return -EINVAL ; - -/* -* Ignore write-combine; for now only return uncached mappings. -*/ - vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot); - -return remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot); -} -#ifndef CONFIG_GENERIC_IOMAP void __iomem *__pci_ioport_map(struct pci_dev *dev,
arch/sh/include/asm/pci.h +1 -0
@@ -66,6 +66,7 @@ extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM;struct pci_dev ;#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE extern void pcibios_set_master (struct pci_dev *dev);
Signature · 1 line
2.9.3
PATCH v2 17/27 unicore: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/unicore32/include/asm/pci.h | 1 + arch/unicore32/kernel/pci.c | 24 ------------------------ 2 files changed, 1 insertion(+), 24 deletions(-)
arch/unicore32/include/asm/pci.h +1 -0
@@ -17,6 +17,7 @@#include <mach/hardware.h> /* for PCIBIOS_MIN_* */ #define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */ #endif
arch/unicore32/kernel/pci.c +0 -24
@@ -356,27 +356,3 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) }return 0 ; } - -int pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -unsigned long phys; - -if (mmap_state == pci_mmap_io) -return -EINVAL ; - - phys = vma->vm_pgoff; - -/* -* Mark this as IO -*/ - vma->vm_page_prot =pgprot_noncached (vma->vm_page_prot); - -if (remap_pfn_range (vma, vma->vm_start, phys, - vma->vm_end - vma->vm_start, - vma->vm_page_prot)) -return -EAGAIN ; - -return 0 ; -}
Signature · 1 line
2.9.3
PATCH v2 18/27 x86: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/x86/include/asm/pci.h | 1 + arch/x86/pci/i386.c | 48 ---------------------------------------------- 2 files changed, 1 insertion(+), 48 deletions(-)
arch/x86/include/asm/pci.h +1 -0
@@ -104,6 +104,7 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);#define HAVE_PCI_MMAP #define arch_can_pci_mmap_wc () pat_enabled() +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #ifdef CONFIG_PCI extern void early_quirks (void );
arch/x86/pci/i386.c +0 -48
51 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH v2 19/27 pci: Add I/O BAR support to generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
This will need to call into an arch-provided pci_iobar_pfn() function.
--- drivers/pci/mmap.c | 11 +++++++---- include/linux/pci.h | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-)
drivers/pci/mmap.c +7 -4
@@ -45,9 +45,6 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar, {unsigned long size; -if (mmap_state == pci_mmap_io) -return -EINVAL ; - size = ((pci_resource_len (pdev, bar) -1 ) >>PAGE_SHIFT ) +1 ;if (vma->vm_pgoff +vma_pages (vma) > size)return -EINVAL ;
@@ -57,7 +54,13 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar,else vma->vm_page_prot =pgprot_device (vma->vm_page_prot); - vma->vm_pgoff += (pci_resource_start (pdev, bar) >>PAGE_SHIFT ); +if (mmap_state == pci_mmap_io) { +int ret =pci_iobar_pfn (pdev, bar, vma); +if (ret) +return ret; + }else + vma->vm_pgoff += (pci_resource_start (pdev, bar) >>PAGE_SHIFT ); + vma->vm_ops = &pci_phys_vm_ops; return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
include/linux/pci.h +4 -0
@@ -1648,8 +1648,12 @@ int pci_mmap_page_range(struct pci_dev *pdev, int bar,#ifndef arch_can_pci_mmap_wc#define arch_can_pci_mmap_wc () 0#endif +#ifndef arch_can_pci_mmap_io#define arch_can_pci_mmap_io () 0 +#define pci_iobar_pfn (pdev, bar, vma) (-EINVAL) +#else +int pci_iobar_pfn (struct pci_dev *pdev,int bar,struct vm_area_struct *vma);#endif #ifndef pci_root_bus_fwnode
Signature · 1 line
2.9.3
PATCH v2 20/27 powerpc: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/powerpc/include/asm/pci.h | 9 ++-- arch/powerpc/kernel/pci-common.c | 106 ++++----------------------------------- 2 files changed, 15 insertions(+), 100 deletions(-)
arch/powerpc/include/asm/pci.h +5 -4
@@ -78,10 +78,11 @@ extern int pci_proc_domain(struct pci_bus *bus);struct vm_area_struct ; -/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() and it does WC */ -#define HAVE_PCI_MMAP 1 -#define arch_can_pci_mmap_io () 1 -#define arch_can_pci_mmap_wc () 1 +/* Tell PCI code what kind of PCI resource mappings we support */ +#define HAVE_PCI_MMAP 1 +#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1 +#define arch_can_pci_mmap_io () 1 +#define arch_can_pci_mmap_wc () 1extern int pci_legacy_read (struct pci_bus *bus,loff_t port,u32 *val,size_t count);
arch/powerpc/kernel/pci-common.c +10 -96
124 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH v2 21/27 microblaze: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/microblaze/include/asm/pci.h | 7 +-- arch/microblaze/pci/pci-common.c | 99 ++++----------------------------------- 2 files changed, 13 insertions(+), 93 deletions(-)
arch/microblaze/include/asm/pci.h +4 -3
@@ -47,9 +47,10 @@ extern int pci_proc_domain(struct pci_bus *bus);struct vm_area_struct ; -/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 -#define arch_can_pci_mmap_io () 1 +/* Tell PCI code what kind of PCI resource mappings we support */ +#define HAVE_PCI_MMAP 1 +#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1 +#define arch_can_pci_mmap_io () 1extern int pci_legacy_read (struct pci_bus *bus,loff_t port,u32 *val,size_t count);
arch/microblaze/pci/pci-common.c +9 -90
118 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH v2 22/27 xtensa: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/xtensa/include/asm/pci.h | 7 ++-- arch/xtensa/kernel/pci.c | 94 ++++--------------------------------------- 2 files changed, 12 insertions(+), 89 deletions(-)
arch/xtensa/include/asm/pci.h +4 -3
@@ -46,9 +46,10 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1) -/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 -#define arch_can_pci_mmap_io () 1 +/* Tell PCI code what kind of PCI resource mappings we support */ +#define HAVE_PCI_MMAP 1 +#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1 +#define arch_can_pci_mmap_io () 1#endif /* __KERNEL__ */
arch/xtensa/kernel/pci.c +8 -86
113 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH v2 23/27 ia64: Remove redundant valid_mmap_phys_addr_range() from pci_mmap_page_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
We know we are within a valid MMIO BAR by the time this function gets called; there's no need to check.
--- arch/ia64/pci/pci.c | 3 --- 1 file changed, 3 deletions(-)
arch/ia64/pci/pci.c +0 -3
@@ -439,9 +439,6 @@ pci_mmap_page_range (struct pci_dev *dev, int bar,*/ return -EINVAL ; -if (!valid_mmap_phys_addr_range (vma->vm_pgoff, size)) -return -EINVAL ; - prot =phys_mem_access_prot (NULL , vma->vm_pgoff, size, vma->vm_page_prot);
Signature · 1 line
2.9.3
PATCH v2 24/27 ia64: Remove redundant checks for WC in pci_mmap_page_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
For a PCI MMIO BAR, phys_mem_access_prot() should always return UC or WC. And while a mixture of cached and uncached mappings is forbidden, we were already mixing WC and UC, which is OK. Just do as we're asked.
--- arch/ia64/pci/pci.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
arch/ia64/pci/pci.c +2 -16
@@ -423,9 +423,6 @@ pci_mmap_page_range (struct pci_dev *dev, int bar,struct vm_area_struct *vma, enum pci_mmap_state mmap_state, int write_combine) { - unsigned long size = vma->vm_end - vma->vm_start; -pgprot_t prot; -/* * I/O space cannot be accessed via normal processor loads and * stores on this platform.
@@ -439,21 +436,10 @@ pci_mmap_page_range (struct pci_dev *dev, int bar,*/ return -EINVAL ; - prot =phys_mem_access_prot (NULL , vma->vm_pgoff, size, - vma->vm_page_prot); - -/* -* If the user requested WC, the kernel uses UC or WC for this region, -* and the chipset supports WC, we can use WC. Otherwise, we have to -* use the same attribute the kernel uses. -*/ -if (write_combine && - ((pgprot_val (prot) & _PAGE_MA_MASK) == _PAGE_MA_UC || - (pgprot_val (prot) & _PAGE_MA_MASK) == _PAGE_MA_WC) && -efi_range_is_wc (vma->vm_start, vma->vm_end - vma->vm_start)) +if (write_combine) vma->vm_page_prot =pgprot_writecombine (vma->vm_page_prot);else - vma->vm_page_prot = prot; + vma->vm_page_prot =pgprot_device (vma->vm_page_prot);if (remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot))
Signature · 1 line
2.9.3
PATCH v2 25/27 ia64: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
Now that we eliminated the different behaviour in separately-reviewable commits, we can switch IA64 to the generic implementation.
--- arch/ia64/include/asm/pci.h | 1 + arch/ia64/pci/pci.c | 30 ------------------------------ 2 files changed, 1 insertion(+), 30 deletions(-)
arch/ia64/include/asm/pci.h +1 -0
@@ -51,6 +51,7 @@ extern unsigned long ia64_max_iommu_merge_mask;#define PCI_DMA_BUS_IS_PHYS (ia64_max_iommu_merge_mask == ~0UL)#define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define arch_can_pci_mmap_wc () 1#define HAVE_PCI_LEGACY
arch/ia64/pci/pci.c +0 -30
@@ -418,36 +418,6 @@ pcibios_align_resource (void *data, const struct resource *res,return res->start; } -int -pci_mmap_page_range (struct pci_dev *dev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -/* -* I/O space cannot be accessed via normal processor loads and -* stores on this platform. -*/ -if (mmap_state == pci_mmap_io) -/* -* XXX we could relax this for I/O spaces for which ACPI -* indicates that the space is 1-to-1 mapped. But at the -* moment, we don't support multiple PCI address spaces and -* the legacy I/O space is not 1-to-1 mapped, so this is moot. -*/ -return -EINVAL ; - -if (write_combine) - vma->vm_page_prot =pgprot_writecombine (vma->vm_page_prot); -else - vma->vm_page_prot =pgprot_device (vma->vm_page_prot); - -if (remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, vma->vm_page_prot)) -return -EAGAIN ; - -return 0 ; -} -/** * ia64_pci_get_legacy_mem - generic legacy mem routine * @bus: bus to get legacy memory base address for
Signature · 1 line
2.9.3
Re: [PATCH v2 25/27] ia64: Use generic pci_mmap_resource_range()
Quoted 6 lines · David Woodhouse
From: David Woodhouse <[email protected]>
Now that we eliminated the different behaviour in separately-reviewable commits, we can switch IA64 to the generic implementation.
Signed-off-by David Woodhouse <[email protected]>
Well it builds and boots on my last remaining ia64 machine. No warnings or weird stuff in the console log. So you can mark the three ia64 patches
and bundle them with the others rather than through the ia64 tree.
-Tony
Re: [PATCH v2 25/27] ia64: Use generic pci_mmap_resource_range()
Quoted 9 lines · Tony Luck
Quoted 6 lines · David Woodhouse
From: David Woodhouse <[email protected]>
Now that we eliminated the different behaviour in separately-reviewable commits, we can switch IA64 to the generic implementation.
Signed-off-by David Woodhouse <[email protected]>Well it builds and boots on my last remaining ia64 machine.
Does that mean ia64 reached the 'NCR Voyager' stage and can be scheduled for removal?
Thanks,
tglx
Re: [PATCH v2 25/27] ia64: Use generic pci_mmap_resource_range()
In reply to Tony LuckQuoted 11 lines · Tony Luck
Quoted 7 lines · David Woodhouse
From: David Woodhouse <[email protected]>
Now that we eliminated the different behaviour in separately-reviewable commits, we can switch IA64 to the generic implementation.
Signed-off-by David Woodhouse <[email protected]>Well it builds and boots on my last remaining ia64 machine. No warnings or weird stuff in the console log. So you can mark the three ia64 patches
Thanks. The interesting test is whether you can correctly map PCI BARs through /proc/bus/pci and /sys/bus/pci?
And if you find a prefetchable BAR you can scribble on, does the box explode if you do it both WC and UC at the same time?
http://david.woodhou.se/pcimmap_copy.c should validate WC mappings and look something like this...
[fedora@ip-172-31-55-194 ~]$ sudo ./pcimmap_copy /sys/bus/pci/devices/0000\:00\:1e.0/resource4 0 Copied 1000 loops in 0.354437301s
[fedora@ip-172-31-55-194 ~]$ sudo ./pcimmap_copy /sys/bus/pci/devices/0000\:00\:1e.0/resource4_wc 0 Copied 1000 loops in 0.057309254s
PATCH v2 26/27 sparc: Use generic pci_mmap_resource_range()
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
--- arch/sparc/include/asm/pci_64.h | 1 + arch/sparc/kernel/pci.c | 155 ---------------------------------------- 2 files changed, 1 insertion(+), 155 deletions(-)
arch/sparc/include/asm/pci_64.h +1 -0
@@ -42,6 +42,7 @@ static inline int pci_proc_domain(struct pci_bus *bus)/* Platform support for /proc/bus/pci/X/Y mmap()s. */ #define HAVE_PCI_MMAP +#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define arch_can_pci_mmap_io () 1#define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define get_pci_unmapped_area get_fb_unmapped_area
arch/sparc/kernel/pci.c +0 -155
161 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH v2 27/27 pci: Kill ARCH_GENERIC_PCI_MMAP_RESOURCE
In reply to David WoodhouseFrom: David Woodhouse <[email protected]>
Now that every architecture does it, we can kill the #define. This does have the side-effect that other architectures which previously didn't support mmap on sysfs resource files now get it.
We have an exemption for !MMU (obviously) and for Alpha (with its bizarre setup for pre-BWX CPUs).
--- Documentation/filesystems/sysfs-pci.txt | 11 +++-------- arch/arm/include/asm/pci.h | 1 - arch/arm64/include/asm/pci.h | 2 -- arch/cris/include/asm/pci.h | 1 - arch/ia64/include/asm/pci.h | 1 - arch/microblaze/include/asm/pci.h | 1 - arch/mips/include/asm/pci.h | 1 - arch/mn10300/include/asm/pci.h | 1 - arch/parisc/include/asm/pci.h | 1 - arch/powerpc/include/asm/pci.h | 1 - arch/sh/include/asm/pci.h | 1 - arch/sparc/include/asm/pci_64.h | 1 - arch/unicore32/include/asm/pci.h | 1 - arch/x86/include/asm/pci.h | 1 - arch/xtensa/include/asm/pci.h | 1 - drivers/pci/Makefile | 3 ++- drivers/pci/mmap.c | 20 -------------------- drivers/pci/pci-sysfs.c | 2 +- 18 files changed, 6 insertions(+), 45 deletions(-)
Documentation/filesystems/sysfs-pci.txt +3 -8
@@ -112,14 +112,9 @@ to access legacy memory space. Supporting PCI access on new platforms -------------------------------------- -In order to support PCI resource mapping as described above, Linux platform -code should ideally define ARCH_GENERIC_PCI_MMAP_RESOURCE and use the generic -implementation of that functionality. To support the historical interface of -mmap() through files in /proc/bus/pci, platforms may also set HAVE_PCI_MMAP. - -Alternatively, platforms which set HAVE_PCI_MMAP may provide their own -implementation of pci_mmap_page_range() instead of defining -ARCH_GENERIC_PCI_MMAP_RESOURCE. +To support the historical interface of mmap() through files in /proc/bus/pci, +platforms may also set HAVE_PCI_MMAP. The mapping through sysfs is supported +through generic code. Platforms which support write-combining maps of PCI resources must define arch_can_pci_mmap_wc() which shall evaluate to non-zero at runtime when
arch/arm/include/asm/pci.h +0 -1
@@ -29,7 +29,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE static inline int pci_get_legacy_ide_irq (struct pci_dev *dev,int channel) {
arch/arm64/include/asm/pci.h +0 -2
@@ -22,8 +22,6 @@*/ #define PCI_DMA_BUS_IS_PHYS (0) -#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1 -extern int isa_dma_bridge_buggy;#ifdef CONFIG_PCI
arch/cris/include/asm/pci.h +0 -1
@@ -42,7 +42,6 @@ struct pci_dev;#define PCI_DMA_BUS_IS_PHYS (1)#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */
arch/ia64/include/asm/pci.h +0 -1
@@ -51,7 +51,6 @@ extern unsigned long ia64_max_iommu_merge_mask;#define PCI_DMA_BUS_IS_PHYS (ia64_max_iommu_merge_mask == ~0UL)#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define arch_can_pci_mmap_wc () 1#define HAVE_PCI_LEGACY
arch/microblaze/include/asm/pci.h +0 -1
@@ -49,7 +49,6 @@ struct vm_area_struct;/* Tell PCI code what kind of PCI resource mappings we support */ #define HAVE_PCI_MMAP 1 -#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1#define arch_can_pci_mmap_io () 1 extern int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val,
arch/mips/include/asm/pci.h +0 -1
@@ -110,7 +110,6 @@ extern unsigned long PCIBIOS_MIN_MEM;extern void pcibios_set_master (struct pci_dev *dev);#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define HAVE_ARCH_PCI_RESOURCE_TO_USER /*
arch/mn10300/include/asm/pci.h +0 -1
@@ -74,7 +74,6 @@ static inline int pci_controller_num(struct pci_dev *dev) }#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */
arch/parisc/include/asm/pci.h +0 -1
@@ -200,6 +200,5 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) }#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __ASM_PARISC_PCI_H */
arch/powerpc/include/asm/pci.h +0 -1
@@ -80,7 +80,6 @@ struct vm_area_struct;/* Tell PCI code what kind of PCI resource mappings we support */ #define HAVE_PCI_MMAP 1 -#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1#define arch_can_pci_mmap_io () 1#define arch_can_pci_mmap_wc () 1
arch/sh/include/asm/pci.h +0 -1
@@ -66,7 +66,6 @@ extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM;struct pci_dev ;#define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE extern void pcibios_set_master (struct pci_dev *dev);
arch/sparc/include/asm/pci_64.h +0 -1
@@ -42,7 +42,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)/* Platform support for /proc/bus/pci/X/Y mmap()s. */ #define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define arch_can_pci_mmap_io () 1#define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define get_pci_unmapped_area get_fb_unmapped_area
arch/unicore32/include/asm/pci.h +0 -1
@@ -17,7 +17,6 @@#include <mach/hardware.h> /* for PCIBIOS_MIN_* */ #define HAVE_PCI_MMAP -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #endif /* __KERNEL__ */ #endif
arch/x86/include/asm/pci.h +0 -1
@@ -104,7 +104,6 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);#define HAVE_PCI_MMAP #define arch_can_pci_mmap_wc () pat_enabled() -#define ARCH_GENERIC_PCI_MMAP_RESOURCE #ifdef CONFIG_PCI extern void early_quirks (void );
arch/xtensa/include/asm/pci.h +0 -1
@@ -48,7 +48,6 @@ struct pci_dev;/* Tell PCI code what kind of PCI resource mappings we support */ #define HAVE_PCI_MMAP 1 -#define ARCH_GENERIC_PCI_MMAP_RESOURCE 1#define arch_can_pci_mmap_io () 1#endif /* __KERNEL__ */
drivers/pci/Makefile +2 -1
@@ -4,7 +4,8 @@ obj-y += access.o bus.o probe.o host-bridge.o remove.o pci.o \ pci-driver.o search.o pci-sysfs.o rom.o setup-res.o \ - irq.o vpd.o setup-bus.o vc.o mmap.o + irq.o vpd.o setup-bus.o vc.o +obj-$(CONFIG_MMU) += mmap.o obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_SYSFS) += slot.o
drivers/pci/mmap.c +0 -20
@@ -15,7 +15,6 @@#include <linux/mm.h> #include <linux/pci.h> -#ifdef ARCH_GENERIC_PCI_MMAP_RESOURCE /* Modern setup: generic pci_mmap_resource_range(), and implement the legacy * pci_mmap_page_range() (if needed) as a wrapper round it. */
@@ -66,22 +65,3 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar,return io_remap_pfn_range (vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot); } - -#elif defined(HAVE_PCI_MMAP)/* && !ARCH_GENERIC_PCI_MMAP_RESOURCE */ -/* Legacy setup: Impement pci_mmap_resource_range() as a wrapper around -the architecture's pci_mmap_page_range(), converting to "user visible" -addresses as necessary. */ -int pci_mmap_resource_range (struct pci_dev *pdev,int bar, -struct vm_area_struct *vma, -enum pci_mmap_state mmap_state,int write_combine) -{ -resource_size_t start, end; -/* pci_mmap_page_range() expects the same kind of entry as coming -* from /proc/bus/pci/ which is a "user visible" value. If this is -* different from the resource itself, arch will do necessary fixup. -*/ -pci_resource_to_user (pdev, bar, &pdev->resource[bar], &start, &end); - vma->vm_pgoff += start >>PAGE_SHIFT ; -return pci_mmap_page_range (pdev, bar, vma, mmap_state, write_combine); -} -#endif
drivers/pci/pci-sysfs.c +1 -1
@@ -980,7 +980,7 @@ void pci_remove_legacy_files(struct pci_bus *b) }#endif /* HAVE_PCI_LEGACY */ -#if defined(HAVE_PCI_MMAP ) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE ) +#if defined(CONFIG_MMU ) && !defined(__alpha__)int pci_mmap_fits (struct pci_dev *pdev,int resno,struct vm_area_struct *vma,enum pci_mmap_api mmap_api)
Signature · 1 line
2.9.3
Bjorn Helgaas
AppliedQuoted 26 lines · David Woodhouse
This pursues my previous patch set all the way to its logical conclusion.
It kills off the legacy arch-provided
pci_mmap_page_range()completely, along with its vile 'address converted bypci_resource_to_user()' API and the various bugs and other strange behaviour that various architectures had.In some cases like IA64 I've killed off the odd behaviour *first* in separately reviewable patches, before the final switch over to the generic code which should then basically have no functional effect.
To accommodate the ARM64 maintainers' desire *not* to support mmap through
/proc/bus/pciI have separatedHAVE_PCI_MMAPfrom the sysfs implementation, which (as of the last patch in the series) ends up present on *all* platforms with an MMU. I still don't think that's a *good* idea though; it's a generic part of /proc, and nobody ever did answer my question about what *else* we can delete from /proc on ARM64 "because it's a new platform"...I would very much like the interesting parts of this to go through the arch maintainers' trees. I'd suggest that we can pull everything up to and including patch 19 ("pci: Add I/O BAR support to generic
pci_mmap_resource_range()") through the PCI tree, which includes the relatively trivial architectures. Then the others can go through the appropriate arch tree with more careful review and testing.
Quoted 7 lines
Once everything's done, then we can apply something like the final patch ("pci: Kill
ARCH_GENERIC_PCI_MMAP_RESOURCE"). But that's mostly just there for now as a demonstration of the intended end point.This is in
git://git.infradead.org/users/dwmw2/random-2.6.gitpcimmap
http://git.infradead.org/users/dwmw2/random-2.6.git/shortlog/refs/heads/pcimmap
Applied to pci/resource-mmap for v4.12, thanks!
This consists of the email patches + the acks/etc so far. It doesn't include any updates from your git branch (but it doesn't look like it's been updated recently).
Quoted 71 lines
David Woodhouse (27):
pci: Fixpci_mmap_fits()forHAVE_PCI_RESOURCE_TO_USERplatforms
pci: Fix another sanity check bug in/proc/pcimmap
pci: Only allow WC mmap on prefetchable resources
xtensa: Do not mmap PCI BARs to userspace as write-through
pci: Addarch_can_pci_mmap_wc()macro
pci: Move multiple declarations ofpci_mmap_page_range()to<linux/pci.h>pci: Add
arch_can_pci_mmap_io()on architectures which canmmap()I/O
space
pci: Use BAR index in sysfsattr->privateinstead of resource pointer
pci: Add BAR index argument topci_mmap_page_range()
pci: Addpci_mmap_resource_range()and use it for ARM64
arm: Use genericpci_mmap_resource_range()
cris: Use genericpci_mmap_resource_range()
mips: Use genericpci_mmap_resource_range()
mn10300: Use genericpci_mmap_resource_range()
parisc: Use genericpci_mmap_resource_range()
sh: Use genericpci_mmap_resource_range()
unicore: Use genericpci_mmap_resource_range()
x86: Use genericpci_mmap_resource_range()
pci: Add I/O BAR support to genericpci_mmap_resource_range()
powerpc: Use genericpci_mmap_resource_range()
microblaze: Use genericpci_mmap_resource_range()
xtensa: Use genericpci_mmap_resource_range()
ia64: Remove redundantvalid_mmap_phys_addr_range()from
pci_mmap_page_range()
ia64: Remove redundant checks for WC inpci_mmap_page_range()
ia64: Use genericpci_mmap_resource_range()
sparc: Use genericpci_mmap_resource_range()
pci: KillARCH_GENERIC_PCI_MMAP_RESOURCEDocumentation/filesystems/sysfs-pci.txt | 12 ++- arch/arm/include/asm/pci.h | 2 - arch/arm/kernel/bios32.c | 19 ---- arch/cris/arch-v32/drivers/pci/bios.c | 22 ----- arch/cris/include/asm/pci.h | 3 - arch/ia64/include/asm/pci.h | 4 +- arch/ia64/pci/pci.c | 46 ---------- arch/microblaze/include/asm/pci.h | 8 +- arch/microblaze/pci/pci-common.c | 99 ++------------------ arch/mips/include/asm/pci.h | 4 - arch/mips/pci/pci.c | 24 ----- arch/mn10300/include/asm/pci.h | 3 - arch/mn10300/unit-asb2305/pci-asb2305.c | 23 ----- arch/parisc/include/asm/pci.h | 3 - arch/parisc/kernel/pci.c | 28 ------ arch/powerpc/include/asm/pci.h | 9 +- arch/powerpc/kernel/pci-common.c | 105 +++------------------- arch/sh/drivers/pci/pci.c | 21 ----- arch/sh/include/asm/pci.h | 3 +- arch/sparc/include/asm/pci_64.h | 5 +- arch/sparc/kernel/pci.c | 155 -------------------------------- arch/unicore32/include/asm/pci.h | 2 - arch/unicore32/kernel/pci.c | 23 ----- arch/x86/include/asm/pci.h | 6 +- arch/x86/pci/i386.c | 47 ---------- arch/xtensa/include/asm/pci.h | 9 +- arch/xtensa/kernel/pci.c | 112 ++--------------------- drivers/pci/Makefile | 1 + drivers/pci/mmap.c | 67 ++++++++++++++ drivers/pci/pci-sysfs.c | 76 +++++++--------- drivers/pci/pci.h | 4 +- drivers/pci/proc.c | 41 ++++++--- include/linux/pci.h | 30 +++++++ 33 files changed, 211 insertions(+), 805 deletions(-) create mode 100644 drivers/pci/mmap.cSignature · 1 line
2.9.3
Quoted 35 lines · Bjorn Helgaas
Quoted 26 lines · David Woodhouse
This pursues my previous patch set all the way to its logical conclusion.
It kills off the legacy arch-provided
pci_mmap_page_range()completely, along with its vile 'address converted bypci_resource_to_user()' API and the various bugs and other strange behaviour that various architectures had.In some cases like IA64 I've killed off the odd behaviour *first* in separately reviewable patches, before the final switch over to the generic code which should then basically have no functional effect.
To accommodate the ARM64 maintainers' desire *not* to support mmap through
/proc/bus/pciI have separatedHAVE_PCI_MMAPfrom the sysfs implementation, which (as of the last patch in the series) ends up present on *all* platforms with an MMU. I still don't think that's a *good* idea though; it's a generic part of /proc, and nobody ever did answer my question about what *else* we can delete from /proc on ARM64 "because it's a new platform"...I would very much like the interesting parts of this to go through the arch maintainers' trees. I'd suggest that we can pull everything up to and including patch 19 ("pci: Add I/O BAR support to generic
pci_mmap_resource_range()") through the PCI tree, which includes the relatively trivial architectures. Then the others can go through the appropriate arch tree with more careful review and testing.Quoted 7 lines
Once everything's done, then we can apply something like the final patch ("pci: Kill
ARCH_GENERIC_PCI_MMAP_RESOURCE"). But that's mostly just there for now as a demonstration of the intended end point.This is in
git://git.infradead.org/users/dwmw2/random-2.6.gitpcimmap
http://git.infradead.org/users/dwmw2/random-2.6.git/shortlog/refs/heads/pcimmap
Quoted 5 lines
Applied to pci/resource-mmap for v4.12, thanks!
This consists of the email patches + the acks/etc so far. It doesn't include any updates from your git branch (but it doesn't look like it's been updated recently).
Oops, sorry, I just noticed your desired merge process above.
I removed everything after patch 19 from my branch, so it now contains these patches:
e34bedcbfa71 PCI: Add I/O BAR support to generic pci_mmap_resource_range() 4f27eb90214b x86/PCI: Use generic pci_mmap_resource_range()
192702a91cdc unicore32/PCI: Use generic pci_mmap_resource_range() 11c9d07f5a48 sh/PCI: Use generic pci_mmap_resource_range()
c18dc595e36c parisc: Use generic pci_mmap_resource_range()
f8773c830087 mn10300/PCI: Use generic pci_mmap_resource_range() 93ec50f6955d MIPS: PCI: Use generic pci_mmap_resource_range() e47765a11a38 cris/PCI: Use generic pci_mmap_resource_range()
a2f4dd2b148b ARM/PCI: Use generic pci_mmap_resource_range()
9f97f5c8fb0e PCI: Add pci_mmap_resource_range() and use it for ARM64 4536661783d8 PCI: Add BAR index argument to pci_mmap_page_range() 3e07a66fe61c PCI: Use BAR index in sysfs attr->private instead of resource pointer 416a332dcf00 pci: Add arch_can_pci_mmap_io() on architectures which can mmap() I/O space 11df19546fe4 PCI: Move multiple declarations of pci_mmap_page_range() to <linux/pci.h> ae749c7ab475 PCI: Add arch_can_pci_mmap_wc() macro
03a064b431eb xtensa/PCI: Do not mmap PCI BARs to userspace as write-through cef4d02305a0 PCI: Only allow WC mmap on prefetchable resources 17caf5673131 PCI: Fix another sanity check bug in /proc/pci mmap 6bccc7f426ab PCI: Fix pci_mmap_fits() for HAVE_PCI_RESOURCE_TO_USER platforms
Quoted 71 lines
Quoted 71 lines
David Woodhouse (27):
pci: Fixpci_mmap_fits()forHAVE_PCI_RESOURCE_TO_USERplatforms
pci: Fix another sanity check bug in/proc/pcimmap
pci: Only allow WC mmap on prefetchable resources
xtensa: Do not mmap PCI BARs to userspace as write-through
pci: Addarch_can_pci_mmap_wc()macro
pci: Move multiple declarations ofpci_mmap_page_range()to<linux/pci.h>pci: Add
arch_can_pci_mmap_io()on architectures which canmmap()I/O
space
pci: Use BAR index in sysfsattr->privateinstead of resource pointer
pci: Add BAR index argument topci_mmap_page_range()
pci: Addpci_mmap_resource_range()and use it for ARM64
arm: Use genericpci_mmap_resource_range()
cris: Use genericpci_mmap_resource_range()
mips: Use genericpci_mmap_resource_range()
mn10300: Use genericpci_mmap_resource_range()
parisc: Use genericpci_mmap_resource_range()
sh: Use genericpci_mmap_resource_range()
unicore: Use genericpci_mmap_resource_range()
x86: Use genericpci_mmap_resource_range()
pci: Add I/O BAR support to genericpci_mmap_resource_range()
powerpc: Use genericpci_mmap_resource_range()
microblaze: Use genericpci_mmap_resource_range()
xtensa: Use genericpci_mmap_resource_range()
ia64: Remove redundantvalid_mmap_phys_addr_range()from
pci_mmap_page_range()
ia64: Remove redundant checks for WC inpci_mmap_page_range()
ia64: Use genericpci_mmap_resource_range()
sparc: Use genericpci_mmap_resource_range()
pci: KillARCH_GENERIC_PCI_MMAP_RESOURCEDocumentation/filesystems/sysfs-pci.txt | 12 ++- arch/arm/include/asm/pci.h | 2 - arch/arm/kernel/bios32.c | 19 ---- arch/cris/arch-v32/drivers/pci/bios.c | 22 ----- arch/cris/include/asm/pci.h | 3 - arch/ia64/include/asm/pci.h | 4 +- arch/ia64/pci/pci.c | 46 ---------- arch/microblaze/include/asm/pci.h | 8 +- arch/microblaze/pci/pci-common.c | 99 ++------------------ arch/mips/include/asm/pci.h | 4 - arch/mips/pci/pci.c | 24 ----- arch/mn10300/include/asm/pci.h | 3 - arch/mn10300/unit-asb2305/pci-asb2305.c | 23 ----- arch/parisc/include/asm/pci.h | 3 - arch/parisc/kernel/pci.c | 28 ------ arch/powerpc/include/asm/pci.h | 9 +- arch/powerpc/kernel/pci-common.c | 105 +++------------------- arch/sh/drivers/pci/pci.c | 21 ----- arch/sh/include/asm/pci.h | 3 +- arch/sparc/include/asm/pci_64.h | 5 +- arch/sparc/kernel/pci.c | 155 -------------------------------- arch/unicore32/include/asm/pci.h | 2 - arch/unicore32/kernel/pci.c | 23 ----- arch/x86/include/asm/pci.h | 6 +- arch/x86/pci/i386.c | 47 ---------- arch/xtensa/include/asm/pci.h | 9 +- arch/xtensa/kernel/pci.c | 112 ++--------------------- drivers/pci/Makefile | 1 + drivers/pci/mmap.c | 67 ++++++++++++++ drivers/pci/pci-sysfs.c | 76 +++++++--------- drivers/pci/pci.h | 4 +- drivers/pci/proc.c | 41 ++++++--- include/linux/pci.h | 30 +++++++ 33 files changed, 211 insertions(+), 805 deletions(-) create mode 100644 drivers/pci/mmap.cSignature · 1 line
2.9.3
Quoted 6 lines · Bjorn Helgaas
Applied to pci/resource-mmap for v4.12, thanks!
This consists of the email patches + the acks/etc so far. It doesn't include any updates from your git branch (but it doesn't look like it's been updated recently).
Thanks. Aside from merging the acks, I had also fixed a typo in include/linux/pci.h (s/aroudn/around) and re-ordered the later commits to put the three IA64 changes immediately after the ones you already merged. Tony said it was OK to take those through your tree too.
I've taken your pci/resource-mmap branch, edited it to apply the typo fix, and added the three IA64 commits at
git://git.infradead.org/users/dwmw2/random-2.6.git for-bjorn
http://git.infradead.org/users/dwmw2/random-2.6.git/shortlog/refs/heads/for-bjorn
Bjorn Helgaas
maintainerQuoted 13 lines · David Woodhouse
Quoted 6 lines · Bjorn Helgaas
Applied to pci/resource-mmap for v4.12, thanks!
This consists of the email patches + the acks/etc so far. It doesn't include any updates from your git branch (but it doesn't look like it's been updated recently).
Thanks. Aside from merging the acks, I had also fixed a typo in
include/linux/pci.h(s/aroudn/around) and re-ordered the later commits to put the three IA64 changes immediately after the ones you already merged. Tony said it was OK to take those through your tree too.
Quoted 5 lines
I've taken your pci/resource-mmap branch, edited it to apply the typo fix, and added the three IA64 commits at
git://git.infradead.org/users/dwmw2/random-2.6.gitfor-bjorn
http://git.infradead.org/users/dwmw2/random-2.6.git/shortlog/refs/heads/for-bjorn
I pulled this branch; it's on my pci/resource-mmap branch for v4.12.