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