[Feature] Show Performance & Efficient Core instead of Core (#2095)

* Push

* Change Voltages, Temperatures to P/E Core.
Use independent counter for P/E Core.
This commit is contained in:
辉夜
2025-12-09 12:16:57 +01:00
committed by GitHub
parent ecd1c25b7f
commit 94c742b22d
3 changed files with 74 additions and 19 deletions
@@ -0,0 +1,8 @@
namespace LibreHardwareMonitor.Hardware;
public enum CoreType
{
Unknown = 0,
Performance = 0x40,
Efficient = 0x20
}
@@ -83,6 +83,24 @@ public class CpuId
OpCode.CpuId(CPUID_0 + i, 0, out Data[i, 0], out Data[i, 1], out Data[i, 2], out Data[i, 3]);
}
if (Vendor == Vendor.Intel && maxCpuid >= 0x1A)
{
// Leaf 0x1A, SubLeaf 0, EAX Bits 31:24 = Core Type ID
uint coreType = (Data[0x1A, 0] >> 24) & 0xFF;
CoreType = coreType switch
{
// 0x40 = Core (P-Core), 0x20 = Atom (E-Core)
0x40 => CoreType.Performance,
0x20 => CoreType.Efficient,
_ => CoreType.Unknown
};
}
else
{
CoreType = CoreType.Unknown;
}
ExtData = new uint[maxCpuidExt + 1, 4];
for (uint i = 0; i < maxCpuidExt + 1; i++)
{
@@ -191,6 +209,7 @@ public class CpuId
public string BrandString { get; } = string.Empty;
public uint CoreId { get; }
public CoreType CoreType { get; } = CoreType.Unknown;
public uint[,] Data { get; } = new uint[0, 0];
@@ -23,6 +23,8 @@ internal sealed class IntelCpu : GenericCpu
private readonly Sensor _coreVoltage;
private readonly Sensor[] _distToTjMaxTemperatures;
private readonly string[] _coreNames;
private readonly uint[] _energyStatusMsrs = { MSR_PKG_ENERGY_STATUS, MSR_PP0_ENERGY_STATUS, MSR_PP1_ENERGY_STATUS, MSR_DRAM_ENERGY_STATUS, MSR_PLATFORM_ENERGY_STATUS };
private readonly uint[] _lastEnergyConsumed;
private readonly DateTime[] _lastEnergyTime;
@@ -324,6 +326,30 @@ internal sealed class IntelCpu : GenericCpu
break;
}
// Initialize core names
_coreNames = new string[_coreCount];
int pCoreIndex = 1;
int eCoreIndex = 1;
for (int i = 0; i < _coreCount; i++)
{
if (_cpuId.Length > i && _cpuId[i].Length > 0)
{
CoreType coreType = _cpuId[i][0].CoreType;
_coreNames[i] = coreType switch
{
CoreType.Performance => $"P-Core #{pCoreIndex++}",
CoreType.Efficient => $"E-Core #{eCoreIndex++}",
_ => CoreString(i)
};
}
else
{
_coreNames[i] = CoreString(i);
}
}
int coreSensorId = 0;
//core temp avg and max value
@@ -350,23 +376,24 @@ internal sealed class IntelCpu : GenericCpu
_coreTemperatures = new Sensor[_coreCount];
for (int i = 0; i < _coreTemperatures.Length; i++)
{
_coreTemperatures[i] = new Sensor(CoreString(i),
coreSensorId,
SensorType.Temperature,
this,
new[]
{
new ParameterDescription("TjMax [°C]", "TjMax temperature of the core sensor.\n" + "Temperature = TjMax - TSlope * Value.", tjMax[i]),
new ParameterDescription("TSlope [°C]", "Temperature slope of the digital thermal sensor.\n" + "Temperature = TjMax - TSlope * Value.", 1)
},
settings);
_coreTemperatures[i] = new Sensor(_coreNames[i],
coreSensorId,
SensorType.Temperature,
this,
[
new ParameterDescription("TjMax [°C]", "TjMax temperature of the core sensor.\n" + "Temperature = TjMax - TSlope * Value.", tjMax[i]),
new ParameterDescription("TSlope [°C]", "Temperature slope of the digital thermal sensor.\n" + "Temperature = TjMax - TSlope * Value.", 1)
],
settings);
ActivateSensor(_coreTemperatures[i]);
coreSensorId++;
}
}
else
_coreTemperatures = Array.Empty<Sensor>();
{
_coreTemperatures = [];
}
// check if processor supports a digital thermal sensor at package level
if (cpuId[0][0].Data.GetLength(0) > 6 && (cpuId[0][0].Data[6, 0] & 0x40) != 0 && _microArchitecture != MicroArchitecture.Unknown)
@@ -375,11 +402,10 @@ internal sealed class IntelCpu : GenericCpu
coreSensorId,
SensorType.Temperature,
this,
new[]
{
[
new ParameterDescription("TjMax [°C]", "TjMax temperature of the package sensor.\n" + "Temperature = TjMax - TSlope * Value.", tjMax[0]),
new ParameterDescription("TSlope [°C]", "Temperature slope of the digital thermal sensor.\n" + "Temperature = TjMax - TSlope * Value.", 1)
},
],
settings);
ActivateSensor(_packageTemperature);
@@ -392,19 +418,21 @@ internal sealed class IntelCpu : GenericCpu
_distToTjMaxTemperatures = new Sensor[_coreCount];
for (int i = 0; i < _distToTjMaxTemperatures.Length; i++)
{
_distToTjMaxTemperatures[i] = new Sensor(CoreString(i) + " Distance to TjMax", coreSensorId, SensorType.Temperature, this, settings);
_distToTjMaxTemperatures[i] = new Sensor(_coreNames[i] + " Distance to TjMax", coreSensorId, SensorType.Temperature, this, settings);
ActivateSensor(_distToTjMaxTemperatures[i]);
coreSensorId++;
}
}
else
_distToTjMaxTemperatures = Array.Empty<Sensor>();
{
_distToTjMaxTemperatures = [];
}
_busClock = new Sensor("Bus Speed", 0, SensorType.Clock, this, settings);
_coreClocks = new Sensor[_coreCount];
for (int i = 0; i < _coreClocks.Length; i++)
{
_coreClocks[i] = new Sensor(CoreString(i), i + 1, SensorType.Clock, this, settings);
_coreClocks[i] = new Sensor(_coreNames[i], i + 1, SensorType.Clock, this, settings);
if (HasTimeStampCounter && _microArchitecture != MicroArchitecture.Unknown)
ActivateSensor(_coreClocks[i]);
}
@@ -449,7 +477,7 @@ internal sealed class IntelCpu : GenericCpu
if (EnergyUnitsMultiplier != 0)
{
string[] powerSensorLabels = { "CPU Package", "CPU Cores", "CPU Graphics", "CPU Memory", "CPU Platform" };
string[] powerSensorLabels = ["CPU Package", "CPU Cores", "CPU Graphics", "CPU Memory", "CPU Platform"];
for (int i = 0; i < _energyStatusMsrs.Length; i++)
{
@@ -482,7 +510,7 @@ internal sealed class IntelCpu : GenericCpu
_coreVIDs = new Sensor[_coreCount];
for (int i = 0; i < _coreVIDs.Length; i++)
{
_coreVIDs[i] = new Sensor(CoreString(i), i + 1, SensorType.Voltage, this, settings);
_coreVIDs[i] = new Sensor(_coreNames[i], i + 1, SensorType.Voltage, this, settings);
ActivateSensor(_coreVIDs[i]);
}