|
|
@ -23,6 +23,7 @@ bool adl_active; |
|
|
|
int opt_hysteresis = 3; |
|
|
|
int opt_hysteresis = 3; |
|
|
|
int opt_targettemp = 75; |
|
|
|
int opt_targettemp = 75; |
|
|
|
int opt_overheattemp = 85; |
|
|
|
int opt_overheattemp = 85; |
|
|
|
|
|
|
|
static pthread_mutex_t adl_lock; |
|
|
|
|
|
|
|
|
|
|
|
// Memory allocation function
|
|
|
|
// Memory allocation function
|
|
|
|
static void * __stdcall ADL_Main_Memory_Alloc(int iSize) |
|
|
|
static void * __stdcall ADL_Main_Memory_Alloc(int iSize) |
|
|
@ -79,6 +80,16 @@ static LPAdapterInfo lpInfo = NULL; |
|
|
|
|
|
|
|
|
|
|
|
static int set_fanspeed(int gpu, int iFanSpeed); |
|
|
|
static int set_fanspeed(int gpu, int iFanSpeed); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void lock_adl(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
mutex_lock(&adl_lock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void unlock_adl(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
mutex_unlock(&adl_lock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void init_adl(int nDevs) |
|
|
|
void init_adl(int nDevs) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int i, devices = 0, last_adapter = -1, gpu = 0, dummy = 0; |
|
|
|
int i, devices = 0, last_adapter = -1, gpu = 0, dummy = 0; |
|
|
@ -97,6 +108,11 @@ void init_adl(int nDevs) |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(pthread_mutex_init(&adl_lock, NULL))) { |
|
|
|
|
|
|
|
applog(LOG_ERR, "Failed to init adl_lock in init_adl"); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ADL_Main_Control_Create = (ADL_MAIN_CONTROL_CREATE) GetProcAddress(hDLL,"ADL_Main_Control_Create"); |
|
|
|
ADL_Main_Control_Create = (ADL_MAIN_CONTROL_CREATE) GetProcAddress(hDLL,"ADL_Main_Control_Create"); |
|
|
|
ADL_Main_Control_Destroy = (ADL_MAIN_CONTROL_DESTROY) GetProcAddress(hDLL,"ADL_Main_Control_Destroy"); |
|
|
|
ADL_Main_Control_Destroy = (ADL_MAIN_CONTROL_DESTROY) GetProcAddress(hDLL,"ADL_Main_Control_Destroy"); |
|
|
|
ADL_Adapter_NumberOfAdapters_Get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET) GetProcAddress(hDLL,"ADL_Adapter_NumberOfAdapters_Get"); |
|
|
|
ADL_Adapter_NumberOfAdapters_Get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET) GetProcAddress(hDLL,"ADL_Adapter_NumberOfAdapters_Get"); |
|
|
@ -318,12 +334,16 @@ static inline float __gpu_temp(struct gpu_adl *ga) |
|
|
|
float gpu_temp(int gpu) |
|
|
|
float gpu_temp(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
float ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return 0; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
return __gpu_temp(ga); |
|
|
|
lock_adl(); |
|
|
|
|
|
|
|
ret = __gpu_temp(ga); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int __gpu_engineclock(struct gpu_adl *ga) |
|
|
|
static inline int __gpu_engineclock(struct gpu_adl *ga) |
|
|
@ -334,14 +354,19 @@ static inline int __gpu_engineclock(struct gpu_adl *ga) |
|
|
|
int gpu_engineclock(int gpu) |
|
|
|
int gpu_engineclock(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return 0; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
return 0; |
|
|
|
goto out; |
|
|
|
return __gpu_engineclock(ga); |
|
|
|
ret = __gpu_engineclock(ga); |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int __gpu_memclock(struct gpu_adl *ga) |
|
|
|
static inline int __gpu_memclock(struct gpu_adl *ga) |
|
|
@ -352,14 +377,19 @@ static inline int __gpu_memclock(struct gpu_adl *ga) |
|
|
|
int gpu_memclock(int gpu) |
|
|
|
int gpu_memclock(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return 0; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
return 0; |
|
|
|
goto out; |
|
|
|
return __gpu_memclock(ga); |
|
|
|
ret = __gpu_memclock(ga); |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline float __gpu_vddc(struct gpu_adl *ga) |
|
|
|
static inline float __gpu_vddc(struct gpu_adl *ga) |
|
|
@ -370,14 +400,19 @@ static inline float __gpu_vddc(struct gpu_adl *ga) |
|
|
|
float gpu_vddc(int gpu) |
|
|
|
float gpu_vddc(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
float ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return 0; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
return 0; |
|
|
|
goto out; |
|
|
|
return __gpu_vddc(ga); |
|
|
|
ret = __gpu_vddc(ga); |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int __gpu_activity(struct gpu_adl *ga) |
|
|
|
static inline int __gpu_activity(struct gpu_adl *ga) |
|
|
@ -390,14 +425,20 @@ static inline int __gpu_activity(struct gpu_adl *ga) |
|
|
|
int gpu_activity(int gpu) |
|
|
|
int gpu_activity(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) |
|
|
|
lock_adl(); |
|
|
|
|
|
|
|
ret = ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
if (ret != ADL_OK) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
return __gpu_activity(ga); |
|
|
|
if (!ga->lpOdParameters.iActivityReportingSupported) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
return ga->lpActivity.iActivityPercent; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int __gpu_fanspeed(struct gpu_adl *ga) |
|
|
|
static inline int __gpu_fanspeed(struct gpu_adl *ga) |
|
|
@ -413,12 +454,16 @@ static inline int __gpu_fanspeed(struct gpu_adl *ga) |
|
|
|
int gpu_fanspeed(int gpu) |
|
|
|
int gpu_fanspeed(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return 0; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
return __gpu_fanspeed(ga); |
|
|
|
lock_adl(); |
|
|
|
|
|
|
|
ret = __gpu_fanspeed(ga); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int __gpu_fanpercent(struct gpu_adl *ga) |
|
|
|
static inline int __gpu_fanpercent(struct gpu_adl *ga) |
|
|
@ -434,12 +479,16 @@ static inline int __gpu_fanpercent(struct gpu_adl *ga) |
|
|
|
int gpu_fanpercent(int gpu) |
|
|
|
int gpu_fanpercent(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
return __gpu_fanpercent(ga); |
|
|
|
lock_adl(); |
|
|
|
|
|
|
|
ret = __gpu_fanpercent(ga); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int __gpu_powertune(struct gpu_adl *ga) |
|
|
|
static inline int __gpu_powertune(struct gpu_adl *ga) |
|
|
@ -454,12 +503,16 @@ static inline int __gpu_powertune(struct gpu_adl *ga) |
|
|
|
int gpu_powertune(int gpu) |
|
|
|
int gpu_powertune(int gpu) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = -1; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) |
|
|
|
return -1; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
return __gpu_powertune(ga); |
|
|
|
lock_adl(); |
|
|
|
|
|
|
|
ret = __gpu_powertune(ga); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool gpu_stats(int gpu, float *temp, int *engineclock, int *memclock, float *vddc, |
|
|
|
bool gpu_stats(int gpu, float *temp, int *engineclock, int *memclock, float *vddc, |
|
|
@ -471,6 +524,8 @@ bool gpu_stats(int gpu, float *temp, int *engineclock, int *memclock, float *vdd |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
*temp = __gpu_temp(ga); |
|
|
|
*temp = __gpu_temp(ga); |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) { |
|
|
|
if (ADL_Overdrive5_CurrentActivity_Get(ga->iAdapterIndex, &ga->lpActivity) != ADL_OK) { |
|
|
|
*engineclock = 0; |
|
|
|
*engineclock = 0; |
|
|
@ -486,6 +541,7 @@ bool gpu_stats(int gpu, float *temp, int *engineclock, int *memclock, float *vdd |
|
|
|
*fanspeed = __gpu_fanspeed(ga); |
|
|
|
*fanspeed = __gpu_fanspeed(ga); |
|
|
|
*fanpercent = __gpu_fanpercent(ga); |
|
|
|
*fanpercent = __gpu_fanpercent(ga); |
|
|
|
*powertune = __gpu_powertune(ga); |
|
|
|
*powertune = __gpu_powertune(ga); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
@ -507,11 +563,11 @@ static int set_engineclock(int gpu, int iEngineClock) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ADLODPerformanceLevels *lpOdPerformanceLevels; |
|
|
|
ADLODPerformanceLevels *lpOdPerformanceLevels; |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
int lev; |
|
|
|
int lev, ret = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
wlogprint("Set engineclock not supported\n"); |
|
|
|
wlogprint("Set engineclock not supported\n"); |
|
|
|
return 1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
iEngineClock *= 100; |
|
|
|
iEngineClock *= 100; |
|
|
@ -520,11 +576,13 @@ static int set_engineclock(int gpu, int iEngineClock) |
|
|
|
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; |
|
|
|
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; |
|
|
|
lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel))); |
|
|
|
lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel))); |
|
|
|
lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev; |
|
|
|
lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iEngineClock = iEngineClock; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iEngineClock = iEngineClock; |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
/* Reset to old value if it fails! */ |
|
|
|
/* Reset to old value if it fails! */ |
|
|
|
if (lpOdPerformanceLevels->aLevels[lev].iEngineClock != iEngineClock) { |
|
|
|
if (lpOdPerformanceLevels->aLevels[lev].iEngineClock != iEngineClock) { |
|
|
@ -534,7 +592,7 @@ static int set_engineclock(int gpu, int iEngineClock) |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = ga->iVddc; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = ga->iVddc; |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
ga->iEngineClock = lpOdPerformanceLevels->aLevels[lev].iEngineClock; |
|
|
|
ga->iEngineClock = lpOdPerformanceLevels->aLevels[lev].iEngineClock; |
|
|
|
if (ga->iEngineClock > ga->maxspeed) |
|
|
|
if (ga->iEngineClock > ga->maxspeed) |
|
|
@ -543,7 +601,10 @@ static int set_engineclock(int gpu, int iEngineClock) |
|
|
|
ga->minspeed = ga->iEngineClock; |
|
|
|
ga->minspeed = ga->iEngineClock; |
|
|
|
ga->iMemoryClock = lpOdPerformanceLevels->aLevels[lev].iMemoryClock; |
|
|
|
ga->iMemoryClock = lpOdPerformanceLevels->aLevels[lev].iMemoryClock; |
|
|
|
ga->iVddc = lpOdPerformanceLevels->aLevels[lev].iVddc; |
|
|
|
ga->iVddc = lpOdPerformanceLevels->aLevels[lev].iVddc; |
|
|
|
return 0; |
|
|
|
ret = 0; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void get_memoryrange(int gpu, int *imin, int *imax) |
|
|
|
static void get_memoryrange(int gpu, int *imin, int *imax) |
|
|
@ -563,11 +624,11 @@ static int set_memoryclock(int gpu, int iMemoryClock) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ADLODPerformanceLevels *lpOdPerformanceLevels; |
|
|
|
ADLODPerformanceLevels *lpOdPerformanceLevels; |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
int lev; |
|
|
|
int lev, ret = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
wlogprint("Set memoryclock not supported\n"); |
|
|
|
wlogprint("Set memoryclock not supported\n"); |
|
|
|
return 1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
iMemoryClock *= 100; |
|
|
|
iMemoryClock *= 100; |
|
|
@ -576,11 +637,13 @@ static int set_memoryclock(int gpu, int iMemoryClock) |
|
|
|
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; |
|
|
|
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; |
|
|
|
lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel))); |
|
|
|
lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel))); |
|
|
|
lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev; |
|
|
|
lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iMemoryClock = iMemoryClock; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iMemoryClock = iMemoryClock; |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
/* Reset to old value if it fails! */ |
|
|
|
/* Reset to old value if it fails! */ |
|
|
|
if (lpOdPerformanceLevels->aLevels[lev].iMemoryClock != iMemoryClock) { |
|
|
|
if (lpOdPerformanceLevels->aLevels[lev].iMemoryClock != iMemoryClock) { |
|
|
@ -590,12 +653,15 @@ static int set_memoryclock(int gpu, int iMemoryClock) |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = ga->iVddc; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = ga->iVddc; |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
ga->iEngineClock = lpOdPerformanceLevels->aLevels[lev].iEngineClock; |
|
|
|
ga->iEngineClock = lpOdPerformanceLevels->aLevels[lev].iEngineClock; |
|
|
|
ga->iMemoryClock = lpOdPerformanceLevels->aLevels[lev].iMemoryClock; |
|
|
|
ga->iMemoryClock = lpOdPerformanceLevels->aLevels[lev].iMemoryClock; |
|
|
|
ga->iVddc = lpOdPerformanceLevels->aLevels[lev].iVddc; |
|
|
|
ga->iVddc = lpOdPerformanceLevels->aLevels[lev].iVddc; |
|
|
|
return 0; |
|
|
|
ret = 0; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void get_vddcrange(int gpu, float *imin, float *imax) |
|
|
|
static void get_vddcrange(int gpu, float *imin, float *imax) |
|
|
@ -625,12 +691,12 @@ static float curses_float(const char *query) |
|
|
|
static int set_vddc(int gpu, float fVddc) |
|
|
|
static int set_vddc(int gpu, float fVddc) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ADLODPerformanceLevels *lpOdPerformanceLevels; |
|
|
|
ADLODPerformanceLevels *lpOdPerformanceLevels; |
|
|
|
|
|
|
|
int iVddc, lev, ret = 1; |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
int iVddc, lev; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
wlogprint("Set vddc not supported\n"); |
|
|
|
wlogprint("Set vddc not supported\n"); |
|
|
|
return 1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
iVddc = 1000 * fVddc; |
|
|
|
iVddc = 1000 * fVddc; |
|
|
@ -639,11 +705,13 @@ static int set_vddc(int gpu, float fVddc) |
|
|
|
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; |
|
|
|
lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; |
|
|
|
lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel))); |
|
|
|
lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel))); |
|
|
|
lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev; |
|
|
|
lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = iVddc; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = iVddc; |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
/* Reset to old value if it fails! */ |
|
|
|
/* Reset to old value if it fails! */ |
|
|
|
if (lpOdPerformanceLevels->aLevels[lev].iVddc != iVddc) { |
|
|
|
if (lpOdPerformanceLevels->aLevels[lev].iVddc != iVddc) { |
|
|
@ -653,12 +721,15 @@ static int set_vddc(int gpu, float fVddc) |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = ga->iVddc; |
|
|
|
lpOdPerformanceLevels->aLevels[lev].iVddc = ga->iVddc; |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Get(ga->iAdapterIndex, 0, lpOdPerformanceLevels); |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
ga->iEngineClock = lpOdPerformanceLevels->aLevels[lev].iEngineClock; |
|
|
|
ga->iEngineClock = lpOdPerformanceLevels->aLevels[lev].iEngineClock; |
|
|
|
ga->iMemoryClock = lpOdPerformanceLevels->aLevels[lev].iMemoryClock; |
|
|
|
ga->iMemoryClock = lpOdPerformanceLevels->aLevels[lev].iMemoryClock; |
|
|
|
ga->iVddc = lpOdPerformanceLevels->aLevels[lev].iVddc; |
|
|
|
ga->iVddc = lpOdPerformanceLevels->aLevels[lev].iVddc; |
|
|
|
return 0; |
|
|
|
ret = 0; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void get_fanrange(int gpu, int *imin, int *imax) |
|
|
|
static void get_fanrange(int gpu, int *imin, int *imax) |
|
|
@ -677,17 +748,20 @@ static void get_fanrange(int gpu, int *imin, int *imax) |
|
|
|
static int set_fanspeed(int gpu, int iFanSpeed) |
|
|
|
static int set_fanspeed(int gpu, int iFanSpeed) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
wlogprint("Set fanspeed not supported\n"); |
|
|
|
wlogprint("Set fanspeed not supported\n"); |
|
|
|
return 1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
if (!(ga->lpFanSpeedInfo.iFlags & (ADL_DL_FANCTRL_SUPPORTS_RPM_WRITE | ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE ))) |
|
|
|
if (!(ga->lpFanSpeedInfo.iFlags & (ADL_DL_FANCTRL_SUPPORTS_RPM_WRITE | ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE ))) |
|
|
|
return 1; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_FanSpeed_Get(ga->iAdapterIndex, 0, &ga->lpFanSpeedValue) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_FanSpeed_Get(ga->iAdapterIndex, 0, &ga->lpFanSpeedValue) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
ga->lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED; |
|
|
|
ga->lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED; |
|
|
|
if ((ga->lpFanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_RPM_WRITE) && |
|
|
|
if ((ga->lpFanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_RPM_WRITE) && |
|
|
|
!(ga->lpFanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE)) { |
|
|
|
!(ga->lpFanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE)) { |
|
|
@ -698,28 +772,37 @@ static int set_fanspeed(int gpu, int iFanSpeed) |
|
|
|
ga->lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; |
|
|
|
ga->lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; |
|
|
|
ga->lpFanSpeedValue.iFanSpeed = iFanSpeed; |
|
|
|
ga->lpFanSpeedValue.iFanSpeed = iFanSpeed; |
|
|
|
if (ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->lpFanSpeedValue) != ADL_OK) |
|
|
|
if (ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->lpFanSpeedValue) != ADL_OK) |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
return 0; |
|
|
|
ret = 0; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int set_powertune(int gpu, int iPercentage) |
|
|
|
static int set_powertune(int gpu, int iPercentage) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int oldPercentage, dummy; |
|
|
|
int oldPercentage, dummy; |
|
|
|
struct gpu_adl *ga; |
|
|
|
struct gpu_adl *ga; |
|
|
|
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
if (!gpus[gpu].has_adl || !adl_active) { |
|
|
|
wlogprint("Set powertune not supported\n"); |
|
|
|
wlogprint("Set powertune not supported\n"); |
|
|
|
return 1; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
oldPercentage = ga->iPercentage; |
|
|
|
oldPercentage = ga->iPercentage; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
if (ADL_Overdrive5_PowerControl_Set(ga->iAdapterIndex, iPercentage) != ADL_OK) { |
|
|
|
if (ADL_Overdrive5_PowerControl_Set(ga->iAdapterIndex, iPercentage) != ADL_OK) { |
|
|
|
ADL_Overdrive5_PowerControl_Set(ga->iAdapterIndex, ga->iPercentage); |
|
|
|
ADL_Overdrive5_PowerControl_Set(ga->iAdapterIndex, ga->iPercentage); |
|
|
|
return 1; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
ADL_Overdrive5_PowerControl_Get(ga->iAdapterIndex, &ga->iPercentage, &dummy); |
|
|
|
ADL_Overdrive5_PowerControl_Get(ga->iAdapterIndex, &ga->iPercentage, &dummy); |
|
|
|
return 0; |
|
|
|
ret = 0; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void gpu_autotune(int gpu) |
|
|
|
void gpu_autotune(int gpu) |
|
|
@ -732,8 +815,12 @@ void gpu_autotune(int gpu) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
temp = __gpu_temp(ga); |
|
|
|
temp = __gpu_temp(ga); |
|
|
|
newpercent = fanpercent = __gpu_fanpercent(ga); |
|
|
|
newpercent = fanpercent = __gpu_fanpercent(ga); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
|
|
|
|
newengine = engine = gpu_engineclock(gpu) * 100; |
|
|
|
newengine = engine = gpu_engineclock(gpu) * 100; |
|
|
|
|
|
|
|
|
|
|
|
if (temp && fanpercent >= 0 && ga->autofan) { |
|
|
|
if (temp && fanpercent >= 0 && ga->autofan) { |
|
|
@ -796,7 +883,9 @@ void set_defaultfan(int gpu) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->DefFanSpeedValue); |
|
|
|
ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->DefFanSpeedValue); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void set_defaultengine(int gpu) |
|
|
|
void set_defaultengine(int gpu) |
|
|
@ -806,7 +895,9 @@ void set_defaultengine(int gpu) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
ga = &gpus[gpu].adl; |
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, ga->DefPerfLev); |
|
|
|
ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, ga->DefPerfLev); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void change_autosettings(int gpu) |
|
|
|
void change_autosettings(int gpu) |
|
|
@ -961,6 +1052,7 @@ void clear_adl(nDevs) |
|
|
|
if (!adl_active) |
|
|
|
if (!adl_active) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock_adl(); |
|
|
|
/* Try to reset values to their defaults */ |
|
|
|
/* Try to reset values to their defaults */ |
|
|
|
for (i = 0; i < nDevs; i++) { |
|
|
|
for (i = 0; i < nDevs; i++) { |
|
|
|
ga = &gpus[i].adl; |
|
|
|
ga = &gpus[i].adl; |
|
|
@ -974,6 +1066,7 @@ void clear_adl(nDevs) |
|
|
|
|
|
|
|
|
|
|
|
ADL_Main_Memory_Free ( (void **)&lpInfo ); |
|
|
|
ADL_Main_Memory_Free ( (void **)&lpInfo ); |
|
|
|
ADL_Main_Control_Destroy (); |
|
|
|
ADL_Main_Control_Destroy (); |
|
|
|
|
|
|
|
unlock_adl(); |
|
|
|
|
|
|
|
|
|
|
|
#if defined (LINUX) |
|
|
|
#if defined (LINUX) |
|
|
|
dlclose(hDLL); |
|
|
|
dlclose(hDLL); |
|
|
|