diff --git a/adl.c b/adl.c index ab316594..9a3c7418 100644 --- a/adl.c +++ b/adl.c @@ -364,7 +364,9 @@ void init_adl(int nDevs) if (gpus[gpu].deven == DEV_DISABLED) { gpus[gpu].gpu_engine = + gpus[gpu].gpu_engine_exit = gpus[gpu].gpu_memclock = + gpus[gpu].gpu_memclock_exit = gpus[gpu].gpu_vddc = gpus[gpu].gpu_fan = gpus[gpu].gpu_powertune = 0; @@ -1434,6 +1436,16 @@ void clear_adl(int nDevs) /* Only reset the values if we've changed them at any time */ if (!gpus[i].has_adl || !ga->managed) continue; + + int lev; + lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1; + + /* Set exit values of the GPU */ + if (gpus[i].gpu_engine_exit) + ga->DefPerfLev->aLevels[lev].iEngineClock = gpus[i].gpu_engine_exit * 100; + if (gpus[i].gpu_memclock_exit) + ga->DefPerfLev->aLevels[lev].iMemoryClock = gpus[i].gpu_memclock_exit * 100; + ADL_Overdrive5_ODPerformanceLevels_Set(ga->iAdapterIndex, ga->DefPerfLev); free(ga->DefPerfLev); ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->DefFanSpeedValue); diff --git a/cgminer.c b/cgminer.c index 64245276..47d1a32d 100644 --- a/cgminer.c +++ b/cgminer.c @@ -683,6 +683,25 @@ void get_intrange(char *arg, int *val1, int *val2) *val2 = *val1; } +void get_intexitval(char *arg, int *val1, int *val2) +{ + if (sscanf(arg, "%d:%d", val1, val2) == 1) + *val2 = *val1; +} + +void get_intrangeexitval(char *arg, int *val1, int *val2, int *val3) +{ + if (sscanf(arg, "%d:%d", val2, val3) == 2) + { + *val1 = *val2; + } + else if (sscanf(arg, "%d-%d:%d", val1, val2, val3) != 3) + { + get_intrange(arg, val1, val2); + *val3 = *val2; + } +} + static char *set_devices(char *arg) { int i, val1 = 0, val2 = 0; diff --git a/driver-opencl.c b/driver-opencl.c index 14d13f30..0c0f762a 100644 --- a/driver-opencl.c +++ b/driver-opencl.c @@ -280,26 +280,28 @@ char *set_gpu_map(char *arg) char *set_gpu_engine(char *arg) { - int i, val1 = 0, val2 = 0, device = 0; + int i, min_val = 0, gpu_val = 0, exit_val = 0, device = 0; char *nextptr; nextptr = strtok(arg, ","); if (nextptr == NULL) return "Invalid parameters for set gpu engine"; - get_intrange(nextptr, &val1, &val2); - if (val1 < 0 || val1 > 9999 || val2 < 0 || val2 > 9999) + get_intrangeexitval(nextptr, &min_val, &gpu_val, &exit_val); + if (min_val < 0 || min_val > 9999 || gpu_val < 0 || gpu_val > 9999 || exit_val < 0 || exit_val > 9999) return "Invalid value passed to set_gpu_engine"; - gpus[device].min_engine = val1; - gpus[device].gpu_engine = val2; + gpus[device].min_engine = min_val; + gpus[device].gpu_engine = gpu_val; + gpus[device].gpu_engine_exit = exit_val; device++; while ((nextptr = strtok(NULL, ",")) != NULL) { - get_intrange(nextptr, &val1, &val2); - if (val1 < 0 || val1 > 9999 || val2 < 0 || val2 > 9999) + get_intrangeexitval(nextptr, &min_val, &gpu_val, &exit_val); + if (min_val < 0 || min_val > 9999 || gpu_val < 0 || gpu_val > 9999 || exit_val < 0 || exit_val > 9999) return "Invalid value passed to set_gpu_engine"; - gpus[device].min_engine = val1; - gpus[device].gpu_engine = val2; + gpus[device].min_engine = min_val; + gpus[device].gpu_engine = gpu_val; + gpus[device].gpu_engine_exit = exit_val; device++; } @@ -307,6 +309,7 @@ char *set_gpu_engine(char *arg) for (i = 1; i < MAX_GPUDEVICES; i++) { gpus[i].min_engine = gpus[0].min_engine; gpus[i].gpu_engine = gpus[0].gpu_engine; + gpus[i].gpu_engine_exit = gpus[0].gpu_engine_exit; } } @@ -351,28 +354,37 @@ char *set_gpu_fan(char *arg) char *set_gpu_memclock(char *arg) { - int i, val = 0, device = 0; + int i, val = 0, exit_val = 0, device = 0; char *nextptr; + char *valuesptr; nextptr = strtok(arg, ","); if (nextptr == NULL) return "Invalid parameters for set gpu memclock"; - val = atoi(nextptr); - if (val < 0 || val >= 9999) + get_intexitval(nextptr, &val, &exit_val); + + if (val < 0 || val > 9999 || exit_val < 0 || exit_val > 9999) return "Invalid value passed to set_gpu_memclock"; - gpus[device++].gpu_memclock = val; + gpus[device].gpu_memclock = val; + gpus[device].gpu_memclock_exit = exit_val; + device++; while ((nextptr = strtok(NULL, ",")) != NULL) { - val = atoi(nextptr); - if (val < 0 || val >= 9999) + get_intexitval(nextptr, &val, &exit_val); + if (val < 0 || val > 9999 || exit_val < 0 || exit_val > 9999) return "Invalid value passed to set_gpu_memclock"; - gpus[device++].gpu_memclock = val; + gpus[device].gpu_memclock = val; + gpus[device].gpu_memclock_exit = exit_val; + device++; } if (device == 1) { for (i = device; i < MAX_GPUDEVICES; i++) + { gpus[i].gpu_memclock = gpus[0].gpu_memclock; + gpus[i].gpu_memclock_exit = gpus[0].gpu_memclock_exit; + } } return NULL; diff --git a/miner.h b/miner.h index 1cac6826..d593038c 100644 --- a/miner.h +++ b/miner.h @@ -561,6 +561,8 @@ struct cgpu_info { int gpu_memdiff; int gpu_powertune; float gpu_vddc; + int gpu_engine_exit; + int gpu_memclock_exit; #endif int diff1; double diff_accepted;