123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- /* Copyright (C) 1883 Thomas Edison - All Rights Reserved
- * You may use, distribute and modify this code under the
- * terms of the GPLv3 license, which unfortunately won't be
- * written for another century.
- *
- * You should have received a copy of the LICENSE file with
- * this file.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <string>
- #include "wrapadl.h"
- #include "wraphelper.h"
- #if defined(__cplusplus)
- extern "C" {
- #endif
- void* ADL_API_CALL ADL_Main_Memory_Alloc(int iSize) {
- void* lpBuffer = malloc(iSize);
- return lpBuffer;
- }
- wrap_adl_handle* wrap_adl_create() {
- wrap_adl_handle* adlh = nullptr;
- #if defined(_WIN32)
- /* Windows */
- #define libatiadlxx "atiadlxx.dll"
- #elif defined(__linux) && (defined(__i386__) || defined(__ARM_ARCH_7A__))
- /* 32-bit linux assumed */
- #define libatiadlxx "libatiadlxx.so"
- #elif defined(__linux)
- /* 64-bit linux assumed */
- #define libatiadlxx "libatiadlxx.so"
- #else
- #define libatiadlxx ""
- #warning "Unrecognized platform: need ADL DLL path for this platform..."
- return nullptr;
- #endif
- #ifdef _WIN32
- char tmp[512];
- ExpandEnvironmentStringsA(libatiadlxx, tmp, sizeof(tmp));
- #else
- char tmp[512] = libatiadlxx;
- #endif
- void* adl_dll = wrap_dlopen(tmp);
- if (adl_dll == nullptr) {
- cwarn << "Failed to obtain all required ADL function pointers";
- cwarn << "AMD hardware monitoring disabled";
- return nullptr;
- }
- adlh = (wrap_adl_handle*)calloc(1, sizeof(wrap_adl_handle));
- adlh->adl_dll = adl_dll;
- adlh->adlMainControlCreate =
- (wrap_adlReturn_t(*)(ADL_MAIN_MALLOC_CALLBACK, int))wrap_dlsym(adlh->adl_dll, "ADL_Main_Control_Create");
- adlh->adlAdapterNumberOfAdapters =
- (wrap_adlReturn_t(*)(int*))wrap_dlsym(adlh->adl_dll, "ADL_Adapter_NumberOfAdapters_Get");
- adlh->adlAdapterAdapterInfoGet =
- (wrap_adlReturn_t(*)(LPAdapterInfo, int))wrap_dlsym(adlh->adl_dll, "ADL_Adapter_AdapterInfo_Get");
- adlh->adlAdapterAdapterIdGet = (wrap_adlReturn_t(*)(int, int*))wrap_dlsym(adlh->adl_dll, "ADL_Adapter_ID_Get");
- adlh->adlOverdrive5TemperatureGet =
- (wrap_adlReturn_t(*)(int, int, ADLTemperature*))wrap_dlsym(adlh->adl_dll, "ADL_Overdrive5_Temperature_Get");
- adlh->adlOverdrive5FanSpeedGet =
- (wrap_adlReturn_t(*)(int, int, ADLFanSpeedValue*))wrap_dlsym(adlh->adl_dll, "ADL_Overdrive5_FanSpeed_Get");
- adlh->adlMainControlRefresh = (wrap_adlReturn_t(*)(void))wrap_dlsym(adlh->adl_dll, "ADL_Main_Control_Refresh");
- adlh->adlMainControlDestroy = (wrap_adlReturn_t(*)(void))wrap_dlsym(adlh->adl_dll, "ADL_Main_Control_Destroy");
- adlh->adl2MainControlCreate = (wrap_adlReturn_t(*)(ADL_MAIN_MALLOC_CALLBACK, int, ADL_CONTEXT_HANDLE*))wrap_dlsym(
- adlh->adl_dll, "ADL2_Main_Control_Create");
- adlh->adl2MainControlDestroy =
- (wrap_adlReturn_t(*)(ADL_CONTEXT_HANDLE))wrap_dlsym(adlh->adl_dll, "ADL_Main_Control_Destroy");
- adlh->adl2Overdrive6CurrentPowerGet = (wrap_adlReturn_t(*)(ADL_CONTEXT_HANDLE, int, int, int*))wrap_dlsym(
- adlh->adl_dll, "ADL2_Overdrive6_CurrentPower_Get");
- adlh->adl2MainControlRefresh =
- (wrap_adlReturn_t(*)(ADL_CONTEXT_HANDLE))wrap_dlsym(adlh->adl_dll, "ADL2_Main_Control_Refresh");
- if (adlh->adlMainControlCreate == nullptr || adlh->adlMainControlDestroy == nullptr ||
- adlh->adlMainControlRefresh == nullptr || adlh->adlAdapterNumberOfAdapters == nullptr ||
- adlh->adlAdapterAdapterInfoGet == nullptr || adlh->adlAdapterAdapterIdGet == nullptr ||
- adlh->adlOverdrive5TemperatureGet == nullptr || adlh->adlOverdrive5FanSpeedGet == nullptr ||
- adlh->adl2MainControlCreate == nullptr || adlh->adl2MainControlRefresh == nullptr ||
- adlh->adl2MainControlDestroy == nullptr || adlh->adl2Overdrive6CurrentPowerGet == nullptr) {
- cwarn << "Failed to obtain all required ADL function pointers";
- cwarn << "AMD hardware monitoring disabled";
- wrap_dlclose(adlh->adl_dll);
- free(adlh);
- return nullptr;
- }
- adlh->adlMainControlCreate(ADL_Main_Memory_Alloc, 1);
- adlh->adlMainControlRefresh();
- adlh->context = nullptr;
- adlh->adl2MainControlCreate(ADL_Main_Memory_Alloc, 1, &(adlh->context));
- adlh->adl2MainControlRefresh(adlh->context);
- int logicalGpuCount = 0;
- adlh->adlAdapterNumberOfAdapters(&logicalGpuCount);
- adlh->phys_logi_device_id = (int*)calloc(logicalGpuCount, sizeof(int));
- adlh->adl_gpucount = 0;
- int last_adapter = 0;
- if (logicalGpuCount > 0) {
- adlh->log_gpucount = logicalGpuCount;
- adlh->devs = (LPAdapterInfo)malloc(sizeof(AdapterInfo) * logicalGpuCount);
- memset(adlh->devs, '\0', sizeof(AdapterInfo) * logicalGpuCount);
- adlh->devs->iSize = sizeof(adlh->devs);
- int res = adlh->adlAdapterAdapterInfoGet(adlh->devs, sizeof(AdapterInfo) * logicalGpuCount);
- if (res != WRAPADL_OK) {
- cwarn << "Failed to obtain using adlAdapterAdapterInfoGet().";
- cwarn << "AMD hardware monitoring disabled";
- wrap_dlclose(adlh->adl_dll);
- free(adlh);
- return nullptr;
- }
- for (int i = 0; i < logicalGpuCount; i++) {
- int adapterIndex = adlh->devs[i].iAdapterIndex;
- int adapterID = 0;
- res = adlh->adlAdapterAdapterIdGet(adapterIndex, &adapterID);
- if (res != WRAPADL_OK) {
- continue;
- }
- adlh->phys_logi_device_id[adlh->adl_gpucount] = adapterIndex;
- if (adapterID == last_adapter) {
- continue;
- }
- last_adapter = adapterID;
- adlh->adl_gpucount++;
- }
- }
- return adlh;
- }
- int wrap_adl_destroy(wrap_adl_handle* adlh) {
- adlh->adlMainControlDestroy();
- adlh->adl2MainControlDestroy(adlh->context);
- wrap_dlclose(adlh->adl_dll);
- free(adlh);
- return 0;
- }
- int wrap_adl_get_gpucount(wrap_adl_handle* adlh, int* gpucount) {
- *gpucount = adlh->adl_gpucount;
- return 0;
- }
- int wrap_adl_get_gpu_name(wrap_adl_handle* adlh, int gpuindex, char* namebuf, int bufsize) {
- if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
- return -1;
- memcpy(namebuf, adlh->devs[adlh->phys_logi_device_id[gpuindex]].strAdapterName, bufsize);
- return 0;
- }
- int wrap_adl_get_gpu_pci_id(wrap_adl_handle* adlh, int gpuindex, char* idbuf, int bufsize) {
- if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
- return -1;
- char buf[256];
- sprintf(buf, "%04x:%02x:%02x",
- 0, // Is probably 0
- adlh->devs[adlh->phys_logi_device_id[gpuindex]].iBusNumber,
- adlh->devs[adlh->phys_logi_device_id[gpuindex]].iDeviceNumber);
- memcpy(idbuf, buf, bufsize);
- return 0;
- }
- int wrap_adl_get_tempC(wrap_adl_handle* adlh, int gpuindex, unsigned int* tempC) {
- if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
- return -1;
- ADLTemperature* temperature = new ADLTemperature();
- if (adlh->adlOverdrive5TemperatureGet(adlh->phys_logi_device_id[gpuindex], 0, temperature) != WRAPADL_OK)
- return -1;
- *tempC = unsigned(temperature->iTemperature / 1000);
- delete temperature;
- return 0;
- }
- int wrap_adl_get_mem_tempC(wrap_adl_handle* adlh, int gpuindex, unsigned int* tempC) {
- if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
- return -1;
- ADLTemperature* temperature = new ADLTemperature();
- if (adlh->adlOverdrive5TemperatureGet(adlh->phys_logi_device_id[gpuindex], 1, temperature) != WRAPADL_OK)
- return -1;
- *tempC = unsigned(temperature->iTemperature / 1000);
- delete temperature;
- return 0;
- }
- int wrap_adl_get_fanpcnt(wrap_adl_handle* adlh, int gpuindex, unsigned int* fanpcnt) {
- if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
- return -1;
- ADLFanSpeedValue* fan = new ADLFanSpeedValue();
- fan->iSpeedType = 1;
- if (adlh->adlOverdrive5FanSpeedGet(adlh->phys_logi_device_id[gpuindex], 0, fan) != WRAPADL_OK)
- return -1;
- *fanpcnt = unsigned(fan->iFanSpeed);
- delete fan;
- return 0;
- }
- int wrap_adl_get_power_usage(wrap_adl_handle* adlh, int gpuindex, unsigned int* miliwatts) {
- if (gpuindex < 0 || gpuindex >= adlh->adl_gpucount)
- return -1;
- int power = 0;
- if (adlh->adl2Overdrive6CurrentPowerGet(adlh->context, adlh->phys_logi_device_id[gpuindex], 0, &power) !=
- WRAPADL_OK)
- return -1;
- *miliwatts = (unsigned int)(power * 3.90625);
- return 0;
- }
- #if defined(__cplusplus)
- }
- #endif
|