Module Name:    src
Committed By:   jmcneill
Date:           Tue Dec 31 17:26:04 UTC 2019

Modified Files:
        src/sys/arch/arm/acpi: acpi_machdep.c
        src/sys/dev/acpi: acpi_resource.c acpivar.h

Log Message:
Rely on 32/64-bit overflow to calculate translation offsets. Store this
as a separate ar_xbase field in acpi_mem instead of having separate
ar_offset and ar_decode fields.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/acpi/acpi_machdep.c
cvs rdiff -u -r1.40 -r1.41 src/sys/dev/acpi/acpi_resource.c
cvs rdiff -u -r1.80 -r1.81 src/sys/dev/acpi/acpivar.h

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.17 src/sys/arch/arm/acpi/acpi_machdep.c:1.18
--- src/sys/arch/arm/acpi/acpi_machdep.c:1.17	Tue Dec 31 13:54:22 2019
+++ src/sys/arch/arm/acpi/acpi_machdep.c	Tue Dec 31 17:26:04 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_machdep.c,v 1.17 2019/12/31 13:54:22 jmcneill Exp $ */
+/* $NetBSD: acpi_machdep.c,v 1.18 2019/12/31 17:26:04 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.17 2019/12/31 13:54:22 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.18 2019/12/31 17:26:04 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -438,20 +438,17 @@ default_tag:
 	for (n = 0; n < res.ar_nmem; n++) {
 		mem = acpi_res_mem(&res, n);
 		dmat->_ranges[n].dr_busbase = mem->ar_base;
-		dmat->_ranges[n].dr_sysbase = mem->ar_base;
-		if (mem->ar_decode == ACPI_POS_DECODE)
-		 	dmat->_ranges[n].dr_sysbase += mem->ar_offset;
-		else
-			dmat->_ranges[n].dr_sysbase -= mem->ar_offset;
+		dmat->_ranges[n].dr_sysbase = mem->ar_xbase;
 		dmat->_ranges[n].dr_len = mem->ar_length;
 		dmat->_ranges[n].dr_flags = flags;
 
 		aprint_debug_dev(sc->sc_dev,
-		    "%s: DMA sysbase %#lx busbase %#lx len %#lx%s\n",
+		    "%s: DMA sys %#lx-%#lx bus %#lx-%#lx%s\n",
 		    acpi_name(ad->ad_handle),
 		    dmat->_ranges[n].dr_sysbase,
+		    dmat->_ranges[n].dr_sysbase + dmat->_ranges[n].dr_len - 1,
 		    dmat->_ranges[n].dr_busbase,
-		    dmat->_ranges[n].dr_len,
+		    dmat->_ranges[n].dr_busbase + dmat->_ranges[n].dr_len - 1,
 		    flags ? " (coherent)" : "");
 	}
 

Index: src/sys/dev/acpi/acpi_resource.c
diff -u src/sys/dev/acpi/acpi_resource.c:1.40 src/sys/dev/acpi/acpi_resource.c:1.41
--- src/sys/dev/acpi/acpi_resource.c:1.40	Tue Dec 31 13:39:15 2019
+++ src/sys/dev/acpi/acpi_resource.c	Tue Dec 31 17:26:04 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_resource.c,v 1.40 2019/12/31 13:39:15 jmcneill Exp $	*/
+/*	$NetBSD: acpi_resource.c,v 1.41 2019/12/31 17:26:04 jmcneill Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.40 2019/12/31 13:39:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.41 2019/12/31 17:26:04 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -148,7 +148,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 			(*ops->memory)(arg->dev, arg->context,
 			    res->Data.FixedMemory32.Address,
 			    res->Data.FixedMemory32.AddressLength,
-			    0, 0);
+			    res->Data.FixedMemory32.Address);
 		break;
 
 	case ACPI_RESOURCE_TYPE_MEMORY32:
@@ -162,7 +162,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 				(*ops->memory)(arg->dev, arg->context,
 				    res->Data.Memory32.Minimum,
 				    res->Data.Memory32.AddressLength,
-				    0, 0);
+				    res->Data.Memory32.Minimum);
 		} else {
 			ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
 					     "Memory32 0x%x-0x%x/%u\n",
@@ -189,7 +189,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 				(*ops->memory)(arg->dev, arg->context,
 				    res->Data.Memory24.Minimum,
 				    res->Data.Memory24.AddressLength,
-				    0, 0);
+				    res->Data.Memory24.Minimum);
 		} else {
 			ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
 					     "Memory24 0x%x-0x%x/%u\n",
@@ -259,8 +259,8 @@ acpi_resource_parse_callback(ACPI_RESOUR
 					(*ops->memory)(arg->dev, arg->context,
 					    res->Data.Address32.Address.Minimum,
 					    res->Data.Address32.Address.AddressLength,
-					    res->Data.Address32.Address.TranslationOffset,
-					    res->Data.Address32.Decode);
+					    res->Data.Address32.Address.Minimum +
+					        res->Data.Address32.Address.TranslationOffset);
 			} else {
 				if (ops->memrange)
 					(*ops->memrange)(arg->dev, arg->context,
@@ -314,8 +314,8 @@ acpi_resource_parse_callback(ACPI_RESOUR
 					(*ops->memory)(arg->dev, arg->context,
 					    res->Data.Address64.Address.Minimum,
 					    res->Data.Address64.Address.AddressLength,
-					    res->Data.Address64.Address.TranslationOffset,
-					    res->Data.Address64.Decode);
+					    res->Data.Address64.Address.Minimum +
+					        res->Data.Address64.Address.TranslationOffset);
 			} else {
 				if (ops->memrange)
 					(*ops->memrange)(arg->dev, arg->context,
@@ -654,7 +654,7 @@ static void	acpi_res_parse_iorange(devic
 		    uint32_t, uint32_t, uint32_t);
 
 static void	acpi_res_parse_memory(device_t, void *, uint64_t,
-		    uint64_t, uint64_t, uint8_t);
+		    uint64_t, uint64_t);
 static void	acpi_res_parse_memrange(device_t, void *, uint64_t,
 		    uint64_t, uint64_t, uint64_t);
 
@@ -804,7 +804,7 @@ acpi_res_parse_iorange(device_t dev, voi
 
 static void
 acpi_res_parse_memory(device_t dev, void *context, uint64_t base,
-    uint64_t length, uint64_t offset, uint8_t decode)
+    uint64_t length, uint64_t xbase)
 {
 	struct acpi_resources *res = context;
 	struct acpi_mem *ar;
@@ -820,8 +820,7 @@ acpi_res_parse_memory(device_t dev, void
 	ar->ar_index = res->ar_nmem++;
 	ar->ar_base = base;
 	ar->ar_length = length;
-	ar->ar_offset = offset;
-	ar->ar_decode = decode;
+	ar->ar_xbase = xbase;
 
 	SIMPLEQ_INSERT_TAIL(&res->ar_mem, ar, ar_list);
 }

Index: src/sys/dev/acpi/acpivar.h
diff -u src/sys/dev/acpi/acpivar.h:1.80 src/sys/dev/acpi/acpivar.h:1.81
--- src/sys/dev/acpi/acpivar.h:1.80	Tue Dec 31 13:39:15 2019
+++ src/sys/dev/acpi/acpivar.h	Tue Dec 31 17:26:04 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpivar.h,v 1.80 2019/12/31 13:39:15 jmcneill Exp $	*/
+/*	$NetBSD: acpivar.h,v 1.81 2019/12/31 17:26:04 jmcneill Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -226,8 +226,7 @@ struct acpi_mem {
 	int		ar_index;
 	bus_addr_t	ar_base;
 	bus_size_t	ar_length;
-	bus_addr_t	ar_offset;
-	uint8_t		ar_decode;
+	bus_addr_t	ar_xbase;	/* translated base address */
 };
 
 struct acpi_memrange {
@@ -286,8 +285,7 @@ struct acpi_resource_parse_ops {
 	void	(*iorange)(device_t, void *, uint32_t, uint32_t,
 		    uint32_t, uint32_t);
 
-	void	(*memory)(device_t, void *, uint64_t, uint64_t,
-		    uint64_t, uint8_t);
+	void	(*memory)(device_t, void *, uint64_t, uint64_t, uint64_t);
 	void	(*memrange)(device_t, void *, uint64_t, uint64_t,
 		    uint64_t, uint64_t);
 

Reply via email to