Skip to contentSkip to conversation

arm64: pci: add support for pci_mmap_page_range

PATCH Superseded Jerin Jacob 4 participants 18 messages Apr 13, 2016 – Mar 20, 2017

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Certain X11 servers and user space network drivers frameworks need PCI mmaped /sys/bus/pci/devices/B:D:F/resourceX file to access PCI bar address space from user space.

---
Changes in v2:
- Rebased to 4.6.0-rc3.
- Tested and verified the change on Thunderx and xgene1 arm64 platforms

 arch/arm64/include/asm/pci.h |  6 ++++++
 arch/arm64/kernel/pci.c      | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)
arch/arm64/include/asm/pci.h +6 -0
index b9a7ba9..9d7e460 100644
@@ -37,5 +37,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 }
 #endif  /* CONFIG_PCI */
 
+#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  /* __ASM_PCI_H */
arch/arm64/kernel/pci.c +20 -0
index c72de66..be7ddf1 100644
@@ -82,3 +82,23 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 	return NULL;
 }
 #endif
+
+int pci_mmap_page_range(struct pci_dev *dev, 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;
+
+	if (write_combine)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+	else
+		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);
+}
Signature · 1 line
2.1.0
#1 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 19 lines · Jerin Jacob

Certain X11 servers and user space network drivers frameworks need PCI mmaped /sys/bus/pci/devices/B:D:F/resourceX file to access PCI bar address space from user space.

---
Changes in v2:
- Rebased to 4.6.0-rc3.
- Tested and verified the change on Thunderx and xgene1 arm64 platforms

 arch/arm64/include/asm/pci.h |  6 ++++++
 arch/arm64/kernel/pci.c      | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)
arch/arm64/include/asm/pci.h +0 -0
index b9a7ba9..9d7e460 100644

arch/arm64/include/asm/pci.h static inline int pci_proc_domain(struct pci_bus *bus) · line 40

Quoted 4 lines
arch/arm64/include/asm/pci.h +1 -0
@@ -37,5 +37,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 }
 #endif  /* CONFIG_PCI */
 
+#define HAVE_PCI_MMAP

By defining this symbol, we also get lumbered with the legacy /proc interface, which I'd be keen to avoid exposing until we have people explicitly asking for it.

Any chance you could expose only the /sysfs interface on arm64?

Quoted 21 lines
arch/arm64/include/asm/pci.h +5 -0
+
+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  /* __ASM_PCI_H */
arch/arm64/kernel/pci.c +6 -0
index c72de66..be7ddf1 100644
@@ -82,3 +82,23 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 	return NULL;
 }
 #endif
+
+int pci_mmap_page_range(struct pci_dev *dev, 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

arch/arm64/kernel/pci.c struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) · line 100

Quoted 10 lines
arch/arm64/kernel/pci.c +10 -0
+	* 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)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+	else
+		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

For consistency with ioremap, this should be pgprot_device.

Will

#2 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 23 lines · On Friday 15 April 2016 14:09:53 Will Deacon wrote:
Quoted 22 lines · Jerin Jacob

Certain X11 servers and user space network drivers frameworks need PCI mmaped /sys/bus/pci/devices/B:D:F/resourceX file to access PCI bar address space from user space.

---
Changes in v2:
- Rebased to 4.6.0-rc3.
- Tested and verified the change on Thunderx and xgene1 arm64 platforms

 arch/arm64/include/asm/pci.h |  6 ++++++
 arch/arm64/kernel/pci.c      | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)
arch/arm64/include/asm/pci.h +0 -0
index b9a7ba9..9d7e460 100644
@@ -37,5 +37,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 }
 #endif  /* CONFIG_PCI */
 
Quoted 8 lines

arch/arm64/include/asm/pci.h static inline int pci_proc_domain(struct pci_bus *bus) · line 40

Quoted 1 line
arch/arm64/include/asm/pci.h +1 -0
+#define HAVE_PCI_MMAP

By defining this symbol, we also get lumbered with the legacy /proc interface, which I'd be keen to avoid exposing until we have people explicitly asking for it.

Any chance you could expose only the /sysfs interface on arm64?

Do we have an idea how much user space code is affected by this? Maybe it can instead be changed to use VFIO, which is basically the current way to do this.

Arnd

#3 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 30 lines · Arnd Bergmann
Quoted 29 lines · On Friday 15 April 2016 14:09:53 Will Deacon wrote:
Quoted 19 lines · Jerin Jacob

Certain X11 servers and user space network drivers frameworks need PCI mmaped /sys/bus/pci/devices/B:D:F/resourceX file to access PCI bar address space from user space.

---
Changes in v2:
- Rebased to 4.6.0-rc3.
- Tested and verified the change on Thunderx and xgene1 arm64 platforms

 arch/arm64/include/asm/pci.h |  6 ++++++
 arch/arm64/kernel/pci.c      | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)
arch/arm64/include/asm/pci.h +0 -0
index b9a7ba9..9d7e460 100644

arch/arm64/include/asm/pci.h static inline int pci_proc_domain(struct pci_bus *bus) · line 40

Quoted 4 lines
arch/arm64/include/asm/pci.h +1 -0
@@ -37,5 +37,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 }
 #endif  /* CONFIG_PCI */
 
+#define HAVE_PCI_MMAP

By defining this symbol, we also get lumbered with the legacy /proc interface, which I'd be keen to avoid exposing until we have people explicitly asking for it.

Quoted 6 lines
Quoted 2 lines

Any chance you could expose only the /sysfs interface on arm64?

Do we have an idea how much user space code is affected by this? Maybe it can instead be changed to use VFIO, which is basically the current way to do this.

Yes, after the introduction of vfio-noiommu mode almost all uses case can be addressed with vfio. But still their are userspace applications uses /sysfs scheme.

Regarding existing user space applications,
AFAIK, DPDK has the feature to support both /sysfs and vifo scheme. X11 uses only /sysfs scheme.

IMO, Nothing wrong in providing this feature in arm64 kernel. Except arm64, almost all the major architecture has this support.

Jerin

Quoted 2 lines

Arnd

#4 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 6 lines · On Monday 18 April 2016 19:31:20 Jerin Jacob wrote:

Regarding existing user space applications,
AFAIK, DPDK has the feature to support both /sysfs and vifo scheme. X11 uses only /sysfs scheme.

IMO, Nothing wrong in providing this feature in arm64 kernel. Except arm64, almost all the major architecture has this support.

My understanding was that it's considered deprecated and only supported for backwards compatibility, but now I can't find any indication of that in the source code and I don't know if that is actually the case.

I agree with Will that we should not expose the procfs interface, it's just far too ugly.

Arnd

#5 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 8 lines · Arnd Bergmann
Quoted 6 lines · On Monday 18 April 2016 19:31:20 Jerin Jacob wrote:

Regarding existing user space applications,
AFAIK, DPDK has the feature to support both /sysfs and vifo scheme. X11 uses only /sysfs scheme.

IMO, Nothing wrong in providing this feature in arm64 kernel. Except arm64, almost all the major architecture has this support.

Quoted 7 lines

My understanding was that it's considered deprecated and only supported for backwards compatibility, but now I can't find any indication of that in the source code and I don't know if that is actually the case.

I agree with Will that we should not expose the procfs interface, it's just far too ugly.

Me too agree with Will and I don't like it either.
My point was, Irrespective of this change, the /proc/bus/pci/*/* entries will be created. i.e disabling /proc/bus/pci should be a seprate patch and it does not depend on this patch.

Quoted 2 lines

Arnd

#6 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 14 lines · On Monday 18 April 2016 20:23:49 Jerin Jacob wrote:
Quoted 13 lines · Arnd Bergmann
Quoted 6 lines · On Monday 18 April 2016 19:31:20 Jerin Jacob wrote:

Regarding existing user space applications,
AFAIK, DPDK has the feature to support both /sysfs and vifo scheme. X11 uses only /sysfs scheme.

IMO, Nothing wrong in providing this feature in arm64 kernel. Except arm64, almost all the major architecture has this support.

My understanding was that it's considered deprecated and only supported for backwards compatibility, but now I can't find any indication of that in the source code and I don't know if that is actually the case.

Quoted 7 lines
Quoted 2 lines

I agree with Will that we should not expose the procfs interface, it's just far too ugly.

Me too agree with Will and I don't like it either.
My point was, Irrespective of this change, the /proc/bus/pci/*/* entries will be created. i.e disabling /proc/bus/pci should be a seprate patch and it does not depend on this patch.

The problem is that once we allow mmap() on proc/bus/pci/*/*, it becomes much harder to prove that we are able to remove it again without breaking stuff that worked.

We have to decouple the sysfs interface from the procfs interface before we allow the former.

Arnd

#7 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 18 lines · Arnd Bergmann
Quoted 17 lines · On Monday 18 April 2016 20:23:49 Jerin Jacob wrote:
Quoted 15 lines · Arnd Bergmann
Quoted 6 lines · On Monday 18 April 2016 19:31:20 Jerin Jacob wrote:

Regarding existing user space applications,
AFAIK, DPDK has the feature to support both /sysfs and vifo scheme. X11 uses only /sysfs scheme.

IMO, Nothing wrong in providing this feature in arm64 kernel. Except arm64, almost all the major architecture has this support.

My understanding was that it's considered deprecated and only supported for backwards compatibility, but now I can't find any indication of that in the source code and I don't know if that is actually the case.

I agree with Will that we should not expose the procfs interface, it's just far too ugly.

Quoted 8 lines
Quoted 4 lines

Me too agree with Will and I don't like it either.
My point was, Irrespective of this change, the /proc/bus/pci/*/* entries will be created. i.e disabling /proc/bus/pci should be a seprate patch and it does not depend on this patch.

The problem is that once we allow mmap() on proc/bus/pci/*/*, it becomes much harder to prove that we are able to remove it again without breaking stuff that worked.

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other services offered though proc/bus/pci/ like config space read, /proc/bus/pci/devices etc

if a given platform not interested in proc fs then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Jerin

Quoted 5 lines

We have to decouple the sysfs interface from the procfs interface before we allow the former.

Arnd

#8 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 8 lines · On Monday 18 April 2016 20:51:27 Jerin Jacob wrote:

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other services offered though proc/bus/pci/ like config space read, /proc/bus/pci/devices etc

if a given platform not interested in proc fs then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Disabling CONFIG_PROC_FS is not really an option for anybody.

The config space access may be something we should have disabled, or it may not be, but I think it's too late to kill that off now, as that would likely break something.

The mmap() support on those files is way uglier than the config access, so as long as nobody absolutely requires it, we should not add it to the list of things we can't get rid of again.

Arnd

#9 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 12 lines · Arnd Bergmann
Quoted 8 lines · On Monday 18 April 2016 20:51:27 Jerin Jacob wrote:

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other services offered though proc/bus/pci/ like config space read, /proc/bus/pci/devices etc

if a given platform not interested in proc fs then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Disabling CONFIG_PROC_FS is not really an option for anybody.

Quoted 7 lines

The config space access may be something we should have disabled, or it may not be, but I think it's too late to kill that off now, as that would likely break something.

The mmap() support on those files is way uglier than the config access, so as long as nobody absolutely requires it, we should not add it to the list of things we can't get rid of again.

Completely agreed. IIRC, there's some unspeakable ioctl() magic to configure the memory type that the BARs are mapped with via the /proc interface and I *really* don't want that on arm64.

Will

#10 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 17 lines · Will Deacon
Quoted 16 lines · Arnd Bergmann
Quoted 8 lines · On Monday 18 April 2016 20:51:27 Jerin Jacob wrote:

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other services offered though proc/bus/pci/ like config space read, /proc/bus/pci/devices etc

if a given platform not interested in proc fs then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Disabling CONFIG_PROC_FS is not really an option for anybody.

The config space access may be something we should have disabled, or it may not be, but I think it's too late to kill that off now, as that would likely break something.

Quoted 7 lines
Quoted 3 lines

The mmap() support on those files is way uglier than the config access, so as long as nobody absolutely requires it, we should not add it to the list of things we can't get rid of again.

Completely agreed. IIRC, there's some unspeakable ioctl() magic to configure the memory type that the BARs are mapped with via the /proc interface and I *really* don't want that on arm64.

But do you think introducing a conditional compilation flag or weak function or arch specific function to disable pci proc fs mmap support in the generic code will be acceptable?

Quoted 2 lines

Will

#11 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 22 lines · On Monday 18 April 2016 23:15:36 Jerin Jacob wrote:
Quoted 21 lines · Will Deacon
Quoted 19 lines · Arnd Bergmann
Quoted 8 lines · On Monday 18 April 2016 20:51:27 Jerin Jacob wrote:

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other services offered though proc/bus/pci/ like config space read, /proc/bus/pci/devices etc

if a given platform not interested in proc fs then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Disabling CONFIG_PROC_FS is not really an option for anybody.

The config space access may be something we should have disabled, or it may not be, but I think it's too late to kill that off now, as that would likely break something.

The mmap() support on those files is way uglier than the config access, so as long as nobody absolutely requires it, we should not add it to the list of things we can't get rid of again.

Quoted 8 lines
Quoted 3 lines

Completely agreed. IIRC, there's some unspeakable ioctl() magic to configure the memory type that the BARs are mapped with via the /proc interface and I *really* don't want that on arm64.

But do you think introducing a conditional compilation flag or weak function or arch specific function to disable pci proc fs mmap support in the generic code will be acceptable?

Flag yes, weak function no.

Arnd

#12 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

In reply to Arnd Bergmann
Quoted 13 lines · Arnd Bergmann
Quoted 10 lines · On Monday 18 April 2016 20:51:27 Jerin Jacob wrote:

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other??services offered though proc/bus/pci/ like config space read,
/proc/bus/pci/devices etc

if a given platform not interested in proc fs??then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Disabling CONFIG_PROC_FS is not really an option for anybody.

Quoted 7 lines

The config space access may be something we should have disabled, or it may not be, but I think it's too late to kill that off now, as that would likely break something.

The mmap() support on those files is way uglier than the config access, so as long as nobody absolutely requires it, we should not add it to the list of things we can't get rid of again.

I don't think we should be doing this. You may have guessed that from my... less than sympathetic... implementation of it in the patch I just sent.

The thing is, this *isn't* an architecture-specific interface where you get a clean slate. It's a cross-platform interface. Legacy and horrid, sure. But it does you no harm.

What *else* don't you like having in /proc? Shall we have a clean slate
and eliminate *everything* other than actual processes from /proc for
the next architecture we add to the tree? If not, why not?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4938 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170315/6a3ba016/attachment-0001.bin>

#13 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 22 lines · David Woodhouse
Quoted 13 lines · Arnd Bergmann
Quoted 10 lines · On Monday 18 April 2016 20:51:27 Jerin Jacob wrote:

Why only to disable mmap() serivce in proc/bus/pci/*/*. Why not other??services offered though proc/bus/pci/ like config space read,
/proc/bus/pci/devices etc

if a given platform not interested in proc fs??then disable through CONFIG_PROC_FS in defconfig. I don't understand the logic behind disabling partial services that proc fs exposes.

Disabling CONFIG_PROC_FS is not really an option for anybody.

Quoted 7 lines

The config space access may be something we should have disabled, or it may not be, but I think it's too late to kill that off now, as that would likely break something.

The mmap() support on those files is way uglier than the config access, so as long as nobody absolutely requires it, we should not add it to the list of things we can't get rid of again.

Quoted 7 lines

I don't think we should be doing this. You may have guessed that from my... less than sympathetic... implementation of it in the patch I just sent.

The thing is, this *isn't* an architecture-specific interface where you get a clean slate. It's a cross-platform interface. Legacy and horrid, sure. But it does you no harm.

I don't agree with that: it provides (privileged) userspace with a way to map non-prefetchable BARs using write-combining memory attributes, which could lead to mismatched memory attributes against a kernel mapping of the same BAR and is something that you can't achieve using the sysfs API.

Quoted 3 lines

What *else* don't you like having in /proc? Shall we have a clean slate and eliminate *everything* other than actual processes from /proc for the next architecture we add to the tree? If not, why not?

It's not about what we like and don't like in /proc, it's about not promoting legacy that we don't need. If somebody actually needs the /proc interface, fine, we can support it. But all the people asking for this have been concerned solely about the sysfs interface, so I'd just like the two divorced from each other so that we can provide what people are asking for without pulling in a deprecated interface at the same time.

This should be straightforward.

Will

#14 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 8 lines · Will Deacon
Quoted 3 lines

The thing is, this *isn't* an architecture-specific interface where you get a clean slate. It's a cross-platform interface. Legacy and horrid, sure. But it does you no harm.

I don't agree with that: it provides (privileged) userspace with a way to map non-prefetchable BARs using write-combining memory attributes, which could lead to mismatched memory attributes against a kernel mapping of the same BAR and is something that you can't achieve using the sysfs API.

I think that's just a bug. I'll add it to my list. We shouldn't be allowing a WC mapping on a non-prefetchable resource, should we?

For that matter, I think it allows you mmap a range of MMIO addresses that correspond to an I/O BAR, and on platforms which allow pci_mmap_io, the converse. That seems... suboptimal.
?

Quoted 11 lines
Quoted 3 lines

What *else* don't you like having in /proc? Shall we have a clean slate and eliminate *everything* other than actual processes from /proc for the next architecture we add to the tree? If not, why not?

It's not about what we like and don't like in /proc, it's about not promoting legacy that we don't need. If somebody actually needs the /proc interface, fine, we can support it. But all the people asking for this have been concerned solely about the sysfs interface, so I'd just like the two divorced from each other so that we can provide what people are asking for without pulling in a deprecated interface at the same time.

This should be straightforward.

Sure, but fairly much orthogonal. I'll roll it in. It's fairly much in
the noise now I'm this far down the rabbithole...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4938 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170320/fb220219/attachment.bin>

#15 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

In reply to Will Deacon
Quoted 23 lines · Will Deacon
Quoted 22 lines · Jerin Jacob

Certain X11 servers and user space network drivers frameworks need PCI mmaped /sys/bus/pci/devices/B:D:F/resourceX file to access PCI bar address space from user space.

---
Changes in v2:
- Rebased to 4.6.0-rc3.
- Tested and verified the change on Thunderx and xgene1 arm64 platforms

 arch/arm64/include/asm/pci.h |  6 ++++++
 arch/arm64/kernel/pci.c      | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)
arch/arm64/include/asm/pci.h +0 -0
index b9a7ba9..9d7e460 100644
@@ -37,5 +37,11 @@ static inline int pci_proc_domain(struct pci_bus *bus)
 }
 #endif  /* CONFIG_PCI */
 
Quoted 5 lines

arch/arm64/include/asm/pci.h static inline int pci_proc_domain(struct pci_bus *bus) · line 40

Quoted 1 line
arch/arm64/include/asm/pci.h +1 -0
+#define HAVE_PCI_MMAP

By defining this symbol, we also get lumbered with the legacy /proc interface, which I'd be keen to avoid exposing until we have people explicitly asking for it.

AFAIK, /proc/bus/pci/* proc entry files will be created irrespective of HAVE_PCI_MMAP, But mmap capability added only when HAVE_PCI_MMAP selected.

Quoted 3 lines

Any chance you could expose only the /sysfs interface on arm64?

AFAIK, With existing generic code infrastructure its is not possible. IMO, Introducing yet another kernel configuration or weak function to disable in the /proc/ entries in the generic code may not be a good idea.

Quoted 25 lines
Quoted 25 lines
arch/arm64/include/asm/pci.h +5 -0
+
+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  /* __ASM_PCI_H */
arch/arm64/kernel/pci.c +10 -0
index c72de66..be7ddf1 100644
@@ -82,3 +82,23 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 	return NULL;
 }
 #endif
+
+int pci_mmap_page_range(struct pci_dev *dev, 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)
Quoted 8 lines

arch/arm64/kernel/pci.c struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) · line 100

Quoted 6 lines
arch/arm64/kernel/pci.c +6 -0
+		return -EINVAL;
+
+	if (write_combine)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+	else
+		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

For consistency with ioremap, this should be pgprot_device.

Will fix it in v3.

Quoted 2 lines

Will

#16 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

In reply to Will Deacon
Quoted 7 lines · Will Deacon
Quoted 5 lines

+?????if (write_combine)
+?????????????vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); +?????else
+?????????????vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

For consistency with ioremap, this should be pgprot_device.

What's the difference?

I note that VFIO is using pgprot_noncached() too, in vfio_pci_mmap() ? where it open-codes an entirely arch-agnostic version of pci_mmap_page_range() all for itself. Should that be changed to pgprot_device() too?

Let me see if I can get this straight...

We have the legacy interface through /proc/bus/pci, where the user passes a "user-visible" bus address not necessarily (on platforms with HAVE_PCI_RESOURCE_TO_USER) a host physical address.

The arch-specific pci_mmap_page_range() exists to work around that translation, on the two platforms which need it. It *also* has (on about three platforms) support for a write-combining mapping.

The sysfs interface theough /sys/bus/pci/devices/*/resource* probably doesn't need to use pci_mmap_page_range() at all, *except* for the 'resourceX_wc' variant which has write-combining support.

How about we do the following (probably not in this order):
?? Kill pci_mmap_page_range() entirely.
?? Implement a generic version which has (arch-assisted) WC support ? ?but no knowledge of the horrid pci_resource_to_user() mapping. ?? Require pci_user_to_resource() to be provided by platforms with ? ?HAVE_ARCH_PCI_RESOURCE_TO_USER, and call that from *generic* code, ? ?for the legacy procfs interface, before invoking the generic ? ?replacement for pci_mmap_page_range().

(Yes, we still need to support mmap of I/O resources on... is it only powerpc? And there are a few inconsistencies, like powerpc forcing WC even on the sysfs files that *don't* have _wc in their name, that probably want to be cleaned up as we consolidate...)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4938 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20170316/f016edd6/attachment.bin>

#17 lore raw

PATCH v2 1/1 arm64: pci: add support for pci_mmap_page_range

Quoted 10 lines · David Woodhouse
Quoted 7 lines · Will Deacon
Quoted 5 lines

+?????if (write_combine)
+?????????????vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); +?????else
+?????????????vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

For consistency with ioremap, this should be pgprot_device.

What's the difference?

The different between ioremap (which used pgprot_device) and a mapping created using pgprot_noncached is that the former allows for early acknowledgement of writes (e.g. at a bridge). See this recent series from Lorenzo that is also trying to clean this up:

http://lkml.kernel.org/r/20170227151436.18698-1-lorenzo.pieralisi at arm.com

Quoted 4 lines

I note that VFIO is using pgprot_noncached() too, in vfio_pci_mmap() ? where it open-codes an entirely arch-agnostic version of pci_mmap_page_range() all for itself. Should that be changed to pgprot_device() too?

I think so. At least, on arm64, pgprot_noncached is only really needed for PCI config space and "I don't know that this is, but I'm going to map it anyway" regions in /dev/mem.

Quoted 23 lines

Let me see if I can get this straight...

We have the legacy interface through /proc/bus/pci, where the user passes a "user-visible" bus address not necessarily (on platforms with HAVE_PCI_RESOURCE_TO_USER) a host physical address.

The arch-specific pci_mmap_page_range() exists to work around that translation, on the two platforms which need it. It *also* has (on about three platforms) support for a write-combining mapping.

The sysfs interface theough /sys/bus/pci/devices/*/resource* probably doesn't need to use pci_mmap_page_range() at all, *except* for the 'resourceX_wc' variant which has write-combining support.

How about we do the following (probably not in this order):
?? Kill pci_mmap_page_range() entirely.
?? Implement a generic version which has (arch-assisted) WC support ? ?but no knowledge of the horrid pci_resource_to_user() mapping. ?? Require pci_user_to_resource() to be provided by platforms with ? ?HAVE_ARCH_PCI_RESOURCE_TO_USER, and call that from *generic* code, ? ?for the legacy procfs interface, before invoking the generic ? ?replacement for pci_mmap_page_range().

Quoted 4 lines

(Yes, we still need to support mmap of I/O resources on... is it only powerpc? And there are a few inconsistencies, like powerpc forcing WC even on the sysfs files that *don't* have _wc in their name, that probably want to be cleaned up as we consolidate...)

Happy to review patches :)

Will