Module Name: src Committed By: jmcneill Date: Thu Aug 1 13:13:51 UTC 2019
Modified Files: src/sys/arch/arm/acpi: acpi_machdep.c Log Message: acpi_md_OsMapMemory can be used for both normal and device memory. Use the UEFI memory map to determine how to map a given region. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/acpi/acpi_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/acpi/acpi_machdep.c diff -u src/sys/arch/arm/acpi/acpi_machdep.c:1.6 src/sys/arch/arm/acpi/acpi_machdep.c:1.7 --- src/sys/arch/arm/acpi/acpi_machdep.c:1.6 Fri Nov 16 23:03:55 2018 +++ src/sys/arch/arm/acpi/acpi_machdep.c Thu Aug 1 13:13:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_machdep.c,v 1.6 2018/11/16 23:03:55 jmcneill Exp $ */ +/* $NetBSD: acpi_machdep.c,v 1.7 2019/08/01 13:13:51 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #include "pci.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.6 2018/11/16 23:03:55 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.7 2019/08/01 13:13:51 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -50,6 +50,8 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_machdep #include <dev/acpi/acpi_mcfg.h> #endif +#include <arm/arm/efi_runtime.h> + #include <arm/pic/picvar.h> #include <arm/locore.h> @@ -58,6 +60,45 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_machdep extern struct bus_space arm_generic_bs_tag; +static int +acpi_md_pmapflags(paddr_t pa) +{ + int len; + + const int chosen = OF_finddevice("/chosen"); + if (chosen == -1) + return 0; + + const uint32_t *map = fdtbus_get_prop(chosen, "netbsd,uefi-memmap", &len); + if (map == NULL) + return 0; + + while (len >= 28) { + const uint64_t phys_start = be64dec(&map[1]); + const uint64_t num_pages = be64dec(&map[3]); + const uint64_t attr = be64dec(&map[5]); + + if (pa >= phys_start && pa < phys_start + (num_pages * EFI_PAGE_SIZE)) { + if ((attr & EFI_MD_ATTR_UC) != 0) + return PMAP_DEV; /* Not cacheable means Device-nGnRnE */ + else if ((attr & EFI_MD_ATTR_WC) != 0) + return PMAP_WRITE_COMBINE; + else if ((attr & EFI_MD_ATTR_WT) != 0) + return 0; /* XXX */ + else if ((attr & EFI_MD_ATTR_WB) != 0) + return PMAP_WRITE_BACK; + else + return PMAP_DEV; + } + + map += 7; + len -= 28; + } + + /* Not found; assume device memory */ + return PMAP_DEV; +} + ACPI_STATUS acpi_md_OsInitialize(void) { @@ -105,8 +146,12 @@ acpi_md_OsMapMemory(ACPI_PHYSICAL_ADDRES if (va == 0) return AE_NO_MEMORY; + const int pmapflags = acpi_md_pmapflags(spa); + + aprint_debug("%s: 0x%lx 0x%x flags = %#x\n", __func__, pa, size, pmapflags); + for (curpa = spa, curva = va; curpa < epa; curpa += PAGE_SIZE, curva += PAGE_SIZE) - pmap_kenter_pa(curva, curpa, VM_PROT_READ | VM_PROT_WRITE, 0); + pmap_kenter_pa(curva, curpa, VM_PROT_READ | VM_PROT_WRITE, pmapflags); pmap_update(pmap_kernel()); *vap = (void *)(va + (pa - spa));