common/sensor/dev/pch.c (39 lines of code) (raw):

#include <stdio.h> #include <stdlib.h> #include "sensor.h" #include "ipmi.h" uint8_t pch_read(uint8_t sensor_num, int *reading) { if (!reading) return SENSOR_UNSPECIFIED_ERROR; ipmb_error status; ipmi_msg *bridge_msg; bridge_msg = (ipmi_msg *)malloc(sizeof(ipmi_msg)); if (bridge_msg == NULL) { printk("pch_read bridge message alloc fail\n"); return SENSOR_UNSPECIFIED_ERROR; } /* read sensor from ME */ bridge_msg->seq_source = 0xff; bridge_msg->netfn = NETFN_SENSOR_REQ; bridge_msg->cmd = CMD_SENSOR_GET_SENSOR_READING; bridge_msg->InF_source = Self_IFs; bridge_msg->InF_target = ME_IPMB_IFs; bridge_msg->data_len = 1; /* parameter offset is the sensor number to read from pch */ bridge_msg->data[0] = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset; status = ipmb_read(bridge_msg, IPMB_inf_index_map[bridge_msg->InF_target]); if (status != ipmb_error_success) { printk("pch_read ipmb read fail, ret %d\n", status); free(bridge_msg); return SENSOR_UNSPECIFIED_ERROR; } sensor_val *sval = (sensor_val *)reading; memset(sval, 0, sizeof(sensor_val)); sval->integer = bridge_msg->data[0]; free(bridge_msg); return SENSOR_READ_SUCCESS; } uint8_t pch_init(uint8_t sensor_num) { sensor_config[SensorNum_SensorCfg_map[sensor_num]].read = pch_read; return SENSOR_INIT_SUCCESS; }