Files
fastfetch/src/detection/gpu/gpu_nvidia.c
T

98 lines
3.4 KiB
C
Raw Normal View History

2023-10-28 13:12:04 +08:00
#include "gpu_nvidia.h"
2023-10-26 23:28:43 +08:00
#include "3rdparty/nvml/nvml.h"
#include "common/library.h"
struct FFNvmlData {
FF_LIBRARY_SYMBOL(nvmlDeviceGetCount_v2)
FF_LIBRARY_SYMBOL(nvmlDeviceGetHandleByIndex_v2)
2023-10-27 21:05:03 +08:00
FF_LIBRARY_SYMBOL(nvmlDeviceGetHandleByPciBusId_v2)
2023-10-26 23:28:43 +08:00
FF_LIBRARY_SYMBOL(nvmlDeviceGetPciInfo_v3)
FF_LIBRARY_SYMBOL(nvmlDeviceGetTemperature)
2023-10-28 13:12:04 +08:00
FF_LIBRARY_SYMBOL(nvmlDeviceGetMemoryInfo_v2)
FF_LIBRARY_SYMBOL(nvmlDeviceGetNumGpuCores)
2023-10-26 23:28:43 +08:00
bool inited;
} nvmlData;
2023-11-01 00:07:23 +08:00
const char* ffDetectNvidiaGpuInfo(FFGpuNvidiaCondition cond, FFGpuNvidiaResult result, const char* soName)
2023-10-26 23:28:43 +08:00
{
if (!nvmlData.inited)
{
nvmlData.inited = true;
2023-11-01 00:07:23 +08:00
FF_LIBRARY_LOAD(libnvml, NULL, "dlopen nvml failed", soName , 1);
2023-10-26 23:28:43 +08:00
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libnvml, nvmlInit_v2)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libnvml, nvmlShutdown)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetCount_v2)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetHandleByIndex_v2)
2023-10-27 21:05:03 +08:00
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetHandleByPciBusId_v2)
2023-10-26 23:28:43 +08:00
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetPciInfo_v3)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetTemperature)
2023-10-28 13:12:04 +08:00
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetMemoryInfo_v2)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libnvml, nvmlData, nvmlDeviceGetNumGpuCores)
2023-10-26 23:28:43 +08:00
if (ffnvmlInit_v2() != NVML_SUCCESS)
{
2023-10-28 13:12:04 +08:00
nvmlData.ffnvmlDeviceGetNumGpuCores = NULL;
2023-10-26 23:28:43 +08:00
return "nvmlInit_v2() failed";
}
atexit((void*) ffnvmlShutdown);
libnvml = NULL; // don't close nvml
}
2023-10-28 13:12:04 +08:00
if (nvmlData.ffnvmlDeviceGetNumGpuCores == NULL)
2023-10-26 23:28:43 +08:00
return "loading nvml library failed";
2023-10-27 21:05:03 +08:00
nvmlDevice_t device = NULL;
2023-10-28 13:12:04 +08:00
if (cond.pciBusId)
2023-10-27 21:05:03 +08:00
{
2023-10-28 13:12:04 +08:00
nvmlReturn_t ret = nvmlData.ffnvmlDeviceGetHandleByPciBusId_v2(cond.pciBusId, &device);
2023-10-27 21:05:03 +08:00
if (ret != NVML_SUCCESS)
return "nvmlDeviceGetHandleByPciBusId_v2() failed";
}
else
2023-10-26 23:28:43 +08:00
{
2023-10-27 21:05:03 +08:00
uint32_t count;
if (nvmlData.ffnvmlDeviceGetCount_v2(&count) != NVML_SUCCESS)
return "nvmlDeviceGetCount_v2() failed";
2023-10-26 23:28:43 +08:00
2023-10-27 21:05:03 +08:00
for (uint32_t i = 0; i < count; i++, device = NULL)
{
if (nvmlData.ffnvmlDeviceGetHandleByIndex_v2(i, &device) != NVML_SUCCESS)
continue;
2023-10-26 23:28:43 +08:00
2023-10-27 21:05:03 +08:00
nvmlPciInfo_t pciInfo;
if (nvmlData.ffnvmlDeviceGetPciInfo_v3(device, &pciInfo) != NVML_SUCCESS)
continue;
2023-10-26 23:28:43 +08:00
2023-10-28 13:12:04 +08:00
if (pciInfo.pciDeviceId != cond.pciDeviceId || pciInfo.pciSubSystemId != cond.pciSubSystemId)
2023-10-27 21:05:03 +08:00
continue;
2023-10-26 23:28:43 +08:00
2023-10-27 21:05:03 +08:00
break;
}
if (!device) return "Device not found";
2023-10-26 23:28:43 +08:00
}
2023-10-28 13:12:04 +08:00
if (result.temp)
{
uint32_t value;
if (nvmlData.ffnvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &value) == NVML_SUCCESS)
*result.temp = value;
}
if (result.memory)
{
nvmlMemory_v2_t memory = { .version = nvmlMemory_v2 };
if (nvmlData.ffnvmlDeviceGetMemoryInfo_v2(device, &memory) == NVML_SUCCESS)
{
result.memory->total = memory.used + memory.free;
result.memory->used = memory.used;
}
}
if (result.coreCount)
nvmlData.ffnvmlDeviceGetNumGpuCores(device, result.coreCount);
2023-10-27 21:05:03 +08:00
return NULL;
2023-10-26 23:28:43 +08:00
}