PERFORCE change 56210 for review

Peter Wemm peter at FreeBSD.org
Thu Jul 1 07:17:11 PDT 2004


http://perforce.freebsd.org/chv.cgi?CH=56210

Change 56210 by peter at peter_work on 2004/07/01 14:15:42

	IFC @56209

Affected files ...

.. //depot/projects/hammer/sys/amd64/acpica/acpi_machdep.c#14 integrate
.. //depot/projects/hammer/sys/amd64/amd64/nexus.c#25 integrate
.. //depot/projects/hammer/sys/boot/common/newvers.sh#3 integrate
.. //depot/projects/hammer/sys/conf/NOTES#50 integrate
.. //depot/projects/hammer/sys/conf/files#68 integrate
.. //depot/projects/hammer/sys/conf/files.amd64#48 integrate
.. //depot/projects/hammer/sys/conf/files.i386#34 integrate
.. //depot/projects/hammer/sys/conf/files.ia64#19 integrate
.. //depot/projects/hammer/sys/conf/kmod.mk#31 integrate
.. //depot/projects/hammer/sys/conf/newvers.sh#11 integrate
.. //depot/projects/hammer/sys/conf/options#43 integrate
.. //depot/projects/hammer/sys/contrib/ipfilter/netinet/fil.c#6 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi.c#40 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_acad.c#13 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_button.c#9 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_cmbat.c#13 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_ec.c#23 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_if.m#1 branch
.. //depot/projects/hammer/sys/dev/acpica/acpi_isab.c#7 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_lid.c#9 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_pci.c#14 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_pcib.c#19 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_pcib_acpi.c#9 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_powerres.c#11 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_quirk.c#1 branch
.. //depot/projects/hammer/sys/dev/acpica/acpi_quirks#2 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpi_resource.c#12 integrate
.. //depot/projects/hammer/sys/dev/acpica/acpivar.h#30 integrate
.. //depot/projects/hammer/sys/dev/amr/amr.c#11 integrate
.. //depot/projects/hammer/sys/dev/amr/amrvar.h#10 integrate
.. //depot/projects/hammer/sys/dev/ata/ata-raid.c#18 integrate
.. //depot/projects/hammer/sys/dev/digi/digi.c#14 integrate
.. //depot/projects/hammer/sys/dev/firewire/fwohci_pci.c#25 integrate
.. //depot/projects/hammer/sys/dev/pci/pci.c#22 integrate
.. //depot/projects/hammer/sys/dev/pci/pci_pci.c#11 integrate
.. //depot/projects/hammer/sys/dev/puc/puc.c#10 integrate
.. //depot/projects/hammer/sys/dev/random/randomdev.c#16 integrate
.. //depot/projects/hammer/sys/dev/rc/rc.c#11 integrate
.. //depot/projects/hammer/sys/dev/sio/sio.c#37 integrate
.. //depot/projects/hammer/sys/dev/uart/uart_tty.c#10 integrate
.. //depot/projects/hammer/sys/dev/usb/uftdi.c#13 integrate
.. //depot/projects/hammer/sys/dev/usb/ugen.c#16 integrate
.. //depot/projects/hammer/sys/dev/usb/uhub.c#6 integrate
.. //depot/projects/hammer/sys/dev/usb/usb_subr.c#12 integrate
.. //depot/projects/hammer/sys/dev/usb/usbdevs#39 integrate
.. //depot/projects/hammer/sys/dev/usb/usbdivar.h#4 integrate
.. //depot/projects/hammer/sys/geom/geom_disk.c#26 integrate
.. //depot/projects/hammer/sys/geom/geom_slice.c#16 integrate
.. //depot/projects/hammer/sys/i386/acpica/acpi_asus.c#5 integrate
.. //depot/projects/hammer/sys/i386/acpica/acpi_machdep.c#18 integrate
.. //depot/projects/hammer/sys/i386/acpica/acpi_toshiba.c#9 integrate
.. //depot/projects/hammer/sys/i386/conf/NOTES#44 integrate
.. //depot/projects/hammer/sys/i386/i386/i686_mem.c#8 integrate
.. //depot/projects/hammer/sys/i386/i386/mptable.c#13 integrate
.. //depot/projects/hammer/sys/i386/i386/nexus.c#12 integrate
.. //depot/projects/hammer/sys/i386/i386/pmap.c#41 integrate
.. //depot/projects/hammer/sys/i386/include/pmap.h#16 integrate
.. //depot/projects/hammer/sys/i386/isa/isa.c#4 integrate
.. //depot/projects/hammer/sys/i386/isa/vesa.c#7 integrate
.. //depot/projects/hammer/sys/i386/pci/pci_cfgreg.c#16 integrate
.. //depot/projects/hammer/sys/i386/pci/pci_pir.c#5 integrate
.. //depot/projects/hammer/sys/ia64/acpica/acpi_machdep.c#4 integrate
.. //depot/projects/hammer/sys/ia64/ia64/nexus.c#3 integrate
.. //depot/projects/hammer/sys/kern/kern_linker.c#17 integrate
.. //depot/projects/hammer/sys/kern/link_elf_obj.c#45 integrate
.. //depot/projects/hammer/sys/kern/subr_bus.c#22 integrate
.. //depot/projects/hammer/sys/kern/subr_rman.c#7 integrate
.. //depot/projects/hammer/sys/kern/subr_sleepqueue.c#7 integrate
.. //depot/projects/hammer/sys/kern/subr_turnstile.c#9 integrate
.. //depot/projects/hammer/sys/modules/Makefile#48 integrate
.. //depot/projects/hammer/sys/modules/acpi/acpi/Makefile#5 integrate
.. //depot/projects/hammer/sys/modules/acpi/acpi_asus/Makefile#2 integrate
.. //depot/projects/hammer/sys/modules/acpi/acpi_toshiba/Makefile#2 integrate
.. //depot/projects/hammer/sys/modules/acpi/acpi_video/Makefile#2 integrate
.. //depot/projects/hammer/sys/modules/ahb/Makefile#1 branch
.. //depot/projects/hammer/sys/netgraph/netgraph.h#8 integrate
.. //depot/projects/hammer/sys/netgraph/ng_base.c#14 integrate
.. //depot/projects/hammer/sys/netgraph/ng_device.c#7 integrate
.. //depot/projects/hammer/sys/netgraph/ng_device.h#3 integrate
.. //depot/projects/hammer/sys/pc98/conf/NOTES#29 integrate
.. //depot/projects/hammer/sys/pc98/pc98/sio.c#26 integrate
.. //depot/projects/hammer/sys/pci/if_dcreg.h#15 integrate
.. //depot/projects/hammer/sys/powerpc/powermac/grackle.c#5 integrate
.. //depot/projects/hammer/sys/powerpc/powermac/hrowpic.c#8 integrate
.. //depot/projects/hammer/sys/powerpc/powermac/macio.c#7 integrate
.. //depot/projects/hammer/sys/powerpc/powermac/maciovar.h#3 integrate
.. //depot/projects/hammer/sys/powerpc/powermac/openpic_macio.c#5 integrate
.. //depot/projects/hammer/sys/powerpc/powermac/uninorth.c#5 integrate
.. //depot/projects/hammer/sys/powerpc/powerpc/openpic.c#8 integrate
.. //depot/projects/hammer/sys/powerpc/powerpc/pmap.c#22 integrate
.. //depot/projects/hammer/sys/powerpc/psim/iobus.c#5 integrate
.. //depot/projects/hammer/sys/powerpc/psim/iobusvar.h#2 integrate
.. //depot/projects/hammer/sys/powerpc/psim/openpic_iobus.c#4 integrate
.. //depot/projects/hammer/sys/sparc64/ebus/ebus.c#11 integrate
.. //depot/projects/hammer/sys/sparc64/fhc/fhc.c#2 integrate
.. //depot/projects/hammer/sys/sparc64/pci/psycho.c#19 integrate
.. //depot/projects/hammer/sys/sparc64/sbus/sbus.c#13 integrate
.. //depot/projects/hammer/sys/sparc64/sparc64/iommu.c#16 integrate
.. //depot/projects/hammer/sys/sparc64/sparc64/nexus.c#7 integrate
.. //depot/projects/hammer/sys/sys/rman.h#4 integrate
.. //depot/projects/hammer/sys/sys/tty.h#12 integrate
.. //depot/projects/hammer/sys/tools/acpi_quirks2h.awk#2 integrate

Differences ...

==== //depot/projects/hammer/sys/amd64/acpica/acpi_machdep.c#14 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/acpica/acpi_machdep.c,v 1.13 2004/04/21 02:10:58 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/acpica/acpi_machdep.c,v 1.14 2004/06/30 04:42:29 njl Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -56,3 +56,9 @@
 
 	intr_model = model;
 }
+
+int
+acpi_machdep_quirks(int *quirks)
+{
+	return (0);
+}

==== //depot/projects/hammer/sys/amd64/amd64/nexus.c#25 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/nexus.c,v 1.60 2004/06/03 20:22:48 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/nexus.c,v 1.61 2004/06/30 19:24:26 imp Exp $");
 
 /*
  * This code implements a `root nexus' for Intel Architecture
@@ -41,6 +41,7 @@
  * and I/O memory address space.
  */
 
+#define __RMAN_RESOURCE_VISIBLE
 #include "opt_isa.h"
 
 #include <sys/param.h>

==== //depot/projects/hammer/sys/boot/common/newvers.sh#3 (text+ko) ====

@@ -1,6 +1,6 @@
 #!/bin/sh -
 #
-# $FreeBSD: src/sys/boot/common/newvers.sh,v 1.4 2004/04/07 20:45:56 imp Exp $
+# $FreeBSD: src/sys/boot/common/newvers.sh,v 1.5 2004/07/01 06:40:12 ps Exp $
 #	$NetBSD: newvers.sh,v 1.1 1997/07/26 01:50:38 thorpej Exp $
 #
 # Copyright (c) 1984, 1986, 1990, 1993
@@ -33,7 +33,7 @@
 #	@(#)newvers.sh	8.1 (Berkeley) 4/20/94
 
 LC_ALL=C; export LC_ALL
-u=${USER-root} h=`hostname` t=`date`
+u=${USER-root} h=${HOSTNAME-`hostname`} t=`date`
 #r=`head -n 6 $1 | tail -n 1 | awk -F: ' { print $1 } '`
 r=`awk -F: ' /^[0-9]\.[0-9]+:/ { print $1; exit }' $1`
 

==== //depot/projects/hammer/sys/conf/NOTES#50 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1236 2004/06/27 02:36:33 rwatson Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1238 2004/06/30 01:00:59 jhb Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -178,9 +178,18 @@
 # and WITNESS options.
 options 	MUTEX_NOINLINE
 
+# MUTEX_WAKE_ALL changes the mutex unlock algorithm to wake all waiters
+# when a contested mutex is released rather than just awaking the highest
+# priority waiter.
+options 	MUTEX_WAKE_ALL
+
 # SMP Debugging Options:
 #
 # MUTEX_DEBUG enables various extra assertions in the mutex code.
+# SLEEPQUEUE_PROFILING enables rudimentary profiling of the hash table
+#	  used to hold active sleep queues.
+# TURNSTILE_PROFILING enables rudimentary profiling of the hash table
+#	  used to hold active lock queues.
 # WITNESS enables the witness code which detects deadlocks and cycles
 #         during locking operations.
 # WITNESS_DDB causes the witness code to drop into the kernel debugger if
@@ -196,6 +205,10 @@
 # MUTEX_PROFILING(9) for details.
 options 	MUTEX_PROFILING
 
+# Profiling for internal hash tables.
+options 	SLEEPQUEUE_PROFILING
+options 	TURNSTILE_PROFILING
+
 
 #####################################################################
 # COMPATIBILITY OPTIONS

==== //depot/projects/hammer/sys/conf/files#68 (text+ko) ====

@@ -1,13 +1,13 @@
-# $FreeBSD: src/sys/conf/files,v 1.914 2004/06/28 16:22:20 imp Exp $
+# $FreeBSD: src/sys/conf/files,v 1.921 2004/06/30 14:52:49 imp Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
 # dependency lines other than the first are silently ignored.
 #
-acpi_quirks.h		standard					   \
+acpi_quirks.h			optional acpi				   \
 	dependency	"$S/tools/acpi_quirks2h.awk $S/dev/acpica/acpi_quirks" \
 	compile-with	"${AWK} -f $S/tools/acpi_quirks2h.awk $S/dev/acpica/acpi_quirks" \
-	no-obj no-implicit-rule						   \
+	no-obj no-implicit-rule before-depend				   \
 	clean		"acpi_quirks.h"
 aicasm				optional ahc				   \
 	dependency 	"$S/dev/aic7xxx/aicasm/*.[chyl]"		   \
@@ -45,7 +45,7 @@
 	compile-with	"${AWK} -f $S/tools/miidevs2h.awk $S/dev/mii/miidevs" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"miidevs.h"
-pccarddevs.h			optional pccard				   \
+pccarddevs.h			standard				   \
 	dependency	"$S/tools/pccarddevs2h.awk $S/dev/pccard/pccarddevs" \
 	compile-with	"${AWK} -f $S/tools/pccarddevs2h.awk $S/dev/pccard/pccarddevs" \
 	no-obj no-implicit-rule before-depend				   \
@@ -290,6 +290,7 @@
 dev/acpica/acpi_pcib_acpi.c	optional acpi pci
 dev/acpica/acpi_pcib_pci.c	optional acpi pci
 dev/acpica/acpi_powerres.c	optional acpi
+dev/acpica/acpi_quirk.c		optional acpi
 dev/acpica/acpi_resource.c	optional acpi
 dev/acpica/acpi_thermal.c	optional acpi
 dev/acpica/acpi_timer.c		optional acpi

==== //depot/projects/hammer/sys/conf/files.amd64#48 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.amd64,v 1.37 2004/05/24 12:08:56 bde Exp $
+# $FreeBSD: src/sys/conf/files.amd64,v 1.38 2004/06/30 14:19:28 njl Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -35,6 +35,7 @@
 	no-obj no-implicit-rule before-depend				\
 	clean		"ukbdmap.h"
 #
+dev/acpica/acpi_if.m		standard
 amd64/acpica/OsdEnvironment.c	optional	acpi
 amd64/acpica/acpi_machdep.c	optional	acpi
 amd64/acpica/acpi_wakeup.c	optional	acpi

==== //depot/projects/hammer/sys/conf/files.i386#34 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.i386,v 1.494 2004/06/23 17:33:24 brooks Exp $
+# $FreeBSD: src/sys/conf/files.i386,v 1.495 2004/06/30 14:19:28 njl Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -180,6 +180,7 @@
 geom/geom_bsd_enc.c		standard
 geom/geom_mbr.c			standard
 geom/geom_mbr_enc.c		standard
+dev/acpica/acpi_if.m		standard
 i386/acpica/OsdEnvironment.c	optional	acpi
 i386/acpica/acpi_asus.c		optional	acpi_asus acpi
 i386/acpica/acpi_machdep.c	optional	acpi

==== //depot/projects/hammer/sys/conf/files.ia64#19 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.ia64,v 1.68 2004/05/17 06:51:19 marcel Exp $
+# $FreeBSD: src/sys/conf/files.ia64,v 1.69 2004/06/30 14:19:28 njl Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -75,6 +75,7 @@
 geom/geom_gpt.c			standard
 geom/geom_mbr.c			standard
 geom/geom_mbr_enc.c		standard
+dev/acpica/acpi_if.m		standard
 ia64/acpica/OsdEnvironment.c	optional	acpi
 ia64/acpica/acpi_machdep.c	optional	acpi
 ia64/acpica/acpi_wakeup.c	optional	acpi

==== //depot/projects/hammer/sys/conf/kmod.mk#31 (text+ko) ====

@@ -1,5 +1,5 @@
 #	From: @(#)bsd.prog.mk	5.26 (Berkeley) 6/25/91
-# $FreeBSD: src/sys/conf/kmod.mk,v 1.162 2004/06/24 06:29:22 njl Exp $
+# $FreeBSD: src/sys/conf/kmod.mk,v 1.163 2004/06/29 18:56:14 njl Exp $
 #
 # The include file <bsd.kmod.mk> handles installing Kernel Loadable Device
 # drivers (KLD's).
@@ -293,7 +293,7 @@
 MFILES?= kern/bus_if.m kern/device_if.m dev/iicbus/iicbb_if.m \
     dev/iicbus/iicbus_if.m isa/isa_if.m \
     libkern/iconv_converter_if.m \
-    dev/eisa/eisa_if.m dev/mii/miibus_if.m \
+    dev/acpica/acpi_if.m dev/eisa/eisa_if.m dev/mii/miibus_if.m \
     dev/pccard/card_if.m dev/pccard/power_if.m dev/pci/pci_if.m \
     dev/pci/pcib_if.m dev/ppbus/ppbus_if.m dev/smbus/smbus_if.m \
     dev/usb/usb_if.m dev/sound/pcm/ac97_if.m dev/sound/pcm/channel_if.m \

==== //depot/projects/hammer/sys/conf/newvers.sh#11 (text+ko) ====

@@ -28,7 +28,7 @@
 # SUCH DAMAGE.
 #
 #	@(#)newvers.sh	8.1 (Berkeley) 4/20/94
-# $FreeBSD: src/sys/conf/newvers.sh,v 1.61 2004/04/07 20:45:56 imp Exp $
+# $FreeBSD: src/sys/conf/newvers.sh,v 1.62 2004/07/01 06:40:12 ps Exp $
 
 TYPE="FreeBSD"
 REVISION="5.2"
@@ -81,7 +81,7 @@
 fi
 
 touch version
-v=`cat version` u=${USER-root} d=`pwd` h=`hostname` t=`date`
+v=`cat version` u=${USER-root} d=`pwd` h=${HOSTNAME-`hostname`} t=`date`
 i=`make -V KERN_IDENT`
 cat << EOF > vers.c
 $COPYRIGHT

==== //depot/projects/hammer/sys/conf/options#43 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.456 2004/06/27 02:36:33 rwatson Exp $
+# $FreeBSD: src/sys/conf/options,v 1.457 2004/06/29 02:30:12 jhb Exp $
 #
 #        On the handling of kernel options
 #
@@ -110,6 +110,7 @@
 SCHED_4BSD	opt_sched.h
 SCHED_ULE	opt_sched.h
 SHOW_BUSYBUFS
+SLEEPQUEUE_PROFILING
 SPX_HACK
 SUIDDIR		opt_suiddir.h
 MSGMNB		opt_sysvipc.h
@@ -134,6 +135,7 @@
 SYSVSEM		opt_sysvipc.h
 SYSVSHM		opt_sysvipc.h
 SW_WATCHDOG	opt_watchdog.h
+TURNSTILE_PROFILING
 TTYHOG		opt_tty.h
 VFS_AIO
 WLCACHE		opt_wavelan.h

==== //depot/projects/hammer/sys/contrib/ipfilter/netinet/fil.c#6 (text+ko) ====

@@ -100,7 +100,7 @@
 
 #if !defined(lint)
 static const char sccsid[] = "@(#)fil.c	1.36 6/5/96 (C) 1993-2000 Darren Reed";
-static const char rcsid[] = "@(#)$FreeBSD: src/sys/contrib/ipfilter/netinet/fil.c,v 1.38 2004/06/21 22:46:35 darrenr Exp $";
+static const char rcsid[] = "@(#)$FreeBSD: src/sys/contrib/ipfilter/netinet/fil.c,v 1.39 2004/06/29 03:39:06 darrenr Exp $";
 #endif
 
 #ifndef	_KERNEL
@@ -2155,9 +2155,6 @@
 		ip_natsync(ifp);
 		ip_statesync(ifp);
 	}
-#  if defined(__FreeBSD_version) && (__FreeBSD_version >= 500043)
-	IFNET_RUNLOCK();
-#  endif
 	ip_natsync((struct ifnet *)-1);
 #  if defined(__FreeBSD_version) && (__FreeBSD_version >= 500043)
 	IFNET_RUNLOCK();

==== //depot/projects/hammer/sys/dev/acpica/acpi.c#40 (text+ko) ====

@@ -26,9 +26,10 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.167 2004/06/28 03:36:37 imp Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.173 2004/06/30 16:54:10 imp Exp $
  */
 
+#define __RMAN_RESOURCE_VISIBLE
 #include "opt_acpi.h"
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -52,6 +53,7 @@
 #include <machine/bus.h>
 #include <sys/rman.h>
 #include <isa/isavar.h>
+#include <isa/pnpvar.h>
 
 #include "acpi.h"
 #include <dev/acpica/acpivar.h>
@@ -77,36 +79,20 @@
 	.d_name =	"acpi",
 };
 
-#if __FreeBSD_version >= 500000
+/* Global mutex for locking access to the ACPI subsystem. */
 struct mtx	acpi_mutex;
-#endif
+
+/* Bitmap of device quirks. */
+int		acpi_quirks;
 
 /* Local pools for managing system resources for ACPI child devices. */
-struct rman acpi_rman_io, acpi_rman_mem;
-
-struct acpi_quirks {
-    char	*OemId;
-    uint32_t	OemRevision;
-    char	*value;
-};
-
-#define ACPI_OEM_REV_ANY	0
-
-static struct acpi_quirks acpi_quirks_table[] = {
-#ifdef notyet
-    /* Bad PCI routing table.  Used on some SuperMicro boards. */
-    { "PTLTD ", 0x06040000, "pci_link" },
-#endif
-
-    { NULL, 0, NULL }
-};
+struct rman	acpi_rman_io, acpi_rman_mem;
 
 static int	acpi_modevent(struct module *mod, int event, void *junk);
 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 int	acpi_shutdown(device_t dev);
-static void	acpi_quirks_set(void);
 static device_t	acpi_add_child(device_t bus, int order, const char *name,
 			int unit);
 static int	acpi_print_child(device_t bus, device_t child);
@@ -122,18 +108,25 @@
 			int rid, struct resource *r);
 static uint32_t	acpi_isa_get_logicalid(device_t dev);
 static int	acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count);
+static char	*acpi_device_id_probe(device_t bus, device_t dev, char **ids);
+static ACPI_STATUS acpi_device_eval_obj(device_t bus, device_t dev,
+		    ACPI_STRING pathname, ACPI_OBJECT_LIST *parameters,
+		    ACPI_BUFFER *ret);
+static ACPI_STATUS acpi_device_walk_ns(device_t bus, device_t dev,
+		    ACPI_OBJECT_TYPE type, UINT32 max_depth,
+		    ACPI_WALK_CALLBACK user_fn, void *context, void **ret);
 static int	acpi_isa_pnp_probe(device_t bus, device_t child,
 			struct isa_pnp_id *ids);
 static void	acpi_probe_children(device_t bus);
 static int	acpi_probe_order(ACPI_HANDLE handle, int *order);
 static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level,
 			void *context, void **status);
+static BOOLEAN	acpi_MatchHid(ACPI_HANDLE h, const char *hid);
 static void	acpi_shutdown_final(void *arg, int howto);
 static void	acpi_enable_fixed_events(struct acpi_softc *sc);
-static int	acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
-static ACPI_STATUS acpi_wake_limit(ACPI_HANDLE h, UINT32 level, void *context,
-		    void **status);
-static int	acpi_wake_limit_walk(int sstate);
+static int	acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate);
+static int	acpi_wake_run_prep(ACPI_HANDLE handle, int sstate);
+static int	acpi_wake_prep_walk(int sstate);
 static int	acpi_wake_sysctl_walk(device_t dev);
 static int	acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS);
 static void	acpi_system_eventhandler_sleep(void *arg, int state);
@@ -174,6 +167,11 @@
     DEVMETHOD(bus_setup_intr,		bus_generic_setup_intr),
     DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
 
+    /* ACPI bus */
+    DEVMETHOD(acpi_id_probe,		acpi_device_id_probe),
+    DEVMETHOD(acpi_evaluate_object,	acpi_device_eval_obj),
+    DEVMETHOD(acpi_walk_namespace,	acpi_device_walk_ns),
+
     /* ISA emulation */
     DEVMETHOD(isa_pnp_probe,		acpi_isa_pnp_probe),
 
@@ -217,7 +215,7 @@
 static int
 acpi_modevent(struct module *mod, int event, void *junk)
 {
-    switch(event) {
+    switch (event) {
     case MOD_LOAD:
 	if (!cold) {
 	    printf("The ACPI driver cannot be loaded after boot.\n");
@@ -243,18 +241,17 @@
 #ifdef ACPI_DEBUGGER
     char *debugpoint;
 #endif
-    static int error, started = 0;
+    static int started = 0;
+    int error, val;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (started)
-	return_VALUE (error);
+	return_VALUE (0);
     started = 1;
 
-#if __FreeBSD_version >= 500000
     /* Initialise the ACPI mutex */
     mtx_init(&acpi_mutex, "ACPI global lock", NULL, MTX_DEF);
-#endif
 
     /*
      * Set the globals from our tunables.  This is needed because ACPI-CA
@@ -286,13 +283,21 @@
 
     if (ACPI_FAILURE(error = AcpiLoadTables())) {
 	printf("ACPI: table load failed: %s\n", AcpiFormatException(error));
-	return_VALUE(error);
+	AcpiTerminate();
+	return_VALUE (error);
     }
 
-    /* Set up any quirks we have for this XSDT. */
-    acpi_quirks_set();
-    if (acpi_disabled("acpi"))
+    /* Set up any quirks we have for this system. */
+    acpi_table_quirks(&acpi_quirks);
+
+    /* If the user manually set the disabled hint to 0, override any quirk. */
+    if (resource_int_value("acpi", 0, "disabled", &val) == 0 && val == 0)
+	acpi_quirks &= ~ACPI_Q_BROKEN;
+    if (acpi_quirks & ACPI_Q_BROKEN) {
+	printf("ACPI disabled by blacklist.  Contact your BIOS vendor.\n");
+	AcpiTerminate();
 	return_VALUE (AE_ERROR);
+    }
 
     return_VALUE (AE_OK);
 }
@@ -535,7 +540,7 @@
 
     /* Only enable S4BIOS by default if the FACS says it is available. */
     if (AcpiGbl_FACS->S4Bios_f != 0)
-	    sc->acpi_s4bios = 1;
+	sc->acpi_s4bios = 1;
 
     /*
      * Dispatch the default sleep state to devices.  The lid switch is set
@@ -628,60 +633,12 @@
     /* Allow children to shutdown first. */
     bus_generic_shutdown(dev);
 
-    /* Disable all wake GPEs not appropriate for reboot/poweroff. */
-    acpi_wake_limit_walk(ACPI_STATE_S5);
+    /* Enable any GPEs that are able to power-on the system (i.e., RTC). */
+    acpi_wake_prep_walk(ACPI_STATE_S5);
+
     return (0);
 }
 
-static void
-acpi_quirks_set()
-{
-    XSDT_DESCRIPTOR *xsdt;
-    struct acpi_quirks *quirk;
-    char *env, *tmp;
-    int len;
-
-    /*
-     * If the user loaded a custom table or disabled "quirks", leave
-     * the settings alone.
-     */
-    len = 0;
-    if ((env = getenv("acpi_dsdt_load")) != NULL) {
-	/* XXX No strcasecmp but this is good enough. */
-	if (*env == 'Y' || *env == 'y')
-	    goto out;
-	freeenv(env);
-    }
-    if ((env = getenv("debug.acpi.disabled")) != NULL) {
-	if (strstr("quirks", env) != NULL)
-	    goto out;
-	len = strlen(env);
-    }
-
-    /*
-     * Search through our quirk table and concatenate the disabled
-     * values with whatever we find.
-     */
-    xsdt = AcpiGbl_XSDT;
-    for (quirk = acpi_quirks_table; quirk->OemId; quirk++) {
-	if (!strncmp(xsdt->OemId, quirk->OemId, strlen(quirk->OemId)) &&
-	    (xsdt->OemRevision == quirk->OemRevision ||
-	    quirk->OemRevision == ACPI_OEM_REV_ANY)) {
-		len += strlen(quirk->value) + 2;
-		if ((tmp = malloc(len, M_TEMP, M_NOWAIT)) == NULL)
-		    goto out;
-		sprintf(tmp, "%s %s", env ? env : "", quirk->value);
-		setenv("debug.acpi.disabled", tmp);
-		free(tmp, M_TEMP);
-		break;
-	}
-    }
-
-out:
-    if (env)
-	freeenv(env);
-}
-
 /*
  * Handle a new device being added
  */
@@ -786,6 +743,9 @@
     case ACPI_IVAR_PRIVATE:
 	*(void **)result = ad->ad_private;
 	break;
+    case ACPI_IVAR_FLAGS:
+	*(int *)result = ad->ad_flags;
+	break;
     case ISA_IVAR_VENDORID:
     case ISA_IVAR_SERIAL:
     case ISA_IVAR_COMPATID:
@@ -821,6 +781,9 @@
     case ACPI_IVAR_PRIVATE:
 	ad->ad_private = (void *)value;
 	break;
+    case ACPI_IVAR_FLAGS:
+	ad->ad_flags = (int)value;
+	break;
     default:
 	panic("bad ivar write request (%d)", index);
 	return (ENOENT);
@@ -969,19 +932,7 @@
     return (bus_alloc_resource_any(dev, type, rid, RF_ACTIVE));
 }
 
-/*
- * Handle ISA-like devices probing for a PnP ID to match.
- */
-#define PNP_EISAID(s)				\
-	((((s[0] - '@') & 0x1f) << 2)		\
-	 | (((s[1] - '@') & 0x18) >> 3)		\
-	 | (((s[1] - '@') & 0x07) << 13)	\
-	 | (((s[2] - '@') & 0x1f) << 8)		\
-	 | (PNP_HEXTONUM(s[4]) << 16)		\
-	 | (PNP_HEXTONUM(s[3]) << 20)		\
-	 | (PNP_HEXTONUM(s[6]) << 24)		\
-	 | (PNP_HEXTONUM(s[5]) << 28))
-
+/* Probe _HID and _CID for compatible ISA PNP ids. */
 static uint32_t
 acpi_isa_get_logicalid(device_t dev)
 {
@@ -1064,6 +1015,46 @@
     return_VALUE (valid);
 }
 
+static char *
+acpi_device_id_probe(device_t bus, device_t dev, char **ids) 
+{
+    ACPI_HANDLE h;
+    int i;
+
+    h = acpi_get_handle(dev);
+    if (ids == NULL || h == NULL || acpi_get_type(dev) != ACPI_TYPE_DEVICE)
+	return (NULL);
+
+    /* Try to match one of the array of IDs with a HID or CID. */
+    for (i = 0; ids[i] != NULL; i++) {
+	if (acpi_MatchHid(h, ids[i]))
+	    return (ids[i]);
+    }
+    return (NULL);
+}
+
+static ACPI_STATUS
+acpi_device_eval_obj(device_t bus, device_t dev, ACPI_STRING pathname,
+    ACPI_OBJECT_LIST *parameters, ACPI_BUFFER *ret)
+{
+    ACPI_HANDLE h;
+
+    if ((h = acpi_get_handle(dev)) == NULL)
+	return (AE_BAD_PARAMETER);
+    return (AcpiEvaluateObject(h, pathname, parameters, ret));
+}
+
+static ACPI_STATUS
+acpi_device_walk_ns(device_t bus, device_t dev, ACPI_OBJECT_TYPE type,
+    UINT32 max_depth, ACPI_WALK_CALLBACK user_fn, void *context, void **ret)
+{
+    ACPI_HANDLE h;
+
+    if ((h = acpi_get_handle(dev)) == NULL)
+	return (AE_BAD_PARAMETER);
+    return (AcpiWalkNamespace(type, h, max_depth, user_fn, context, ret));
+}
+
 static int
 acpi_isa_pnp_probe(device_t bus, device_t child, struct isa_pnp_id *ids)
 {
@@ -1206,7 +1197,7 @@
 
     bus = (device_t)context;
     if (ACPI_SUCCESS(AcpiGetType(handle, &type))) {
-	switch(type) {
+	switch (type) {
 	case ACPI_TYPE_DEVICE:
 	case ACPI_TYPE_PROCESSOR:
 	case ACPI_TYPE_THERMAL:
@@ -1232,10 +1223,6 @@
 	    acpi_set_handle(child, handle);
 	    AcpiAttachData(handle, acpi_fake_objhandler, child);
 
-	    /* Check if the device can generate wake events. */
-	    if (ACPI_SUCCESS(AcpiEvaluateObject(handle, "_PRW", NULL, NULL)))
-		device_set_flags(child, ACPI_FLAG_WAKE_CAPABLE);
-
 	    /*
 	     * Check that the device is present.  If it's not present,
 	     * leave it disabled (so that we have a device_t attached to
@@ -1409,8 +1396,8 @@
 /*
  * Match a HID string against a handle
  */
-BOOLEAN
-acpi_MatchHid(ACPI_HANDLE h, char *hid) 
+static BOOLEAN
+acpi_MatchHid(ACPI_HANDLE h, const char *hid) 
 {
     ACPI_DEVICE_INFO	*devinfo;
     ACPI_BUFFER		buf;
@@ -1782,8 +1769,8 @@
 	sc->acpi_sstate = state;
 	sc->acpi_sleep_disabled = 1;
 
-	/* Disable all wake GPEs not appropriate for this state. */
-	acpi_wake_limit_walk(state);
+	/* Enable any GPEs as appropriate and requested by the user. */
+	acpi_wake_prep_walk(state);
 
 	/* Inform all devices that we are going to sleep. */
 	if (DEVICE_SUSPEND(root_bus) != 0) {
@@ -1829,6 +1816,9 @@
 		break;
 	    }
 	}
+
+	/* Resume devices, re-enable GPEs and fixed events. */
+	acpi_wake_prep_walk(state);
 	AcpiLeaveSleepState((UINT8)state);
 	DEVICE_RESUME(root_bus);
 	sc->acpi_sstate = ACPI_STATE_S0;
@@ -1860,10 +1850,6 @@
 {
     struct acpi_prw_data prw;
 
-    /* Check that the device can wake the system. */
-    if ((device_get_flags(dev) & ACPI_FLAG_WAKE_CAPABLE) == 0)
-	return (ENXIO);
-
     /* Evaluate _PRW to find the GPE. */
     if (acpi_parse_prw(acpi_get_handle(dev), &prw) != 0)
 	return (ENXIO);
@@ -1886,149 +1872,124 @@
     ACPI_STATUS status;
     int flags;
 
-    /* Make sure the device supports waking the system. */
-    flags = device_get_flags(dev);
+    /* Make sure the device supports waking the system and get the GPE. */
     handle = acpi_get_handle(dev);
-    if ((flags & ACPI_FLAG_WAKE_CAPABLE) == 0 || handle == NULL)
-	return (ENXIO);
-
-    /* Evaluate _PRW to find the GPE. */
     if (acpi_parse_prw(handle, &prw) != 0)
 	return (ENXIO);
 
+    flags = acpi_get_flags(dev);
     if (enable) {
 	status = AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
 	if (ACPI_FAILURE(status)) {
 	    device_printf(dev, "enable wake failed\n");
 	    return (ENXIO);
 	}
-	device_set_flags(dev, flags | ACPI_FLAG_WAKE_ENABLED);
+	acpi_set_flags(dev, flags | ACPI_FLAG_WAKE_ENABLED);
     } else {
 	status = AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
 	if (ACPI_FAILURE(status)) {
 	    device_printf(dev, "disable wake failed\n");
 	    return (ENXIO);
 	}
-	device_set_flags(dev, flags & ~ACPI_FLAG_WAKE_ENABLED);
+	acpi_set_flags(dev, flags & ~ACPI_FLAG_WAKE_ENABLED);
     }
 
     return (0);
 }
 
-/* Configure a device's GPE appropriately for the new sleep state. */
-int
-acpi_wake_sleep_prep(device_t dev, int sstate)
+static int
+acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate)
 {
     struct acpi_prw_data prw;
-    ACPI_HANDLE handle;
-    int flags;
+    device_t dev;
 
-    /* Check that this is an ACPI device and get its GPE. */
-    flags = device_get_flags(dev);
-    handle = acpi_get_handle(dev);
-    if ((flags & ACPI_FLAG_WAKE_CAPABLE) == 0 || handle == NULL)
-	return (ENXIO);
-
-    /* Evaluate _PRW to find the GPE. */
+    /* Check that this is a wake-capable device and get its GPE. */
     if (acpi_parse_prw(handle, &prw) != 0)
 	return (ENXIO);
+    dev = acpi_get_device(handle);
 
     /*
-     * TBD: All Power Resources referenced by elements 2 through N
-     *      of the _PRW object are put into the ON state.
+     * The destination sleep state must be less than (i.e., higher power)
+     * or equal to the value specified by _PRW.  If this GPE cannot be
+     * enabled for the next sleep state, then disable it.  If it can and
+     * the user requested it be enabled, turn on any required power resources
+     * and set _PSW.
      */
-
-    /*
-     * If the user requested that this device wake the system and the next
-     * sleep state is valid for this GPE, enable it and the device's wake
-     * capability.  The sleep state must be less than (i.e., higher power)
-     * or equal to the value specified by _PRW.  Return early, leaving
-     * the appropriate power resources enabled.
-     */
-    if ((flags & ACPI_FLAG_WAKE_ENABLED) != 0 &&
-	sstate <= prw.lowest_wake) {
+    if (sstate > prw.lowest_wake) {
+	AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
 	if (bootverbose)
-	    device_printf(dev, "wake_prep enabled gpe %#x for state %d\n",
-		prw.gpe_bit, sstate);
-	AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
+	    device_printf(dev, "wake_prep disabled wake for %s (S%d)\n",
+		acpi_name(handle), sstate);
+    } else if (dev && (acpi_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) != 0) {
+	acpi_pwr_wake_enable(handle, 1);
 	acpi_SetInteger(handle, "_PSW", 1);
-	return (0);
+	if (bootverbose)
+	    device_printf(dev, "wake_prep enabled for %s (S%d)\n",
+		acpi_name(handle), sstate);
     }
 
-    /*
-     * If the device wake was disabled or this sleep state is too low for
-     * this device, disable its wake capability and GPE.
-     */
-    AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
-    acpi_SetInteger(handle, "_PSW", 0);
-    if (bootverbose)
-	device_printf(dev, "wake_prep disabled gpe %#x for state %d\n",
-	    prw.gpe_bit, sstate);
-
-    /*
-     * TBD: All Power Resources referenced by elements 2 through N
-     *      of the _PRW object are put into the OFF state.
-     */
-
     return (0);
 }
 
-/* Re-enable GPEs after wake. */
-int
-acpi_wake_run_prep(device_t dev)
+static int
+acpi_wake_run_prep(ACPI_HANDLE handle, int sstate)
 {
     struct acpi_prw_data prw;
-    ACPI_HANDLE handle;
-    int flags;
+    device_t dev;
 
-    /* Check that this is an ACPI device and get its GPE. */
-    flags = device_get_flags(dev);
-    handle = acpi_get_handle(dev);
-    if ((flags & ACPI_FLAG_WAKE_CAPABLE) == 0 || handle == NULL)
-	return (ENXIO);
-
-    /* Evaluate _PRW to find the GPE. */
+    /*
+     * Check that this is a wake-capable device and get its GPE.  Return
+     * now if the user didn't enable this device for wake.
+     */
     if (acpi_parse_prw(handle, &prw) != 0)
 	return (ENXIO);
+    dev = acpi_get_device(handle);
+    if (dev == NULL || (acpi_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) == 0)
+	return (0);
 
     /*
-     * TBD: Be sure all Power Resources referenced by elements 2 through N
-     *      of the _PRW object are in the ON state.
+     * If this GPE couldn't be enabled for the previous sleep state, it was
+     * disabled before going to sleep so re-enable it.  If it was enabled,
+     * clear _PSW and turn off any power resources it used.
      */
+    if (sstate > prw.lowest_wake) {
+	AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
+	if (bootverbose)
+	    device_printf(dev, "run_prep re-enabled %s\n", acpi_name(handle));
+    } else {
+	acpi_SetInteger(handle, "_PSW", 0);
+	acpi_pwr_wake_enable(handle, 0);
+	if (bootverbose)
+	    device_printf(dev, "run_prep cleaned up for %s\n",
+		acpi_name(handle));
+    }
 
-    /* Disable wake capability and if the user requested, enable the GPE. */
-    acpi_SetInteger(handle, "_PSW", 0);
-    if ((flags & ACPI_FLAG_WAKE_ENABLED) != 0)
-	AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
     return (0);
 }
 
 static ACPI_STATUS
-acpi_wake_limit(ACPI_HANDLE h, UINT32 level, void *context, void **status)
+acpi_wake_prep(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
 {
-    struct acpi_prw_data prw;
-    int *sstate;
+    int sstate;
 
-    /* It's ok not to have _PRW if the device can't wake the system. */
-    if (acpi_parse_prw(h, &prw) != 0)
-	return (AE_OK);
-
-    sstate = (int *)context;
-    if (*sstate > prw.lowest_wake)
-	AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
-
+    /* If suspending, run the sleep prep function, otherwise wake. */
+    sstate = *(int *)context;
+    if (AcpiGbl_SystemAwakeAndRunning)
+	acpi_wake_sleep_prep(handle, sstate);
+    else
+	acpi_wake_run_prep(handle, sstate);
     return (AE_OK);
 }
 
-/* Walk all system devices, disabling them if necessary for sstate. */
+/* Walk the tree rooted at acpi0 to prep devices for suspend/resume. */
 static int
-acpi_wake_limit_walk(int sstate)
+acpi_wake_prep_walk(int sstate)
 {
     ACPI_HANDLE sb_handle;
 
     if (ACPI_SUCCESS(AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &sb_handle)))
-	AcpiWalkNamespace(ACPI_TYPE_ANY, sb_handle, 100,
-	    acpi_wake_limit, &sstate, NULL);
+	AcpiWalkNamespace(ACPI_TYPE_DEVICE, sb_handle, 100,
+	    acpi_wake_prep, &sstate, NULL);
     return (0);
 }
 
@@ -2039,21 +2000,23 @@
     int error, i, numdevs;
     device_t *devlist;
     device_t child;
+    ACPI_STATUS status;
 
     error = device_get_children(dev, &devlist, &numdevs);
     if (error != 0 || numdevs == 0)

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list