hwmon-vid: Add support for VIA family 6 model D CPU
The VIA family 6 model D CPU (C7-D, Eden 90 nm) can use two different VID tables, we have to check the value of a MSR to decide which one to use. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Guenter Roeck <guenter.roeck@ericsson.com> Tested-by: Jeff Rickman <jrickman@myamigos.us>
This commit is contained in:
committed by
Jean Delvare
parent
0772a64079
commit
0a88f4b557
@@ -140,7 +140,11 @@ int vid_from_reg(int val, u8 vrm)
|
|||||||
return(val & 0x10 ? 975 - (val & 0xF) * 25 :
|
return(val & 0x10 ? 975 - (val & 0xF) * 25 :
|
||||||
1750 - val * 50);
|
1750 - val * 50);
|
||||||
case 13:
|
case 13:
|
||||||
|
case 131:
|
||||||
val &= 0x3f;
|
val &= 0x3f;
|
||||||
|
/* Exception for Eden ULV 500 MHz */
|
||||||
|
if (vrm == 131 && val == 0x3f)
|
||||||
|
val++;
|
||||||
return(1708 - val * 16);
|
return(1708 - val * 16);
|
||||||
case 14: /* Intel Core */
|
case 14: /* Intel Core */
|
||||||
/* compute in uV, round to mV */
|
/* compute in uV, round to mV */
|
||||||
@@ -205,11 +209,45 @@ static struct vrm_model vrm_models[] = {
|
|||||||
{X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nehemiah */
|
{X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nehemiah */
|
||||||
{X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M, Eden-N */
|
{X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M, Eden-N */
|
||||||
{X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0}, /* No information */
|
{X86_VENDOR_CENTAUR, 0x6, 0xA, 0x7, 0}, /* No information */
|
||||||
{X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13}, /* C7, Esther */
|
{X86_VENDOR_CENTAUR, 0x6, 0xA, ANY, 13}, /* C7-M, C7, Eden (Esther) */
|
||||||
|
{X86_VENDOR_CENTAUR, 0x6, 0xD, ANY, 134}, /* C7-D, C7-M, C7, Eden (Esther) */
|
||||||
|
|
||||||
{X86_VENDOR_UNKNOWN, ANY, ANY, ANY, 0} /* stop here */
|
{X86_VENDOR_UNKNOWN, ANY, ANY, ANY, 0} /* stop here */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Special case for VIA model D: there are two different possible
|
||||||
|
* VID tables, so we have to figure out first, which one must be
|
||||||
|
* used. This resolves temporary drm value 134 to 14 (Intel Core
|
||||||
|
* 7-bit VID), 13 (Pentium M 6-bit VID) or 131 (Pentium M 6-bit VID
|
||||||
|
* + quirk for Eden ULV 500 MHz).
|
||||||
|
* Note: something similar might be needed for model A, I'm not sure.
|
||||||
|
*/
|
||||||
|
static u8 get_via_model_d_vrm(void)
|
||||||
|
{
|
||||||
|
unsigned int vid, brand, dummy;
|
||||||
|
static const char *brands[4] = {
|
||||||
|
"C7-M", "C7", "Eden", "C7-D"
|
||||||
|
};
|
||||||
|
|
||||||
|
rdmsr(0x198, dummy, vid);
|
||||||
|
vid &= 0xff;
|
||||||
|
|
||||||
|
rdmsr(0x1154, brand, dummy);
|
||||||
|
brand = ((brand >> 4) ^ (brand >> 2)) & 0x03;
|
||||||
|
|
||||||
|
if (vid > 0x3f) {
|
||||||
|
pr_info("Using %d-bit VID table for VIA %s CPU\n",
|
||||||
|
7, brands[brand]);
|
||||||
|
return 14;
|
||||||
|
} else {
|
||||||
|
pr_info("Using %d-bit VID table for VIA %s CPU\n",
|
||||||
|
6, brands[brand]);
|
||||||
|
/* Enable quirk for Eden */
|
||||||
|
return brand == 2 ? 131 : 13;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor)
|
static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -247,6 +285,8 @@ u8 vid_which_vrm(void)
|
|||||||
eff_model += ((eax & 0x000F0000)>>16)<<4;
|
eff_model += ((eax & 0x000F0000)>>16)<<4;
|
||||||
}
|
}
|
||||||
vrm_ret = find_vrm(eff_family, eff_model, eff_stepping, c->x86_vendor);
|
vrm_ret = find_vrm(eff_family, eff_model, eff_stepping, c->x86_vendor);
|
||||||
|
if (vrm_ret == 134)
|
||||||
|
vrm_ret = get_via_model_d_vrm();
|
||||||
if (vrm_ret == 0)
|
if (vrm_ret == 0)
|
||||||
pr_info("Unknown VRM version of your x86 CPU\n");
|
pr_info("Unknown VRM version of your x86 CPU\n");
|
||||||
return vrm_ret;
|
return vrm_ret;
|
||||||
|
Reference in New Issue
Block a user