summaryrefslogtreecommitdiffstats
path: root/perl-install/cpufreq.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/cpufreq.pm')
-rw-r--r--perl-install/cpufreq.pm55
1 files changed, 33 insertions, 22 deletions
diff --git a/perl-install/cpufreq.pm b/perl-install/cpufreq.pm
index 8fa9b5a17..bbcf56700 100644
--- a/perl-install/cpufreq.pm
+++ b/perl-install/cpufreq.pm
@@ -41,18 +41,24 @@ sub find_pci_device {
sub probe_acpi_cpufreq() {
any {
get_vendor($_) eq "Intel" &&
- has_flag($_, 'est') &&
$_->{'cpu family'} == 6 &&
- $_->{model} == 15;
+ (
+ has_flag($_, 'est') ||
+ $_->{model} == 11
+ );
} get_cpus();
}
+# see cpuid.c (from cpuid package) for a list of family/models
sub probe_centrino() {
any {
get_vendor($_) eq "Intel" &&
has_flag($_, 'est') && (
- $_->{'cpu family'} == 6 && member($_->{model}, 9, 13, 14) ||
- $_->{'cpu family'} == 15 && member($_->{model}, 3, 4)
+ ($_->{'cpu family'} == 6 && $_->{model} == 9 && $_->{stepping} == 5 &&
+ $_->{'model name'} =~ /^Intel\(R\) Pentium\(R\) M processor ( 900|1[0-7]00)MHz$/) ||
+ ($_->{'cpu family'} == 6 && $_->{model} == 13 && member($_->{stepping}, 1, 2, 6)) ||
+ ($_->{'cpu family'} == 15 && $_->{model} == 3 && $_->{stepping} == 4) ||
+ ($_->{'cpu family'} == 15 && $_->{model} == 4 && $_->{stepping} == 1)
);
} get_cpus();
}
@@ -64,23 +70,16 @@ sub probe_smi() { find_pci_device([ 0x8086, 0x7190 ]) }
sub probe_nforce2() { find_pci_device([ 0x10de, 0x01e0 ]) }
sub probe_gsx() {
- any { member(get_vendor($_), "Cyrix", "NSC") } get_cpus() &&
+ (any { member(get_vendor($_), "Cyrix", "NSC") } get_cpus()) &&
find_pci_device([ 0x1078, 0x0100 ], [ 0x1078, 0x0002 ], [ 0x1078, 0x0000 ]);
}
-sub probe_powerpc() {
- arch() =~ /ppc/ && any {
- member($_->{motherboard}, ('PowerBook3,4', 'PowerBook3,5', 'PowerBook4,1', 'PowerBook3,2', 'MacRISC3')) &&
- # Kernel contains a special case for the supported 750FX,
- # not sure if the cpu name can be used, so use same test as kernel
- first($_->{revision} =~ /\bpvr\s+(\d+)\b/) == 7000;
- } get_cpus();
-}
-
sub probe_p4() {
any {
- get_vendor($_) eq "Intel" &&
- $_->{'cpu family'} == 15;
+ get_vendor($_) eq "Intel" && (
+ $_->{'cpu family'} == 15 ||
+ ($_->{'cpu family'} == 6 && !has_flag($_, 'est') && member($_->{model}, 9, 13, 14, 15))
+ );
} get_cpus();
}
@@ -101,9 +100,11 @@ sub probe_powernow_k7() {
sub probe_powernow_k8() {
any {
- get_vendor($_) eq "AMD" &&
- $_->{'cpu family'} == 15 &&
- ($_->{'power management'} =~ /\bfid\b/ || has_flag($_, 'fid')); # frequency ID control
+ get_vendor($_) eq "AMD" && (
+ ($_->{'cpu family'} == 15 && ($_->{'power management'} =~ /\bfid\b/ || has_flag($_, 'fid'))) # frequency ID control)
+ ||
+ $_->{'cpu family'} == 16 && ($_->{'power management'} =~ /\bhwpstate\b/) # support for Athlon/Phenom II processors (#58477))
+ );
} get_cpus();
}
@@ -115,6 +116,15 @@ sub probe_longhaul() {
} get_cpus();
}
+sub probe_e_powersaver() {
+ any {
+ get_vendor($_) eq "Centaur" &&
+ has_flag($_, 'est') &&
+ $_->{'cpu family'} == 6 &&
+ member($_->{model}, 10, 13);
+ } get_cpus();
+}
+
sub probe_longrun() {
any {
get_vendor($_) eq "Transmeta" &&
@@ -123,10 +133,10 @@ sub probe_longrun() {
}
my @modules = (
- [ "acpi-cpufreq", \&probe_acpi_cpufreq ],
# probe centrino first, it will get detected on ICH chipset and
# speedstep-ich doesn't work with it
[ "speedstep-centrino", \&probe_centrino ],
+ [ "acpi-cpufreq", \&probe_acpi_cpufreq ],
# try to find cpufreq compliant northbridge
[ "speedstep-ich", \&probe_ich ],
[ "speedstep-smi", \&probe_smi ],
@@ -138,6 +148,7 @@ my @modules = (
[ "powernow-k7", \&probe_powernow_k7 ],
[ "powernow-k8", \&probe_powernow_k8 ],
[ "longhaul", \&probe_longhaul ],
+ [ "e_powersaver", \&probe_e_powersaver ],
[ "longrun", \&probe_longrun ],
);
@@ -146,11 +157,11 @@ sub find_driver() {
$m && $m->[0];
}
-my @governor_modules = map { "cpufreq_$_" } qw(performance powersave conservative ondemand);
+my @governor_modules = map { "cpufreq_$_" } qw(powersave conservative ondemand);
sub get_modules() {
my $module;
- if (probe_powerpc() || ($module = find_driver())) {
+ if ($module = find_driver()) {
return if_($module, $module), @governor_modules;
}
();