patch: enable MSR support for EST

Nate Lawson nate at root.org
Fri Apr 1 10:42:57 PST 2005


The attached patch calls an acpi 3.0 method that on some laptops, 
exposes the SpeedStep MSRs via the acpi_perf driver.  If you have a 
laptop that supports SpeedStep but it doesn't appear to work right, 
please try this patch and see if it fixes things.

-- 
Nate
-------------- next part --------------
Index: sys/dev/acpica/acpi_cpu.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpica/acpi_cpu.c,v
retrieving revision 1.54
diff -u -r1.54 acpi_cpu.c
--- sys/dev/acpica/acpi_cpu.c	27 Mar 2005 03:37:43 -0000	1.54
+++ sys/dev/acpica/acpi_cpu.c	1 Apr 2005 18:22:51 -0000
@@ -79,6 +79,7 @@
     struct acpi_cx	 cpu_cx_states[MAX_CX_STATES];
     int			 cpu_cx_count;	/* Number of valid Cx states. */
     int			 cpu_prev_sleep;/* Last idle sleep duration. */
+    int			 cpu_features;	/* Child driver supported features. */
 };
 
 struct acpi_cpu_device {
@@ -138,6 +139,7 @@
 static int	acpi_cpu_read_ivar(device_t dev, device_t child, int index,
 		    uintptr_t *result);
 static int	acpi_cpu_shutdown(device_t dev);
+static int	acpi_cpu_feature(device_t bus, device_t dev, int features);
 static int	acpi_cpu_cx_probe(struct acpi_cpu_softc *sc);
 static int	acpi_cpu_cx_cst(struct acpi_cpu_softc *sc);
 static void	acpi_cpu_startup(void *arg);
@@ -171,6 +173,9 @@
     DEVMETHOD(bus_setup_intr,	bus_generic_setup_intr),
     DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
 
+    /* ACPI methods */
+    DEVMETHOD(acpi_enable_feature, acpi_cpu_feature),
+
     {0, 0}
 };
 
@@ -324,8 +329,13 @@
     } else
 	sysctl_ctx_free(&acpi_cpu_sysctl_ctx);
 
-    /* Call identify and then probe/attach for cpu child drivers. */
+    /*
+     * Call identify, collecting CPU feature hints from children, notify
+     * ACPI of them, and then probe/attach cpu child drivers.
+     */
     bus_generic_probe(dev);
+    if (sc->cpu_features)
+	acpi_SetInteger(sc->cpu_dev, "_PDC", sc->cpu_features);
     bus_generic_attach(dev);
 
     return (0);
@@ -434,6 +444,16 @@
 }
 
 static int
+acpi_cpu_feature(device_t bus, device_t dev, int features)
+{
+    struct acpi_cpu_softc *sc;
+
+    sc = device_get_softc(bus);
+    sc->cpu_features |= features;
+    return (0);
+}
+
+static int
 acpi_cpu_cx_probe(struct acpi_cpu_softc *sc)
 {
     ACPI_GENERIC_ADDRESS gas;
Index: sys/dev/acpica/acpi_if.m
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpica/acpi_if.m,v
retrieving revision 1.5
diff -u -r1.5 acpi_if.m
--- sys/dev/acpica/acpi_if.m	20 Mar 2005 01:27:27 -0000	1.5
+++ sys/dev/acpica/acpi_if.m	1 Apr 2005 02:50:11 -0000
@@ -156,6 +156,23 @@
 };
 
 #
+# Notify ACPI that a given driver supports some feature(s).  This should be
+# called by the driver before it expects to probe or use the desired
+# features.
+#
+# device_t bus:  parent bus for the device
+#
+# device_t dev:  device requesting the feature(s)
+#
+# int features:  bitmask of all desired features
+#
+METHOD int enable_feature {
+	device_t	bus;
+	device_t	dev;
+	u_int		features;
+};
+
+#
 # Read embedded controller (EC) address space
 #
 # device_t dev:  EC device
Index: sys/dev/acpica/acpivar.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpica/acpivar.h,v
retrieving revision 1.91
diff -u -r1.91 acpivar.h
--- sys/dev/acpica/acpivar.h	27 Mar 2005 21:30:33 -0000	1.91
+++ sys/dev/acpica/acpivar.h	1 Apr 2005 03:04:08 -0000
@@ -166,6 +166,20 @@
 #define	ACPI_INTR_SAPIC		2
 
 /*
+ * Various features and capabilities for the acpi_enable_feature() method.
+ * In particular, these are used for the ACPI 3.0 _PDC and _OSC methods.
+ */
+#define ACPI_CAP_PERF_MSRS	(1 << 0) /* Intel SpeedStep PERF_CTL MSRs */
+#define ACPI_CAP_C1_IO_HALT	(1 << 1) /* Intel C1 "IO then halt" sequence */
+#define ACPI_CAP_THR_MSRS	(1 << 2) /* Intel OnDemand throttling MSRs */
+#define ACPI_CAP_SMP_SAME	(1 << 3) /* MP C1, Px, and Tx (all the same) */
+#define ACPI_CAP_SMP_SAME_C3	(1 << 4) /* MP C2 and C3 (all the same) */
+#define ACPI_CAP_SMP_DIFF_PX	(1 << 5) /* MP Px (different, using _PSD) */
+#define ACPI_CAP_SMP_DIFF_CX	(1 << 6) /* MP Cx (different, using _CSD) */
+#define ACPI_CAP_SMP_DIFF_TX	(1 << 7) /* MP Tx (different, using _TSD) */
+#define ACPI_CAP_SMP_C1_NATIVE	(1 << 8) /* MP C1 support other than halt */
+
+/*
  * Quirk flags.
  *
  * ACPI_Q_BROKEN: Disables all ACPI support.
Index: sys/i386/cpufreq/est.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/cpufreq/est.c,v
retrieving revision 1.5
diff -u -r1.5 est.c
--- sys/i386/cpufreq/est.c	21 Mar 2005 06:43:25 -0000	1.5
+++ sys/i386/cpufreq/est.c	1 Apr 2005 18:13:00 -0000
@@ -40,6 +40,10 @@
 #include "cpufreq_if.h"
 #include <machine/md_var.h>
 
+#include <contrib/dev/acpica/acpi.h>
+#include <dev/acpica/acpivar.h>
+#include "acpi_if.h"
+
 /* Status/control registers (from the IA-32 System Programming Guide). */
 #define MSR_PERF_STATUS		0x198
 #define MSR_PERF_CTL		0x199
@@ -572,6 +576,7 @@
 static void
 est_identify(driver_t *driver, device_t parent)
 {
+	device_t child;
 	u_int p[4];
 
 	/* Make sure we're not being doubly invoked. */
@@ -591,8 +596,14 @@
 	 * We add a child for each CPU since settings must be performed
 	 * on each CPU in the SMP case.
 	 */
-	if (BUS_ADD_CHILD(parent, 0, "est", -1) == NULL)
+	child = BUS_ADD_CHILD(parent, 0, "est", -1);
+	if (child == NULL) {
 		device_printf(parent, "add est child failed\n");
+		return;
+	}
+
+	/* Notify the ACPI CPU that we support direct access to MSRs */
+	ACPI_ENABLE_FEATURE(parent, child, ACPI_CAP_PERF_MSRS);
 }
 
 static int
Index: sys/modules/cpufreq/Makefile
===================================================================
RCS file: /home/ncvs/src/sys/modules/cpufreq/Makefile,v
retrieving revision 1.6
diff -u -r1.6 Makefile
--- sys/modules/cpufreq/Makefile	31 Mar 2005 18:51:06 -0000	1.6
+++ sys/modules/cpufreq/Makefile	1 Apr 2005 18:16:55 -0000
@@ -8,13 +8,11 @@
 SRCS=	ichss.c
 SRCS+=	bus_if.h cpufreq_if.h device_if.h pci_if.h
 
-.if ${MACHINE} == "i386"
+.if ${MACHINE} == "i386" || ${MACHINE} == "amd64"
+.PATH:	${.CURDIR}/../../i386/cpufreq
+CFLAGS+= -I${.CURDIR}/../../contrib/dev/acpica
+SRCS+=	acpi_if.h opt_acpi.h
 SRCS+=	est.c p4tcc.c powernow.c
 .endif
 
-.if ${MACHINE} == "amd64"
-.PATH: ${.CURDIR}/../../i386/cpufreq
-SRCS+=	powernow.c
-.endif
-
 .include <bsd.kmod.mk>


More information about the freebsd-acpi mailing list