Added support for ADL (AMD Display Library) Overdrive8 GPU sensors.

This commit is contained in:
Michael Möller 2020-02-28 23:21:02 +01:00
parent e3919ece28
commit 9b55e1f66d
3 changed files with 225 additions and 72 deletions

View File

@ -77,6 +77,19 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public int MaxRPM;
}
[StructLayout(LayoutKind.Sequential)]
internal struct ADLSingleSensorData {
public bool Supported;
public int Value;
}
[StructLayout(LayoutKind.Sequential)]
internal struct ADLPMLogDataOutput {
public int Size;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = ADL.ADL_PMLOG_MAX_SENSORS)]
public ADLSingleSensorData[] Sensors;
}
internal enum ADLODNCurrentPowerType {
TOTAL_POWER = 0,
PPT_POWER,
@ -94,6 +107,48 @@ namespace OpenHardwareMonitor.Hardware.ATI {
HOTSPOT = 7,
}
internal enum ADLSensorType {
CLK_GFXCLK = 1,
CLK_MEMCLK = 2,
CLK_SOCCLK = 3,
CLK_UVDCLK1 = 4,
CLK_UVDCLK2 = 5,
CLK_VCECLK = 6,
CLK_VCNCLK = 7,
TEMPERATURE_EDGE = 8,
TEMPERATURE_MEM = 9,
TEMPERATURE_VRVDDC = 10,
TEMPERATURE_VRMVDD = 11,
TEMPERATURE_LIQUID = 12,
TEMPERATURE_PLX = 13,
FAN_RPM = 14,
FAN_PERCENTAGE = 15,
SOC_VOLTAGE = 16,
SOC_POWER = 17,
SOC_CURRENT = 18,
INFO_ACTIVITY_GFX = 19,
INFO_ACTIVITY_MEM = 20,
GFX_VOLTAGE = 21,
MEM_VOLTAGE = 22,
ASIC_POWER = 23,
TEMPERATURE_VRSOC = 24,
TEMPERATURE_VRMVDD0 = 25,
TEMPERATURE_VRMVDD1 = 26,
TEMPERATURE_HOTSPOT = 27,
TEMPERATURE_GFX = 28,
TEMPERATURE_SOC = 29,
GFX_POWER = 30,
GFX_CURRENT = 31,
TEMPERATURE_CPU = 32,
CPU_POWER = 33,
CLK_CPUCLK = 34,
THROTTLER_STATUS = 35,
CLK_VCN1CLK1 = 36,
CLK_VCN1CLK2 = 37,
SMART_POWERSHIFT_CPU = 38,
SMART_POWERSHIFT_DGPU = 39
}
internal class ADL {
public const int ADL_MAX_PATH = 256;
public const int ADL_MAX_ADAPTERS = 40;
@ -105,6 +160,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public const int ADL_MAX_GLSYNC_PORTS = 8;
public const int ADL_MAX_GLSYNC_PORT_LEDS = 8;
public const int ADL_MAX_NUM_DISPLAYMODES = 1024;
public const int ADL_PMLOG_MAX_SENSORS = 256;
public const int ADL_DL_FANCTRL_SPEED_TYPE_PERCENT = 1;
public const int ADL_DL_FANCTRL_SPEED_TYPE_RPM = 2;
@ -156,6 +212,8 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public delegate int ADL2_Overdrive6_CurrentPower_GetDelegate(IntPtr context,
int adapterIndex, ADLODNCurrentPowerType powerType,
out int currentValue);
public delegate int ADL2_New_QueryPMLogData_GetDelegate(IntPtr context,
int adapterIndex, out ADLPMLogDataOutput dataOutput);
private static ADL_Main_Control_CreateDelegate
_ADL_Main_Control_Create;
@ -194,6 +252,8 @@ namespace OpenHardwareMonitor.Hardware.ATI {
ADL2_OverdriveN_Temperature_Get;
public static ADL2_Overdrive6_CurrentPower_GetDelegate
ADL2_Overdrive6_CurrentPower_Get;
public static ADL2_New_QueryPMLogData_GetDelegate
ADL2_New_QueryPMLogData_Get;
private static string dllName;
@ -250,6 +310,8 @@ namespace OpenHardwareMonitor.Hardware.ATI {
out ADL2_OverdriveN_Temperature_Get);
GetDelegate("ADL2_Overdrive6_CurrentPower_Get",
out ADL2_Overdrive6_CurrentPower_Get);
GetDelegate("ADL2_New_QueryPMLogData_Get",
out ADL2_New_QueryPMLogData_Get);
}
static ADL() {

View File

@ -33,6 +33,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
private readonly Sensor coreClock;
private readonly Sensor memoryClock;
private readonly Sensor coreVoltage;
private readonly Sensor memoryVoltage;
private readonly Sensor coreLoad;
private readonly Sensor controlSensor;
private readonly Control fanControl;
@ -76,12 +77,12 @@ namespace OpenHardwareMonitor.Hardware.ATI {
this.powerCore = new Sensor("GPU Core", 1, SensorType.Power, this, settings);
this.powerPpt = new Sensor("GPU PPT", 2, SensorType.Power, this, settings);
this.powerSocket = new Sensor("GPU Socket", 3, SensorType.Power, this, settings);
this.fan = new Sensor("GPU Fan", 0, SensorType.Fan, this, settings);
this.coreClock = new Sensor("GPU Core", 0, SensorType.Clock, this, settings);
this.memoryClock = new Sensor("GPU Memory", 1, SensorType.Clock, this, settings);
this.coreVoltage = new Sensor("GPU Core", 0, SensorType.Voltage, this, settings);
this.memoryVoltage = new Sensor("GPU Memory", 1, SensorType.Voltage, this, settings);
this.coreLoad = new Sensor("GPU Core", 0, SensorType.Load, this, settings);
this.controlSensor = new Sensor("GPU Fan", 0, SensorType.Control, this, settings);
@ -191,92 +192,182 @@ namespace OpenHardwareMonitor.Hardware.ATI {
r.AppendLine(enabled.ToString(CultureInfo.InvariantCulture));
r.Append(" Version: ");
r.AppendLine(version.ToString(CultureInfo.InvariantCulture));
r.AppendLine();
if (context != IntPtr.Zero && overdriveVersion >= 6) {
r.AppendLine("Overdrive6 CurrentPower:");
r.AppendLine();
for (int i = 0; i < 4; i++) {
var pt = ((ADLODNCurrentPowerType)i).ToString();
var ps = ADL.ADL2_Overdrive6_CurrentPower_Get(
context, adapterIndex, (ADLODNCurrentPowerType)i,
out int power);
if (ps == ADL.ADL_OK) {
r.AppendFormat(" Power[{0}].Value: {1}{2}", pt,
power * (1.0f / 0xFF), Environment.NewLine);
} else {
r.AppendFormat(" Power[{0}].Status: {1}{2}", pt,
ps, Environment.NewLine);
}
}
r.AppendLine();
}
if (context != IntPtr.Zero && overdriveVersion >= 7) {
r.AppendLine("OverdriveN Temperature:");
r.AppendLine();
for (int i = 1; i < 8; i++) {
var tt = ((ADLODNTemperatureType)i).ToString();
var ts = ADL.ADL2_OverdriveN_Temperature_Get(
context, adapterIndex, (ADLODNTemperatureType)i,
out int temperature);
if (ts == ADL.ADL_OK) {
r.AppendFormat(" Temperature[{0}].Value: {1}{2}", tt,
0.001f * temperature, Environment.NewLine);
} else {
r.AppendFormat(" Temperature[{0}].Status: {1}{2}", tt,
ts, Environment.NewLine);
}
}
r.AppendLine();
}
if (context != IntPtr.Zero && overdriveVersion >= 8) {
r.AppendLine("Performance Metrics:");
r.AppendLine();
var ps = ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex,
out var data);
if (ps == ADL.ADL_OK) {
r.Append(" Size: ");
r.AppendLine(data.Size.ToString(CultureInfo.InvariantCulture));
for (int i = 0; i < data.Size; i++) {
var st = ((ADLSensorType)i).ToString();
r.AppendFormat(" Sensor[{0}].Supported: {1}{2}", st,
data.Sensors[i].Supported, Environment.NewLine);
r.AppendFormat(" Sensor[{0}].Value: {1}{2}", st,
data.Sensors[i].Value, Environment.NewLine);
}
} else {
r.Append(" Status: ");
r.AppendLine(ps.ToString(CultureInfo.InvariantCulture));
}
r.AppendLine();
}
return r.ToString();
}
private void GetPMLog(ADLPMLogDataOutput data,
ADLSensorType sensorType, Sensor sensor, float factor = 1.0f)
{
int i = (int)sensorType;
if (i < data.Size && data.Sensors[i].Supported) {
sensor.Value = data.Sensors[i].Value * factor;
ActivateSensor(sensor);
}
}
public override void Update() {
if (context != IntPtr.Zero && overdriveVersion >= 7) {
GetODNTemperature(ADLODNTemperatureType.CORE, temperatureCore);
GetODNTemperature(ADLODNTemperatureType.MEMORY, temperatureMemory);
GetODNTemperature(ADLODNTemperatureType.VRM_CORE, temperatureVrmCore);
GetODNTemperature(ADLODNTemperatureType.VRM_MEMORY, temperatureVrmMemory);
GetODNTemperature(ADLODNTemperatureType.LIQUID, temperatureLiquid);
GetODNTemperature(ADLODNTemperatureType.PLX, temperaturePlx);
GetODNTemperature(ADLODNTemperatureType.HOTSPOT, temperatureHotSpot);
if (context != IntPtr.Zero && overdriveVersion >= 8 &&
ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex,
out var data) == ADL.ADL_OK)
{
GetPMLog(data, ADLSensorType.TEMPERATURE_EDGE, temperatureCore);
GetPMLog(data, ADLSensorType.TEMPERATURE_MEM, temperatureMemory);
GetPMLog(data, ADLSensorType.TEMPERATURE_VRVDDC, temperatureVrmCore);
GetPMLog(data, ADLSensorType.TEMPERATURE_VRMVDD, temperatureVrmMemory);
GetPMLog(data, ADLSensorType.TEMPERATURE_LIQUID, temperatureLiquid);
GetPMLog(data, ADLSensorType.TEMPERATURE_PLX, temperaturePlx);
GetPMLog(data, ADLSensorType.TEMPERATURE_HOTSPOT, temperatureHotSpot);
GetPMLog(data, ADLSensorType.GFX_POWER, powerCore);
GetPMLog(data, ADLSensorType.ASIC_POWER, powerTotal);
GetPMLog(data, ADLSensorType.FAN_RPM, fan);
GetPMLog(data, ADLSensorType.CLK_GFXCLK, coreClock);
GetPMLog(data, ADLSensorType.CLK_MEMCLK, memoryClock);
GetPMLog(data, ADLSensorType.GFX_VOLTAGE, coreVoltage, 0.001f);
GetPMLog(data, ADLSensorType.MEM_VOLTAGE, memoryVoltage, 0.001f);
GetPMLog(data, ADLSensorType.INFO_ACTIVITY_GFX, coreLoad);
GetPMLog(data, ADLSensorType.FAN_PERCENTAGE, controlSensor);
} else {
ADLTemperature adlt = new ADLTemperature();
if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt)
== ADL.ADL_OK) {
temperatureCore.Value = 0.001f * adlt.Temperature;
ActivateSensor(temperatureCore);
if (context != IntPtr.Zero && overdriveVersion >= 7) {
GetODNTemperature(ADLODNTemperatureType.CORE, temperatureCore);
GetODNTemperature(ADLODNTemperatureType.MEMORY, temperatureMemory);
GetODNTemperature(ADLODNTemperatureType.VRM_CORE, temperatureVrmCore);
GetODNTemperature(ADLODNTemperatureType.VRM_MEMORY, temperatureVrmMemory);
GetODNTemperature(ADLODNTemperatureType.LIQUID, temperatureLiquid);
GetODNTemperature(ADLODNTemperatureType.PLX, temperaturePlx);
GetODNTemperature(ADLODNTemperatureType.HOTSPOT, temperatureHotSpot);
} else {
temperatureCore.Value = null;
ADLTemperature adlt = new ADLTemperature();
if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt)
== ADL.ADL_OK) {
temperatureCore.Value = 0.001f * adlt.Temperature;
ActivateSensor(temperatureCore);
} else {
temperatureCore.Value = null;
}
}
}
if (context != IntPtr.Zero && overdriveVersion >= 6) {
GetOD6Power(ADLODNCurrentPowerType.TOTAL_POWER, powerTotal);
GetOD6Power(ADLODNCurrentPowerType.CHIP_POWER, powerCore);
GetOD6Power(ADLODNCurrentPowerType.PPT_POWER, powerPpt);
GetOD6Power(ADLODNCurrentPowerType.SOCKET_POWER, powerSocket);
}
ADLFanSpeedValue adlf = new ADLFanSpeedValue();
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM;
if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
== ADL.ADL_OK)
{
fan.Value = adlf.FanSpeed;
ActivateSensor(fan);
} else {
fan.Value = null;
}
if (context != IntPtr.Zero && overdriveVersion >= 6) {
GetOD6Power(ADLODNCurrentPowerType.TOTAL_POWER, powerTotal);
GetOD6Power(ADLODNCurrentPowerType.CHIP_POWER, powerCore);
GetOD6Power(ADLODNCurrentPowerType.PPT_POWER, powerPpt);
GetOD6Power(ADLODNCurrentPowerType.SOCKET_POWER, powerSocket);
}
adlf = new ADLFanSpeedValue();
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
== ADL.ADL_OK) {
controlSensor.Value = adlf.FanSpeed;
ActivateSensor(controlSensor);
} else {
controlSensor.Value = null;
}
ADLFanSpeedValue adlf = new ADLFanSpeedValue();
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM;
if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
== ADL.ADL_OK) {
fan.Value = adlf.FanSpeed;
ActivateSensor(fan);
} else {
fan.Value = null;
}
ADLPMActivity adlp = new ADLPMActivity();
if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp)
== ADL.ADL_OK)
{
if (adlp.EngineClock > 0) {
coreClock.Value = 0.01f * adlp.EngineClock;
ActivateSensor(coreClock);
adlf = new ADLFanSpeedValue();
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
== ADL.ADL_OK) {
controlSensor.Value = adlf.FanSpeed;
ActivateSensor(controlSensor);
} else {
controlSensor.Value = null;
}
ADLPMActivity adlp = new ADLPMActivity();
if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp)
== ADL.ADL_OK) {
if (adlp.EngineClock > 0) {
coreClock.Value = 0.01f * adlp.EngineClock;
ActivateSensor(coreClock);
} else {
coreClock.Value = null;
}
if (adlp.MemoryClock > 0) {
memoryClock.Value = 0.01f * adlp.MemoryClock;
ActivateSensor(memoryClock);
} else {
memoryClock.Value = null;
}
if (adlp.Vddc > 0) {
coreVoltage.Value = 0.001f * adlp.Vddc;
ActivateSensor(coreVoltage);
} else {
coreVoltage.Value = null;
}
coreLoad.Value = Math.Min(adlp.ActivityPercent, 100);
ActivateSensor(coreLoad);
} else {
coreClock.Value = null;
}
if (adlp.MemoryClock > 0) {
memoryClock.Value = 0.01f * adlp.MemoryClock;
ActivateSensor(memoryClock);
} else {
memoryClock.Value = null;
}
if (adlp.Vddc > 0) {
coreVoltage.Value = 0.001f * adlp.Vddc;
ActivateSensor(coreVoltage);
} else {
coreVoltage.Value = null;
coreLoad.Value = null;
}
coreLoad.Value = Math.Min(adlp.ActivityPercent, 100);
ActivateSensor(coreLoad);
} else {
coreClock.Value = null;
memoryClock.Value = null;
coreVoltage.Value = null;
coreLoad.Value = null;
}
}

View File

@ -10,5 +10,5 @@
using System.Reflection;
[assembly: AssemblyVersion("0.9.1.0")]
[assembly: AssemblyInformationalVersion("0.9.1.0")]
[assembly: AssemblyVersion("0.9.1.1")]
[assembly: AssemblyInformationalVersion("0.9.1.1 Alpha")]