git: 2abd4f858146 - main - Add a way to map arm64 non-posted device memory
Andrew Turner
andrew at FreeBSD.org
Sat May 1 08:25:21 UTC 2021
The branch main has been updated by andrew:
URL: https://cgit.FreeBSD.org/src/commit/?id=2abd4f858146a266d48e3c55c2e29376e8b00967
commit 2abd4f858146a266d48e3c55c2e29376e8b00967
Author: Andrew Turner <andrew at FreeBSD.org>
AuthorDate: 2021-04-08 11:54:20 +0000
Commit: Andrew Turner <andrew at FreeBSD.org>
CommitDate: 2021-05-01 06:01:20 +0000
Add a way to map arm64 non-posted device memory
On arm64 we currently use a non-posted write for device memory, however
we should move to use posted writes. This is expected to work on most
hardware, however we will need to support a non-posted option for some
broken hardware.
Reviewed by: imp, manu, bcr (manpage)
Differential Revision: https://reviews.freebsd.org/D29722
---
share/man/man9/bus_space.9 | 7 ++++++-
sys/arm64/arm64/bus_machdep.c | 6 +++++-
sys/arm64/include/bus.h | 1 +
sys/arm64/include/vm.h | 5 +++++
usr.bin/vmstat/vmstat.c | 3 +++
5 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/share/man/man9/bus_space.9 b/share/man/man9/bus_space.9
index 80e041dea4eb..9d5ca602acfe 100644
--- a/share/man/man9/bus_space.9
+++ b/share/man/man9/bus_space.9
@@ -52,7 +52,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 7, 2020
+.Dd May 1, 2021
.Dt BUS_SPACE 9
.Os
.Sh NAME
@@ -876,6 +876,11 @@ call should fail.
If this
flag is not specified, the system may map the space in whatever way is
most convenient.
+.It Dv BUS_SPACE_MAP_NONPOSTED
+Try to map the space using non-posted device memory.
+This is to support buses and devices where mapping with posted device
+memory is unsupported or broken.
+This flag is currently only available on arm64.
.El
.Pp
Not all combinations of flags make sense or are supported with all
diff --git a/sys/arm64/arm64/bus_machdep.c b/sys/arm64/arm64/bus_machdep.c
index 69d7c5b591b2..b2136af38cad 100644
--- a/sys/arm64/arm64/bus_machdep.c
+++ b/sys/arm64/arm64/bus_machdep.c
@@ -99,9 +99,13 @@ static int
generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
bus_space_handle_t *bshp)
{
+ vm_memattr_t ma;
void *va;
- va = pmap_mapdev(bpa, size);
+ ma = VM_MEMATTR_DEVICE;
+ if (flags == BUS_SPACE_MAP_NONPOSTED)
+ ma = VM_MEMATTR_DEVICE_NP;
+ va = pmap_mapdev_attr(bpa, size, ma);
if (va == NULL)
return (ENOMEM);
*bshp = (bus_space_handle_t)va;
diff --git a/sys/arm64/include/bus.h b/sys/arm64/include/bus.h
index a2bd432a5de5..61573b27728d 100644
--- a/sys/arm64/include/bus.h
+++ b/sys/arm64/include/bus.h
@@ -85,6 +85,7 @@
#define BUS_SPACE_MAP_CACHEABLE 0x01
#define BUS_SPACE_MAP_LINEAR 0x02
#define BUS_SPACE_MAP_PREFETCHABLE 0x04
+#define BUS_SPACE_MAP_NONPOSTED 0x08
#define BUS_SPACE_UNRESTRICTED (~0)
diff --git a/sys/arm64/include/vm.h b/sys/arm64/include/vm.h
index 3df3af24c010..e479aab52e26 100644
--- a/sys/arm64/include/vm.h
+++ b/sys/arm64/include/vm.h
@@ -36,7 +36,12 @@
#define VM_MEMATTR_WRITE_THROUGH 3
#define VM_MEMATTR_DEVICE_nGnRE 4
+/*
+ * VM_MEMATTR_DEVICE can be changed to VM_MEMATTR_DEVICE_nGnRE when
+ * the PCI drivers use VM_MEMATTR_DEVICE_NP for their config space.
+ */
#define VM_MEMATTR_DEVICE VM_MEMATTR_DEVICE_nGnRnE
+#define VM_MEMATTR_DEVICE_NP VM_MEMATTR_DEVICE_nGnRnE
#ifdef _KERNEL
/* If defined vmstat will try to use both of these in a switch statement */
diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c
index 403dc6e2a054..ba1dc9eef883 100644
--- a/usr.bin/vmstat/vmstat.c
+++ b/usr.bin/vmstat/vmstat.c
@@ -1570,6 +1570,9 @@ display_object(struct kinfo_vmobject *kvo)
#ifdef VM_MEMATTR_DEVICE
MEMATTR_STR(VM_MEMATTR_DEVICE, "DEV")
#endif
+#ifdef VM_MEMATTR_DEVICE_NP
+ MEMATTR_STR(VM_MEMATTR_DEVICE, "NP")
+#endif
#ifdef VM_MEMATTR_CACHEABLE
MEMATTR_STR(VM_MEMATTR_CACHEABLE, "C")
#endif
More information about the dev-commits-src-main
mailing list