Index: sys/arch/arm/arm32/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/arm32/pmap.c,v retrieving revision 1.362 diff -u -p -r1.362 pmap.c --- sys/arch/arm/arm32/pmap.c 17 Jan 2018 20:30:16 -0000 1.362 +++ sys/arch/arm/arm32/pmap.c 22 Jan 2018 11:41:45 -0000 @@ -3704,12 +3704,24 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v } } pmap_release_pmap_lock(kpm); + pt_entry_t npte = L2_S_PROTO | pa | L2_S_PROT(PTE_KERNEL, prot); - pt_entry_t npte = L2_S_PROTO | pa | L2_S_PROT(PTE_KERNEL, prot) - | ((flags & PMAP_NOCACHE) - ? 0 - : ((flags & PMAP_PTE) - ? pte_l2_s_cache_mode_pt : pte_l2_s_cache_mode)); + if (flags & PMAP_PTE) { + KASSERT((flags & PMAP_CACHE_MASK) == 0); + if (!(flags & PMAP_NOCACHE)) + npte |= pte_l2_s_cache_mode_pt; + } else { + switch (flags & PMAP_CACHE_MASK) { + case PMAP_NOCACHE: + break; + case PMAP_WRITE_COMBINE: + npte |= pte_l2_s_wc_mode; + break; + default: + npte |= pte_l2_s_cache_mode; + break; + } + } #ifdef ARM_MMU_EXTENDED if (prot & VM_PROT_EXECUTE) npte &= ~L2_XS_XN; Index: sys/arch/arm/broadcom/bcm2835_space.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm2835_space.c,v retrieving revision 1.14 diff -u -p -r1.14 bcm2835_space.c --- sys/arch/arm/broadcom/bcm2835_space.c 10 Dec 2017 21:38:26 -0000 1.14 +++ sys/arch/arm/broadcom/bcm2835_space.c 22 Jan 2018 11:41:46 -0000 @@ -533,6 +533,7 @@ bcm283x_bs_map(void *t, bus_addr_t ba, b bus_space_handle_t *bshp) { u_long startpa, endpa, pa; + int pmapflags; vaddr_t va; /* Convert BA to PA */ @@ -550,10 +551,13 @@ bcm283x_bs_map(void *t, bus_addr_t ba, b *bshp = (bus_space_handle_t)(va + (pa - startpa)); - const int pmapflags = - (flag & (BUS_SPACE_MAP_CACHEABLE|BUS_SPACE_MAP_PREFETCHABLE)) - ? 0 - : PMAP_NOCACHE; + if (flag & BUS_SPACE_MAP_PREFETCHABLE) + pmapflags = PMAP_WRITE_COMBINE; + else if (flag & BUS_SPACE_MAP_CACHEABLE) + pmapflags = 0; + else + pmapflags = PMAP_NOCACHE; + for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) { pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, pmapflags); }