summaryrefslogtreecommitdiffstats
path: root/sensorhandler.C
diff options
context:
space:
mode:
Diffstat (limited to 'sensorhandler.C')
-rw-r--r--sensorhandler.C232
1 files changed, 99 insertions, 133 deletions
diff --git a/sensorhandler.C b/sensorhandler.C
index 0b16d10..9344abd 100644
--- a/sensorhandler.C
+++ b/sensorhandler.C
@@ -5,132 +5,102 @@
#include <stdint.h>
extern int updateSensorRecordFromSSRAESC(const void *);
+extern int find_interface_property_fru_type(dbus_interface_t *interface, const char *property_name, char *property_value) ;
+extern int find_openbmc_path(const char *type, const uint8_t num, dbus_interface_t *interface) ;
void register_netfn_sen_functions() __attribute__((constructor));
+struct sensorTypemap_t {
+ uint8_t number;
+ char dbusname[32];
+} ;
+
+
+sensorTypemap_t g_SensorTypeMap[] = {
+
+ {0x01, "Temp"},
+ {0x0C, "DIMM"},
+ {0x0C, "MEMORY_BUFFER"},
+ {0x07, "PROC"},
+ {0x07, "CORE"},
+ {0x07, "CPU"},
+ {0x0F, "BootProgress"},
+ {0xC3, "OccStatus"},
+ {0xC3, "BootCount"},
+ {0xFF, ""}
+};
+
+
struct sensor_data_t {
uint8_t sennum;
} __attribute__ ((packed)) ;
-unsigned char g_sensortype [][2] = {
- {0xc7, 58},
-{0x01, 113},
-{0xc7, 56},
-{0x01, 114},
-{0xc6, 54},
-{0x07, 40},
-{0xC1, 121},
-{0xC2, 137},
-{0x07, 36},
-{0x07, 43},
-{0xC1, 122},
-{0xC1, 119},
-{0x01, 12},
-{0x01, 111},
-{0x01, 116},
-{0xC1, 127},
-{0xC2, 134},
-{0xC2, 130},
-{0xc, 33},
-{0xC1, 125},
-{0x01, 115},
-{0x22, 4},
-{0xC2, 138},
-{0x01, 108},
-{0x01, 102},
-{0xc, 46},
-{0x7, 11},
-{0xC1, 120},
-{0x07, 39},
-{0x07, 42},
-{0x5, 21},
-{0xC2, 131},
-{0xc1, 48},
-{0x12, 53},
-{0xC1, 124},
-{0x01, 117},
-{0xC1, 126},
-{0xf, 5},
-{0x23, 0},
-{0xC2, 139},
-{0x07, 34},
-{0x09, 146},
-{0x02, 178},
-{0xC2, 140},
-{0xC1, 118},
-{0xC2, 133},
-{0x07, 38},
-{0xC2, 143},
-{0x01, 101},
-{0xc3, 9},
-{0x7, 10},
-{0xc2, 51},
-{0x01, 109},
-{0xc, 32},
-{0x7, 8},
-{0xC1, 129},
-{0x01, 112},
-{0x01, 107},
-{0x07, 37},
-{0x07, 44},
-{0x1f, 50},
-{0xC2, 144},
-{0xc7, 52},
-{0xC2, 141},
-{0x01, 106},
-{0x01, 110},
-{0x01, 103},
-{0x9, 28},
-{0x07, 35},
-{0xc7, 55},
-{0x03, 179},
-{0x07, 41},
-{0xc, 30},
-{0x01, 100},
-{0xC1, 128},
-{0xC2, 135},
-{0x01, 105},
-{0x7, 47},
-{0xC2, 145},
-{0xc7, 57},
-{0x01, 104},
-{0x07, 45},
-{0xC2, 132},
-{0xc4, 49},
-{0xC1, 123},
-{0xC2, 142},
-{0x01, 13},
-{0xC2, 136},
-{0xc, 31},
-{0xff,0xff}
-};
-
-unsigned char findSensor(char sensor_number) {
+uint8_t dbus_to_sensor_type(char *p) {
- int i=0;
+ sensorTypemap_t *s = g_SensorTypeMap;
+ char r=0;
- // TODO : This function should actually call
- // a dbus object and have it return the data
- // it is not ready yet so use a Palmetto
- // based lookup table for now. The g_sensortype
- // can be removed once the dbus method exists
- while (g_sensortype[i][0] != 0xff) {
- if (g_sensortype[i][1] == sensor_number) {
- break;
- } else {
- i++;
+ while (s->number != 0xFF) {
+ if (!strcmp(s->dbusname,p)) {
+ r = s->number;
+ break;
}
-
+ s++;
}
- return g_sensortype[i][0];
+ if (s->number == 0xFF)
+ printf("Failed to find Sensor Type %s\n", p);
+ return r;
}
-ipmi_ret_t ipmi_sen_get_sensor_type(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
- ipmi_request_t request, ipmi_response_t response,
+
+uint8_t dbus_to_sensor_type_from_dbus(dbus_interface_t *a) {
+ char fru_type_name[64];
+ int r= 0;
+
+ r = find_interface_property_fru_type(a, "fru_type", fru_type_name);
+ if (r<0) {
+ fprintf(stderr, "Failed to get a fru type: %s", strerror(-r));
+ return -1;
+ } else {
+ return dbus_to_sensor_type(fru_type_name);
+ }
+}
+
+
+uint8_t find_sensor(uint8_t sensor_number) {
+
+ dbus_interface_t a;
+ char *p;
+ char r;
+
+ r = find_openbmc_path("SENSOR", sensor_number, &a);
+
+ if (r < 0) { return 0; }
+
+ // This is where sensors that do not exist in dbus but do
+ // exist in the host code stop. This should indicate it
+ // is not a supported sensor
+ if (a.bus[0] == 0) { return 0;}
+
+ if (strstr(a.interface, "InventoryItem")) {
+ // InventoryItems are real frus. So need to get the
+ // fru_type property
+ r = dbus_to_sensor_type_from_dbus(&a);
+ } else {
+ // Non InventoryItems
+ p = strrchr (a.path, '/');
+ r = dbus_to_sensor_type(p+1);
+ }
+
+ return r;
+ }
+
+ipmi_ret_t ipmi_sen_get_sensor_type(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
+ ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context)
{
sensor_data_t *reqptr = (sensor_data_t*)request;
@@ -142,55 +112,51 @@ ipmi_ret_t ipmi_sen_get_sensor_type(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
// need to ask Hostboot team
unsigned char buf[] = {0x00,0x6F};
- buf[0] = findSensor(reqptr->sennum);
+ buf[0] = find_sensor(reqptr->sennum);
- *data_len = sizeof(buf);
- memcpy(response, &buf, *data_len);
+ // HACK UNTIL Dbus gets updated or we find a better way
+ if (buf[0] == 0) {
+
+ switch(reqptr->sennum) {
+ case 0x35 : buf[0] = 0x12; buf[1] = 0x6F; break;
+ case 0x37 : buf[0] = 0xC7; buf[1] = 0x03; break;
+ case 0x38 : buf[0] = 0xC7; buf[1] = 0x03; break;
+ case 0x39 : buf[0] = 0xC7; buf[1] = 0x03; break;
+ case 0x3A : buf[0] = 0xC7; buf[1] = 0x03; break;
+ default: rc = IPMI_CC_SENSOR_INVALID;
+ }
+ }
+ *data_len = sizeof(buf);
+ memcpy(response, &buf, *data_len);
return rc;
}
-// TODO: Saves the sensor information to a file in /tmp. This
-// will need to change to calling the correct method
-// once it exists in the stack.
-ipmi_ret_t ipmi_sen_set_sensor(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
- ipmi_request_t request, ipmi_response_t response,
+ipmi_ret_t ipmi_sen_set_sensor(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
+ ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context)
{
- FILE *fp;
- char string[16];
sensor_data_t *reqptr = (sensor_data_t*)request;
ipmi_ret_t rc = IPMI_CC_OK;
unsigned short rlen;
rlen = (unsigned short) *data_len;
- sprintf(string, "%s%02x", "/tmp/sen", reqptr->sennum);
-
- printf("IPMI SET_SENSOR [%s]\n",string);
-
- if ((fp = fopen(string, "wb")) != NULL) {
- fwrite(reqptr,rlen,1,fp);
- fclose(fp);
- } else {
- fprintf(stderr, "Error trying to write to sensor file %s\n",string);
- ipmi_ret_t rc = IPMI_CC_INVALID;
- }
+ printf("IPMI SET_SENSOR [0x%02x]\n",reqptr->sennum);
updateSensorRecordFromSSRAESC(reqptr);
*data_len=0;
-
return rc;
}
-ipmi_ret_t ipmi_sen_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
- ipmi_request_t request, ipmi_response_t response,
+ipmi_ret_t ipmi_sen_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
+ ipmi_request_t request, ipmi_response_t response,
ipmi_data_len_t data_len, ipmi_context_t context)
{
ipmi_ret_t rc = IPMI_CC_OK;
OpenPOWER on IntegriCloud