diff --git a/src/plugins/AMD.cpp b/src/plugins/AMD.cpp index acdf032..542e05f 100644 --- a/src/plugins/AMD.cpp +++ b/src/plugins/AMD.cpp @@ -384,9 +384,12 @@ std::vector> getVoltFreqFreq(AMDGPUData data) { Assignable a{setWithPerfLevel, *range, getFunc, _("MHz")}; pointId++; + // The rest of this code should work the same on Navi and RDNA 3 + auto name = (*data.ppTableType == Navi) ? _("Core Clock") : _("Core Clock Offset"); + if (getFunc().has_value()) return {DeviceNode{ - .name = _("Core Clock"), + .name = name, .interface = a, .hash = md5(data.pciId + "VFClock" + std::to_string(id)), }}; @@ -449,9 +452,12 @@ std::vector> getVoltFreqVolt(AMDGPUData data) { Assignable a{setWithPerfLevel, *range, getFunc, _("mV")}; pointId++; + // The rest of this code should work the same on Navi and RDNA 3 + auto name = (*data.ppTableType == Navi) ? _("Core Voltage") : _("Core Voltage Offset"); + if (getFunc().has_value()) return {DeviceNode{ - .name = _("Core Voltage"), + .name = name, .interface = a, .hash = md5(data.pciId + "VFVoltage" + std::to_string(id)), }}; @@ -461,7 +467,8 @@ std::vector> getVoltFreqVolt(AMDGPUData data) { std::vector> getVoltFreqNodes(AMDGPUData data) { // Root item for voltage and frequency of a point std::vector> retval; - if (!data.ppTableType.has_value() || *data.ppTableType != Navi) + if (!data.ppTableType.has_value() || *data.ppTableType != Navi || + *data.ppTableType != SMU13) return {}; auto path = data.hwmonPath + "/pp_od_clk_voltage"; @@ -543,7 +550,8 @@ std::vector> getForcePerfLevel(AMDGPUData data) { } std::vector> getVoltFreqRoot(AMDGPUData data) { - if (data.ppTableType.has_value() && *data.ppTableType == Navi) + if (data.ppTableType.has_value() && + (*data.ppTableType == Navi || *data.ppTableType == SMU13)) return {DeviceNode{ .name = _("Voltage-Frequency Curve"), .interface = std::nullopt, diff --git a/src/plugins/AMDUtils.cpp b/src/plugins/AMDUtils.cpp index 3147859..493f392 100644 --- a/src/plugins/AMDUtils.cpp +++ b/src/plugins/AMDUtils.cpp @@ -118,6 +118,10 @@ std::optional fromPPTableContents(const std::string &contents) { // Navi (NV1X?) has three frequency-voltage points if (first.has_value() && !fourth.has_value()) return Navi; + + // RDNA 3 (SMU13) has six points using offsets + if (first.has_value() && fourth.has_value()) + return SMU13; } } return std::nullopt; diff --git a/src/plugins/AMDUtils.hpp b/src/plugins/AMDUtils.hpp index e1c95d1..dd4cf59 100644 --- a/src/plugins/AMDUtils.hpp +++ b/src/plugins/AMDUtils.hpp @@ -12,7 +12,8 @@ namespace fs = std::filesystem; enum PPTableType { Vega10, - Navi + Navi, + SMU13 // RDNA 3 }; struct VFPoint {