summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-11-14 16:20:07 +0000
committermav <mav@FreeBSD.org>2009-11-14 16:20:07 +0000
commit6ca2296a1ba7d79ea4c890c09191fb27e9ef7bdf (patch)
tree97a6ad1a74b5e163a2d7f2d8250349461df60c3a
parentb056f85a3c5445b7eea6adc5e38992e1d71014e5 (diff)
downloadFreeBSD-src-6ca2296a1ba7d79ea4c890c09191fb27e9ef7bdf.zip
FreeBSD-src-6ca2296a1ba7d79ea4c890c09191fb27e9ef7bdf.tar.gz
Previous solution appeared to be unsufficient. After additional testing
I have found that it is not only desktop CPUs problem. but mobile also. Probably AP on laptops just started initially at lower frequency, hiding the problem. Disable frequency validation by default, for systems with more then one CPU, until we can implement it properly. It looks like making more harm now then benefits. Add 'hw.est.strict' loader tunable to control it. Now my iXsystems Invincibook is able to run at 800MHz lowest frequency, instead of 1200MHz before, when 800MHz was incorrectly reported invalid.
-rw-r--r--sys/i386/cpufreq/est.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/sys/i386/cpufreq/est.c b/sys/i386/cpufreq/est.c
index 5be6ecd..6a7b514 100644
--- a/sys/i386/cpufreq/est.c
+++ b/sys/i386/cpufreq/est.c
@@ -96,6 +96,8 @@ struct est_softc {
static int msr_info_enabled = 0;
TUNABLE_INT("hw.est.msr_info", &msr_info_enabled);
+static int strict = -1;
+TUNABLE_INT("hw.est.strict", &strict);
/* Default bus clock value for Centrino processors. */
#define INTEL_BUS_CLK 100
@@ -1025,6 +1027,9 @@ est_attach(device_t dev)
sc = device_get_softc(dev);
sc->dev = dev;
+ /* On SMP system we can't guarantie independent freq setting. */
+ if (strict == -1 && mp_ncpus > 1)
+ strict = 0;
/* Check CPU for supported settings. */
if (est_get_info(dev))
return (ENXIO);
@@ -1088,7 +1093,7 @@ est_acpi_info(device_t dev, freq_info **freqs)
struct cf_setting *sets;
freq_info *table;
device_t perf_dev;
- int count, error, i, j, check = 1;
+ int count, error, i, j;
uint16_t saved_id16;
perf_dev = device_find_child(device_get_parent(dev), "acpi_perf", -1);
@@ -1113,34 +1118,29 @@ est_acpi_info(device_t dev, freq_info **freqs)
goto out;
}
est_get_id16(&saved_id16);
-restart:
for (i = 0, j = 0; i < count; i++) {
/*
* Confirm id16 value is correct.
*/
if (sets[i].freq > 0) {
- if (check &&
- est_set_id16(dev, sets[i].spec[0], 1) != 0) {
+ error = est_set_id16(dev, sets[i].spec[0], 1);
+ if (error != 0 && strict) {
if (bootverbose)
device_printf(dev, "Invalid freq %u, "
"ignored.\n", sets[i].freq);
- } else {
- table[j].freq = sets[i].freq;
- table[j].volts = sets[i].volts;
- table[j].id16 = sets[i].spec[0];
- table[j].power = sets[i].power;
- ++j;
+ continue;
+ } else if (error != 0 && bootverbose) {
+ device_printf(dev, "Can't check freq %u, "
+ "it may be invalid\n",
+ sets[i].freq);
}
+ table[j].freq = sets[i].freq;
+ table[j].volts = sets[i].volts;
+ table[j].id16 = sets[i].spec[0];
+ table[j].power = sets[i].power;
+ ++j;
}
}
- if (check && count >= 2 && j < 2) {
- if (bootverbose) {
- device_printf(dev, "Too much freqs ignored. "
- "May be a check problem. Restore all.\n");
- }
- check = 0;
- goto restart;
- }
/* restore saved setting */
est_set_id16(dev, saved_id16, 0);
OpenPOWER on IntegriCloud