Commit fa4ce8daf2d5726a50286ad48f5f632144db83ea

Con Kolivas 2012-02-18T22:29:12

Keep track of intended engine clock speed and only adjust up if it's higher than the last intended speed. This avoids setting the clock speed to one relative to a lower profile one by mistake.

diff --git a/adl.c b/adl.c
index 7858b99..6f0b501 100644
--- a/adl.c
+++ b/adl.c
@@ -743,6 +743,10 @@ int set_engineclock(int gpu, int iEngineClock)
 	iEngineClock *= 100;
 	ga = &gpus[gpu].adl;
 
+	/* Keep track of intended engine clock in case the device changes
+	 * profile and drops while idle, not taking the new engine clock */
+	ga->lastengine = iEngineClock;
+
 	lev = ga->lpOdParameters.iNumberOfPerformanceLevels - 1;
 	lpOdPerformanceLevels = alloca(sizeof(ADLODPerformanceLevels) + (lev * sizeof(ADLODPerformanceLevel)));
 	lpOdPerformanceLevels->iSize = sizeof(ADLODPerformanceLevels) + sizeof(ADLODPerformanceLevel) * lev;
@@ -1073,7 +1077,12 @@ void gpu_autotune(int gpu, bool *enable)
 			newengine = ga->maxspeed;
 		else if (newengine < ga->minspeed)
 			newengine = ga->minspeed;
-		if (newengine != engine) {
+
+		/* Adjust engine clock speed if it's lower, or if it's higher
+		 * but higher than the last intended value as well as the
+		 * current speed, to avoid setting the engine clock speed to
+		 * a speed relateive to a lower profile during idle periods. */
+		if (newengine < engine || (newengine > engine && newengine > ga->lastengine)) {
 			newengine /= 100;
 			applog(LOG_INFO, "Setting GPU %d engine clock to %d", gpu, newengine);
 			set_engineclock(gpu, newengine);
diff --git a/miner.h b/miner.h
index 7550ec7..8e05696 100644
--- a/miner.h
+++ b/miner.h
@@ -169,6 +169,7 @@ struct gpu_adl {
 	bool autoengine;
 	bool managed; /* Were the values ever changed on this card */
 
+	int lastengine;
 	int lasttemp;
 	int targetfan;
 	int targettemp;