Module Name: src
Committed By: jmcneill
Date: Mon Aug 1 11:26:00 UTC 2011
Modified Files:
src/sys/dev/acpi: acpi.c acpireg.h acpivar.h
Log Message:
add support for reset registers in PCI config space
To generate a diff of this commit:
cvs rdiff -u -r1.247 -r1.248 src/sys/dev/acpi/acpi.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/acpi/acpireg.h
cvs rdiff -u -r1.72 -r1.73 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.c
diff -u src/sys/dev/acpi/acpi.c:1.247 src/sys/dev/acpi/acpi.c:1.248
--- src/sys/dev/acpi/acpi.c:1.247 Sun Jul 17 02:32:01 2011
+++ src/sys/dev/acpi/acpi.c Mon Aug 1 11:25:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi.c,v 1.247 2011/07/17 02:32:01 jakllsch Exp $ */
+/* $NetBSD: acpi.c,v 1.248 2011/08/01 11:25:59 jmcneill Exp $ */
/*-
* Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -100,7 +100,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi.c,v 1.247 2011/07/17 02:32:01 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi.c,v 1.248 2011/08/01 11:25:59 jmcneill Exp $");
#include "opt_acpi.h"
#include "opt_pcifixup.h"
@@ -348,6 +348,46 @@
return (config_search_ia(acpi_submatch, parent, ifattr, NULL) != NULL);
}
+int
+acpi_reset(void)
+{
+ struct acpi_softc *sc = acpi_softc;
+ ACPI_GENERIC_ADDRESS *ResetReg;
+ ACPI_PCI_ID PciId;
+ ACPI_STATUS status;
+
+ if (sc == NULL)
+ return ENXIO;
+
+ ResetReg = &AcpiGbl_FADT.ResetRegister;
+
+ /* Check if the reset register is supported */
+ if (!(AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER) ||
+ !ResetReg->Address) {
+ return ENOENT;
+ }
+
+ switch (ResetReg->SpaceId) {
+ case ACPI_ADR_SPACE_PCI_CONFIG:
+ PciId.Segment = PciId.Bus = 0;
+ PciId.Device = ACPI_GAS_PCI_DEV(ResetReg->Address);
+ PciId.Function = ACPI_GAS_PCI_FUNC(ResetReg->Address);
+ status = AcpiOsWritePciConfiguration(&PciId,
+ ACPI_GAS_PCI_REGOFF(ResetReg->Address),
+ AcpiGbl_FADT.ResetValue, ResetReg->BitWidth);
+ break;
+ case ACPI_ADR_SPACE_SYSTEM_IO:
+ case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+ status = AcpiReset();
+ break;
+ default:
+ status = AE_TYPE;
+ break;
+ }
+
+ return ACPI_FAILURE(status) ? EIO : 0;
+}
+
/*
* Autoconfiguration.
*/
Index: src/sys/dev/acpi/acpireg.h
diff -u src/sys/dev/acpi/acpireg.h:1.11 src/sys/dev/acpi/acpireg.h:1.12
--- src/sys/dev/acpi/acpireg.h:1.11 Tue Oct 12 19:10:50 2010
+++ src/sys/dev/acpi/acpireg.h Mon Aug 1 11:25:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: acpireg.h,v 1.11 2010/10/12 19:10:50 gsutre Exp $ */
+/* $NetBSD: acpireg.h,v 1.12 2011/08/01 11:25:59 jmcneill Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -61,6 +61,10 @@
#define ACPI_ADR_PCI_FUNC(x) ((x) & 0xffff)
#define ACPI_ADR_PCI_ALLFUNCS 0xffff
+#define ACPI_GAS_PCI_DEV(x) (((x) >> 32) & 0xffff)
+#define ACPI_GAS_PCI_FUNC(x) (((x) >> 16) & 0xffff)
+#define ACPI_GAS_PCI_REGOFF(x) ((x) & 0xffff)
+
/*
* ACPI driver components.
*/
Index: src/sys/dev/acpi/acpivar.h
diff -u src/sys/dev/acpi/acpivar.h:1.72 src/sys/dev/acpi/acpivar.h:1.73
--- src/sys/dev/acpi/acpivar.h:1.72 Tue Jun 21 03:37:21 2011
+++ src/sys/dev/acpi/acpivar.h Mon Aug 1 11:25:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: acpivar.h,v 1.72 2011/06/21 03:37:21 jruoho Exp $ */
+/* $NetBSD: acpivar.h,v 1.73 2011/08/01 11:25:59 jmcneill Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -297,6 +297,8 @@
void acpi_disable(void);
int acpi_check(device_t, const char *);
+int acpi_reset(void);
+
ACPI_PHYSICAL_ADDRESS acpi_OsGetRootPointer(void);
bool acpi_register_notify(struct acpi_devnode *,