Browse Source

knc: Store volt/current on knccore

Luke Dashjr 12 years ago
parent
commit
a1fccc7a82
1 changed files with 36 additions and 24 deletions
  1. 36 24
      driver-knc.c

+ 36 - 24
driver-knc.c

@@ -71,6 +71,9 @@ struct knc_device {
 struct knc_core {
 	int asicno;
 	int coreno;
+	
+	float volt;
+	float current;
 };
 
 static
@@ -589,15 +592,16 @@ bool knc_get_stats(struct cgpu_info * const cgpu)
 	if (cgpu->device != cgpu)
 		return true;
 	
-	struct knc_core * const knccore = cgpu->thr[0]->cgpu_data;
+	struct thr_info *thr = cgpu->thr[0];
+	struct knc_core *knccore = thr->cgpu_data;
 	struct cgpu_info *proc;
 	const int i2cdev = knccore->asicno + 3;
 	const int i2cslave_temp = 0x48;
 	const int i2cslave_dcdc[] = {0x10, 0x12, 0x14, 0x17};
-	int die;
+	int die, i;
 	int i2c;
 	int32_t rawtemp, rawvolt, rawcurrent;
-	float temp;
+	float temp, volt, current;
 	bool rv = false;
 	
 	char i2cpath[sizeof(KNC_I2C_TEMPLATE)];
@@ -633,32 +637,40 @@ bool knc_get_stats(struct cgpu_info * const cgpu)
 	   Datasheet at http://www.lineagepower.com/oem/pdf/MDT040A0X.pdf
 	*/
 
-	for (die = 0; die < 4; die++)
+	for (proc = cgpu, i = 0; proc && proc->device == cgpu; proc = proc->next_proc, ++i)
 	{
-		if (ioctl(i2c, I2C_SLAVE, i2cslave_dcdc[die]))
+		thr = proc->thr[0];
+		knccore = thr->cgpu_data;
+		die = i / 0x30;
+		
+		if (0 == i % 0x30)
 		{
-			applog(LOG_DEBUG, "%s: %s: Failed to select i2c slave 0x%x",
-			       cgpu->dev_repr, __func__, i2cslave_dcdc[die]);
-			goto out;
+			if (ioctl(i2c, I2C_SLAVE, i2cslave_dcdc[die]))
+			{
+				applog(LOG_DEBUG, "%s: %s: Failed to select i2c slave 0x%x",
+				       cgpu->dev_repr, __func__, i2cslave_dcdc[die]);
+				goto out;
+			}
+			
+			rawvolt = i2c_smbus_read_word_data(i2c, 0x8b);  // VOUT
+			if (rawvolt == -1)
+				goto out;
+			
+			rawcurrent = i2c_smbus_read_word_data(i2c, 0x8c);  // IOUT
+			if (rawcurrent == -1)
+				goto out;
+			
+			volt    = (float)rawvolt * exp2(-10);
+			current = (float)knc_dcdc_decode_5_11(rawcurrent);
+			
+			applog(LOG_DEBUG, "%s: die %d %6.3fV %5.2fA",
+			       cgpu->dev_repr, die, volt, current);
 		}
 		
-		rawvolt = i2c_smbus_read_word_data(i2c, 0x8b);  // VOUT
-		if (rawvolt == -1)
-			goto out;
-		
-		rawcurrent = i2c_smbus_read_word_data(i2c, 0x8c);  // IOUT
-		if (rawcurrent == -1)
-			goto out;
-		
-		float volt    = (float)rawvolt * exp2(-10);
-		float current = (float)knc_dcdc_decode_5_11(rawcurrent);
-		
-		applog(LOG_DEBUG, "%s: die %d %6.3fV %5.2fA",
-		       cgpu->dev_repr, die, volt, current);
-	}
-	
-	for (proc = cgpu; proc && proc->device == cgpu; proc = proc->next_proc)
 		proc->temp = temp;
+		knccore->volt = volt;
+		knccore->current = current;
+	}
 	
 	rv = true;
 out: