Module Name:    src
Committed By:   jmcneill
Date:           Thu Oct 25 10:38:57 UTC 2018

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

Log Message:
Add support for 64-bit memory resources.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/dev/acpi/acpi_resource.c
cvs rdiff -u -r1.76 -r1.77 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/dev/acpi/acpi_resource.c
diff -u src/sys/dev/acpi/acpi_resource.c:1.37 src/sys/dev/acpi/acpi_resource.c:1.38
--- src/sys/dev/acpi/acpi_resource.c:1.37	Mon Jul 27 04:50:50 2015
+++ src/sys/dev/acpi/acpi_resource.c	Thu Oct 25 10:38:57 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_resource.c,v 1.37 2015/07/27 04:50:50 msaitoh Exp $	*/
+/*	$NetBSD: acpi_resource.c,v 1.38 2018/10/25 10:38:57 jmcneill Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.37 2015/07/27 04:50:50 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_resource.c,v 1.38 2018/10/25 10:38:57 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -246,12 +246,12 @@ acpi_resource_parse_callback(ACPI_RESOUR
 		if (res->Data.Address32.Address.AddressLength == 0 ||
 		    res->Data.Address32.ProducerConsumer != ACPI_CONSUMER)
 			break;
-#define ADRRESS32_FIXED2(r)						\
+#define ADDRESS32_FIXED2(r)						\
 	((r)->Data.Address32.MinAddressFixed == ACPI_ADDRESS_FIXED &&	\
 	 (r)->Data.Address32.MaxAddressFixed == ACPI_ADDRESS_FIXED)
 		switch (res->Data.Address32.ResourceType) {
 		case ACPI_MEMORY_RANGE:
-			if (ADRRESS32_FIXED2(res)) {
+			if (ADDRESS32_FIXED2(res)) {
 				if (ops->memory)
 					(*ops->memory)(arg->dev, arg->context,
 					    res->Data.Address32.Address.Minimum,
@@ -266,7 +266,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 			}
 			break;
 		case ACPI_IO_RANGE:
-			if (ADRRESS32_FIXED2(res)) {
+			if (ADDRESS32_FIXED2(res)) {
 				if (ops->ioport)
 					(*ops->ioport)(arg->dev, arg->context,
 					    res->Data.Address32.Address.Minimum,
@@ -285,7 +285,7 @@ acpi_resource_parse_callback(ACPI_RESOUR
 				      "Address32/BusNumber unimplemented\n"));
 			break;
 		}
-#undef ADRRESS32_FIXED2
+#undef ADDRESS32_FIXED2
 		break;
 
 	case ACPI_RESOURCE_TYPE_ADDRESS16:
@@ -294,8 +294,55 @@ acpi_resource_parse_callback(ACPI_RESOUR
 		break;
 
 	case ACPI_RESOURCE_TYPE_ADDRESS64:
+#ifdef _LP64
+		/* XXX Only fixed size supported for now */
+		if (res->Data.Address64.Address.AddressLength == 0 ||
+		    res->Data.Address64.ProducerConsumer != ACPI_CONSUMER)
+			break;
+#define ADDRESS64_FIXED2(r)						\
+	((r)->Data.Address64.MinAddressFixed == ACPI_ADDRESS_FIXED &&	\
+	 (r)->Data.Address64.MaxAddressFixed == ACPI_ADDRESS_FIXED)
+		switch (res->Data.Address64.ResourceType) {
+		case ACPI_MEMORY_RANGE:
+			if (ADDRESS64_FIXED2(res)) {
+				if (ops->memory)
+					(*ops->memory)(arg->dev, arg->context,
+					    res->Data.Address64.Address.Minimum,
+					    res->Data.Address64.Address.AddressLength);
+			} else {
+				if (ops->memrange)
+					(*ops->memrange)(arg->dev, arg->context,
+					    res->Data.Address64.Address.Minimum,
+					    res->Data.Address64.Address.Maximum,
+					    res->Data.Address64.Address.AddressLength,
+					    res->Data.Address64.Address.Granularity);
+			}
+			break;
+		case ACPI_IO_RANGE:
+			if (ADDRESS64_FIXED2(res)) {
+				if (ops->ioport)
+					(*ops->ioport)(arg->dev, arg->context,
+					    res->Data.Address64.Address.Minimum,
+					    res->Data.Address64.Address.AddressLength);
+			} else {
+				if (ops->iorange)
+					(*ops->iorange)(arg->dev, arg->context,
+					    res->Data.Address64.Address.Minimum,
+					    res->Data.Address64.Address.Maximum,
+					    res->Data.Address64.Address.AddressLength,
+					    res->Data.Address64.Address.Granularity);
+			}
+			break;
+		case ACPI_BUS_NUMBER_RANGE:
+			ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
+				      "Address64/BusNumber unimplemented\n"));
+			break;
+		}
+#undef ADDRESS64_FIXED2
+#else
 		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
 				     "Address64 unimplemented\n"));
+#endif
 		break;
 	case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
 		ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
@@ -423,9 +470,11 @@ acpi_resource_print(device_t dev, struct
 		sep = "";
 		aprint_normal(" mem ");
 		SIMPLEQ_FOREACH(ar, &res->ar_mem, ar_list) {
-			aprint_normal("%s0x%x", sep, ar->ar_base);
+			aprint_normal("%s0x%" PRIx64, sep,
+			    (uint64_t)ar->ar_base);
 			if (ar->ar_length > 1)
-				aprint_normal("-0x%x", ar->ar_base +
+				aprint_normal("-0x%" PRIx64,
+				    (uint64_t)ar->ar_base +
 				    ar->ar_length - 1);
 			sep = ",";
 		}
@@ -597,10 +646,10 @@ static void	acpi_res_parse_ioport(device
 static void	acpi_res_parse_iorange(device_t, void *, uint32_t,
 		    uint32_t, uint32_t, uint32_t);
 
-static void	acpi_res_parse_memory(device_t, void *, uint32_t,
-		    uint32_t);
-static void	acpi_res_parse_memrange(device_t, void *, uint32_t,
-		    uint32_t, uint32_t, uint32_t);
+static void	acpi_res_parse_memory(device_t, void *, uint64_t,
+		    uint64_t);
+static void	acpi_res_parse_memrange(device_t, void *, uint64_t,
+		    uint64_t, uint64_t, uint64_t);
 
 static void	acpi_res_parse_irq(device_t, void *, uint32_t, uint32_t);
 static void	acpi_res_parse_drq(device_t, void *, uint32_t);
@@ -747,8 +796,8 @@ acpi_res_parse_iorange(device_t dev, voi
 }
 
 static void
-acpi_res_parse_memory(device_t dev, void *context, uint32_t base,
-    uint32_t length)
+acpi_res_parse_memory(device_t dev, void *context, uint64_t base,
+    uint64_t length)
 {
 	struct acpi_resources *res = context;
 	struct acpi_mem *ar;
@@ -769,8 +818,8 @@ acpi_res_parse_memory(device_t dev, void
 }
 
 static void
-acpi_res_parse_memrange(device_t dev, void *context, uint32_t low,
-    uint32_t high, uint32_t length, uint32_t align)
+acpi_res_parse_memrange(device_t dev, void *context, uint64_t low,
+    uint64_t high, uint64_t length, uint64_t align)
 {
 	struct acpi_resources *res = context;
 	struct acpi_memrange *ar;

Index: src/sys/dev/acpi/acpivar.h
diff -u src/sys/dev/acpi/acpivar.h:1.76 src/sys/dev/acpi/acpivar.h:1.77
--- src/sys/dev/acpi/acpivar.h:1.76	Fri Oct 12 21:20:54 2018
+++ src/sys/dev/acpi/acpivar.h	Thu Oct 25 10:38:57 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpivar.h,v 1.76 2018/10/12 21:20:54 jmcneill Exp $	*/
+/*	$NetBSD: acpivar.h,v 1.77 2018/10/25 10:38:57 jmcneill Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -222,17 +222,17 @@ struct acpi_iorange {
 struct acpi_mem {
 	SIMPLEQ_ENTRY(acpi_mem) ar_list;
 	int		ar_index;
-	uint32_t	ar_base;
-	uint32_t	ar_length;
+	bus_addr_t	ar_base;
+	bus_size_t	ar_length;
 };
 
 struct acpi_memrange {
 	SIMPLEQ_ENTRY(acpi_memrange) ar_list;
 	int		ar_index;
-	uint32_t	ar_low;
-	uint32_t	ar_high;
-	uint32_t	ar_length;
-	uint32_t	ar_align;
+	bus_addr_t	ar_low;
+	bus_addr_t	ar_high;
+	bus_size_t	ar_length;
+	bus_size_t	ar_align;
 };
 
 struct acpi_irq {
@@ -282,9 +282,9 @@ struct acpi_resource_parse_ops {
 	void	(*iorange)(device_t, void *, uint32_t, uint32_t,
 		    uint32_t, uint32_t);
 
-	void	(*memory)(device_t, void *, uint32_t, uint32_t);
-	void	(*memrange)(device_t, void *, uint32_t, uint32_t,
-		    uint32_t, uint32_t);
+	void	(*memory)(device_t, void *, uint64_t, uint64_t);
+	void	(*memrange)(device_t, void *, uint64_t, uint64_t,
+		    uint64_t, uint64_t);
 
 	void	(*irq)(device_t, void *, uint32_t, uint32_t);
 	void	(*drq)(device_t, void *, uint32_t);

Reply via email to