2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-08-31 06:15:15 +00:00

Attempt to make sensors-detect slightly more user-friendly, part three.

* Give a name to Super-I/O chip families.
* Merge the two Winbond families.
* Be smarter when testing Super-I/O chips, read the device ID only once.
* When an unknown chip is found, print the ID only once.
* Reformat the warning message when a module isn't found.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@4129 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Jean Delvare
2006-09-01 19:22:13 +00:00
parent f9b1002b79
commit 2668fbb56e

View File

@@ -1430,7 +1430,7 @@ use vars qw(@pci_adapters_sis5595 @pci_adapters_sis645 @pci_adapters_sis96x);
i2c_detect => sub { ite_detect(0, @_); },
},
{
name => "ITE IT8201R/IT8203R/IT8206R/IT8266R overclocking controller",
name => "ITE IT8201R/IT8203R/IT8206R/IT8266R",
driver => "not-a-sensor",
i2c_addrs => [0x4e],
i2c_detect => sub { ite_overclock_detect(@_); },
@@ -1643,6 +1643,7 @@ $chip_kern26_w83791d = {
# I2C bus number, and the I2C address.
@superio_ids = (
{
family => "ITE",
enter =>
{
0x2e => [0x87, 0x01, 0x55, 0x55],
@@ -1684,6 +1685,7 @@ $chip_kern26_w83791d = {
],
},
{
family => "National Semiconductor",
enter =>
{
0x2e => [],
@@ -1804,12 +1806,12 @@ $chip_kern26_w83791d = {
],
},
{
family => "SMSC",
enter =>
{
0x2e => [0x55],
0x4e => [0x55],
},
exit => [0xaa],
chips =>
[
{
@@ -1873,12 +1875,12 @@ $chip_kern26_w83791d = {
],
},
{
family => "VIA/Winbond/Fintek",
enter =>
{
0x2e => [0x87, 0x87],
0x4e => [0x87, 0x87],
},
exit => [0xaa],
chips =>
[
{
@@ -1924,6 +1926,22 @@ $chip_kern26_w83791d = {
devid => 0x68,
logdev => 0x0b,
},
{
name => "Winbond W83627EHF/EHG Super IO Sensors",
driver => "w83627ehf",
# W83627EHF datasheet says 0x886x but 0x8853 was seen, thus the
# broader mask. W83627EHG was seen with ID 0x8863.
devid => 0x8840,
devid_mask => 0xFFC0,
logdev => 0x0b,
},
{
name => "Winbond W83627DHG Super IO Sensors",
driver => "w83627ehf",
devid => 0xA020,
devid_mask => 0xFFF0,
logdev => 0x0b,
},
{
name => "Winbond W83L517D Super IO",
driver => "not-a-sensor",
@@ -1948,32 +1966,6 @@ $chip_kern26_w83791d = {
},
],
},
{
enter =>
{
0x2e => [0x87, 0x87],
0x4e => [0x87, 0x87],
},
chips =>
[
{
name => "Winbond W83627EHF/EHG Super IO Sensors",
driver => "w83627ehf",
# W83627EHF datasheet says 0x886x but 0x8853 was seen, thus the
# broader mask. W83627EHG was seen with ID 0x8863.
devid => 0x8840,
devid_mask => 0xFFC0,
logdev => 0x0b,
},
{
name => "Winbond W83627DHG Super IO Sensors",
driver => "w83627ehf",
devid => 0xA020,
devid_mask => 0xFFF0,
logdev => 0x0b,
},
]
}
);
#######################
@@ -2899,21 +2891,74 @@ sub scan_isa_bus
}
}
use vars qw(%superio);
%superio = (
devidreg => 0x20,
logdevreg => 0x07,
actreg => 0x30,
actmask => 0x01,
basereg => 0x60,
);
sub exit_superio
{
my ($addrreg, $datareg, $family, $success) = @_;
my ($addrreg, $datareg) = @_;
# If detection succeeded and an exit sequence exists, use it
if ($success && defined ($family->{exit})) {
foreach my $byte (@{$family->{exit}}) {
outb($addrreg, $byte);
}
# Some chips (SMSC, Winbond) want this
outb($addrreg, 0xaa);
# Return to "Wait For Key" state (PNP-ISA spec)
outb($addrreg, 0x02);
outb($datareg, 0x02);
}
sub probe_superio($$$)
{
my ($addrreg, $datareg, $chip) = @_;
my ($val, $addr);
printf "\%-60s", "Found `$chip->{name}'";
# Does it have hardware monitoring capabilities?
if (!exists $chip->{driver}) {
print "\n (no information available)\n";
return;
}
if ($chip->{driver} eq "not-a-sensor") {
print "\n (no hardware monitoring capabilities)\n";
return;
}
# Else return to "Wait For Key" state (PNP-ISA spec)
outb($addrreg, 0x02);
outb($datareg, 0x02);
# Switch to the sensor logical device
outb($addrreg, $superio{logdevreg});
outb($datareg, $chip->{logdev});
# Check the activation register
outb($addrreg, $superio{actreg});
$val = inb($datareg);
if (!($val & $superio{actmask})) {
print "\n (but not activated)\n";
return;
}
# Get the IO base register
outb($addrreg, $superio{basereg});
$addr = inb($datareg);
outb($addrreg, $superio{basereg} + 1);
$addr = ($addr << 8) | inb($datareg);
if ($addr == 0) {
print "\n (but no address specified)\n";
return;
}
print "Success!\n";
printf " (address 0x\%x, driver `%s')\n", $addr, $chip->{driver};
my $new_hash = { conf => 9,
isa_addr => $addr,
chipname => $chip->{name}
};
add_isa_to_chips_detected $chip->{alias_detect},$chip->{driver},
$new_hash;
}
# The following are taken from the PNP ISA spec (so it's supposed
@@ -2926,82 +2971,40 @@ sub exit_superio
sub scan_superio
{
my ($addrreg, $datareg) = @_;
my ($val, $addr, $name);
my ($val, $found);
my %superio = (
devidreg => 0x20,
logdevreg => 0x07,
actreg => 0x30,
actmask => 0x01,
basereg => 0x60,
);
printf("Probing for Super-I/O at 0x\%x/0x\%x\n", $addrreg, $datareg);
FAMILY:
foreach my $family (@superio_ids) {
printf("\%-60s", "Trying family `$family->{family}'... ");
# write the password
foreach $val (@{$family->{enter}->{$addrreg}}) {
outb($addrreg, $val);
}
foreach my $chip (@{$family->{chips}}) {
$name = $chip->{name};
$name =~ s/ Super IO//;
printf("\%-60s", sprintf("Probing for `\%s'... ", $name));
# check the device ID
outb($addrreg, $superio{devidreg});
$val = inb($datareg);
if ($val == 0x00 || $val == 0xff) {
print "No\n";
exit_superio($addrreg, $datareg, $family, 0);
next FAMILY;
}
if ($chip->{devid}>0xff) {
outb($addrreg, $superio{devidreg} + 1);
$val = ($val << 8) | inb($datareg);
}
if (($val & ($chip->{devid_mask} || 0xffff)) != $chip->{devid}) {
printf "No (0x%0*x)\n", $chip->{devid}>0xff ? 4 : 2, $val;
next;
}
print "Success!\n";
# does it have hardware monitoring capabilities
if (!exists $chip->{driver}) {
print " (no information available)\n";
next;
}
if($chip->{driver} eq "not-a-sensor") {
print " (no hardware monitoring capabilities)\n";
next;
}
# switch to the sensor logical device
outb($addrreg, $superio{logdevreg});
outb($datareg, $chip->{logdev});
# check the activation register
outb($addrreg, $superio{actreg});
$val = inb($datareg);
if(!($val & $superio{actmask})) {
print " (but not activated)\n";
next;
}
# Get the IO base register
outb($addrreg, $superio{basereg});
$addr = inb($datareg);
outb($addrreg, $superio{basereg} + 1);
$addr = ($addr << 8) | inb($datareg);
if($addr == 0) {
print " (but no address specified)\n";
next;
}
printf " (address 0x\%x, driver `%s')\n", $addr, $chip->{driver};
my $new_hash = { conf => 9,
isa_addr => $addr,
chipname => $chip->{name}
};
add_isa_to_chips_detected $chip->{alias_detect},$chip->{driver},
$new_hash;
# did it work?
outb($addrreg, $superio{devidreg});
$val = inb($datareg);
outb($addrreg, $superio{devidreg} + 1);
$val = ($val << 8) | inb($datareg);
if ($val == 0x0000 || $val == 0xffff) {
print "No\n";
next FAMILY;
}
exit_superio($addrreg, $datareg, $family, 1);
print "Yes\n";
$found = 0;
foreach my $chip (@{$family->{chips}}) {
if (($chip->{devid} > 0xff && ($val & ($chip->{devid_mask} || 0xffff)) == $chip->{devid})
|| ($chip->{devid} <= 0xff && ($val >> 8) == $chip->{devid})) {
probe_superio($addrreg, $datareg, $chip);
$found++;
}
}
printf(" Found unknown chip with ID 0x%04x\n", $val)
unless $found;
exit_superio($addrreg, $datareg);
}
}
@@ -5207,9 +5210,11 @@ sub generate_modprobes
close INPUTFILE;
#check return value from modprobe in case modprobe -l isn't supported
if((($? >> 8) == 0) && ! $modulefound) {
$modprobes .= "# Warning: the required module $chip->{driver} is not currently installed on your system.\n";
$modprobes .= "# For status of 2.6 kernel ports see http://www.lm-sensors.org/wiki/SupportedDevices\n";
$modprobes .= "# If driver is built-in to the kernel, or unavailable, comment out the following line.\n";
$modprobes .= "# Warning: the required module $chip->{driver} is not currently installed on\n".
"# your system. For status of 2.6 kernel ports see\n".
"# http://www.lm-sensors.org/wiki/SupportedDevices and\n".
"# http://www.lm-sensors.org/wiki/SupportedDevices. If driver is built\n".
"# into the kernel, or unavailable, comment out the following line.\n";
}
$modprobes .= "modprobe $chip->{driver}\n";
}