Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Sep 2000 02:16:48 -0700
From:      Mike Smith <msmith@freebsd.org>
To:        Munehiro Matsuda <haro@tk.kubota.co.jp>
Cc:        takawata@shidahara1.planet.sci.kobe-u.ac.jp, current@freebsd.org, acpi-jp@jp.freebsd.org
Subject:   ACPI megapatch
Message-ID:  <200009290916.e8T9GmA04415@mass.osd.bsdi.com>

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

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


Here's the latest ACPI megapatch:

 - Move all the register I/O into a separate file
 - Made all the I/O spaces use proper bus resources
 - Allocate the resources in machine-dependant code
 - Map ACPI-used memory in machine-dependant code
 - Create a machine-dependant "acpiprobe" device which just knows
   how to find and set up ACPI for the machine-independant code
 - Remove all the ACPI #ifdefs from non-ACPI code
 - Minor style and commenting fixes

Issues outstanding:

 - Need to remove superfluous headers
 - Need to decide the correct split between <sys/acpi.h> and 
   <sys/dev/acpi/acpi.h> in terms of functionality.

Comments, etc. all welcome as usual.



--==_Exmh_294820930
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/29 07:54:01
@@ -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,38 +62,14 @@
 #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
- */
-#define ACPI_SMAP_MAX_SIZE	16
-
-struct ACPIaddr {
-	int	entries;
-	struct {
-		vm_offset_t	pa_base;
-		vm_offset_t	va_base;
-		vm_size_t	size;
-		u_int32_t	type;
-	} t [ACPI_SMAP_MAX_SIZE];
-};
-
-static void		 acpi_pmap_init(void);
-static void		 acpi_pmap_release(void);
-static vm_offset_t	 acpi_pmap_ptv(vm_offset_t pa);
-static vm_offset_t	 acpi_pmap_vtp(vm_offset_t va);
-static void		 acpi_free(struct acpi_softc *sc);
 
 /*
  * These items cannot be in acpi_softc because they are be initialized
  * before probing for the device.
  */
 
-static struct	ACPIaddr acpi_addr;
+struct		ACPIaddr acpi_addr;
 struct		ACPIrsdp *acpi_rsdp;
-static int	acpi_port;
-static int	acpi_irq;
 
 /* Character device */
 
@@ -122,32 +97,8 @@
 };
 
 /* 
- * ACPI register I/O 
+ * Miscellaneous utility functions 
  */
-#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 
- */
-static int  acpi_sdt_checksum(struct ACPIsdt * sdt);
 static void acpi_handle_dsdt(acpi_softc_t *sc);
 static void acpi_handle_facp(acpi_softc_t *sc, struct ACPIsdt *facp);
 static int  acpi_handle_rsdt(acpi_softc_t *sc);
@@ -164,8 +115,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);
@@ -174,22 +124,22 @@
 /*
  * Bus interface 
  */
-static int  acpi_send_pm_event(acpi_softc_t *sc, u_int8_t state);
-static void acpi_identify(driver_t *driver, device_t parent);
 static int  acpi_probe(device_t dev);
 static int  acpi_attach(device_t dev);
+static void acpi_free(struct acpi_softc *sc);
 
 /*
  * Event thread
  */
+static int  acpi_send_pm_event(acpi_softc_t *sc, u_int8_t state);
 static void acpi_event_thread(void *);
 static void acpi_start_threads(void *);
 
 /* 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, "");
@@ -197,9 +147,8 @@
 /*
  * ACPI pmap subsystem
  */
-
 void
-acpi_init_addr_range()
+acpi_init_addr_range(void)
 {
 	acpi_addr.entries = 0;
 }
@@ -238,35 +187,7 @@
 	acpi_addr.entries++;
 }
 
-static void
-acpi_pmap_init()
-{
-	int		i;
-	vm_offset_t	va;
-
-	for (i = 0; i < acpi_addr.entries; i++) {
-		va = (vm_offset_t) pmap_mapdev(acpi_addr.t[i].pa_base,
-					       acpi_addr.t[i].size);
-		acpi_addr.t[i].va_base = va;
-		ACPI_DEBUGPRINT("ADDR RANGE %x %x (mapped 0x%x)\n",
-				acpi_addr.t[i].pa_base, acpi_addr.t[i].size, va);
-	}
-}
-
-static void
-acpi_pmap_release()
-{
-#if 0
-	int		i;
-
-	for (i = 0; i < acpi_addr.entries; i++) {
-		pmap_unmapdev(acpi_addr.t[i].va_base, acpi_addr.t[i].size);
-	}
-	acpi_addr.entries = 0;
-#endif
-}
-
-static vm_offset_t
+vm_offset_t
 acpi_pmap_ptv(vm_offset_t pa)
 {
 	int		i;
@@ -284,7 +205,7 @@
 	return (va);
 }
 
-static vm_offset_t
+vm_offset_t
 acpi_pmap_vtp(vm_offset_t va)
 {
 	int		i;
@@ -302,366 +223,10 @@
 	return (pa);
 }
 
-/*
- * ACPI Register I/O
- */
-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
+ * Miscellaneous utility functions
  */
-
-static int
+int
 acpi_sdt_checksum(struct ACPIsdt *sdt)
 {
 	u_char	cksm, *ckbf;
@@ -769,10 +334,6 @@
 
 /*
  * Handle the FACP.
- *
- * In the special case where sc is NULL, we are just trying to set acpi_port 
- * and acpi_irq, so don't try to do anything to the softc, and return as soon
- * as we have worked them out.
  */
 static void
 acpi_handle_facp(acpi_softc_t *sc, struct ACPIsdt *facp)
@@ -781,16 +342,8 @@
 	struct FACPbody	*body;
 	struct FACS	*facs;
 
-	body = (struct FACPbody *)facp->body;
-
-	/* in discovery mode, we have everything we need now */
-	if (sc == NULL) {
-		acpi_port = body->smi_cmd;
-		acpi_irq = body->sci_int;
-		return;
-	}
-
 	ACPI_DEBUGPRINT("	FACP found\n");
+	body = (struct FACPbody *)facp->body;
 	sc->facp = facp;
 	sc->facp_body = body;
 	sc->dsdt = NULL;
@@ -824,9 +377,6 @@
 
 /*
  * Handle the RSDT.
- *
- * In the special case where sc is NULL, we are just trying to set acpi_port 
- * and acpi_irq, so don't try to do anything to the softc.
  */
 static int
 acpi_handle_rsdt(acpi_softc_t *sc)
@@ -847,8 +397,7 @@
 		ACPI_DEVPRINTF("RSDT is broken\n");
 		return (-1);
 	}
-	if (sc != NULL)
-		sc->rsdt = rsdt;
+	sc->rsdt = rsdt;
 	entries = (rsdt->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t);
 	ACPI_DEBUGPRINT("RSDT have %d entries\n", entries);
 	ptrs = (u_int32_t *) & rsdt->body;
@@ -864,7 +413,6 @@
 			acpi_handle_facp(sc, sdt);
 		}
 	}
-
 	return (0);
 }
 
@@ -887,18 +435,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 +472,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 +618,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 +640,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 +663,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 +676,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 +709,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 +747,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 +784,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 +813,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 +838,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
@@ -1396,7 +938,6 @@
 /*
  * Bus interface
  */
-
 static devclass_t acpi_devclass;
 
 static int
@@ -1424,39 +965,6 @@
 	return (error);
 }
 
-static void
-acpi_identify(driver_t *driver, device_t parent)
-{
-	device_t        child;
-
-	/*
-	 * If the MD code hasn't detected an RSDT, or there has already 
-	 * been an 'acpi' device instantiated, give up now.
-	 */
-	if ((acpi_rsdp == NULL) || (device_find_child(parent, "acpi", 0)))
-		return;
-
-	/*
-	 * Handle enough of the RSDT to work out what our I/O resources
-	 * are.
-	 */
-	acpi_pmap_init();
-	if (acpi_handle_rsdt(NULL))
-		return;
-
-	/*
-	 * Create the device and establish its resources.
-	 */
-	if ((child = BUS_ADD_CHILD(parent, 101, "acpi", 0)) == NULL) {
-		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);
-}
-
 static int
 acpi_probe(device_t dev)
 {
@@ -1485,6 +993,7 @@
 acpi_attach(device_t dev)
 {
 	acpi_softc_t	*sc;
+	int		i;
 
 	/*
 	 * Set up the softc and parse the ACPI data completely.
@@ -1498,12 +1007,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, 
@@ -1535,8 +1048,6 @@
 
 	EVENTHANDLER_REGISTER(shutdown_final, acpi_soft_off, sc, SHUTDOWN_PRI_LAST);
 
-	acpi_pmap_release();
-
 	sc->dev_t = make_dev(&acpi_cdevsw, 0, 0, 5, 0660, "acpi");
 	sc->dev_t->si_drv1 = sc;
 	
@@ -1564,13 +1075,20 @@
 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)
 		bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid, sc->irq);
-	acpi_pmap_release();
 }
 
 static int
@@ -1589,7 +1107,6 @@
 
 static device_method_t acpi_methods[] = {
 	/* Device interface */
-	DEVMETHOD(device_identify,	acpi_identify),
 	DEVMETHOD(device_probe,		acpi_probe),
 	DEVMETHOD(device_attach,	acpi_attach),
 	DEVMETHOD(device_resume,	acpi_resume),
@@ -1697,7 +1214,10 @@
 void acpi_start_threads(void *arg)
 {
 	acpi_softc_t	*sc = devclass_get_softc(acpi_devclass, 0);
-	device_t	dev = devclass_get_device(acpi_devclass, 0);
+
+	/* check to see that we were attached */
+	if (sc == NULL)
+		return;
 
 	ACPI_DEBUGPRINT("start thread\n");
 	if (kthread_create(acpi_event_thread, sc, &sc->acpi_thread, 0, "acpi")) {
@@ -1706,6 +1226,3 @@
 }
 
 SYSINIT(acpi, SI_SUB_KTHREAD_IDLE, SI_ORDER_ANY, acpi_start_threads, 0);
-
-
-
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/29 07:15:30
@@ -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
@@ -155,6 +194,29 @@
 extern void	acpi_queue_event(acpi_softc_t *sc, int type, int arg);
 
 /*
+ * ACPI pmap subsystem
+ */
+#define ACPI_SMAP_MAX_SIZE	16
+
+struct ACPIaddr {
+	int	entries;
+	struct {
+		vm_offset_t	pa_base;
+		vm_offset_t	va_base;
+		vm_size_t	size;
+		u_int32_t	type;
+	} t [ACPI_SMAP_MAX_SIZE];
+};
+
+extern struct ACPIaddr	acpi_addr;
+extern struct ACPIrsdp *acpi_rsdp;	/* ACPI Root System Description Table */
+extern void		acpi_init_addr_range(void);
+extern void		acpi_register_addr_range(u_int64_t base, u_int64_t size, u_int32_t type);
+extern int		acpi_sdt_checksum(struct ACPIsdt * sdt);
+extern vm_offset_t	acpi_pmap_ptv(vm_offset_t pa);
+extern vm_offset_t	acpi_pmap_vtp(vm_offset_t va);
+
+/*
  * Debugging, console output
  *
  * XXX this should really be using device_printf
@@ -164,3 +226,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	Fri Sep 29 01:35:14 2000
@@ -0,0 +1,373 @@
+/*-
+ * 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 (%d)\n", size);
+		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 (size == 0)			/* port is optional */
+	    return;
+
+	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 (size == 0)			/* port is optional */
+	    return;
+
+	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 (size == 0)			/* port is optional */
+	    return;
+
+	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 (size == 0)			/* port is optional */
+	    return;
+
+	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 (size == 0)			/* port is optional */
+	    return;
+
+	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>
Index: i386/i386/acpi_machdep.c
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/i386/i386/acpi_machdep.c,v
retrieving revision 1.2
diff -u -r1.2 acpi_machdep.c
--- i386/i386/acpi_machdep.c	2000/09/02 15:06:35	1.2
+++ i386/i386/acpi_machdep.c	2000/09/29 08:22:33
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
+ * Copyright (c) 2000 Michael Smith <msmith@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,9 +29,273 @@
  */
 
 #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 <machine/acpi_machdep.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 */
+
+#include <dev/acpi/aml/aml_amlmem.h>
+#include <dev/acpi/aml/aml_common.h>
+#include <dev/acpi/aml/aml_env.h>
+#include <dev/acpi/aml/aml_evalobj.h>
+#include <dev/acpi/aml/aml_name.h>
+#include <dev/acpi/aml/aml_parse.h>
+#include <dev/acpi/aml/aml_memman.h>
+#include <sys/param.h>		/* XXX trim includes */
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/bus.h>
+#include <sys/acpi.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <machine/md_var.h>
+#include <machine/segments.h>
+#include <machine/stdarg.h>
+#include <machine/vmparam.h>
+#include <machine/pc/bios.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <machine/vm86.h>
+
+
+#include <dev/acpi/acpi.h>
+
 #ifdef ACPI_NO_OSDFUNC_INLINE
 #include <machine/acpica_osd.h>
 #endif	/* ACPI_NO_OSDFUNC_INLINE */
+
+static void		acpiprobe_identify(driver_t *driver, device_t parent);
+static void		acpiprobe_mapmem(void);
+static struct FACPbody	*acpiprobe_facp(struct ACPIrsdp *rsdp);
+
+
+static device_method_t acpiprobe_methods[] = {
+    /* Device interface */
+    DEVMETHOD(device_identify,	acpiprobe_identify),
+    {0, 0}
+};
+
+static driver_t acpiprobe_driver = {
+    "acpiprobe",
+    acpiprobe_methods,
+    0,
+};
+
+static devclass_t acpiprobe_devclass;
+DRIVER_MODULE(acpiprobe, nexus, acpiprobe_driver, acpiprobe_devclass, 0, 0);
+
+static void
+acpiprobe_identify(driver_t *driver, device_t parent)
+{
+    device_t		child;
+    u_long		sigaddr;
+    struct ACPIrsdp	*rsdp;
+    struct FACPbody	*facp;
+    u_int8_t		ck, *cv;
+    int			i;
+
+    /*
+     * If we've already got ACPI attached somehow, don't try again.
+     */
+    if (device_find_child(parent, "acpi", 0)) {
+	printf("ACPI: already attached\n");
+	return;
+    }
+
+    /*
+     * Search for the RSD PTR signature.
+     */
+    if ((sigaddr = bios_sigsearch(0, "RSD PTR ", 8, 16, 0)) == 0) {
+	printf("ACPI: no support in system\n");
+	return;
+    }
+
+    /* get a virtual pointer to the structure */
+    rsdp = (struct ACPIrsdp *)(uintptr_t)BIOS_PADDRTOVADDR(sigaddr);
+    for (cv = (u_int8_t *)rsdp, ck = 0, i = 0; i < sizeof(struct ACPIrsdp); i++) {
+	ck += cv[i];
+    }
+	
+    /* If checksum is OK, attach ACPI */
+    if (ck != 0) {
+	printf("ACPI: Bad ACPI BIOS data checksum\n");
+	return;
+    }
+
+    /*
+     * Handle enough of the RSDT to work out what our I/O resources are.
+     */
+    acpi_rsdp = rsdp;
+    acpiprobe_mapmem();
+    if ((facp = acpiprobe_facp(rsdp)) == NULL) {
+	printf("ACPI: can't map RSDT/FACT\n");
+	return;
+    }
+
+    /*
+     * Create the device and establish its resources.
+     */
+    if ((child = BUS_ADD_CHILD(parent, 101, "acpi", 0)) == NULL) {
+	device_printf(parent, "ACPI: could not attach child\n");
+	return;
+    }
+
+    /*
+     * SMI command register
+     */
+    bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_SMI_CMD,
+		     facp->smi_cmd, 1);
+
+    /*
+     * PM1 event registers
+     */
+    bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_EVT,
+		     facp->pm1a_evt_blk, facp->pm1_evt_len);
+    if (facp->pm1b_evt_blk != 0)
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_EVT,
+			 facp->pm1b_evt_blk, facp->pm1_evt_len);
+
+    /*
+     * PM1 control registers
+     */
+    bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_CNT,
+		     facp->pm1a_cnt_blk, facp->pm1_cnt_len);
+    if (facp->pm1b_cnt_blk != 0)
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_CNT,
+			 facp->pm1b_cnt_blk, facp->pm1_cnt_len);
+
+    /*
+     * PM2 control register
+     */
+    bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM2_CNT,
+		     facp->pm2_cnt_blk, facp->pm2_cnt_len);
+
+    /*
+     * PM timer register
+     */
+    bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM_TMR,
+		     facp->pm_tmr_blk, 4);
+
+    /*
+     * General purpose event registers
+     */
+    if (facp->gpe0_blk != 0)
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE0,
+			 facp->gpe0_blk, facp->gpe0_len);
+    if (facp->gpe1_blk != 0)
+	bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE1,
+			 facp->gpe1_blk, facp->gpe1_len);
+
+    /*
+     * Notification interrupt
+     */
+    if (facp->sci_int != 0)
+	bus_set_resource(child, SYS_RES_IRQ, 0, facp->sci_int, 1);
+}
+
+/*
+ * Find and map all memory regions that are regarded as belonging to ACPI
+ * and let the MI code know about them.  Scan the ACPI memory map as managed
+ * by the MI code and map it into kernel space.
+ */
+static void
+acpiprobe_mapmem(void)
+{
+    struct vm86frame	vmf;
+    struct vm86context	vmc;
+    struct bios_smap	*smap;
+    vm_offset_t		va;
+    int			i;
+
+    bzero(&vmf, sizeof(struct vm86frame));
+
+    acpi_init_addr_range();
+
+    /*
+     * Scan memory map with INT 15:E820
+     */
+    vmc.npages = 0;
+    smap = (void *)vm86_addpage(&vmc, 1, KERNBASE + (1 << PAGE_SHIFT));
+    vm86_getptr(&vmc, (vm_offset_t)smap, &vmf.vmf_es, &vmf.vmf_di);
+
+    vmf.vmf_ebx = 0;
+    do {
+	vmf.vmf_eax = 0xE820;
+	vmf.vmf_edx = SMAP_SIG;
+	vmf.vmf_ecx = sizeof(struct bios_smap);
+	i = vm86_datacall(0x15, &vmf, &vmc);
+	if (i || vmf.vmf_eax != SMAP_SIG)
+	    break;
+
+	/* ACPI-owned memory? */
+	if (smap->type == 0x03 || smap->type == 0x04) {
+	    acpi_register_addr_range(smap->base, smap->length, smap->type);
+	}
+    } while (vmf.vmf_ebx != 0);
+
+    /*
+     * Map the physical ranges that have been registered into the kernel.
+     */
+    for (i = 0; i < acpi_addr.entries; i++) {
+	va = (vm_offset_t)pmap_mapdev(acpi_addr.t[i].pa_base, acpi_addr.t[i].size);
+	acpi_addr.t[i].va_base = va;
+    }
+}
+
+/*
+ * Locate the FACP within the mapped ACPI memory.
+ */
+static struct FACPbody *
+acpiprobe_facp(struct ACPIrsdp *rsdp)
+{
+    u_int32_t		*ptrs;
+    int			entries;
+    int			i;
+    struct ACPIsdt	*rsdt, *sdt;
+    char		sigstring[5];
+
+    rsdt = (struct ACPIsdt *)acpi_pmap_ptv(rsdp->addr);
+    if (rsdt == NULL) {
+	ACPI_DEVPRINTF("can't map memory for RSDT");
+	return(NULL);
+    }
+    if ((strncmp(rsdt->signature, "RSDT", 4) != 0) ||
+	(acpi_sdt_checksum(rsdt) != 0)) {
+	ACPI_DEVPRINTF("RSDT is broken\n");
+	return(NULL);
+    }
+    entries = (rsdt->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t);
+    ptrs = (u_int32_t *)&rsdt->body;
+
+    for (i = 0; i < entries; i++) {
+	sdt = (struct ACPIsdt *) acpi_pmap_ptv((vm_offset_t) ptrs[i]);
+	if (strncmp(sdt->signature, "FACP", 4) == 0 && acpi_sdt_checksum(sdt) == 0) {
+	    return((struct FACPbody *)sdt->body);
+	}
+    }
+    return(NULL);
+}
Index: i386/i386/bios.c
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/i386/i386/bios.c,v
retrieving revision 1.38
diff -u -r1.38 bios.c
--- i386/i386/bios.c	2000/08/31 15:34:54	1.38
+++ i386/i386/bios.c	2000/09/29 05:34:30
@@ -31,7 +31,6 @@
  * Code for dealing with the BIOS in x86 PC systems.
  */
 
-#include "acpi.h"
 #include "isa.h"
 
 #include <sys/param.h>
@@ -50,10 +49,6 @@
 #include <isa/pnpreg.h>
 #include <isa/pnpvar.h>
 
-#if NACPI > 0
-#include <sys/acpi.h>
-#endif
-
 #define BIOS_START	0xe0000
 #define BIOS_SIZE	0x20000
 
@@ -148,26 +143,6 @@
 	    printf("pnpbios: Bad PnP BIOS data checksum\n");
 	}
     }
-#if NACPI > 0
-    /*
-     * ACPI BIOS
-     * acpi_rsdp is GLOBAL and holds RSD PTR signature
-     */
-    if ((sigaddr = bios_sigsearch(0, "RSD PTR ", 8, 16, 0)) != 0) {
- 	/* get a virtual pointer to the structure */
-      acpi_rsdp = (struct ACPIrsdp *)(uintptr_t)BIOS_PADDRTOVADDR(sigaddr);
-      for (cv = (u_int8_t *)acpi_rsdp, ck = 0, i = 0; i < sizeof(struct ACPIrsdp); i++) {
- 	    ck += cv[i];
-      }
-      
-      /* If checksum is NG, disable it */
- 	if (ck != 0) {
- 	  printf("ACPI: Bad ACPI BIOS data checksum\n");
- 	  acpi_rsdp=NULL;/* 0xa0000<=RSD_PTR<0x100000*/
-        }
-    }
-#endif
-
     if (bootverbose) {
 	    /* look for other know signatures */
 	    printf("Other BIOS signatures found:\n");
Index: i386/i386/machdep.c
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/i386/i386/machdep.c,v
retrieving revision 1.411
diff -u -r1.411 machdep.c
--- i386/i386/machdep.c	2000/09/22 23:39:50	1.411
+++ i386/i386/machdep.c	2000/09/29 07:21:34
@@ -37,7 +37,6 @@
  *	from: @(#)machdep.c	7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.411 2000/09/22 23:39:50 ps Exp $
  */
-#include "acpi.h"
 #include "apm.h"
 #include "npx.h"
 #include "opt_atalk.h"
@@ -100,6 +99,7 @@
 #include <machine/ipl.h>
 #include <machine/md_var.h>
 #include <machine/mutex.h>
+#include <machine/pc/bios.h>
 #include <machine/pcb_ext.h>		/* pcb.h included via sys/user.h */
 #include <machine/globaldata.h>
 #include <machine/globals.h>
@@ -120,10 +120,6 @@
 #include <sys/ptrace.h>
 #include <machine/sigframe.h>
 
-#if NACPI > 0
-#include <sys/acpi.h>
-#endif
-
 extern void init386 __P((int first));
 extern void dblfault_handler __P((void));
 
@@ -1468,11 +1464,7 @@
 	vm_offset_t pa, physmap[PHYSMAP_SIZE];
 	pt_entry_t pte;
 	const char *cp;
-	struct {
-		u_int64_t base;
-		u_int64_t length;
-		u_int32_t type;
-	} *smap;
+	struct bios_smap *smap;
 
 	bzero(&vmf, sizeof(struct vm86frame));
 	bzero(physmap, sizeof(physmap));
@@ -1532,22 +1524,16 @@
 	/*
 	 * get memory map with INT 15:E820
 	 */
-#define SMAPSIZ 	sizeof(*smap)
-#define SMAP_SIG	0x534D4150			/* 'SMAP' */
-
 	vmc.npages = 0;
 	smap = (void *)vm86_addpage(&vmc, 1, KERNBASE + (1 << PAGE_SHIFT));
 	vm86_getptr(&vmc, (vm_offset_t)smap, &vmf.vmf_es, &vmf.vmf_di);
 
-#if NACPI > 0
-	acpi_init_addr_range();
-#endif
 	physmap_idx = 0;
 	vmf.vmf_ebx = 0;
 	do {
 		vmf.vmf_eax = 0xE820;
 		vmf.vmf_edx = SMAP_SIG;
-		vmf.vmf_ecx = SMAPSIZ;
+		vmf.vmf_ecx = sizeof(struct bios_smap);
 		i = vm86_datacall(0x15, &vmf, &vmc);
 		if (i || vmf.vmf_eax != SMAP_SIG)
 			break;
@@ -1558,13 +1544,7 @@
 				(u_int32_t)smap->base,
 				*(u_int32_t *)((char *)&smap->length + 4),
 				(u_int32_t)smap->length);
-#if NACPI > 0
-		/* Save ACPI related memory Info */
-		if (smap->type == 0x03 || smap->type == 0x04) {
-			acpi_register_addr_range(smap->base,
-						 smap->length, smap->type);
-		}
-#endif
+
 		if (smap->type != 0x01)
 			goto next_run;
 
Index: i386/include/pc/bios.h
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/i386/include/pc/bios.h,v
retrieving revision 1.8
diff -u -r1.8 bios.h
--- i386/include/pc/bios.h	2000/04/16 20:48:31	1.8
+++ i386/include/pc/bios.h	2000/09/29 05:46:52
@@ -218,3 +218,16 @@
 extern int bios16_call(struct bios_regs *, char *);
 extern int bios32(struct bios_regs *, u_int, u_short);
 extern void set_bios_selectors(struct bios_segments *, int);
+
+/*
+ * Int 15:E820 'SMAP' structure
+ *
+ * XXX add constants for type
+ */
+#define SMAP_SIG	0x534D4150			/* 'SMAP' */
+struct bios_smap {
+    u_int64_t	base;
+    u_int64_t	length;
+    u_int32_t	type;
+} __attribute__ ((packed));
+
Index: kern/kern_synch.c
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/kern/kern_synch.c,v
retrieving revision 1.100
diff -u -r1.100 kern_synch.c
--- kern/kern_synch.c	2000/09/24 00:33:51	1.100
+++ kern/kern_synch.c	2000/09/29 07:56:19
@@ -913,9 +913,11 @@
 	 */
 	microuptime(&new_switchtime);
 	if (timevalcmp(&new_switchtime, &switchtime, <)) {
+#if 0
 		printf("microuptime() went backwards (%ld.%06ld -> %ld.%06ld)\n",
 		    switchtime.tv_sec, switchtime.tv_usec,
 		    new_switchtime.tv_sec, new_switchtime.tv_usec);
+#endif
 		new_switchtime = switchtime;
 	} else {
 		p->p_runtime += (new_switchtime.tv_usec - switchtime.tv_usec) +
Index: sys/acpi.h
===================================================================
RCS file: /host/fs/local0/cvs/src/sys/sys/acpi.h,v
retrieving revision 1.2
diff -u -r1.2 acpi.h
--- sys/acpi.h	2000/08/29 20:30:54	1.2
+++ sys/acpi.h	2000/09/29 07:07:48
@@ -33,6 +33,21 @@
 
 #include <sys/ioccom.h>
 
+/* Generic Address structure */
+struct ACPIgas {
+	u_int8_t	address_space_id;
+#define ACPI_GAS_MEMORY		0
+#define ACPI_GAS_IO		1
+#define ACPI_GAS_PCI		2
+#define ACPI_GAS_EMBEDDED	3
+#define ACPI_GAS_SMBUS		4
+#define ACPI_GAS_FIXED		0x7f
+	u_int8_t	register_bit_width;
+	u_int8_t	register_bit_offset;
+	u_int8_t	res;
+	u_int64_t	address;
+} __attribute__((packed));
+
 /* Root System Description Pointer */
 struct ACPIrsdp {
 	u_char		signature[8];
@@ -96,7 +111,8 @@
 	u_int8_t	day_alrm;
 	u_int8_t	mon_alrm;
 	u_int8_t	century;
-	u_char		reserved4[3];
+	u_int16_t	iapc_boot_arch;
+	u_char		reserved4[1];
 	u_int32_t	flags;
 #define ACPI_FACP_FLAG_WBINVD	1	/* WBINVD is correctly supported */
 #define ACPI_FACP_FLAG_WBINVD_FLUSH 2	/* WBINVD flushes caches */
@@ -108,6 +124,19 @@
 #define ACPI_FACP_FLAG_RTC_S4	128	/* RTC can wakeup from S4 state */
 #define ACPI_FACP_FLAG_TMR_VAL_EXT 256	/* TMR_VAL is 32bit */
 #define ACPI_FACP_FLAG_DCK_CAP	512	/* Can support docking */
+	struct ACPIgas	reset_reg;
+	u_int8_t	reset_value;
+	u_int8_t	reserved5[3];
+	u_int64_t	x_firmware_ctrl;
+	u_int64_t	x_dsdt;
+	struct ACPIgas	x_pm1a_evt_blk;
+	struct ACPIgas	x_pm1b_evt_blk;
+	struct ACPIgas	x_pm1a_cnt_blk;
+	struct ACPIgas	x_pm1b_cnt_blk;
+	struct ACPIgas	x_pm2_cnt_blk;
+	struct ACPIgas	x_pm_tmr_blk;
+	struct ACPIgas	x_gpe0_blk;
+	struct ACPIgas	x_gpe1_blk;
 } __attribute__((packed));
 
 /* Firmware ACPI Control Structure */
@@ -186,11 +215,6 @@
 	} mode[6];
 };
 #define ACPI_UNSUPPORTSLPTYP	0xff	/* unsupported sleeping type */
-
-extern struct ACPIrsdp *acpi_rsdp;	/* ACPI Root System Description Table */
-
-void		 acpi_init_addr_range(void);
-void		 acpi_register_addr_range(u_int64_t, u_int64_t, u_int32_t);
 
 /*
  * ACPICA compatibility

--==_Exmh_294820930
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_294820930--




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?200009290916.e8T9GmA04415>