Browse Source

opencl: Infer autoengine mode when the clock setting receives a range

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

+ 37 - 3
driver-opencl.c

@@ -454,11 +454,15 @@ bool _set_gpu_engine(struct cgpu_info * const cgpu, const char * const _val)
 {
 	int val1, val2;
 	get_intrange(_val, &val1, &val2);
-	if (val1 < 0 || val1 > 9999 || val2 < 0 || val2 > 9999)
+	if (val1 < 0 || val1 > 9999 || val2 < 0 || val2 > 9999 || val2 < val1)
 		return false;
+	
 	struct opencl_device_data * const data = cgpu->device_data;
+	struct gpu_adl * const ga = &data->adl;
+	
 	data->min_engine = val1;
 	data->gpu_engine = val2;
+	ga->autoengine = (val1 != val2);
 	return true;
 }
 _SET_INTERFACE(gpu_engine)
@@ -469,8 +473,38 @@ const char *set_gpu_engine(char *arg)
 static
 const char *opencl_set_gpu_engine(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_engineclock(proc->device_id, atoi(newvalue)))
-		return "Failed to set gpu_engine";
+	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 clock";
+	
+	if (val1 == val2)
+	{
+		if (set_engineclock(proc->device_id, val1))
+			return "Failed to set gpu_engine";
+		ga->autoengine = false;
+	}
+	else
+	{
+		// Ensure current clock is within range
+		if (ga->lastengine < val1)
+		{
+			if (set_engineclock(proc->device_id, val1))
+				return "Failed to set gpu_engine";
+		}
+		else
+		if (ga->lastengine > val2)
+			if (set_engineclock(proc->device_id, val2))
+				return "Failed to set gpu_engine";
+		
+		data->min_engine = val1;
+		data->gpu_engine = val2;
+		ga->autoengine = true;
+	}
+	
 	return NULL;
 }