Module Name: src Committed By: jmcneill Date: Mon Dec 9 21:56:19 UTC 2024
Modified Files: src/sys/arch/arm/acpi: acpi_iort.c acpi_iort.h acpi_machdep.c Log Message: arm64: acpi: Honour DMA memory address limit for named components. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/acpi/acpi_iort.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/acpi/acpi_iort.h cvs rdiff -u -r1.26 -r1.27 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_iort.c diff -u src/sys/arch/arm/acpi/acpi_iort.c:1.4 src/sys/arch/arm/acpi/acpi_iort.c:1.5 --- src/sys/arch/arm/acpi/acpi_iort.c:1.4 Sun Sep 13 21:41:17 2020 +++ src/sys/arch/arm/acpi/acpi_iort.c Mon Dec 9 21:56:19 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_iort.c,v 1.4 2020/09/13 21:41:17 jmcneill Exp $ */ +/* $NetBSD: acpi_iort.c,v 1.5 2024/12/09 21:56:19 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_iort.c,v 1.4 2020/09/13 21:41:17 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_iort.c,v 1.5 2024/12/09 21:56:19 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -149,3 +149,36 @@ acpi_iort_its_id_map(u_int seg, uint32_t return 0; } + +ACPI_STATUS +acpi_iort_named_component(ACPI_HANDLE handle, + ACPI_IORT_NAMED_COMPONENT **out) +{ + ACPI_TABLE_IORT *iort; + ACPI_IORT_NODE *node; + ACPI_IORT_NAMED_COMPONENT *nc; + ACPI_HANDLE nch; + uint32_t offset, n; + ACPI_STATUS rv; + + rv = AcpiGetTable(ACPI_SIG_IORT, 0, (ACPI_TABLE_HEADER **)&iort); + if (ACPI_FAILURE(rv)) { + return rv; + } + + offset = iort->NodeOffset; + for (n = 0; n < iort->NodeCount; n++) { + node = ACPI_ADD_PTR(ACPI_IORT_NODE, iort, offset); + if (node->Type == ACPI_IORT_NODE_NAMED_COMPONENT) { + nc = (ACPI_IORT_NAMED_COMPONENT *)node->NodeData; + rv = AcpiGetHandle(NULL, nc->DeviceName, &nch); + if (rv == AE_OK && nch == handle) { + *out = nc; + return AE_OK; + } + } + offset += le16toh(node->Length); + } + + return AE_NOT_FOUND; +} Index: src/sys/arch/arm/acpi/acpi_iort.h diff -u src/sys/arch/arm/acpi/acpi_iort.h:1.2 src/sys/arch/arm/acpi/acpi_iort.h:1.3 --- src/sys/arch/arm/acpi/acpi_iort.h:1.2 Thu Feb 13 00:02:21 2020 +++ src/sys/arch/arm/acpi/acpi_iort.h Mon Dec 9 21:56:19 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_iort.h,v 1.2 2020/02/13 00:02:21 jmcneill Exp $ */ +/* $NetBSD: acpi_iort.h,v 1.3 2024/12/09 21:56:19 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -34,5 +34,7 @@ uint32_t acpi_iort_pci_root_map(u_int, uint32_t); uint32_t acpi_iort_its_id_map(u_int, uint32_t); +ACPI_STATUS acpi_iort_named_component(ACPI_HANDLE, + ACPI_IORT_NAMED_COMPONENT **); #endif /* !_ARM_ACPI_ACPI_IORT_H */ Index: src/sys/arch/arm/acpi/acpi_machdep.c diff -u src/sys/arch/arm/acpi/acpi_machdep.c:1.26 src/sys/arch/arm/acpi/acpi_machdep.c:1.27 --- src/sys/arch/arm/acpi/acpi_machdep.c:1.26 Sat Oct 15 11:07:38 2022 +++ src/sys/arch/arm/acpi/acpi_machdep.c Mon Dec 9 21:56:19 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_machdep.c,v 1.26 2022/10/15 11:07:38 jmcneill Exp $ */ +/* $NetBSD: acpi_machdep.c,v 1.27 2024/12/09 21:56:19 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.26 2022/10/15 11:07:38 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.27 2024/12/09 21:56:19 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -50,6 +50,7 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_machdep #if NPCI > 0 #include <dev/acpi/acpi_mcfg.h> #endif +#include <arm/acpi/acpi_iort.h> #include <arm/arm/efi_runtime.h> @@ -522,18 +523,27 @@ arm_acpi_dma_init_ranges(struct acpi_sof struct acpi_resources res; struct acpi_mem *mem; ACPI_HANDLE module; + ACPI_IORT_NAMED_COMPONENT *nc; ACPI_STATUS rv; + uintptr_t dma_mask; int n; module = arm_acpi_dma_module(sc, ad->ad_parent); if (module == NULL) { default_tag: + rv = acpi_iort_named_component(ad, &nc); + if (ACPI_SUCCESS(rv) && nc->MemoryAddressLimit != 0) { + dma_mask = __BITS(nc->MemoryAddressLimit - 1, 0); + } else { + dma_mask = UINTPTR_MAX; + } + /* No translation required */ dmat->_nranges = 1; dmat->_ranges = kmem_zalloc(sizeof(*dmat->_ranges), KM_SLEEP); dmat->_ranges[0].dr_sysbase = 0; dmat->_ranges[0].dr_busbase = 0; - dmat->_ranges[0].dr_len = UINTPTR_MAX; + dmat->_ranges[0].dr_len = dma_mask; dmat->_ranges[0].dr_flags = flags; return; }