Browse Source

Support for maximum frequency being below the default, eg when the maximum is temporarily reduced to deal with temperature

Luke Dashjr 13 years ago
parent
commit
e6731766d5
1 changed files with 7 additions and 2 deletions
  1. 7 2
      dynclock.c

+ 7 - 2
dynclock.c

@@ -29,16 +29,21 @@ void dclk_msg_freqchange(const char *repr, int oldFreq, int newFreq, const char
 bool dclk_updateFreq(struct dclk_data *data, dclk_change_clock_func_t changeclock, struct thr_info *thr)
 bool dclk_updateFreq(struct dclk_data *data, dclk_change_clock_func_t changeclock, struct thr_info *thr)
 {
 {
 	struct cgpu_info *cgpu = thr->cgpu;
 	struct cgpu_info *cgpu = thr->cgpu;
+	uint8_t freqMDefault = data->freqMDefault;
 	int i, maxM, bestM;
 	int i, maxM, bestM;
 	double bestR, r;
 	double bestR, r;
 	bool rv = true;
 	bool rv = true;
 
 
+	if (freqMDefault > data->freqMaxM)
+		// This occurs when the device in question adjusts its MaxM down due to temperature or similar reasons
+		freqMDefault = data->freqMaxM;
+
 	for (i = 0; i < data->freqMaxM; i++)
 	for (i = 0; i < data->freqMaxM; i++)
 		if (data->maxErrorRate[i + 1] * i < data->maxErrorRate[i] * (i + 20))
 		if (data->maxErrorRate[i + 1] * i < data->maxErrorRate[i] * (i + 20))
 			data->maxErrorRate[i + 1] = data->maxErrorRate[i] * (1.0 + 20.0 / i);
 			data->maxErrorRate[i + 1] = data->maxErrorRate[i] * (1.0 + 20.0 / i);
 
 
 	maxM = 0;
 	maxM = 0;
-	while (maxM < data->freqMDefault && data->maxErrorRate[maxM + 1] < DCLK_MAXMAXERRORRATE)
+	while (maxM < freqMDefault && data->maxErrorRate[maxM + 1] < DCLK_MAXMAXERRORRATE)
 		maxM++;
 		maxM++;
 	while (maxM < data->freqMaxM && data->errorWeight[maxM] > 150 && data->maxErrorRate[maxM + 1] < DCLK_MAXMAXERRORRATE)
 	while (maxM < data->freqMaxM && data->errorWeight[maxM] > 150 && data->maxErrorRate[maxM + 1] < DCLK_MAXMAXERRORRATE)
 		maxM++;
 		maxM++;
@@ -57,7 +62,7 @@ bool dclk_updateFreq(struct dclk_data *data, dclk_change_clock_func_t changecloc
 		rv = changeclock(thr, bestM);
 		rv = changeclock(thr, bestM);
 	}
 	}
 
 
-	maxM = data->freqMDefault;
+	maxM = freqMDefault;
 	while (maxM < data->freqMaxM && data->errorWeight[maxM + 1] > 100)
 	while (maxM < data->freqMaxM && data->errorWeight[maxM + 1] > 100)
 		maxM++;
 		maxM++;
 	if ((bestM < (1.0 - DCLK_OVERHEATTHRESHOLD) * maxM) && bestM < maxM - 1) {
 	if ((bestM < (1.0 - DCLK_OVERHEATTHRESHOLD) * maxM) && bestM < maxM - 1) {