diff --git a/sys/arm64/arm64/bus_machdep.c b/sys/arm64/arm64/bus_machdep.c index bce20f8eb6d4..341b9db018d0 100644 --- a/sys/arm64/arm64/bus_machdep.c +++ b/sys/arm64/arm64/bus_machdep.c @@ -39,6 +39,9 @@ __FBSDID("$FreeBSD$"); #include +#include +#include + uint8_t generic_bs_r_1(void *, bus_space_handle_t, bus_size_t); uint16_t generic_bs_r_2(void *, bus_space_handle_t, bus_size_t); uint32_t generic_bs_r_4(void *, bus_space_handle_t, bus_size_t); @@ -105,6 +108,8 @@ generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, ma = VM_MEMATTR_DEVICE; if (flags == BUS_SPACE_MAP_NONPOSTED) ma = VM_MEMATTR_DEVICE_NP; + else if (flags == BUS_SPACE_MAP_POSTED) + ma = VM_MEMATTR_DEVICE_nGnRE; va = pmap_mapdev_attr(bpa, size, ma); if (va == NULL) return (ENOMEM); diff --git a/sys/arm64/arm64/nexus.c b/sys/arm64/arm64/nexus.c index 52bf832c02d7..1f35a8682c79 100644 --- a/sys/arm64/arm64/nexus.c +++ b/sys/arm64/arm64/nexus.c @@ -364,6 +364,9 @@ nexus_activate_resource_flags(device_t bus, device_t child, int type, int rid, resource_init_map_request(&args); if ((flags & BUS_SPACE_MAP_NONPOSTED) != 0) args.memattr = VM_MEMATTR_DEVICE_NP; + else if ((flags & BUS_SPACE_MAP_POSTED) != 0) { + args.memattr = VM_MEMATTR_DEVICE_nGnRE; + } err = nexus_map_resource(bus, child, type, r, &args, &map); if (err != 0) { @@ -546,6 +549,11 @@ nexus_fdt_activate_resource(device_t bus, device_t child, int type, int rid, flags |= BUS_SPACE_MAP_NONPOSTED; } } + + devclass_t pci_class = devclass_find("bge"); + if (device_get_devclass(child) == pci_class) { + flags |= BUS_SPACE_MAP_POSTED; + } break; default: break; diff --git a/sys/arm64/include/bus.h b/sys/arm64/include/bus.h index 902be0db3b62..bb469c417756 100644 --- a/sys/arm64/include/bus.h +++ b/sys/arm64/include/bus.h @@ -86,6 +86,7 @@ #define BUS_SPACE_MAP_LINEAR 0x02 #define BUS_SPACE_MAP_PREFETCHABLE 0x04 #define BUS_SPACE_MAP_NONPOSTED 0x08 +#define BUS_SPACE_MAP_POSTED 0x10 #define BUS_SPACE_UNRESTRICTED (~0)