Skip to content

Commit c49bac1

Browse files
paavaananyxieca
authored andcommitted
[devices]: Dell Hwmon S6100/Z9100 SFM version export (#2521)
1 parent f434b80 commit c49bac1

File tree

1 file changed

+125
-21
lines changed
  • platform/broadcom/sonic-platform-modules-dell/common

1 file changed

+125
-21
lines changed

platform/broadcom/sonic-platform-modules-dell/common/dell_pmc.c

Lines changed: 125 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#define SIO_DRVNAME "SMF"
2929
#define DEBUG 1
3030
#define LABELS 1
31+
#define SMF_VERSION_ADDR 0x0000
3132

3233
#define FANIN_MAX 12 /* Counted from 1 */
3334
#define VSEN_MAX 48 /* VSEN1.. */
@@ -471,6 +472,35 @@ static int smf_read_reg16(struct smf_data *data, u16 reg)
471472
return res;
472473
}
473474

475+
/* SMF Version */
476+
static ssize_t show_smf_version(struct device *dev,
477+
struct device_attribute *devattr, char *buf)
478+
{
479+
int index = to_sensor_dev_attr(devattr)->index;
480+
unsigned int ret = 0;
481+
unsigned int smf_version = 0;
482+
unsigned int smf_firmware_major_ver = 0;
483+
unsigned int smf_firmware_minor_ver = 0;
484+
struct smf_data *data = dev_get_drvdata(dev);
485+
486+
ret = smf_read_reg(data, (SMF_VERSION_ADDR + index*2));
487+
488+
printk("smf_firmware_details-->0x%x index[%d]", ret, index);
489+
490+
if (index > 0) {
491+
smf_firmware_major_ver = ((ret & (0xC0)) >> 6);
492+
smf_firmware_minor_ver = (ret & (0x3F));
493+
494+
ret = sprintf(buf, "%u.%u\n", smf_firmware_major_ver,
495+
smf_firmware_minor_ver);
496+
} else {
497+
smf_version = ret;
498+
ret = sprintf(buf, "%u\n", smf_version);
499+
}
500+
501+
return ret;
502+
}
503+
474504

475505
/* FANIN ATTR */
476506
static ssize_t
@@ -514,6 +544,9 @@ static ssize_t show_fan(struct device *dev,
514544
if (ret < 0)
515545
return ret;
516546

547+
if (ret & 0x8000)
548+
ret = - (ret & 0x7fff);
549+
517550
rpm = ret;
518551

519552
if(export_hex)
@@ -1327,23 +1360,28 @@ static ssize_t show_temp_crit(struct device *dev,
13271360
}
13281361

13291362

1330-
/*static ssize_t show_temp_alarm(struct device *dev,
1363+
static ssize_t show_temp_alarm(struct device *dev,
13311364
struct device_attribute *devattr, char *buf)
13321365
{
13331366
int index = to_sensor_dev_attr(devattr)->index;
13341367
struct smf_data *data = dev_get_drvdata(dev);
1335-
int ret;
1336-
int temp;
1368+
int ret = 0;
1369+
int temp = 0;
13371370

1338-
ret = smf_read_reg16(data, TEMP_SENSOR_1_STATUS + index * 2);
1371+
ret = smf_read_reg(data, TEMP_SENSOR_1_STATUS + index);
13391372

1340-
if (ret < 0)
1341-
return ret;
1373+
if (ret < 0) {
1374+
return ret;
1375+
}
1376+
1377+
if (ret == 0xff) {
1378+
ret = 0;
1379+
}
13421380

13431381
temp = ret;
13441382

13451383
return sprintf(buf, "%d\n", temp);
1346-
}*/
1384+
}
13471385

13481386

13491387
static umode_t smf_tcpu_is_visible(struct kobject *kobj,
@@ -1432,6 +1470,25 @@ static SENSOR_DEVICE_ATTR(temp13_max, S_IRUGO, show_temp_crit, NULL, 50);
14321470
static SENSOR_DEVICE_ATTR(temp14_max, S_IRUGO, show_temp_crit, NULL, 46);
14331471
static SENSOR_DEVICE_ATTR(temp15_max, S_IRUGO, show_temp_crit, NULL, 50);
14341472

1473+
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0);
1474+
static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 1);
1475+
static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 2);
1476+
static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO, show_temp_alarm, NULL, 3);
1477+
static SENSOR_DEVICE_ATTR(temp5_alarm, S_IRUGO, show_temp_alarm, NULL, 4);
1478+
static SENSOR_DEVICE_ATTR(temp6_alarm, S_IRUGO, show_temp_alarm, NULL, 5);
1479+
static SENSOR_DEVICE_ATTR(temp7_alarm, S_IRUGO, show_temp_alarm, NULL, 6);
1480+
static SENSOR_DEVICE_ATTR(temp8_alarm, S_IRUGO, show_temp_alarm, NULL, 7);
1481+
static SENSOR_DEVICE_ATTR(temp9_alarm, S_IRUGO, show_temp_alarm, NULL, 8);
1482+
static SENSOR_DEVICE_ATTR(temp10_alarm, S_IRUGO, show_temp_alarm, NULL, 9);
1483+
static SENSOR_DEVICE_ATTR(temp11_alarm, S_IRUGO, show_temp_alarm, NULL, 10);
1484+
static SENSOR_DEVICE_ATTR(temp12_alarm, S_IRUGO, show_temp_alarm, NULL, 11);
1485+
static SENSOR_DEVICE_ATTR(temp13_alarm, S_IRUGO, show_temp_alarm, NULL, 12);
1486+
1487+
static SENSOR_DEVICE_ATTR(temp14_alarm, S_IRUGO, show_temp_alarm, NULL, 13);
1488+
static SENSOR_DEVICE_ATTR(temp15_alarm, S_IRUGO, show_temp_alarm, NULL, 14);
1489+
1490+
1491+
14351492

14361493
static struct attribute *smf_tcpu_attrs[] = {
14371494
&sensor_dev_attr_temp1_input.dev_attr.attr,
@@ -1498,6 +1555,23 @@ static struct attribute *smf_tcpu_attrs[] = {
14981555
&sensor_dev_attr_temp14_max.dev_attr.attr,
14991556
&sensor_dev_attr_temp15_max.dev_attr.attr,
15001557

1558+
&sensor_dev_attr_temp1_alarm.dev_attr.attr,
1559+
&sensor_dev_attr_temp2_alarm.dev_attr.attr,
1560+
&sensor_dev_attr_temp3_alarm.dev_attr.attr,
1561+
&sensor_dev_attr_temp4_alarm.dev_attr.attr,
1562+
&sensor_dev_attr_temp5_alarm.dev_attr.attr,
1563+
&sensor_dev_attr_temp6_alarm.dev_attr.attr,
1564+
&sensor_dev_attr_temp7_alarm.dev_attr.attr,
1565+
&sensor_dev_attr_temp8_alarm.dev_attr.attr,
1566+
&sensor_dev_attr_temp9_alarm.dev_attr.attr,
1567+
&sensor_dev_attr_temp10_alarm.dev_attr.attr,
1568+
&sensor_dev_attr_temp11_alarm.dev_attr.attr,
1569+
&sensor_dev_attr_temp12_alarm.dev_attr.attr,
1570+
&sensor_dev_attr_temp13_alarm.dev_attr.attr,
1571+
&sensor_dev_attr_temp14_alarm.dev_attr.attr,
1572+
&sensor_dev_attr_temp15_alarm.dev_attr.attr,
1573+
1574+
15011575
NULL
15021576
};
15031577

@@ -1525,26 +1599,36 @@ static ssize_t show_psu(struct device *dev,
15251599
struct smf_data *data = dev_get_drvdata(dev);
15261600
int ret=0, export_hex=0;
15271601
int psu_status=0, pow;
1602+
int pow_val = 0;
15281603

15291604
switch (index) {
15301605

15311606
case 0:
15321607
pow = smf_read_reg16(data, PSU_1_MAX_POWER);
1533-
/* TODO Fix */
1534-
if (data->kind == s6100smf)
1535-
ret = 1000000 * 1100;
1536-
else
1537-
ret = 1000000 * 750;
1608+
if (data->kind == s6100smf)
1609+
ret = 1000000 * 1100;
1610+
else
1611+
ret = 1000000 * 750;
15381612
break;
15391613
case 1:
15401614
ret = smf_read_reg(data, PSU_1_STATUS);
15411615
export_hex=1;
15421616
break;
15431617
case 2:
1544-
ret = 100000 * smf_read_reg16(data, PSU_1_INPUT_POWER);
1618+
pow_val = smf_read_reg16(data, PSU_1_INPUT_POWER);
1619+
/* In case of absent psu, pow_val will be 0xffff */
1620+
if (pow_val == 0xffff) {
1621+
pow_val = 0;
1622+
}
1623+
ret = 100000 * pow_val;
15451624
break;
15461625
case 3:
1547-
ret = 100000 * smf_read_reg16(data, PSU_1_OUTPUT_POWER);
1626+
pow_val = smf_read_reg16(data, PSU_1_OUTPUT_POWER);
1627+
/* In case of absent psu, pow_val will be 0xffff */
1628+
if (pow_val == 0xffff) {
1629+
pow_val = 0;
1630+
}
1631+
ret = 100000 * pow_val;
15481632
break;
15491633
case 4:
15501634
psu_status = smf_read_reg(data, PSU_1_STATUS);
@@ -1554,21 +1638,30 @@ static ssize_t show_psu(struct device *dev,
15541638
case 5:
15551639
pow = smf_read_reg16(data, PSU_2_MAX_POWER);
15561640
ret = 1000000 * pow;
1557-
/* TODO Fix */
1558-
if (data->kind == s6100smf)
1559-
ret = 1000000 * 1100;
1560-
else
1561-
ret = 1000000 * 750;
1641+
if (data->kind == s6100smf)
1642+
ret = 1000000 * 1100;
1643+
else
1644+
ret = 1000000 * 750;
15621645
break;
15631646
case 6:
15641647
ret = smf_read_reg(data, PSU_2_STATUS);
15651648
export_hex=1;
15661649
break;
15671650
case 7:
1568-
ret = 100000 * smf_read_reg16(data, PSU_2_INPUT_POWER);
1651+
pow_val = smf_read_reg16(data, PSU_2_INPUT_POWER);
1652+
/* In case of absent psu, pow_val will be 0xffff */
1653+
if (pow_val == 0xffff) {
1654+
pow_val = 0;
1655+
}
1656+
ret = 100000 * pow_val;
15691657
break;
15701658
case 8:
1571-
ret = 100000 * smf_read_reg16(data, PSU_2_OUTPUT_POWER);
1659+
pow_val = smf_read_reg16(data, PSU_2_OUTPUT_POWER);
1660+
/* In case of absent psu, pow_val will be 0xffff */
1661+
if (pow_val == 0xffff) {
1662+
pow_val = 0;
1663+
}
1664+
ret = 100000 * pow_val;
15721665
break;
15731666
case 9:
15741667
psu_status = smf_read_reg(data, PSU_2_STATUS);
@@ -1577,6 +1670,10 @@ static ssize_t show_psu(struct device *dev,
15771670
break;
15781671
case 10:
15791672
pow = smf_read_reg16(data, CURRENT_TOTAL_POWER);
1673+
/* In case of both psu absent, pow will be 0xffff */
1674+
if (pow == 0xffff) {
1675+
pow = 0;
1676+
}
15801677
ret = pow/10;
15811678
break;
15821679
default:
@@ -1678,7 +1775,14 @@ static SENSOR_DEVICE_ATTR(psu1_presence, S_IRUGO, show_psu, NULL, 1);
16781775
static SENSOR_DEVICE_ATTR(psu2_presence, S_IRUGO, show_psu, NULL, 6);
16791776
static SENSOR_DEVICE_ATTR(current_total_power, S_IRUGO, show_psu, NULL, 10);
16801777

1778+
/* SMF Version */
1779+
static SENSOR_DEVICE_ATTR(smf_version, S_IRUGO, show_smf_version, NULL, 0);
1780+
static SENSOR_DEVICE_ATTR(smf_firmware_ver, S_IRUGO, show_smf_version, NULL, 1);
1781+
1782+
16811783
static struct attribute *smf_dell_attrs[] = {
1784+
&sensor_dev_attr_smf_version.dev_attr.attr,
1785+
&sensor_dev_attr_smf_firmware_ver.dev_attr.attr,
16821786
&sensor_dev_attr_fan_tray_presence.dev_attr.attr,
16831787
&sensor_dev_attr_fan1_airflow.dev_attr.attr,
16841788
&sensor_dev_attr_fan3_airflow.dev_attr.attr,

0 commit comments

Comments
 (0)