Page MenuHomeFreeBSD

D29722.id88463.diff
No OneTemporary

D29722.id88463.diff

diff --git a/share/man/man9/bus_space.9 b/share/man/man9/bus_space.9
--- 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 @@
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
--- a/sys/arm64/arm64/bus_machdep.c
+++ b/sys/arm64/arm64/bus_machdep.c
@@ -99,9 +99,13 @@
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
--- 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
--- 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
--- a/usr.bin/vmstat/vmstat.c
+++ b/usr.bin/vmstat/vmstat.c
@@ -1570,6 +1570,9 @@
#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

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 7, 4:26 AM (22 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31010964
Default Alt Text
D29722.id88463.diff (2 KB)

Event Timeline