summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-11-14 14:16:02 +0000
committermav <mav@FreeBSD.org>2009-11-14 14:16:02 +0000
commit2a6e8faff67e22f3f93aa31c0986d6ee6dafaac4 (patch)
treeb255ff7514887127e30b5e056cb6c957a065abc6 /sys/i386
parent54458befa17d26d05a8f24e936bc5e032ba901fe (diff)
downloadFreeBSD-src-2a6e8faff67e22f3f93aa31c0986d6ee6dafaac4.zip
FreeBSD-src-2a6e8faff67e22f3f93aa31c0986d6ee6dafaac4.tar.gz
Desktop Core2Duo/Core2Quad CPUs are unable to control frequency of single
CPU core, only pair of them. As result, both cores are running on highest one of requested frequencies, and that is reported by status register. Such behavior confuses frequency validation logic, as it runs on only one core, as SMP is not yet launched, making EIST completely unusable. To workaround this, add check for validation result. If we haven't found at least two usable frequencies, then probably we are looking bad and have to trust data provided by BIOS as-is.
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/cpufreq/est.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/i386/cpufreq/est.c b/sys/i386/cpufreq/est.c
index 2c6fd2c..873667d 100644
--- a/sys/i386/cpufreq/est.c
+++ b/sys/i386/cpufreq/est.c
@@ -1088,7 +1088,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;
+ int count, error, i, j, check = 1;
uint16_t saved_id16;
perf_dev = device_find_child(device_get_parent(dev), "acpi_perf", -1);
@@ -1113,13 +1113,14 @@ 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) {
- error = est_set_id16(dev, sets[i].spec[0], 1);
- if (error != 0) {
+ if (check &&
+ est_set_id16(dev, sets[i].spec[0], 1) != 0) {
if (bootverbose)
device_printf(dev, "Invalid freq %u, "
"ignored.\n", sets[i].freq);
@@ -1132,6 +1133,14 @@ est_acpi_info(device_t dev, freq_info **freqs)
}
}
}
+ if (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