|
|
@@ -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:
|