diff options
author | mav <mav@FreeBSD.org> | 2009-11-14 14:16:02 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2009-11-14 14:16:02 +0000 |
commit | 2a6e8faff67e22f3f93aa31c0986d6ee6dafaac4 (patch) | |
tree | b255ff7514887127e30b5e056cb6c957a065abc6 /sys/i386 | |
parent | 54458befa17d26d05a8f24e936bc5e032ba901fe (diff) | |
download | FreeBSD-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.c | 15 |
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); |