attempt to use NVML for clock setting on non-X

This commit is contained in:
Jussi Kuokkanen 2023-12-19 18:36:58 +02:00
parent d41030d559
commit 38e178bf0f
3 changed files with 72 additions and 2 deletions

View File

@ -2,4 +2,5 @@ cd "$(dirname "$0")"
sudo dbus-run-session --config-file=dbusconf.conf \
sudo -E DBUS_SYSTEM_BUS_ADDRESS=unix:path=/tmp/tuxclocker-dbus-socket \
XDG_SESSION_TYPE=$XDG_SESSION_TYPE \
LD_LIBRARY_PATH=../inst/lib ../inst/bin/tuxclockerd

View File

@ -21,7 +21,7 @@ export TUXCLOCKER_PLUGIN_PATH=\"$tuxclockerPluginPath\"
nvidiaVersion=\$(cat /sys/module/nvidia/version | sed 's/\./-/g')
flatpakNvidiaPath=\$(find /var/lib/flatpak/runtime/org.freedesktop.Platform.GL.nvidia-\$nvidiaVersion/x86_64/*/active/files/lib)
sudo -E dbus-run-session --config-file=dev/dbusconf.conf \
sudo -E LD_LIBRARY_PATH=\$flatpakNvidiaPath:\"\$LD_LIBRARY_PATH\" ./.tuxclockerd-wrapped & \
sudo -E LD_LIBRARY_PATH=\$flatpakNvidiaPath:\"\$LD_LIBRARY_PATH\" XDG_SESSION_TYPE=\$XDG_SESSION_TYPE ./.tuxclockerd-wrapped & \
(unset LD_LIBRARY_PATH; sleep 2) && ./.tuxclocker-qt-wrapped; \
unset LD_LIBRARY_PATH && \
sudo kill \$(pidof .tuxclockerd-wrapped)

View File

@ -94,6 +94,15 @@ std::optional<NvidiaGPUData> fromIndex(Display *dpy, uint i) {
};
}
bool isXorg() {
auto value = std::getenv("XDG_SESSION_TYPE");
if (!value)
// Assume X, since that will lead to the least amount of broken
return true;
return std::string{value} == "x11";
}
std::vector<TreeNode<DeviceNode>> getGPUName(NvidiaGPUData data) {
char name[NVML_DEVICE_NAME_BUFFER_SIZE];
if (nvmlDeviceGetName(data.devHandle, name, NVML_DEVICE_NAME_BUFFER_SIZE) == NVML_SUCCESS)
@ -247,6 +256,64 @@ std::vector<TreeNode<DeviceNode>> getCoreClockWrite(NvidiaGPUData data) {
}};
}
std::vector<TreeNode<DeviceNode>> getCoreClockWriteNoX(NvidiaGPUData data) {
// Try to use NVML function only on non-X, since seems to be broken on some GPUs
if (isXorg())
return {};
// Completely made-up range
Range<int> range{-300, 1000};
auto setFunc = [=](AssignmentArgument a) -> std::optional<AssignmentError> {
if (!std::holds_alternative<int>(a))
return AssignmentError::InvalidType;
auto target = std::get<int>(a);
if (target < range.min || target > range.max)
return AssignmentError::OutOfRange;
auto retval = nvmlDeviceSetGpcClkVfOffset(data.devHandle, target);
return fromNVMLRet(retval);
};
// No way to get through NVML by the looks if it
auto getFunc = []() { return 0; };
return {DeviceNode{
.name = _("Core Clock Offset"),
.interface = Assignable{setFunc, range, getFunc, _("MHz")},
.hash = md5(data.uuid + "Core Clock Offset NVML"),
}};
}
std::vector<TreeNode<DeviceNode>> getMemoryClockWriteNoX(NvidiaGPUData data) {
// Try to use NVML function only on non-X, since seems to be broken on some GPUs
if (isXorg())
return {};
// Completely made-up range
Range<int> range{-800, 1000};
auto setFunc = [=](AssignmentArgument a) -> std::optional<AssignmentError> {
if (!std::holds_alternative<int>(a))
return AssignmentError::InvalidType;
auto target = std::get<int>(a);
if (target < range.min || target > range.max)
return AssignmentError::OutOfRange;
auto retval = nvmlDeviceSetMemClkVfOffset(data.devHandle, target);
return fromNVMLRet(retval);
};
// No way to get through NVML by the looks if it
auto getFunc = []() { return 0; };
return {DeviceNode{
.name = _("Memory Clock Offset"),
.interface = Assignable{setFunc, range, getFunc, _("MHz")},
.hash = md5(data.uuid + "Memory Clock Offset NVML"),
}};
}
std::vector<TreeNode<DeviceNode>> getCoreClockRead(NvidiaGPUData data) {
auto func = [data]() -> ReadResult {
uint clock;
@ -827,7 +894,9 @@ auto gpuTree = TreeConstructor<NvidiaGPUData, DeviceNode>{
{getCoreClockRead, {}},
{getCoreClockWrite, {}},
{getMemClockRead, {}},
{getMemClockWrite, {}}
{getMemClockWrite, {}},
{getCoreClockWriteNoX, {}},
{getMemoryClockWriteNoX, {}}
}},
{getFanRoot, {
{getMultiFanRoots, {