Skip to content

Commit e7c351c

Browse files
committed
Merge branch 'devel'
2 parents 3c0e7ab + 27dbfd7 commit e7c351c

File tree

3 files changed

+90
-8
lines changed

3 files changed

+90
-8
lines changed

cli/main.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,26 +1284,48 @@ static int test(int argc, char **argv)
12841284
static int temp(int argc, char **argv)
12851285
{
12861286
float ret;
1287+
int nr_reading;
1288+
float temps[4];
12871289

12881290
static struct {
12891291
struct switchtec_dev *dev;
1292+
int verbose;
12901293
} cfg = {};
12911294
const struct argconfig_options opts[] = {
12921295
DEVICE_OPTION,
1296+
{"verbose", 'v', "", CFG_NONE, &cfg.verbose, no_argument,
1297+
"print individual die temperature sensor reading"},
12931298
{NULL}};
12941299

12951300
argconfig_parse(argc, argv, CMD_DESC_TEMP, opts, &cfg, sizeof(cfg));
12961301

1297-
ret = switchtec_die_temp(cfg.dev);
1298-
if (ret < 0) {
1299-
switchtec_perror("die_temp");
1300-
return 1;
1302+
if (!cfg.verbose) {
1303+
ret = switchtec_die_temp(cfg.dev);
1304+
if (ret < 0) {
1305+
switchtec_perror("die_temp");
1306+
return 1;
1307+
}
1308+
1309+
if (have_decent_term())
1310+
printf("%.3g °C\n", ret);
1311+
else
1312+
printf("%.3g degC\n", ret);
1313+
} else {
1314+
int i;
1315+
nr_reading = switchtec_die_temps(cfg.dev, 4, temps);
1316+
if (nr_reading < 0) {
1317+
switchtec_perror("die_temp");
1318+
return 1;
1319+
}
1320+
1321+
for (i = 0; i < nr_reading; i++) {
1322+
if (have_decent_term())
1323+
printf("Sensor %d: %.3g °C\n", i, temps[i]);
1324+
else
1325+
printf("Sensor %d: %.3g degC\n", i, temps[i]);
1326+
}
13011327
}
13021328

1303-
if (have_decent_term())
1304-
printf("%.3g °C\n", ret);
1305-
else
1306-
printf("%.3g degC\n", ret);
13071329
return 0;
13081330
}
13091331

inc/switchtec/switchtec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,8 @@ int switchtec_log_def_to_file(struct switchtec_dev *dev,
408408
enum switchtec_log_def_type type,
409409
FILE* file);
410410
float switchtec_die_temp(struct switchtec_dev *dev);
411+
int switchtec_die_temps(struct switchtec_dev *dev, int nr_sensor,
412+
float *sensor_readings);
411413
int switchtec_calc_lane_id(struct switchtec_dev *dev, int phys_port_id,
412414
int lane_id, struct switchtec_status *port);
413415
int switchtec_calc_port_lane(struct switchtec_dev *dev, int lane_id,

lib/switchtec.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,6 +1825,64 @@ float switchtec_die_temp(struct switchtec_dev *dev)
18251825
return le32toh(temp) / 100.;
18261826
}
18271827

1828+
/**
1829+
* @brief Get the die temperature sensor readings of the switchtec device
1830+
* @param[in] dev Switchtec device handle
1831+
* @param[in] nr_sensor Number of temp sensors to read
1832+
* @param[out] sensor_readings Array of sensor readings (in degrees celsius)
1833+
* @return The number of sensor readings or a negative value on failure
1834+
*/
1835+
int switchtec_die_temps(struct switchtec_dev *dev, int nr_sensor,
1836+
float *sensor_readings)
1837+
{
1838+
int ret;
1839+
uint32_t sub_cmd_id;
1840+
uint32_t temp;
1841+
1842+
if (nr_sensor <= 0 || !sensor_readings)
1843+
return 0;
1844+
1845+
if (switchtec_is_gen3(dev)) {
1846+
sub_cmd_id = MRPC_DIETEMP_SET_MEAS;
1847+
ret = switchtec_cmd(dev, MRPC_DIETEMP, &sub_cmd_id,
1848+
sizeof(sub_cmd_id), NULL, 0);
1849+
if (ret)
1850+
return -100.0;
1851+
1852+
sub_cmd_id = MRPC_DIETEMP_GET;
1853+
ret = switchtec_cmd(dev, MRPC_DIETEMP, &sub_cmd_id,
1854+
sizeof(sub_cmd_id), &temp, sizeof(temp));
1855+
if (ret)
1856+
return -100.0;
1857+
1858+
sensor_readings[0] = le32toh(temp) / 100.;
1859+
return 1;
1860+
} else if (switchtec_is_gen4(dev)) {
1861+
sub_cmd_id = MRPC_DIETEMP_GET_GEN4;
1862+
ret = switchtec_cmd(dev, MRPC_DIETEMP, &sub_cmd_id,
1863+
sizeof(sub_cmd_id), &temp, sizeof(temp));
1864+
if (ret)
1865+
return -100.0;
1866+
1867+
sensor_readings[0] = le32toh(temp) / 100.;
1868+
return 1;
1869+
} else {
1870+
sub_cmd_id = MRPC_DIETEMP_GET_GEN5;
1871+
uint32_t temps[4];
1872+
int i;
1873+
1874+
ret = switchtec_cmd(dev, MRPC_DIETEMP, &sub_cmd_id,
1875+
sizeof(sub_cmd_id), temps, sizeof(temps));
1876+
if (ret)
1877+
return -100.0;
1878+
1879+
for (i = 0; i < nr_sensor && i < 4; i++)
1880+
sensor_readings[i] = le32toh(temps[i]) / 100.;
1881+
1882+
return i;
1883+
}
1884+
}
1885+
18281886
int switchtec_bind_info(struct switchtec_dev *dev,
18291887
struct switchtec_bind_status_out *status, int phy_port)
18301888
{

0 commit comments

Comments
 (0)