Commit 3a5663cac11bf5369d2594a7150d07f960dfaef8

Con Kolivas 2011-09-04T22:25:31

Implement setting the GPU fan speed of all devices or each device as a comma separated value.

diff --git a/adl.c b/adl.c
index 49aa7e0..2f17eea 100644
--- a/adl.c
+++ b/adl.c
@@ -252,6 +252,14 @@ void init_adl(int nDevs)
 
 		/* Save the fanspeed values as defaults in case we reset later */
 		ADL_Overdrive5_FanSpeed_Get(ga->iAdapterIndex, 0, &ga->DefFanSpeedValue);
+		if (gpus[gpu].gpu_fan) {
+			ADL_Overdrive5_FanSpeed_Get(ga->iAdapterIndex, 0, &ga->lpFanSpeedValue);
+			ga->lpFanSpeedValue.iFanSpeed = gpus[gpu].gpu_fan;
+			ga->lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
+			ga->lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
+			applog(LOG_INFO, "Setting GPU %d fan speed to %d%%", gpu, gpus[gpu].gpu_fan);
+			ADL_Overdrive5_FanSpeed_Set(ga->iAdapterIndex, 0, &ga->lpFanSpeedValue);
+		}
 
 		/* Set some default temperatures for autotune when enabled */
 		ga->targettemp = opt_targettemp;
diff --git a/main.c b/main.c
index c938aeb..ebd1682 100644
--- a/main.c
+++ b/main.c
@@ -1139,6 +1139,33 @@ static char *set_gpu_engine(char *arg)
 	return NULL;
 }
 
+static char *set_gpu_fan(char *arg)
+{
+	int i, val = 0, device = 0;
+	char *saveptr = NULL, *nextptr;
+
+	nextptr = strtok_r(arg, ",", &saveptr);
+	if (nextptr == NULL)
+		return "Invalid parameters for set gpu fan";
+	val = atoi(nextptr);
+	if (val < 0 || val > 100)
+		return "Invalid value passed to set_gpu_fan";
+
+	gpus[device++].gpu_fan = val;
+
+	while ((nextptr = strtok_r(NULL, ",", &saveptr)) != NULL) {
+		val = atoi(nextptr);
+		if (val < 0 || val > 100)
+			return "Invalid value passed to set_gpu_fan";
+
+		gpus[device++].gpu_fan = val;
+	}
+	for (i = device; i < 16; i++)
+		gpus[i].gpu_fan = val;
+
+	return NULL;
+}
+
 static char *set_gpu_memclock(char *arg)
 {
 	int i, val = 0, device = 0;
@@ -1260,6 +1287,9 @@ static struct opt_table opt_config_table[] = {
 	OPT_WITH_ARG("--gpu-engine",
 		     set_gpu_engine, NULL, NULL,
 		     "Set the GPU engine (over)clock in Mhz - one value for all or separate by commas for per card."),
+	OPT_WITH_ARG("--gpu-fan",
+		     set_gpu_fan, NULL, NULL,
+		     "Set the GPU fan percentage - one value for all or separate by commas for per card."),
 	OPT_WITH_ARG("--gpu-memclock",
 		     set_gpu_memclock, NULL, NULL,
 		     "Set the GPU memory (over)clock in Mhz - one value for all or separate by commas for per card."),
diff --git a/miner.h b/miner.h
index c5477e5..3da5029 100644
--- a/miner.h
+++ b/miner.h
@@ -199,6 +199,7 @@ struct cgpu_info {
 	bool has_adl;
 	struct gpu_adl adl;
 	int gpu_engine;
+	int gpu_fan;
 	int gpu_memclock;
 	float gpu_vddc;
 #endif