Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Sep 2000 11:19:43 -0700
From:      Mike Smith <msmith@freebsd.org>
To:        Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org>
Cc:        takawata@shidahara1.planet.sci.kobe-u.ac.jp, haro@tk.kubota.co.jp, current@freebsd.org, acpi-jp@jp.FreeBSD.org
Subject:   Re: My system hang with ACPI kernel thread 
Message-ID:  <200009281819.e8SIJhA01660@mass.osd.bsdi.com>
In-Reply-To: Your message of "Fri, 29 Sep 2000 02:36:28 %2B0900." <20000929023628R.iwasaki@jp.FreeBSD.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multipart MIME message.

--==_Exmh_-2406949460
Content-Type: text/plain; charset=us-ascii

> > > Currently kernel thread seems broken, so mallocing storage in
> > > acpi_queue_event() never be freed.  I think number of events at a
> > > point of tme is limited and we can have static storage for the events.
> > > The implementaion of sys/i386/apm/apm.c:apm_record_event() (it's for apmd)
> > > would be a good example.
> > 
> > I have a megapatch for acpi.c that I am nearly ready to commit which 
> > converts it to use bus resources for all I/O allocations.  I'll fix this 
> > in there, if you like.
> 
> I'm interested in your patch.  Can I see it?

Sure.  I'm not 100% sure it's going to work right, so please feel free 
to tell me I've broken something...




--==_Exmh_-2406949460
Content-Type: text/plain ; name="acpi.diff"; charset=us-ascii
Content-Description: acpi.diff
Content-Disposition: attachment; filename="acpi.diff"

Index: conf/files
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/conf/files,v
retrieving revision 1.416
diff -u -r1.416 files
--- conf/files	2000/09/23 22:21:39	1.416
+++ conf/files	2000/09/27 10:17:04
@@ -75,7 +75,8 @@
 #dev/aac/aac_debug.c	optional aac
 dev/aac/aac_disk.c	optional aac
 dev/aac/aac_pci.c	optional aac pci
-dev/acpi/acpi.c		count acpi
+dev/acpi/acpi.c		optional acpi
+dev/acpi/acpi_io.c	optional acpi
 dev/acpi/acpi_powerres.c	optional	acpi
 dev/acpi/aml/aml_amlmem.c	optional	acpi
 dev/acpi/aml/aml_common.c	optional	acpi
Index: dev/acpi/acpi.c
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/dev/acpi/acpi.c,v
retrieving revision 1.14
diff -u -r1.14 acpi.c
--- dev/acpi/acpi.c	2000/09/27 05:43:53	1.14
+++ dev/acpi/acpi.c	2000/09/28 17:56:57
@@ -52,7 +52,6 @@
 #include <sys/rman.h>
 
 #include <sys/acpi.h>
-
 #include <dev/acpi/acpi.h>		/* for softc */
 
 #include <dev/acpi/aml/aml_amlmem.h>
@@ -63,8 +62,6 @@
 #include <dev/acpi/aml/aml_parse.h>
 #include <dev/acpi/aml/aml_memman.h>
 
-#include <machine/acpi_machdep.h>	/* for ACPI_BUS_SPACE_IO */
-
 /*
  * ACPI pmap subsystem
  */
@@ -93,8 +90,7 @@
 
 static struct	ACPIaddr acpi_addr;
 struct		ACPIrsdp *acpi_rsdp;
-static int	acpi_port;
-static int	acpi_irq;
+struct		FACPbody acpi_init_facp;
 
 /* Character device */
 
@@ -121,31 +117,8 @@
 	-1
 };
 
-/* 
- * ACPI register I/O 
- */
-#define	ACPI_REGISTER_INPUT	0
-#define	ACPI_REGISTER_OUTPUT	1
-static void acpi_register_input(u_int32_t ioaddr,
-				u_int32_t *value, u_int32_t size);
-static void acpi_register_output(u_int32_t ioaddr,
-				 u_int32_t *value, u_int32_t size);
-static void acpi_enable_disable(acpi_softc_t *sc, boolean_t enable);
-static void acpi_io_pm1_status(acpi_softc_t *sc, boolean_t io,
-			       u_int32_t *a, u_int32_t *b);
-static void acpi_io_pm1_enable(acpi_softc_t *sc, boolean_t io,
-			       u_int32_t *a, u_int32_t *b);
-static void acpi_io_pm1_control(acpi_softc_t *sc, boolean_t io,
-				u_int32_t *a, u_int32_t *b);
-static void acpi_io_pm2_control(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
-static void acpi_io_pm_timer(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
-static void acpi_io_gpe0_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
-static void acpi_io_gpe0_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
-static void acpi_io_gpe1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
-static void acpi_io_gpe1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
-
 /* 
- * Miscellous utility functions 
+ * Miscellaneous utility functions 
  */
 static int  acpi_sdt_checksum(struct ACPIsdt * sdt);
 static void acpi_handle_dsdt(acpi_softc_t *sc);
@@ -164,8 +137,7 @@
 /* 
  * ACPI events
  */
-static void acpi_process_event(acpi_softc_t *sc,
-			       u_int32_t status_a, u_int32_t status_b,
+static void acpi_process_event(acpi_softc_t *sc, u_int32_t status_e,
 			       u_int32_t status_0, u_int32_t status_1);
 static void acpi_intr(void *data);
 static void acpi_enable_events(acpi_softc_t *sc);
@@ -187,9 +159,9 @@
 
 /* for debugging */
 #ifdef ACPI_DEBUG
-static	int	acpi_debug = 1;
+int	acpi_debug = 1;
 #else	/* !ACPI_DEBUG */
-static	int	acpi_debug = 0;
+int	acpi_debug = 0;
 #endif	/* ACPI_DEBUG */
 
 SYSCTL_INT(_debug, OID_AUTO, acpi_debug, CTLFLAG_RW, &acpi_debug, 1, "");
@@ -303,364 +275,8 @@
 }
 
 /*
- * ACPI Register I/O
+ * Miscellaneous utility functions
  */
-void
-acpi_gpe_enable_bit(acpi_softc_t *sc, u_int32_t bit, boolean_t on_off)
-{
-	int		x;
-	u_int32_t	pos, value;
-	void		(*GPEx_EN[])(acpi_softc_t *, boolean_t, u_int32_t *) = {
-		acpi_io_gpe0_enable, 
-		acpi_io_gpe0_enable
-	};
-
-	x = -1;
-	pos = bit;
-	if (bit < sc->facp_body->gpe0_len * 4) {
-		x = 0;
-	} else {
-		/* should we check gpe1_len too? */
-		pos = bit - sc->facp_body->gpe1_base;
-		x = 1;
-	}
-
-	if (x == -1 || (on_off != 0 && on_off != 1)) {
-		return;
-	}
-
-	GPEx_EN[x](sc, ACPI_REGISTER_INPUT, &value);
-	value = (value & (~(1 << pos))) | (on_off << pos);
-	GPEx_EN[x](sc, ACPI_REGISTER_OUTPUT, &value);
-}
-
-static __inline void
-acpi_register_input(u_int32_t ioaddr, u_int32_t *value, u_int32_t size)
-{
-	bus_space_tag_t		bst;
-	bus_space_handle_t	bsh;
-	u_int32_t		val;
-
-	bst = ACPI_BUS_SPACE_IO;
-	bsh = ioaddr;
-
-	switch (size) {
-	case 1:
-		val = bus_space_read_1(bst, bsh, 0);
-		break;
-	case 2:
-		val = bus_space_read_2(bst, bsh, 0);
-		break;
-	case 3:
-		val = bus_space_read_4(bst, bsh, 0);
-		val &= 0x00ffffff;
-		break;
-	case 4:
-		val = bus_space_read_4(bst, bsh, 0);
-		break;
-	default:
-		ACPI_DEVPRINTF("acpi_register_input(): invalid size\n");
-		val = 0;
-		break;
-	}
-
-	*value = val;
-}
-
-static __inline void
-acpi_register_output(u_int32_t ioaddr, u_int32_t *value, u_int32_t size)
-{
-	bus_space_tag_t		bst;
-	bus_space_handle_t	bsh;
-	u_int32_t		val;
-
-	val = *value;
-	bst = ACPI_BUS_SPACE_IO;
-	bsh = ioaddr;
-
-	switch (size) {
-	case 1:
-		bus_space_write_1(bst, bsh, 0, val & 0xff);
-		break;
-	case 2:
-		bus_space_write_2(bst, bsh, 0, val & 0xffff);
-		break;
-	case 3:
-		bus_space_write_2(bst, bsh, 0, val & 0xffff);
-		bus_space_write_1(bst, bsh, 2, (val >> 16) & 0xff);
-		break;
-	case 4:
-		bus_space_write_4(bst, bsh, 0, val);
-		break;
-	default:
-		ACPI_DEVPRINTF("acpi_register_output(): invalid size\n");
-		break;
-	}
-}
-
-static void
-acpi_enable_disable(acpi_softc_t *sc, boolean_t enable)
-{
-	u_char			val;
-	bus_space_tag_t		bst;
-	bus_space_handle_t	bsh;
-	struct			FACPbody *facp;
-
-	facp = sc->facp_body;
-	bst = ACPI_BUS_SPACE_IO;
-	bsh = facp->smi_cmd;
-
-	if (enable) {
-		val = facp->acpi_enable;
-	} else {
-		val = facp->acpi_disable;
-	}
-
-	bus_space_write_1(bst, bsh, 0, val);
-	sc->enabled = enable;
-
-	ACPI_DEBUGPRINT("acpi_enable_disable(%d) = (%x)\n", enable, val);
-}
-
-static void
-acpi_io_pm1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *status_a,
-		   u_int32_t *status_b)
-{
-	int		size;
-	struct FACPbody	*facp;
-
-	facp = sc->facp_body;
-	size = facp->pm1_evt_len / 2;
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->pm1a_evt_blk, status_a, size);
-
-		*status_b = 0;
-		if (facp->pm1b_evt_blk) {
-			acpi_register_input(facp->pm1b_evt_blk, status_b, size);
-		}
-	} else {
-		acpi_register_output(facp->pm1a_evt_blk, status_a, size);
-
-		if (facp->pm1b_evt_blk) {
-			acpi_register_output(facp->pm1b_evt_blk, status_b, size);
-		}
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_pm1_status(%d) = (%x, %x)\n",
-			io, *status_a, *status_b);
-
-	return;
-}
-
-static void
-acpi_io_pm1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *status_a,
-		   u_int32_t *status_b)
-{
-	int		size;
-	struct FACPbody *facp;
-
-	facp = sc->facp_body;
-	size = facp->pm1_evt_len / 2;
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->pm1a_evt_blk + size, status_a, size);
-
-		*status_b = 0;
-		if (facp->pm1b_evt_blk) {
-			acpi_register_input(facp->pm1b_evt_blk + size,
-					    status_b, size);
-		}
-	} else {
-		acpi_register_output(facp->pm1a_evt_blk + size, status_a, size);
-
-		if (facp->pm1b_evt_blk) {
-			acpi_register_output(facp->pm1b_evt_blk + size,
-					     status_b, size);
-		}
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_pm1_enable(%d) = (%x, %x)\n",
-			io, *status_a, *status_b);
-
-	return;
-}
-
-static void
-acpi_io_pm1_control(acpi_softc_t *sc, boolean_t io, u_int32_t *value_a,
-		    u_int32_t *value_b)
-{
-	int		size;
-	struct FACPbody	*facp;
-
-	facp = sc->facp_body;
-	size = facp->pm1_cnt_len;
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->pm1a_cnt_blk, value_a, size);
-
-		*value_b = 0;
-		if (facp->pm1b_evt_blk) {
-			acpi_register_input(facp->pm1b_cnt_blk, value_b, size);
-		}
-	} else {
-		acpi_register_output(facp->pm1a_cnt_blk, value_a, size);
-
-		if (facp->pm1b_evt_blk) {
-			acpi_register_output(facp->pm1b_cnt_blk, value_b, size);
-		}
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_pm1_control(%d) = (%x, %x)\n",
-			io, *value_a, *value_b);
-
-	return;
-}
-
-static void
-acpi_io_pm2_control(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
-{
-	int		size;
-	struct FACPbody	*facp;
-
-	facp = sc->facp_body;
-	size = facp->pm2_cnt_len;
-
-	if (!facp->pm2_cnt_blk) {
-		return;	/* optional */
-	}
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->pm2_cnt_blk, val, size);
-	} else {
-		acpi_register_output(facp->pm2_cnt_blk, val, size);
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_pm2_control(%d) = (%x)\n", io, *val);
-
-	return;
-}
-
-static void
-acpi_io_pm_timer(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
-{
-	int		size;
-	struct FACPbody	*facp;
-
-	facp = sc->facp_body;
-	size = 0x4;	/* 32-bits */
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->pm_tmr_blk, val, size);
-	} else {
-		return;	/* XXX read-only */
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_pm_timer(%d) = (%x)\n", io, *val);
-
-	return;
-}
-
-static void
-acpi_io_gpe0_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
-{
-	int		size;
-	struct	FACPbody *facp;
-
-	facp = sc->facp_body;
-	size = facp->gpe0_len / 2;
-
-	if (!facp->gpe0_blk) {
-		return;	/* optional */
-	}
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->gpe0_blk, val, size);
-	} else {
-		acpi_register_output(facp->gpe0_blk, val, size);
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_gpe0_status(%d) = (%x)\n", io, *val);
-
-	return;
-}
-
-static void
-acpi_io_gpe0_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
-{
-	int		size;
-	struct	FACPbody *facp;
-
-	facp = sc->facp_body;
-	size = facp->gpe0_len / 2;
-
-	if (!facp->gpe0_blk) {
-		return;	/* optional */
-	}
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->gpe0_blk + size, val, size);
-	} else {
-		acpi_register_output(facp->gpe0_blk + size, val, size);
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_gpe0_enable(%d) = (%x)\n", io, *val);
-
-	return;
-}
-
-static void
-acpi_io_gpe1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
-{
-	int		size;
-	struct FACPbody	*facp;
-
-	facp = sc->facp_body;
-	size = facp->gpe1_len / 2;
-
-	if (!facp->gpe1_blk) {
-		return;	/* optional */
-	}
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->gpe1_blk, val, size);
-	} else {
-		acpi_register_output(facp->gpe1_blk, val, size);
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_gpe1_status(%d) = (%x)\n", io, *val);
-
-	return;
-}
-
-static void
-acpi_io_gpe1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
-{
-	int		size;
-	struct FACPbody	*facp;
-
-	facp = sc->facp_body;
-	size = facp->gpe1_len / 2;
-
-	if (!facp->gpe1_blk) {
-		return;	/* optional */
-	}
-
-	if (io == ACPI_REGISTER_INPUT) {
-		acpi_register_input(facp->gpe1_blk + size, val, size);
-	} else {
-		acpi_register_output(facp->gpe1_blk + size, val, size);
-	}
-
-	ACPI_DEBUGPRINT("acpi_io_gpe1_enable(%d) = (%x)\n", io, *val);
-
-	return;
-}
-
-/*
- * Miscellous utility functions
- */
-
 static int
 acpi_sdt_checksum(struct ACPIsdt *sdt)
 {
@@ -785,8 +401,7 @@
 
 	/* in discovery mode, we have everything we need now */
 	if (sc == NULL) {
-		acpi_port = body->smi_cmd;
-		acpi_irq = body->sci_int;
+		bcopy(body, &acpi_init_facp, sizeof(*body));
 		return;
 	}
 
@@ -887,18 +502,16 @@
 
 	if (state > ACPI_S_STATE_S0) {
 		/* clear WAK_STS bit by writing a one */
-		acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &val_a, &val_b);
-		if ((val_a | val_b) & ACPI_PM1_WAK_STS) {
+		acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &val_a);
+		if (val_a & ACPI_PM1_WAK_STS) {
 			sc->broken_wakeuplogic = 0;
 		} else {
 			ACPI_DEVPRINTF("wake-up logic seems broken, "
 				       "this may cause troubles on wakeup\n");
 			sc->broken_wakeuplogic = 1;
 		}
-		val_a = val_b = 0;
 		val_a = ACPI_PM1_WAK_STS;
-		val_b = ACPI_PM1_WAK_STS;
-		acpi_io_pm1_status(sc, ACPI_REGISTER_OUTPUT, &val_a, &val_b);
+		acpi_io_pm1_status(sc, ACPI_REGISTER_OUTPUT, &val_a);
 
 		/* ignore power button and sleep button events for 5 sec. */
 		sc->ignore_events = ACPI_PM1_PWRBTN_EN | ACPI_PM1_SLPBTN_EN;
@@ -926,8 +539,8 @@
 
 	count = 0;
 	for (;;) {
-		acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &val_a, &val_b);
-		if ((val_a | val_b) & ACPI_PM1_WAK_STS) {
+		acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &val_a);
+		if (val_a & ACPI_PM1_WAK_STS) {
 			break;
 		}
 		/* XXX
@@ -1072,12 +685,12 @@
  */
 
 static void
-acpi_process_event(acpi_softc_t *sc, u_int32_t status_a, u_int32_t status_b,
+acpi_process_event(acpi_softc_t *sc, u_int32_t status_e,
 		   u_int32_t status_0, u_int32_t status_1)
 {
 	int i;
 	
-	if (status_a & ACPI_PM1_PWRBTN_EN || status_b & ACPI_PM1_PWRBTN_EN) {
+	if (status_e & ACPI_PM1_PWRBTN_EN) {
 		if (sc->ignore_events & ACPI_PM1_PWRBTN_EN) {
 			ACPI_DEBUGPRINT("PWRBTN event ingnored\n");
 		} else {
@@ -1094,7 +707,7 @@
 		}
 	}
 
-	if (status_a & ACPI_PM1_SLPBTN_EN || status_b & ACPI_PM1_SLPBTN_EN) {
+	if (status_e & ACPI_PM1_SLPBTN_EN) {
 		if (sc->ignore_events & ACPI_PM1_SLPBTN_EN) {
 			ACPI_DEBUGPRINT("SLPBTN event ingnored\n");
 		} else {
@@ -1117,9 +730,9 @@
 static void
 acpi_intr(void *data)
 {
-	u_int32_t	enable_a, enable_b, enable_0, enable_1;
-	u_int32_t	status_a, status_b, status_0, status_1;
-	u_int32_t	val_a, val_b;
+	u_int32_t	enable;
+	u_int32_t	status_e, status_0, status_1;
+	u_int32_t	val;
 	int		debug;
 	acpi_softc_t	*sc;
 
@@ -1130,35 +743,32 @@
 	/* 
 	 * Power Management 1 Status Registers 
 	 */
-	status_a = status_b = enable_a = enable_b = 0;
-	acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &status_a, &status_b);
+	status_e = enable = 0;
+	acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &status_e);
 
 	/* 
 	 * Get current interrupt mask
 	 */
-	acpi_io_pm1_enable(sc, ACPI_REGISTER_INPUT, &enable_a, &enable_b);
+	acpi_io_pm1_enable(sc, ACPI_REGISTER_INPUT, &enable);
 
 	/* 
 	 * Disable events and re-enable again
 	 */
-	if ((status_a & enable_a) != 0 || (status_b & enable_b) != 0) {
+	if ((status_e & enable) != 0) {
 		acpi_debug = debug;	/* OK, you can speak */
 
 		ACPI_DEBUGPRINT("pm1_status intr CALLED\n");
 
 		/* Disable all interrupt generation */
-		val_a = enable_a & (~ACPI_PM1_ALL_ENABLE_BITS);
-		val_b = enable_b & (~ACPI_PM1_ALL_ENABLE_BITS);
-		acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT, &val_a, &val_b);
+		val = enable & (~ACPI_PM1_ALL_ENABLE_BITS);
+		acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT, &val);
 
 		/* Clear interrupt status */
-		val_a = enable_a & ACPI_PM1_ALL_ENABLE_BITS;
-		val_b = enable_b & ACPI_PM1_ALL_ENABLE_BITS;
-		acpi_io_pm1_status(sc, ACPI_REGISTER_OUTPUT, &val_a, &val_b);
+		val = enable & ACPI_PM1_ALL_ENABLE_BITS;
+		acpi_io_pm1_status(sc, ACPI_REGISTER_OUTPUT, &val);
 
 		/* Re-enable interrupt */
-		acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT,
-				   &enable_a, &enable_b);
+		acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT, &enable);
 
 		acpi_debug = 0;		/* Shut up again */
 	}
@@ -1166,36 +776,36 @@
 	/* 
 	 * General-Purpose Events 0 Status Registers
 	 */
-	status_0 = enable_0 = 0;
+	status_0 = enable = 0;
 	acpi_io_gpe0_status(sc, ACPI_REGISTER_INPUT, &status_0);
 
 	/* 
 	 * Get current interrupt mask 
 	 */
-	acpi_io_gpe0_enable(sc, ACPI_REGISTER_INPUT, &enable_0);
+	acpi_io_gpe0_enable(sc, ACPI_REGISTER_INPUT, &enable);
 
 	/* 
 	 * Disable events and re-enable again 
 	 */
-	if ((status_0 & enable_0) != 0) {
+	if ((status_0 & enable) != 0) {
 		acpi_debug = debug;	/* OK, you can speak */
 
 		ACPI_DEBUGPRINT("gpe0_status intr CALLED\n");
 
 		/* Disable all interrupt generation */
-		val_a = enable_0 & ~status_0;
+		val = enable & ~status_0;
 #if 0
 		/* or should we disable all? */
-		val_a = 0x0;
+		val = 0x0;
 #endif
-		acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &val_a);
+		acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &val);
 #if 0
 		/* Clear interrupt status */
-		val_a = enable_0;	/* XXX */
-		acpi_io_gpe0_status(sc, ACPI_REGISTER_OUTPUT, &val_a);
+		val = enable;	/* XXX */
+		acpi_io_gpe0_status(sc, ACPI_REGISTER_OUTPUT, &val);
 
 		/* Re-enable interrupt */
-		acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &enable_0);
+		acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &enable);
 
 		acpi_debug = 0;		/* Shut up again */
 #endif
@@ -1204,36 +814,36 @@
 	/*
 	 * General-Purpose Events 1 Status Registers
 	 */
-	status_1 = enable_1 = 0;
+	status_1 = enable = 0;
 	acpi_io_gpe1_status(sc, ACPI_REGISTER_INPUT, &status_1);
 
 	/*
 	  Get current interrupt mask
 	*/
-	acpi_io_gpe1_enable(sc, ACPI_REGISTER_INPUT, &enable_1);
+	acpi_io_gpe1_enable(sc, ACPI_REGISTER_INPUT, &enable);
 
 	/*
 	 * Disable events and re-enable again
 	 */
-	if ((status_1 & enable_1) != 0) {
+	if ((status_1 & enable) != 0) {
 		acpi_debug = debug;	/* OK, you can speak */
 
 		ACPI_DEBUGPRINT("gpe1_status intr CALLED\n");
 
 		/* Disable all interrupt generation */
-		val_a = enable_1 & ~status_1;
+		val = enable & ~status_1;
 #if 0
 		/* or should we disable all? */
-		val_a = 0x0;
+		val = 0x0;
 #endif
-		acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &val_a);
+		acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &val);
 
 		/* Clear interrupt status */
-		val_a = enable_1;	/* XXX */
-		acpi_io_gpe1_status(sc, ACPI_REGISTER_OUTPUT, &val_a);
+		val = enable;	/* XXX */
+		acpi_io_gpe1_status(sc, ACPI_REGISTER_OUTPUT, &val);
 
 		/* Re-enable interrupt */
-		acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &enable_1);
+		acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &enable);
 
 		acpi_debug = 0;		/* Shut up again */
 	}
@@ -1241,7 +851,7 @@
 	acpi_debug = debug;	/* Restore debug level */
 
 	/* do something to handle the events... */
-	acpi_process_event(sc, status_a, status_b, status_0, status_1);
+	acpi_process_event(sc, status_e, status_0, status_1);
 }
 
 static int acpi_set_gpe_bits(struct aml_name *name, va_list ap)
@@ -1270,24 +880,23 @@
 static void
 acpi_enable_events(acpi_softc_t *sc)
 {
-	u_int32_t	status_a, status_b;
+	u_int32_t	status;
+	u_int32_t	mask0, mask1;
 	u_int32_t	flags;
 
 	/*
 	 * Setup PM1 Enable Registers Fixed Feature Enable Bits (4.7.3.1.2)
 	 * based on flags field of Fixed ACPI Description Table (5.2.5).
 	 */
-	acpi_io_pm1_enable(sc, ACPI_REGISTER_INPUT, &status_a, &status_b);
+	acpi_io_pm1_enable(sc, ACPI_REGISTER_INPUT, &status);
 	flags = sc->facp_body->flags;
 	if ((flags & ACPI_FACP_FLAG_PWR_BUTTON) == 0) {
-		status_a |= ACPI_PM1_PWRBTN_EN;
-		status_b |= ACPI_PM1_PWRBTN_EN;
+		status |= ACPI_PM1_PWRBTN_EN;
 	}
 	if ((flags & ACPI_FACP_FLAG_SLP_BUTTON) == 0) {
-		status_a |= ACPI_PM1_SLPBTN_EN;
-		status_b |= ACPI_PM1_SLPBTN_EN;
+		status |= ACPI_PM1_SLPBTN_EN;
 	}
-	acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT, &status_a, &status_b);
+	acpi_io_pm1_enable(sc, ACPI_REGISTER_OUTPUT, &status);
 
 #if 1
 	/*
@@ -1296,26 +905,26 @@
 	 * \_GPE scope (4.7.2.2.1.2).
 	 */
 
-	status_a = status_b = 0;
+	mask0 = mask1 = 0;
 	aml_apply_foreach_found_objects(NULL, "\\_GPE._L", acpi_set_gpe_bits,
-					sc, &status_a, &status_b);
-	sc->gpe0_mask = status_a;
-	sc->gpe1_mask = status_b;
+					sc, &mask0, &mask1);	/* XXX correct? */
+	sc->gpe0_mask = mask0;
+	sc->gpe1_mask = mask1;
 
-	acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &status_a);
-	acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &status_b);
+	acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &mask0);
+	acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &mask1);
 #endif
 
 	/* print all event status for debugging */
-	acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &status_a, &status_b);
-	acpi_io_pm1_enable(sc, ACPI_REGISTER_INPUT,  &status_a, &status_b);
-	acpi_io_gpe0_status(sc, ACPI_REGISTER_INPUT, &status_a);
-	acpi_io_gpe0_enable(sc, ACPI_REGISTER_INPUT, &status_a);
-	acpi_io_gpe1_status(sc, ACPI_REGISTER_INPUT, &status_a);
-	acpi_io_gpe1_enable(sc, ACPI_REGISTER_INPUT, &status_a);
-	acpi_io_pm1_control(sc, ACPI_REGISTER_INPUT,  &status_a, &status_b);
-	acpi_io_pm2_control(sc, ACPI_REGISTER_INPUT,  &status_a);
-	acpi_io_pm_timer(sc, ACPI_REGISTER_INPUT,  &status_a);
+	acpi_io_pm1_status(sc, ACPI_REGISTER_INPUT, &status);
+	acpi_io_pm1_enable(sc, ACPI_REGISTER_INPUT,  &status);
+	acpi_io_gpe0_status(sc, ACPI_REGISTER_INPUT, &status);
+	acpi_io_gpe0_enable(sc, ACPI_REGISTER_INPUT, &status);
+	acpi_io_gpe1_status(sc, ACPI_REGISTER_INPUT, &status);
+	acpi_io_gpe1_enable(sc, ACPI_REGISTER_INPUT, &status);
+	acpi_io_pm1_control(sc, ACPI_REGISTER_INPUT,  &mask0, &mask1);
+	acpi_io_pm2_control(sc, ACPI_REGISTER_INPUT,  &status);
+	acpi_io_pm_timer(sc, ACPI_REGISTER_INPUT,  &status);
 }
 
 static void
@@ -1451,10 +1060,58 @@
 		device_printf(parent, "could not attach ACPI\n");
 		return;
 	}
-	if (acpi_port != 0)
-		bus_set_resource(child, SYS_RES_IOPORT, 0, acpi_port, 1);
-	if (acpi_irq != 0)
-		bus_set_resource(child, SYS_RES_IRQ, 0, acpi_irq, 1);
+
+	/*
+	 * SMI command register
+	 */
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_SMI_CMD,
+			 acpi_init_facp.smi_cmd, 1);
+
+	/*
+	 * PM1 event registers
+	 */
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_EVT,
+			 acpi_init_facp.pm1a_evt_blk, acpi_init_facp.pm1_evt_len);
+	if (acpi_init_facp.pm1b_evt_blk != 0)
+		bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_EVT,
+				 acpi_init_facp.pm1b_evt_blk, acpi_init_facp.pm1_evt_len);
+
+	/*
+	 * PM1 control registers
+	 */
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_CNT,
+			 acpi_init_facp.pm1a_cnt_blk, acpi_init_facp.pm1_cnt_len);
+	if (acpi_init_facp.pm1b_cnt_blk != 0)
+	    bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_CNT,
+			     acpi_init_facp.pm1b_cnt_blk, acpi_init_facp.pm1_cnt_len);
+
+	/*
+	 * PM2 control register
+	 */
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM2_CNT,
+			 acpi_init_facp.pm2_cnt_blk, acpi_init_facp.pm2_cnt_len);
+
+	/*
+	 * PM timer register
+	 */
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM_TMR,
+			 acpi_init_facp.pm_tmr_blk, 4);
+
+	/*
+	 * General purpose event registers
+	 */
+	if (acpi_init_facp.gpe0_blk != 0)
+		bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE0,
+				 acpi_init_facp.gpe0_blk, acpi_init_facp.gpe0_len);
+	if (acpi_init_facp.gpe1_blk != 0)
+		bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE1,
+				 acpi_init_facp.gpe1_blk, acpi_init_facp.gpe1_len);
+
+	/*
+	 * Notification interrupt
+	 */
+	if (acpi_init_facp.sci_int != 0)
+		bus_set_resource(child, SYS_RES_IRQ, 0, acpi_init_facp.sci_int, 1);
 }
 
 static int
@@ -1485,6 +1142,7 @@
 acpi_attach(device_t dev)
 {
 	acpi_softc_t	*sc;
+	int		i;
 
 	/*
 	 * Set up the softc and parse the ACPI data completely.
@@ -1498,12 +1156,16 @@
 	/*
 	 * Allocate our resources
 	 */
-	sc->port_rid = 0;
-	if ((sc->port = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid, 
-					   0, ~0, 1, RF_ACTIVE)) == NULL) {
-		ACPI_DEVPRINTF("could not allocate port\n");
-		acpi_free(sc);
-		return(ENOMEM);
+	for (i = 0; i < ACPI_RES_MAX; i++) {
+		sc->iores[i].rid = i;
+		sc->iores[i].rsc = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->iores[i].rid,
+						      0, ~0, 1, RF_ACTIVE);
+		if (sc->iores[i].rsc != NULL) {
+			sc->iores[i].bhandle = rman_get_bushandle(sc->iores[i].rsc);
+			sc->iores[i].btag = rman_get_bustag(sc->iores[i].rsc);
+		} else {
+			/* XXX barf on mandatory resources missing */
+		}
 	}
 	sc->irq_rid = 0;
 	if ((sc->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid, 
@@ -1564,8 +1226,16 @@
 static void
 acpi_free(struct acpi_softc *sc)
 {
-	if (sc->port != NULL)
-		bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port_rid, sc->port);
+	int	i;
+
+	for (i = 0; i < ACPI_RES_MAX; i++) {
+		if (sc->iores[i].rsc != NULL) {
+			bus_release_resource(sc->dev, 
+					     SYS_RES_IOPORT, 
+					     sc->iores[i].rid,
+					     sc->iores[1].rsc);
+		}
+	}
 	if (sc->irq_handle != NULL)
 		bus_teardown_intr(sc->dev, sc->irq, sc->irq_handle);
 	if (sc->irq != NULL)
Index: dev/acpi/acpi.h
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/dev/acpi/acpi.h,v
retrieving revision 1.10
diff -u -r1.10 acpi.h
--- dev/acpi/acpi.h	2000/09/27 05:43:54	1.10
+++ dev/acpi/acpi.h	2000/09/28 17:57:49
@@ -92,15 +92,37 @@
 	int ae_arg;
 };
 
+/*
+ * I/O resource structure
+ */
+
+#define ACPI_RES_SMI_CMD	0
+#define ACPI_RES_PM1A_EVT	1
+#define ACPI_RES_PM1B_EVT	2
+#define ACPI_RES_PM1A_CNT	3
+#define ACPI_RES_PM1B_CNT	4
+#define ACPI_RES_PM2_CNT	5
+#define ACPI_RES_PM_TMR		6
+#define ACPI_RES_GPE0		7
+#define ACPI_RES_GPE1		8
+#define ACPI_RES_MAX		9
+
+struct acpi_io_resource {
+	struct resource		*rsc;
+	int			rid;
+	bus_space_handle_t	bhandle;
+	bus_space_tag_t		btag;
+};
+
 /* 
  * Softc 
-*/
+ */
 typedef struct acpi_softc {
 	device_t	dev;
 	dev_t		dev_t;
+
+	struct acpi_io_resource iores[ACPI_RES_MAX];
 
-	struct resource	*port;
-	int		port_rid;
 	struct resource	*irq;
 	int		irq_rid;
 	void		*irq_handle;
@@ -126,6 +148,23 @@
 } acpi_softc_t;
 
 /* 
+ * ACPI register I/O 
+ */
+#define	ACPI_REGISTER_INPUT	0
+#define	ACPI_REGISTER_OUTPUT	1
+extern void	acpi_enable_disable(acpi_softc_t *sc, boolean_t enable);
+extern void	acpi_io_pm1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *status);
+extern void	acpi_io_pm1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *enable);
+extern void	acpi_io_pm1_control(acpi_softc_t *sc, boolean_t io, u_int32_t *val_a, u_int32_t *val_b);
+extern void	acpi_io_pm2_control(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
+extern void	acpi_io_pm_timer(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
+extern void	acpi_io_gpe0_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
+extern void	acpi_io_gpe0_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
+extern void	acpi_io_gpe1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
+extern void	acpi_io_gpe1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val);
+
+
+/* 
  * Device State 
  */
 extern u_int8_t	 acpi_get_current_device_state(struct aml_name *name);
@@ -147,7 +186,7 @@
 /* 
  * GPE enable bit manipulation 
  */
-extern void	acpi_gpe_enable_bit(acpi_softc_t *, u_int32_t, boolean_t);
+extern void	acpi_gpe_enable_bit(acpi_softc_t *sc, u_int32_t bit, boolean_t on_off);
 
 /*
  * Event queue
@@ -164,3 +203,5 @@
 #define ACPI_DEBUGPRINT(args...)	do { if (acpi_debug) ACPI_DEVPRINTF(args);} while(0)
 
 #endif	/* !_DEV_ACPI_ACPI_H_ */
+
+
Index: dev/acpi/acpi_io.c
===================================================================
RCS file: acpi_io.c
diff -N acpi_io.c
--- /dev/null	Thu Sep 28 10:32:34 2000
+++ acpi_io.c	Wed Sep 27 04:15:36 2000
@@ -0,0 +1,358 @@
+/*-
+ * Copyright (c) 1999 Takanori Watanabe <takawata@shidahara1.planet.sci.kobe-u.ac.jp>
+ * Copyright (c) 1999, 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	$Id: acpi.c,v 1.26 2000/08/15 14:43:43 iwasaki Exp $
+ *	$FreeBSD: src/sys/dev/acpi/acpi.c,v 1.13 2000/09/27 01:40:47 msmith Exp $
+ */
+
+#include "opt_acpi.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/sysctl.h>
+
+#include <sys/malloc.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <sys/eventhandler.h>		/* for EVENTHANDLER_REGISTER */
+#include <sys/reboot.h>			/* for RB_POWEROFF */
+#include <machine/clock.h>		/* for DELAY */
+#include <sys/unistd.h>                 /* for RFSTOPPED*/
+#include <sys/kthread.h>                /* for kthread stuff*/
+#include <sys/ctype.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <sys/acpi.h>
+#include <dev/acpi/acpi.h>		/* for softc */
+
+/*
+ * ACPI Register I/O
+ */
+static __inline void
+acpi_register_input(acpi_softc_t *sc, int res, int offset, u_int32_t *value, u_int32_t size)
+{
+	bus_space_tag_t		bst;
+	bus_space_handle_t	bsh;
+	u_int32_t		val;
+
+	if (sc->iores[res].rsc == NULL)
+		return;
+
+	bst = sc->iores[res].btag;
+	bsh = sc->iores[res].bhandle;
+
+	switch (size) {
+	case 1:
+		val = bus_space_read_1(bst, bsh, offset);
+		break;
+	case 2:
+		val = bus_space_read_2(bst, bsh, offset);
+		break;
+	case 3:
+		val = bus_space_read_4(bst, bsh, offset);
+		val &= 0x00ffffff;
+		break;
+	case 4:
+		val = bus_space_read_4(bst, bsh, offset);
+		break;
+	default:
+		ACPI_DEVPRINTF("acpi_register_input(): invalid size\n");
+		val = 0;
+		break;
+	}
+
+	*value = val;
+}
+
+static __inline void
+acpi_register_output(acpi_softc_t *sc, int res, int offset, u_int32_t *value, u_int32_t size)
+{
+	bus_space_tag_t		bst;
+	bus_space_handle_t	bsh;
+	u_int32_t		val;
+
+	if (sc->iores[res].rsc == NULL)
+		return;
+
+	val = *value;
+	bst = sc->iores[res].btag;
+	bsh = sc->iores[res].bhandle;
+
+	switch (size) {
+	case 1:
+		bus_space_write_1(bst, bsh, offset, val & 0xff);
+		break;
+	case 2:
+		bus_space_write_2(bst, bsh, offset, val & 0xffff);
+		break;
+	case 3:
+		bus_space_write_2(bst, bsh, offset, val & 0xffff);
+		bus_space_write_1(bst, bsh, offset + 2, (val >> 16) & 0xff);
+		break;
+	case 4:
+		bus_space_write_4(bst, bsh, offset, val);
+		break;
+	default:
+		ACPI_DEVPRINTF("acpi_register_output(): invalid size\n");
+		break;
+	}
+}
+
+static __inline void
+acpi_io_mirreg(acpi_softc_t *sc, boolean_t io, u_int32_t *data, 
+	       int res, int altres, int offset, int size)
+{
+	u_int32_t	result;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, res, offset, &result, size);
+		*data = result;
+		acpi_register_input(sc, altres, offset, &result, size);
+		*data |= result;
+	} else {
+		acpi_register_output(sc, res, offset, data, size);
+		acpi_register_output(sc, altres, offset, data, size);
+	}
+
+	return;
+}
+
+void
+acpi_enable_disable(acpi_softc_t *sc, boolean_t enable)
+{
+	u_int8_t	val;
+
+	val = enable ? sc->facp_body->acpi_enable : sc->facp_body->acpi_disable;
+	bus_space_write_1(sc->iores[ACPI_RES_SMI_CMD].btag,
+			  sc->iores[ACPI_RES_SMI_CMD].bhandle,
+			  0, val);
+	sc->enabled = enable;
+
+	ACPI_DEBUGPRINT("acpi_enable_disable(%d) = (%x)\n", enable, val);
+}
+
+void
+acpi_io_pm1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *status)
+{
+	int		size;
+	struct FACPbody	*facp;
+
+	facp = sc->facp_body;
+	size = facp->pm1_evt_len / 2;
+	acpi_io_mirreg(sc, io, status, ACPI_RES_PM1A_EVT, ACPI_RES_PM1B_EVT, 0, size);
+
+	ACPI_DEBUGPRINT("acpi_io_pm1_status(%d) = (%x)\n", io, *status);
+}
+
+void
+acpi_io_pm1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *enable)
+{
+	int		size;
+	struct FACPbody	*facp;
+
+	facp = sc->facp_body;
+	size = facp->pm1_evt_len / 2;
+	acpi_io_mirreg(sc, io, enable, ACPI_RES_PM1A_EVT, ACPI_RES_PM1B_EVT, size, size);
+
+	ACPI_DEBUGPRINT("acpi_io_pm1_enable(%d) = (%x)\n", io, *enable);
+}
+
+/*
+ * PM1 is awkward because the SLP_TYP bits are not common between the two registers.
+ * A better interface than this might pass the SLP_TYP bits separately.
+ */
+void
+acpi_io_pm1_control(acpi_softc_t *sc, boolean_t io, u_int32_t *value_a, u_int32_t *value_b)
+{
+	struct FACPbody	*facp;
+	u_int32_t	result;
+
+	facp = sc->facp_body;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_PM1A_CNT, 0, &result, facp->pm1_cnt_len);
+		*value_a = result;
+		acpi_register_input(sc, ACPI_RES_PM1B_CNT, 0, &result, facp->pm1_cnt_len);
+		*value_a |= result;
+		*value_a &= ~ACPI_CNT_SLP_TYPX;	/* mask the SLP_TYP bits */
+	} else {
+		acpi_register_output(sc, ACPI_RES_PM1A_CNT, 0, value_a, facp->pm1_cnt_len);
+		acpi_register_output(sc, ACPI_RES_PM1B_CNT, 0, value_b, facp->pm1_cnt_len);
+	}
+
+	ACPI_DEBUGPRINT("acpi_io_pm1_control(%d) = (%x, %x)\n", io, *value_a, *value_b);
+}
+
+void
+acpi_io_pm2_control(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
+{
+	int		size;
+	struct FACPbody	*facp;
+
+	facp = sc->facp_body;
+	size = facp->pm2_cnt_len;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_PM2_CNT, 0, val, size);
+	} else {
+		acpi_register_output(sc, ACPI_RES_PM2_CNT, 0, val, size);
+	}
+
+	ACPI_DEBUGPRINT("acpi_io_pm2_control(%d) = (%x)\n", io, *val);
+
+	return;
+}
+
+void
+acpi_io_pm_timer(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
+{
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_PM_TMR, 0, val, sizeof(u_int32_t));
+
+		ACPI_DEBUGPRINT("acpi_io_pm_timer(%d) = (%x)\n", io, *val);
+	}
+}
+
+void
+acpi_io_gpe0_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
+{
+	int		size;
+	struct	FACPbody *facp;
+
+	facp = sc->facp_body;
+	size = facp->gpe0_len / 2;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_GPE0, 0, val, size);
+	} else {
+		acpi_register_output(sc, ACPI_RES_GPE0, 0, val, size);
+	}
+
+	ACPI_DEBUGPRINT("acpi_io_gpe0_status(%d) = (%x)\n", io, *val);
+}
+
+void
+acpi_io_gpe0_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
+{
+	int		size;
+	struct	FACPbody *facp;
+
+	facp = sc->facp_body;
+	size = facp->gpe0_len / 2;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_GPE0, size, val, size);
+	} else {
+		acpi_register_output(sc, ACPI_RES_GPE0, size, val, size);
+	}
+
+	ACPI_DEBUGPRINT("acpi_io_gpe0_enable(%d) = (%x)\n", io, *val);
+}
+
+void
+acpi_io_gpe1_status(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
+{
+	int		size;
+	struct	FACPbody *facp;
+
+	facp = sc->facp_body;
+	size = facp->gpe1_len / 2;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_GPE1, 0, val, size);
+	} else {
+		acpi_register_output(sc, ACPI_RES_GPE1, 0, val, size);
+	}
+
+	ACPI_DEBUGPRINT("acpi_io_gpe1_status(%d) = (%x)\n", io, *val);
+}
+
+void
+acpi_io_gpe1_enable(acpi_softc_t *sc, boolean_t io, u_int32_t *val)
+{
+	int		size;
+	struct	FACPbody *facp;
+
+	facp = sc->facp_body;
+	size = facp->gpe1_len / 2;
+
+	if (io == ACPI_REGISTER_INPUT) {
+		acpi_register_input(sc, ACPI_RES_GPE1, size, val, size);
+	} else {
+		acpi_register_output(sc, ACPI_RES_GPE1, size, val, size);
+	}
+
+	ACPI_DEBUGPRINT("acpi_io_gpe0_enable(%d) = (%x)\n", io, *val);
+}
+
+void
+acpi_gpe_enable_bit(acpi_softc_t *sc, u_int32_t bit, boolean_t on_off)
+{
+	u_int32_t	value;
+	int		res;
+
+	/*
+	 * Is the bit in the first GPE port?
+	 */
+	if (bit < ((sc->facp_body->gpe0_len / 2) * 8)) {
+		res = ACPI_RES_GPE0;
+	} else {
+		/*
+		 * Is the bit in the second GPE port?
+		 */
+		bit -= sc->facp_body->gpe1_base;
+		if (bit < ((sc->facp_body->gpe1_len / 2) * 8)) {
+			res = ACPI_RES_GPE1;
+		} else {
+			return;	/* do nothing */
+		}
+	}
+
+	switch (res) {
+	case ACPI_RES_GPE0:
+		acpi_io_gpe0_enable(sc, ACPI_REGISTER_INPUT, &value);
+		break;
+	case ACPI_RES_GPE1:
+		acpi_io_gpe1_enable(sc, ACPI_REGISTER_INPUT, &value);
+		break;
+	}
+	value = (value & ~(1 << bit)) | (on_off ? (1 << bit) : 0);
+	switch (res) {
+	case ACPI_RES_GPE0:
+		acpi_io_gpe0_enable(sc, ACPI_REGISTER_OUTPUT, &value);
+		break;
+	case ACPI_RES_GPE1:
+		acpi_io_gpe1_enable(sc, ACPI_REGISTER_OUTPUT, &value);
+		break;
+	}
+}
+
Index: dev/acpi/acpi_powerres.c
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/dev/acpi/acpi_powerres.c,v
retrieving revision 1.7
diff -u -r1.7 acpi_powerres.c
--- dev/acpi/acpi_powerres.c	2000/09/27 05:43:54	1.7
+++ dev/acpi/acpi_powerres.c	2000/09/28 17:37:02
@@ -33,8 +33,11 @@
 #include <sys/malloc.h>
 #include <sys/bus.h>
 
-#include <sys/acpi.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
 
+#include <sys/acpi.h>
 #include <dev/acpi/acpi.h>
 
 #include <dev/acpi/aml/aml_amlmem.h>

--==_Exmh_-2406949460
Content-Type: text/plain; charset=us-ascii

... every activity meets with opposition, everyone who acts has his
rivals and unfortunately opponents also.  But not because people want
to be opponents, rather because the tasks and relationships force
people to take different points of view.  [Dr. Fritz Todt]
           V I C T O R Y   N O T   V E N G E A N C E

--==_Exmh_-2406949460--




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200009281819.e8SIJhA01660>