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;
 	}

Reply via email to