+2
-1
@@ -1,4 +1,5 @@
|
||||
*.user
|
||||
*.suo
|
||||
/Bin
|
||||
/Obj
|
||||
/Obj
|
||||
.vs/
|
||||
|
||||
@@ -38,12 +38,16 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
private const ushort FAMILY_15H_MODEL_00_MISC_CONTROL_DEVICE_ID = 0x1603;
|
||||
private const ushort FAMILY_15H_MODEL_10_MISC_CONTROL_DEVICE_ID = 0x1403;
|
||||
private const ushort FAMILY_15H_MODEL_30_MISC_CONTROL_DEVICE_ID = 0x141D;
|
||||
private const ushort FAMILY_15H_MODEL_60_MISC_CONTROL_DEVICE_ID = 0x1573;
|
||||
private const ushort FAMILY_16H_MODEL_00_MISC_CONTROL_DEVICE_ID = 0x1533;
|
||||
private const ushort FAMILY_16H_MODEL_30_MISC_CONTROL_DEVICE_ID = 0x1583;
|
||||
private const ushort FAMILY_17H_MODEL_00_MISC_CONTROL_DEVICE_ID = 0x1577;
|
||||
|
||||
private const uint REPORTED_TEMPERATURE_CONTROL_REGISTER = 0xA4;
|
||||
private const uint CLOCK_POWER_TIMING_CONTROL_0_REGISTER = 0xD4;
|
||||
|
||||
private const uint F15H_M60H_REPORTED_TEMP_CTRL_OFFSET = 0xD8200CA4;
|
||||
|
||||
private readonly uint miscellaneousControlAddress;
|
||||
private readonly ushort miscellaneousControlDeviceId;
|
||||
|
||||
@@ -79,6 +83,8 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
FAMILY_15H_MODEL_10_MISC_CONTROL_DEVICE_ID; break;
|
||||
case 0x30: miscellaneousControlDeviceId =
|
||||
FAMILY_15H_MODEL_30_MISC_CONTROL_DEVICE_ID; break;
|
||||
case 0x60: miscellaneousControlDeviceId =
|
||||
FAMILY_15H_MODEL_60_MISC_CONTROL_DEVICE_ID; break;
|
||||
default: miscellaneousControlDeviceId = 0; break;
|
||||
} break;
|
||||
case 0x16:
|
||||
@@ -89,6 +95,8 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
FAMILY_16H_MODEL_30_MISC_CONTROL_DEVICE_ID; break;
|
||||
default: miscellaneousControlDeviceId = 0; break;
|
||||
} break;
|
||||
case 0x17: miscellaneousControlDeviceId =
|
||||
FAMILY_17H_MODEL_00_MISC_CONTROL_DEVICE_ID; break;
|
||||
default: miscellaneousControlDeviceId = 0; break;
|
||||
}
|
||||
|
||||
@@ -304,6 +312,15 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
if (temperatureStream == null) {
|
||||
if (miscellaneousControlAddress != Ring0.InvalidPciAddress) {
|
||||
uint value;
|
||||
if (miscellaneousControlAddress == FAMILY_15H_MODEL_60_MISC_CONTROL_DEVICE_ID) {
|
||||
value = F15H_M60H_REPORTED_TEMP_CTRL_OFFSET;
|
||||
Ring0.WritePciConfig(Ring0.GetPciAddress(0, 0, 0), 0xB8, value);
|
||||
Ring0.ReadPciConfig(Ring0.GetPciAddress(0, 0, 0), 0xBC, out value);
|
||||
coreTemperature.Value = ((value >> 21) & 0x7FF) * 0.125f +
|
||||
coreTemperature.Parameters[0].Value;
|
||||
ActivateSensor(coreTemperature);
|
||||
return;
|
||||
}
|
||||
if (Ring0.ReadPciConfig(miscellaneousControlAddress,
|
||||
REPORTED_TEMPERATURE_CONTROL_REGISTER, out value)) {
|
||||
if (family == 0x15 && (value & 0x30000) == 0x30000) {
|
||||
|
||||
@@ -102,6 +102,7 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
case 0x14:
|
||||
case 0x15:
|
||||
case 0x16:
|
||||
case 0x17:
|
||||
hardware.Add(new AMD10CPU(index, coreThreads, settings));
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -28,7 +28,8 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
Silvermont,
|
||||
Skylake,
|
||||
Airmont,
|
||||
KabyLake
|
||||
KabyLake,
|
||||
ApolloLake
|
||||
}
|
||||
|
||||
private readonly Sensor[] coreTemperatures;
|
||||
@@ -170,6 +171,7 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
break;
|
||||
case 0x4E:
|
||||
case 0x5E: // Intel Core i5, i7 6xxxx LGA1151 (14nm)
|
||||
case 0x55: // Intel Core X i7, i9 7xxx LGA2066 (14nm)
|
||||
microarchitecture = Microarchitecture.Skylake;
|
||||
tjMax = GetTjMaxFromMSR();
|
||||
break;
|
||||
@@ -182,6 +184,10 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
microarchitecture = Microarchitecture.KabyLake;
|
||||
tjMax = GetTjMaxFromMSR();
|
||||
break;
|
||||
case 0x5C: // Intel ApolloLake
|
||||
microarchitecture = Microarchitecture.ApolloLake;
|
||||
tjMax = GetTjMaxFromMSR();
|
||||
break;
|
||||
default:
|
||||
microarchitecture = Microarchitecture.Unknown;
|
||||
tjMax = Floats(100);
|
||||
@@ -230,6 +236,7 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
case Microarchitecture.Silvermont:
|
||||
case Microarchitecture.Skylake:
|
||||
case Microarchitecture.Airmont:
|
||||
case Microarchitecture.ApolloLake:
|
||||
case Microarchitecture.KabyLake: {
|
||||
uint eax, edx;
|
||||
if (Ring0.Rdmsr(MSR_PLATFORM_INFO, out eax, out edx)) {
|
||||
@@ -294,7 +301,8 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
microarchitecture == Microarchitecture.Skylake ||
|
||||
microarchitecture == Microarchitecture.Silvermont ||
|
||||
microarchitecture == Microarchitecture.Airmont ||
|
||||
microarchitecture == Microarchitecture.KabyLake)
|
||||
microarchitecture == Microarchitecture.KabyLake ||
|
||||
microarchitecture == Microarchitecture.ApolloLake)
|
||||
{
|
||||
powerSensors = new Sensor[energyStatusMSRs.Length];
|
||||
lastEnergyTime = new DateTime[energyStatusMSRs.Length];
|
||||
@@ -412,6 +420,7 @@ namespace OpenHardwareMonitor.Hardware.CPU {
|
||||
case Microarchitecture.Broadwell:
|
||||
case Microarchitecture.Silvermont:
|
||||
case Microarchitecture.Skylake:
|
||||
case Microarchitecture.ApolloLake:
|
||||
case Microarchitecture.KabyLake: {
|
||||
uint multiplier = (eax >> 8) & 0xff;
|
||||
coreClocks[i].Value = (float)(multiplier * newBusClock);
|
||||
|
||||
@@ -27,6 +27,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
|
||||
IT8620E = 0x8620,
|
||||
IT8628E = 0x8628,
|
||||
IT8686E = 0x8686,
|
||||
IT8705F = 0x8705,
|
||||
IT8712F = 0x8712,
|
||||
IT8716F = 0x8716,
|
||||
@@ -43,6 +44,9 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
NCT610X = 0xC452,
|
||||
NCT6779D = 0xC560,
|
||||
NCT6791D = 0xC803,
|
||||
NCT6793D = 0xD121,
|
||||
NCT6795D = 0xD352,
|
||||
NCT6796D = 0xD423,
|
||||
|
||||
W83627DHG = 0xA020,
|
||||
W83627DHGP = 0xB070,
|
||||
@@ -74,6 +78,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
|
||||
case Chip.IT8620E: return "ITE IT8620E";
|
||||
case Chip.IT8628E: return "ITE IT8628E";
|
||||
case Chip.IT8686E: return "ITE IT8686E";
|
||||
case Chip.IT8705F: return "ITE IT8705F";
|
||||
case Chip.IT8712F: return "ITE IT8712F";
|
||||
case Chip.IT8716F: return "ITE IT8716F";
|
||||
@@ -91,6 +96,9 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
case Chip.NCT6776F: return "Nuvoton NCT6776F";
|
||||
case Chip.NCT6779D: return "Nuvoton NCT6779D";
|
||||
case Chip.NCT6791D: return "Nuvoton NCT6791D";
|
||||
case Chip.NCT6793D: return "Nuvoton NCT6793D";
|
||||
case Chip.NCT6795D: return "Nuvoton NCT6795D";
|
||||
case Chip.NCT6796D: return "Nuvoton NCT6796D";
|
||||
|
||||
case Chip.W83627DHG: return "Winbond W83627DHG";
|
||||
case Chip.W83627DHGP: return "Winbond W83627DHG-P";
|
||||
|
||||
+17
-6
@@ -138,15 +138,26 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
if (!valid)
|
||||
return;
|
||||
|
||||
voltages = new float?[9];
|
||||
temperatures = new float?[3];
|
||||
fans = new float?[chip == Chip.IT8705F ? 3 : 5];
|
||||
controls = new float?[3];
|
||||
// IT8686E has more sensors
|
||||
if(chip == Chip.IT8686E)
|
||||
{
|
||||
voltages = new float?[10];
|
||||
temperatures = new float?[5];
|
||||
fans = new float?[5];
|
||||
controls = new float?[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
voltages = new float?[9];
|
||||
temperatures = new float?[3];
|
||||
fans = new float?[chip == Chip.IT8705F ? 3 : 5];
|
||||
controls = new float?[3];
|
||||
}
|
||||
|
||||
// IT8620E, IT8628E, IT8721F, IT8728F and IT8772E use a 12mV resultion
|
||||
// IT8620E, IT8628E, IT8721F, IT8728F, IT8772E and IT8686E use a 12mV resultion
|
||||
// ADC, all others 16mV
|
||||
if (chip == Chip.IT8620E || chip == Chip.IT8628E || chip == Chip.IT8721F
|
||||
|| chip == Chip.IT8728F || chip == Chip.IT8771E || chip == Chip.IT8772E)
|
||||
|| chip == Chip.IT8728F || chip == Chip.IT8771E || chip == Chip.IT8772E || chip == Chip.IT8686E)
|
||||
{
|
||||
voltageGain = 0.012f;
|
||||
} else {
|
||||
|
||||
@@ -73,6 +73,12 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
lmChips.Add(new LMChip(Chip.NCT6779D, path)); break;
|
||||
case "nct6791":
|
||||
lmChips.Add(new LMChip(Chip.NCT6791D, path)); break;
|
||||
case "nct6793":
|
||||
lmChips.Add(new LMChip(Chip.NCT6793D, path)); break;
|
||||
case "nct6795":
|
||||
lmChips.Add(new LMChip(Chip.NCT6795D, path)); break;
|
||||
case "nct6796":
|
||||
lmChips.Add(new LMChip(Chip.NCT6796D, path)); break;
|
||||
|
||||
case "w83627ehf":
|
||||
lmChips.Add(new LMChip(Chip.W83627EHF, path)); break;
|
||||
|
||||
+28
-3
@@ -209,6 +209,27 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN;
|
||||
break;
|
||||
} break;
|
||||
case 0xD4:
|
||||
switch (revision) {
|
||||
case 0x23:
|
||||
chip = Chip.NCT6796D;
|
||||
logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN;
|
||||
break;
|
||||
} break;
|
||||
case 0xD1:
|
||||
switch (revision) {
|
||||
case 0x21:
|
||||
chip = Chip.NCT6793D;
|
||||
logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN;
|
||||
break;
|
||||
} break;
|
||||
case 0xD3:
|
||||
switch (revision) {
|
||||
case 0x52:
|
||||
chip = Chip.NCT6795D;
|
||||
logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN;
|
||||
break;
|
||||
} break;
|
||||
}
|
||||
if (chip == Chip.Unknown) {
|
||||
if (id != 0 && id != 0xff) {
|
||||
@@ -225,9 +246,9 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
ushort verify = port.ReadWord(BASE_ADDRESS_REGISTER);
|
||||
|
||||
ushort vendorID = port.ReadWord(FINTEK_VENDOR_ID_REGISTER);
|
||||
|
||||
// disable the hardware monitor i/o space lock on NCT6791D chips
|
||||
if (address == verify && chip == Chip.NCT6791D) {
|
||||
|
||||
// disable the hardware monitor i/o space lock on NCT679*D chips
|
||||
if (address == verify && (chip == Chip.NCT6791D || chip == Chip.NCT6796D || chip == Chip.NCT6793D || chip == Chip.NCT6795D)) {
|
||||
port.NuvotonDisableIOSpaceLock();
|
||||
}
|
||||
|
||||
@@ -277,6 +298,9 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
case Chip.NCT6776F:
|
||||
case Chip.NCT6779D:
|
||||
case Chip.NCT6791D:
|
||||
case Chip.NCT6796D:
|
||||
case Chip.NCT6793D:
|
||||
case Chip.NCT6795D:
|
||||
superIOs.Add(new NCT677X(chip, revision, address, port));
|
||||
break;
|
||||
case Chip.F71858:
|
||||
@@ -333,6 +357,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
switch (chipID) {
|
||||
case 0x8620: chip = Chip.IT8620E; break;
|
||||
case 0x8628: chip = Chip.IT8628E; break;
|
||||
case 0x8686: chip = Chip.IT8686E; break;
|
||||
case 0x8705: chip = Chip.IT8705F; break;
|
||||
case 0x8712: chip = Chip.IT8712F; break;
|
||||
case 0x8716: chip = Chip.IT8716F; break;
|
||||
|
||||
@@ -271,7 +271,10 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
break;
|
||||
|
||||
case Chip.NCT6779D:
|
||||
case Chip.NCT6795D:
|
||||
case Chip.NCT6793D:
|
||||
case Chip.NCT6791D:
|
||||
case Chip.NCT6796D:
|
||||
if (chip == Chip.NCT6779D) {
|
||||
fans = new float?[5];
|
||||
controls = new float?[5];
|
||||
@@ -414,7 +417,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
|
||||
public float?[] Controls { get { return controls; } }
|
||||
|
||||
private void DisableIOSpaceLock() {
|
||||
if (chip != Chip.NCT6791D)
|
||||
if (chip != Chip.NCT6791D && chip != Chip.NCT6796D && chip != Chip.NCT6793D && chip != Chip.NCT6795D)
|
||||
return;
|
||||
|
||||
// the lock is disabled already if the vendor ID can be read
|
||||
|
||||
@@ -93,6 +93,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
case "P6X58D-E":
|
||||
return Model.P6X58D_E;
|
||||
case "P8P67":
|
||||
case "P8P67 REV 3.1":
|
||||
return Model.P8P67;
|
||||
case "P8P67 EVO":
|
||||
return Model.P8P67_EVO;
|
||||
@@ -180,6 +181,8 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
return Model.X38_DS5;
|
||||
case "X58A-UD3R":
|
||||
return Model.X58A_UD3R;
|
||||
case "X79-UD3":
|
||||
return Model.X79_UD3;
|
||||
case "Z68A-D3H-B3":
|
||||
return Model.Z68A_D3H_B3;
|
||||
case "Z68AP-D3":
|
||||
@@ -190,6 +193,8 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
return Model.Z68X_UD7_B3;
|
||||
case "FH67":
|
||||
return Model.FH67;
|
||||
case "AX370-Gaming K7":
|
||||
return Model.AX370_K7;
|
||||
case "Base Board Product Name":
|
||||
case "To be filled by O.E.M.":
|
||||
return Model.Unknown;
|
||||
|
||||
@@ -75,10 +75,12 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
P8Z68_V_PRO,
|
||||
X38_DS5,
|
||||
X58A_UD3R,
|
||||
X79_UD3,
|
||||
Z68A_D3H_B3,
|
||||
Z68AP_D3,
|
||||
Z68X_UD3H_B3,
|
||||
Z68X_UD7_B3,
|
||||
AX370_K7,
|
||||
|
||||
// Shuttle
|
||||
FH67,
|
||||
|
||||
@@ -182,6 +182,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
case Chip.IT8718F:
|
||||
case Chip.IT8720F:
|
||||
case Chip.IT8726F:
|
||||
case Chip.IT8686E:
|
||||
GetITEConfigurationsA(superIO, manufacturer, model, v, t, f, c,
|
||||
ref readFan, ref postUpdate, ref mutex);
|
||||
break;
|
||||
@@ -266,6 +267,9 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
break;
|
||||
case Chip.NCT6779D:
|
||||
case Chip.NCT6791D:
|
||||
case Chip.NCT6796D:
|
||||
case Chip.NCT6793D:
|
||||
case Chip.NCT6795D:
|
||||
GetNuvotonConfigurationD(superIO, manufacturer, model, v, t, f, c);
|
||||
break;
|
||||
default:
|
||||
@@ -602,6 +606,26 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
f.Add(new Fan("Power Fan", 2));
|
||||
f.Add(new Fan("System Fan #1", 3));
|
||||
break;
|
||||
case Model.AX370_K7: // IT8686E
|
||||
// Note: v3.3, v12, v5, and AVCC3 might be slightly off.
|
||||
v.Add(new Voltage("CPU VCore", 0));
|
||||
v.Add(new Voltage("+3.3V", 1, 0.65f, 1));
|
||||
v.Add(new Voltage("+12V", 2, 5, 1));
|
||||
v.Add(new Voltage("+5V", 3, 1.5f, 1));
|
||||
v.Add(new Voltage("VSOC", 4));
|
||||
v.Add(new Voltage("VDDP", 5));
|
||||
v.Add(new Voltage("VDRAM", 6));
|
||||
v.Add(new Voltage("3VSB", 7, 10, 10));
|
||||
v.Add(new Voltage("VBAT", 8, 10, 10));
|
||||
v.Add(new Voltage("AVCC3", 9, 7.53f, 1));
|
||||
t.Add(new Temperature("System", 0));
|
||||
t.Add(new Temperature("Chipset", 1));
|
||||
t.Add(new Temperature("CPU", 2));
|
||||
t.Add(new Temperature("PCIEX16", 3));
|
||||
t.Add(new Temperature("VRM MOS", 4));
|
||||
for (int i = 0; i < superIO.Fans.Length; i++)
|
||||
f.Add(new Fan("Fan #" + (i + 1), i));
|
||||
break;
|
||||
default:
|
||||
v.Add(new Voltage("CPU VCore", 0));
|
||||
v.Add(new Voltage("DRAM", 1, true));
|
||||
@@ -831,6 +855,24 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
|
||||
f.Add(new Fan("System Fan #2", 3));
|
||||
f.Add(new Fan("System Fan #3", 4));
|
||||
break;
|
||||
case Model.X79_UD3: // IT8728F
|
||||
v.Add(new Voltage("VTT", 0));
|
||||
v.Add(new Voltage("DIMM CH A/B", 1));
|
||||
v.Add(new Voltage("+12V", 2, 10, 2));
|
||||
v.Add(new Voltage("+5V", 3, 15, 10));
|
||||
v.Add(new Voltage("VIN4", 4));
|
||||
v.Add(new Voltage("VCore", 5));
|
||||
v.Add(new Voltage("DIMM CH C/D", 6));
|
||||
v.Add(new Voltage("+3V Standby", 7, 1, 1));
|
||||
v.Add(new Voltage("VBat", 8, 1, 1));
|
||||
t.Add(new Temperature("System", 0));
|
||||
t.Add(new Temperature("CPU", 1));
|
||||
t.Add(new Temperature("Northbridge", 2));
|
||||
f.Add(new Fan("CPU Fan", 0));
|
||||
f.Add(new Fan("System Fan #1", 1));
|
||||
f.Add(new Fan("System Fan #2", 2));
|
||||
f.Add(new Fan("System Fan #3", 3));
|
||||
break;
|
||||
default:
|
||||
v.Add(new Voltage("Voltage #1", 0, true));
|
||||
v.Add(new Voltage("Voltage #2", 1, true));
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
[assembly: AssemblyTitle("Open Hardware Monitor Library")]
|
||||
@@ -24,3 +25,4 @@ using System.Runtime.InteropServices;
|
||||
[assembly: ComVisible(false)]
|
||||
[assembly: CLSCompliant(true)]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user