On Sat, Jun 26, 2010 at 11:48:15PM -0600, Gordon Willem Klok wrote:
> Hello this should make speedstep work on nehalem cpu's (i3, i5, i7s) where
> est uses acpi to get the available states. Please let me know of any
> issues
This is not changing the places where it interprets PERF_STATUS
on processors it shouldn't, I'd prefer something like this:
Index: i386/i386/est.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/i386/est.c,v
retrieving revision 1.35
diff -u -p -r1.35 est.c
--- i386/i386/est.c 20 Apr 2010 22:05:41 -0000 1.35
+++ i386/i386/est.c 3 Jul 2010 02:45:13 -0000
@@ -1062,12 +1062,6 @@ est_init(const char *cpu_device, int ven
if ((cpu_ecxfeature & CPUIDECX_EST) == 0)
return;
- if (bus_clock == 0) {
- printf("%s: EST: PSS not yet available for this processor\n",
- cpu_device);
- return;
- }
-
msr = rdmsr(MSR_PERF_STATUS);
idhi = (msr >> 32) & 0xffff;
idlo = (msr >> 48) & 0xffff;
@@ -1080,7 +1074,11 @@ est_init(const char *cpu_device, int ven
est_fqlist = est_acpi_init();
#endif
- if (est_fqlist == NULL) {
+ /*
+ * Interpreting the values of PERF_STATUS is not valid
+ * on recent processors so don't do it on anything unknown
+ */
+ if (est_fqlist == NULL && bus_clock != 0) {
/*
* Find an entry which matches (vendor, bus_clock, idhi, idlo)
*/
@@ -1095,12 +1093,7 @@ est_init(const char *cpu_device, int ven
}
}
- if (est_fqlist == NULL) {
- if (bus_clock == 0) {
- printf("%s: EST: unknown system bus clock\n",
- cpu_device);
- return;
- }
+ if (est_fqlist == NULL && bus_clock != 0) {
if (crhi == 0 || crcur == 0 || crlo > crhi ||
crcur < crlo || crcur > crhi) {
/*
Index: amd64/amd64/est.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/est.c,v
retrieving revision 1.20
diff -u -p -r1.20 est.c
--- amd64/amd64/est.c 4 Jun 2010 15:03:34 -0000 1.20
+++ amd64/amd64/est.c 3 Jul 2010 02:45:13 -0000
@@ -324,30 +324,20 @@ est_init(struct cpu_info *ci)
if (setperf_prio > 3)
return;
- family = (ci->ci_signature >> 8) & 15;
- if (family == 0xf) {
- p4_get_bus_clock(ci);
- } else if (family == 6) {
- p3_get_bus_clock(ci);
- }
-
- if (bus_clock == 0) {
- printf("%s: EST: PSS not yet available for this processor\n",
- cpu_device);
- return;
- }
-
#if NACPICPU > 0
est_fqlist = est_acpi_init();
#endif
+ if (ci->ci_family == 0xf) {
+ p4_get_bus_clock(ci);
+ } else if (ci->ci_family == 6) {
+ p3_get_bus_clock(ci);
+ }
- if (est_fqlist == NULL) {
- if (bus_clock == 0) {
- printf("%s: EST: unknown system bus clock\n",
- cpu_device);
- return;
- }
-
+ /*
+ * Interpreting the values of PERF_STATUS is not valid
+ * on recent processors so don't do it on anything unknown
+ */
+ if (est_fqlist == NULL && bus_clock != 0) {
msr = rdmsr(MSR_PERF_STATUS);
idhi = (msr >> 32) & 0xffff;
idlo = (msr >> 48) & 0xffff;