mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 22:25:03 +00:00
habanalabs: support temperature offset via sysfs
This commit adds support for offsetting the temperatures reading by a specified value as defined in https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface using the standard sysfs defined for hwmon. This is required by system administrators to inject errors to test their monitoring applications in data centers. Signed-off-by: Moti Haimovski <mhaimovski@habana.ai> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
e5509d5279
commit
5557b138dc
3 changed files with 51 additions and 1 deletions
|
@ -1610,6 +1610,8 @@ int hl_pci_set_dma_mask(struct hl_device *hdev, u8 dma_mask);
|
||||||
long hl_get_frequency(struct hl_device *hdev, u32 pll_index, bool curr);
|
long hl_get_frequency(struct hl_device *hdev, u32 pll_index, bool curr);
|
||||||
void hl_set_frequency(struct hl_device *hdev, u32 pll_index, u64 freq);
|
void hl_set_frequency(struct hl_device *hdev, u32 pll_index, u64 freq);
|
||||||
long hl_get_temperature(struct hl_device *hdev, int sensor_index, u32 attr);
|
long hl_get_temperature(struct hl_device *hdev, int sensor_index, u32 attr);
|
||||||
|
int hl_set_temperature(struct hl_device *hdev,
|
||||||
|
int sensor_index, u32 attr, long value);
|
||||||
long hl_get_voltage(struct hl_device *hdev, int sensor_index, u32 attr);
|
long hl_get_voltage(struct hl_device *hdev, int sensor_index, u32 attr);
|
||||||
long hl_get_current(struct hl_device *hdev, int sensor_index, u32 attr);
|
long hl_get_current(struct hl_device *hdev, int sensor_index, u32 attr);
|
||||||
long hl_get_fan_speed(struct hl_device *hdev, int sensor_index, u32 attr);
|
long hl_get_fan_speed(struct hl_device *hdev, int sensor_index, u32 attr);
|
||||||
|
|
|
@ -125,6 +125,7 @@ static int hl_read(struct device *dev, enum hwmon_sensor_types type,
|
||||||
case hwmon_temp_crit:
|
case hwmon_temp_crit:
|
||||||
case hwmon_temp_max_hyst:
|
case hwmon_temp_max_hyst:
|
||||||
case hwmon_temp_crit_hyst:
|
case hwmon_temp_crit_hyst:
|
||||||
|
case hwmon_temp_offset:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -192,6 +193,15 @@ static int hl_write(struct device *dev, enum hwmon_sensor_types type,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case hwmon_temp:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_temp_offset:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
hl_set_temperature(hdev, channel, attr, val);
|
||||||
|
break;
|
||||||
case hwmon_pwm:
|
case hwmon_pwm:
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
case hwmon_pwm_input:
|
case hwmon_pwm_input:
|
||||||
|
@ -220,6 +230,8 @@ static umode_t hl_is_visible(const void *data, enum hwmon_sensor_types type,
|
||||||
case hwmon_temp_crit:
|
case hwmon_temp_crit:
|
||||||
case hwmon_temp_crit_hyst:
|
case hwmon_temp_crit_hyst:
|
||||||
return 0444;
|
return 0444;
|
||||||
|
case hwmon_temp_offset:
|
||||||
|
return 0644;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case hwmon_in:
|
case hwmon_in:
|
||||||
|
@ -291,6 +303,31 @@ long hl_get_temperature(struct hl_device *hdev, int sensor_index, u32 attr)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int hl_set_temperature(struct hl_device *hdev,
|
||||||
|
int sensor_index, u32 attr, long value)
|
||||||
|
{
|
||||||
|
struct armcp_packet pkt;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
memset(&pkt, 0, sizeof(pkt));
|
||||||
|
|
||||||
|
pkt.ctl = cpu_to_le32(ARMCP_PACKET_TEMPERATURE_SET <<
|
||||||
|
ARMCP_PKT_CTL_OPCODE_SHIFT);
|
||||||
|
pkt.sensor_index = __cpu_to_le16(sensor_index);
|
||||||
|
pkt.type = __cpu_to_le16(attr);
|
||||||
|
pkt.value = __cpu_to_le64(value);
|
||||||
|
|
||||||
|
rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt),
|
||||||
|
SENSORS_PKT_TIMEOUT, NULL);
|
||||||
|
|
||||||
|
if (rc)
|
||||||
|
dev_err(hdev->dev,
|
||||||
|
"Failed to set temperature of sensor %d, error %d\n",
|
||||||
|
sensor_index, rc);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
long hl_get_voltage(struct hl_device *hdev, int sensor_index, u32 attr)
|
long hl_get_voltage(struct hl_device *hdev, int sensor_index, u32 attr)
|
||||||
{
|
{
|
||||||
struct armcp_packet pkt;
|
struct armcp_packet pkt;
|
||||||
|
|
|
@ -189,6 +189,10 @@ enum pq_init_status {
|
||||||
* ArmCP to write to the structure, to prevent data corruption in case of
|
* ArmCP to write to the structure, to prevent data corruption in case of
|
||||||
* mismatched driver/FW versions.
|
* mismatched driver/FW versions.
|
||||||
*
|
*
|
||||||
|
* ARMCP_PACKET_TEMPERATURE_SET -
|
||||||
|
* Set the value of the offset property of a specified thermal sensor.
|
||||||
|
* The packet's arguments specify the desired sensor and the field to
|
||||||
|
* set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum armcp_packet_id {
|
enum armcp_packet_id {
|
||||||
|
@ -214,6 +218,8 @@ enum armcp_packet_id {
|
||||||
ARMCP_PACKET_MAX_POWER_GET, /* sysfs */
|
ARMCP_PACKET_MAX_POWER_GET, /* sysfs */
|
||||||
ARMCP_PACKET_MAX_POWER_SET, /* sysfs */
|
ARMCP_PACKET_MAX_POWER_SET, /* sysfs */
|
||||||
ARMCP_PACKET_EEPROM_DATA_GET, /* sysfs */
|
ARMCP_PACKET_EEPROM_DATA_GET, /* sysfs */
|
||||||
|
ARMCP_RESERVED,
|
||||||
|
ARMCP_PACKET_TEMPERATURE_SET, /* sysfs */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ARMCP_PACKET_FENCE_VAL 0xFE8CE7A5
|
#define ARMCP_PACKET_FENCE_VAL 0xFE8CE7A5
|
||||||
|
@ -271,12 +277,17 @@ enum armcp_packet_rc {
|
||||||
armcp_packet_fault
|
armcp_packet_fault
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* armcp_temp_type should adhere to hwmon_temp_attributes
|
||||||
|
* defined in Linux kernel hwmon.h file
|
||||||
|
*/
|
||||||
enum armcp_temp_type {
|
enum armcp_temp_type {
|
||||||
armcp_temp_input,
|
armcp_temp_input,
|
||||||
armcp_temp_max = 6,
|
armcp_temp_max = 6,
|
||||||
armcp_temp_max_hyst,
|
armcp_temp_max_hyst,
|
||||||
armcp_temp_crit,
|
armcp_temp_crit,
|
||||||
armcp_temp_crit_hyst
|
armcp_temp_crit_hyst,
|
||||||
|
armcp_temp_offset = 19
|
||||||
};
|
};
|
||||||
|
|
||||||
enum armcp_in_attributes {
|
enum armcp_in_attributes {
|
||||||
|
|
Loading…
Reference in a new issue