Browse Source

opencl: Infer autofan mode when the fan setting receives a range

Luke Dashjr 12 years ago
parent
commit
48d0516e49
1 changed files with 37 additions and 3 deletions
  1. 37 3
      driver-opencl.c

+ 37 - 3
driver-opencl.c

@@ -479,11 +479,15 @@ bool _set_gpu_fan(struct cgpu_info * const cgpu, const char * const _val)
 {
 	int val1, val2;
 	get_intrange(_val, &val1, &val2);
-	if (val1 < 0 || val1 > 100 || val2 < 0 || val2 > 100)
+	if (val1 < 0 || val1 > 100 || val2 < 0 || val2 > 100 || val2 < val1)
 		return false;
+	
 	struct opencl_device_data * const data = cgpu->device_data;
+	struct gpu_adl * const ga = &data->adl;
+	
 	data->min_fan = val1;
 	data->gpu_fan = val2;
+	ga->autofan = (val1 != val2);
 	return true;
 }
 _SET_INTERFACE(gpu_fan)
@@ -494,8 +498,38 @@ const char *set_gpu_fan(char *arg)
 static
 const char *opencl_set_gpu_fan(struct cgpu_info * const proc, const char * const optname, const char * const newvalue, char * const replybuf, enum bfg_set_device_replytype * const out_success)
 {
-	if (set_fanspeed(proc->device_id, atoi(newvalue)))
-		return "Failed to set gpu_fan";
+	struct opencl_device_data * const data = proc->device_data;
+	struct gpu_adl * const ga = &data->adl;
+	
+	int val1, val2;
+	get_intrange(newvalue, &val1, &val2);
+	if (val1 < 0 || val1 > 100 || val2 < 0 || val2 > 100 || val2 < val1)
+		return "Invalid value for fan";
+	
+	if (val1 == val2)
+	{
+		if (set_fanspeed(proc->device_id, val1))
+			return "Failed to set gpu_fan";
+		ga->autofan = false;
+	}
+	else
+	{
+		// Ensure current fan is within range
+		if (ga->targetfan < val1)
+		{
+			if (set_fanspeed(proc->device_id, val1))
+				return "Failed to set gpu_fan";
+		}
+		else
+		if (ga->targetfan > val2)
+			if (set_fanspeed(proc->device_id, val2))
+				return "Failed to set gpu_fan";
+		
+		data->min_fan = val1;
+		data->gpu_fan = val2;
+		ga->autofan = true;
+	}
+	
 	return NULL;
 }