Skip to content

Commit

Permalink
CR-1125036 CR-1125031 hwmon_sdm: support reading sensor unit_type & t…
Browse files Browse the repository at this point in the history
…hreshold values through sysfs nodes (Xilinx#6720)

* CR-1125031 hwmon_sdm: support reading sensor threshold values through sysfs nodes

Signed-off-by: Rajkumar Rampelli <[email protected]>

* hwmon_sdm: add support to report sensor unit type also through sysfs

Signed-off-by: Rajkumar Rampelli <[email protected]>
  • Loading branch information
rajkumar-xilinx authored May 24, 2022
1 parent 5e43f4d commit 49f007a
Showing 1 changed file with 121 additions and 8 deletions.
129 changes: 121 additions & 8 deletions src/runtime_src/core/pcie/driver/linux/xocl/subdev/hwmon_sdm.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "../xocl_drv.h"
#include "xclfeatures.h"

#define SYSFS_COUNT_PER_SENSOR 5
#define SYSFS_COUNT_PER_SENSOR 12
#define SYSFS_NAME_LEN 30
#define HWMON_SDM_DEFAULT_EXPIRE_SECS 1

Expand All @@ -43,11 +43,18 @@ enum sensor_data_status {
};

enum sysfs_sdr_field_ids {
SYSFS_SDR_NAME = 0,
SYSFS_SDR_INS_VAL = 1,
SYSFS_SDR_MAX_VAL = 2,
SYSFS_SDR_AVG_VAL = 3,
SYSFS_SDR_STATUS_VAL = 4,
SYSFS_SDR_NAME = 0,
SYSFS_SDR_INS_VAL = 1,
SYSFS_SDR_MAX_VAL = 2,
SYSFS_SDR_AVG_VAL = 3,
SYSFS_SDR_STATUS_VAL = 4,
SYSFS_SDR_UNIT_TYPE_VAL = 5,
SYSFS_SDR_UPPER_WARN_VAL = 6,
SYSFS_SDR_UPPER_CRITICAL_VAL = 7,
SYSFS_SDR_UPPER_FATAL_VAL = 8,
SYSFS_SDR_LOWER_WARN_VAL = 9,
SYSFS_SDR_LOWER_CRITICAL_VAL = 0xA,
SYSFS_SDR_LOWER_FATAL_VAL = 0xB,
};

struct xocl_sdr_bdinfo {
Expand Down Expand Up @@ -314,11 +321,18 @@ static ssize_t hwmon_sensor_show(struct device *dev,
sz = sprintf(buf, "%d\n", 0);
}

if (field_id == SYSFS_SDR_NAME) {
if ((field_id == SYSFS_SDR_NAME) ||
(field_id == SYSFS_SDR_UNIT_TYPE_VAL)) {
memcpy(output, &sdm->sensor_data[repo_id][buf_index], buf_len);
sz = snprintf(buf, buf_len + 2, "%s\n", output);
} else if ((field_id == SYSFS_SDR_INS_VAL) ||
(field_id == SYSFS_SDR_AVG_VAL) ||
(field_id == SYSFS_SDR_UPPER_WARN_VAL) ||
(field_id == SYSFS_SDR_UPPER_FATAL_VAL) ||
(field_id == SYSFS_SDR_UPPER_CRITICAL_VAL) ||
(field_id == SYSFS_SDR_LOWER_CRITICAL_VAL) ||
(field_id == SYSFS_SDR_LOWER_WARN_VAL) ||
(field_id == SYSFS_SDR_LOWER_FATAL_VAL) ||
(field_id == SYSFS_SDR_MAX_VAL)) {
if (buf_len > 4) {
//TODO: fix this case
Expand Down Expand Up @@ -473,7 +487,9 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
uint8_t name_length, name_type_length, sys_index, fan_index;
uint8_t val_len, value_type_length, threshold_support_byte;
uint8_t bu_len, sensor_id, base_unit_type_length, unit_modifier_byte;
uint32_t buf_size, name_index, ins_index, max_index = 0, avg_index = 0, status_index;
uint32_t buf_size, name_index, ins_index, max_index = 0, avg_index = 0, status_index, unit_type_index;
uint32_t upper_warning = 0, upper_critical = 0, upper_fatal = 0;
uint32_t lower_warning = 0, lower_critical = 0, lower_fatal = 0;

completion_code = in_buf[SDR_COMPLETE_IDX];

Expand Down Expand Up @@ -539,6 +555,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
base_unit_type_length = in_buf[buf_index++];
if(base_unit_type_length != SDR_NULL_BYTE)
{
unit_type_index = buf_index;
bu_len = base_unit_type_length & SDR_LENGTH_MASK;
buf_index = SDM_BUF_IDX_INCR(buf_index, bu_len, buf_size);
if (buf_index < 0)
Expand All @@ -554,6 +571,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
if(threshold_support_byte & THRESHOLD_UPPER_WARNING_MASK)
{
buf_index = SDM_BUF_IDX_INCR(buf_index, val_len, buf_size);
upper_warning = buf_index;
if (buf_index < 0)
goto abort;
}
Expand All @@ -562,6 +580,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
if(threshold_support_byte & THRESHOLD_UPPER_CRITICAL_MASK)
{
buf_index = SDM_BUF_IDX_INCR(buf_index, val_len, buf_size);
upper_critical = buf_index;
if (buf_index < 0)
goto abort;
}
Expand All @@ -570,6 +589,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
if(threshold_support_byte & THRESHOLD_UPPER_FATAL_MASK)
{
buf_index = SDM_BUF_IDX_INCR(buf_index, val_len, buf_size);
upper_fatal = buf_index;
if (buf_index < 0)
goto abort;
}
Expand All @@ -578,6 +598,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
if(threshold_support_byte & THRESHOLD_LOWER_WARNING_MASK)
{
buf_index = SDM_BUF_IDX_INCR(buf_index, val_len, buf_size);
lower_warning = buf_index;
if (buf_index < 0)
goto abort;
}
Expand All @@ -586,6 +607,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
if(threshold_support_byte & THRESHOLD_LOWER_CRITICAL_MASK)
{
buf_index = SDM_BUF_IDX_INCR(buf_index, val_len, buf_size);
lower_critical = buf_index;
if (buf_index < 0)
goto abort;
}
Expand All @@ -594,6 +616,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
if(threshold_support_byte & THRESHOLD_LOWER_FATAL_MASK)
{
buf_index = SDM_BUF_IDX_INCR(buf_index, val_len, buf_size);
lower_fatal = buf_index;
if (buf_index < 0)
goto abort;
}
Expand Down Expand Up @@ -637,16 +660,30 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
sprintf(sysfs_name[SYSFS_SDR_NAME], "fan%d_label", fan_index);
fan_index++;
} else {
sprintf(sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL], "temp%d_units", sys_index);
sprintf(sysfs_name[SYSFS_SDR_STATUS_VAL], "temp%d_status", sys_index);
sprintf(sysfs_name[SYSFS_SDR_AVG_VAL], "temp%d_average", sys_index);
sprintf(sysfs_name[SYSFS_SDR_MAX_VAL], "temp%d_max", sys_index);
sprintf(sysfs_name[SYSFS_SDR_INS_VAL], "temp%d_input", sys_index);
sprintf(sysfs_name[SYSFS_SDR_NAME], "temp%d_label", sys_index);
if (upper_warning != 0)
sprintf(sysfs_name[SYSFS_SDR_UPPER_WARN_VAL], "temp%d_upper_warn", sys_index);
if (upper_critical != 0)
sprintf(sysfs_name[SYSFS_SDR_UPPER_CRITICAL_VAL], "temp%d_upper_critical", sys_index);
if (upper_fatal != 0)
sprintf(sysfs_name[SYSFS_SDR_UPPER_FATAL_VAL], "temp%d_upper_fatal", sys_index);
if (lower_warning != 0)
sprintf(sysfs_name[SYSFS_SDR_LOWER_WARN_VAL], "temp%d_lower_warn", sys_index);
if (lower_critical != 0)
sprintf(sysfs_name[SYSFS_SDR_LOWER_CRITICAL_VAL], "temp%d_lower_critical", sys_index);
if (lower_fatal != 0)
sprintf(sysfs_name[SYSFS_SDR_LOWER_FATAL_VAL], "temp%d_lower_fatal", sys_index);
sys_index++;
}
create = true;
break;
case SDR_TYPE_VOLTAGE:
sprintf(sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL], "in%d_units", sys_index);
sprintf(sysfs_name[SYSFS_SDR_STATUS_VAL], "in%d_status", sys_index);
sprintf(sysfs_name[SYSFS_SDR_AVG_VAL], "in%d_average", sys_index);
sprintf(sysfs_name[SYSFS_SDR_MAX_VAL], "in%d_max", sys_index);
Expand All @@ -656,6 +693,7 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
create = true;
break;
case SDR_TYPE_CURRENT:
sprintf(sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL], "curr%d_units", sys_index);
sprintf(sysfs_name[SYSFS_SDR_STATUS_VAL], "curr%d_status", sys_index);
sprintf(sysfs_name[SYSFS_SDR_AVG_VAL], "curr%d_average", sys_index);
sprintf(sysfs_name[SYSFS_SDR_MAX_VAL], "curr%d_max", sys_index);
Expand All @@ -665,11 +703,24 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
create = true;
break;
case SDR_TYPE_POWER:
sprintf(sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL], "power%d_units", sys_index);
sprintf(sysfs_name[SYSFS_SDR_STATUS_VAL], "power%d_status", sys_index);
sprintf(sysfs_name[SYSFS_SDR_AVG_VAL], "power%d_average", sys_index);
sprintf(sysfs_name[SYSFS_SDR_MAX_VAL], "power%d_max", sys_index);
sprintf(sysfs_name[SYSFS_SDR_INS_VAL], "power%d_input", sys_index);
sprintf(sysfs_name[SYSFS_SDR_NAME], "power%d_label", sys_index);
if (upper_warning != 0)
sprintf(sysfs_name[SYSFS_SDR_UPPER_WARN_VAL], "power%d_upper_warn", sys_index);
if (upper_critical != 0)
sprintf(sysfs_name[SYSFS_SDR_UPPER_CRITICAL_VAL], "power%d_upper_critical", sys_index);
if (upper_fatal != 0)
sprintf(sysfs_name[SYSFS_SDR_UPPER_FATAL_VAL], "power%d_upper_fatal", sys_index);
if (lower_warning != 0)
sprintf(sysfs_name[SYSFS_SDR_LOWER_WARN_VAL], "power%d_lower_warn", sys_index);
if (lower_critical != 0)
sprintf(sysfs_name[SYSFS_SDR_LOWER_CRITICAL_VAL], "power%d_lower_critical", sys_index);
if (lower_fatal != 0)
sprintf(sysfs_name[SYSFS_SDR_LOWER_FATAL_VAL], "power%d_lower_fatal", sys_index);
sys_index++;
create = true;
break;
Expand Down Expand Up @@ -728,6 +779,68 @@ static int parse_sdr_info(char *in_buf, struct xocl_hwmon_sdm *sdm, bool create_
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_STATUS_VAL], err);
}
}

//Create *_units sysfs node
if(strlen(sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL], repo_id, SYSFS_SDR_UNIT_TYPE_VAL, unit_type_index, bu_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_UNIT_TYPE_VAL], err);
}
}

//Create *_upper_warn sysfs node
if(strlen(sysfs_name[SYSFS_SDR_UPPER_WARN_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_UPPER_WARN_VAL], repo_id,
SYSFS_SDR_UPPER_WARN_VAL, upper_warning, val_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_UPPER_WARN_VAL], err);
}
}

//Create *_upper_critical sysfs node
if(strlen(sysfs_name[SYSFS_SDR_UPPER_CRITICAL_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_UPPER_CRITICAL_VAL], repo_id,
SYSFS_SDR_UPPER_CRITICAL_VAL, upper_critical, val_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_UPPER_CRITICAL_VAL], err);
}
}

//Create *_upper_fatal sysfs node
if(strlen(sysfs_name[SYSFS_SDR_UPPER_FATAL_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_UPPER_FATAL_VAL], repo_id,
SYSFS_SDR_UPPER_FATAL_VAL, upper_fatal, val_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_UPPER_FATAL_VAL], err);
}
}

//Create *_lower_warn sysfs node
if(strlen(sysfs_name[SYSFS_SDR_LOWER_WARN_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_LOWER_WARN_VAL], repo_id,
SYSFS_SDR_LOWER_WARN_VAL, lower_warning, val_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_LOWER_WARN_VAL], err);
}
}

//Create *_lower_critical sysfs node
if(strlen(sysfs_name[SYSFS_SDR_LOWER_CRITICAL_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_LOWER_CRITICAL_VAL], repo_id,
SYSFS_SDR_LOWER_CRITICAL_VAL, lower_critical, val_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_LOWER_CRITICAL_VAL], err);
}
}

//Create *_lower_fatal sysfs node
if(strlen(sysfs_name[SYSFS_SDR_LOWER_FATAL_VAL]) != 0) {
err = hwmon_sysfs_create(sdm, sysfs_name[SYSFS_SDR_LOWER_FATAL_VAL], repo_id,
SYSFS_SDR_LOWER_FATAL_VAL, lower_fatal, val_len);
if (err) {
xocl_err(&sdm->pdev->dev, "Unable to create sysfs node (%s), err: %d\n", sysfs_name[SYSFS_SDR_LOWER_FATAL_VAL], err);
}
}
}
}

Expand Down

0 comments on commit 49f007a

Please sign in to comment.