Skip to content

Commit 440191f

Browse files
committed
Merge pull request openbmc#54 from causten/sensorpolling
Add support for get-sensor-reading
2 parents e90d8bf + 1864155 commit 440191f

File tree

6 files changed

+128
-39
lines changed

6 files changed

+128
-39
lines changed

ipmid.C

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -561,18 +561,15 @@ final:
561561
// Routines used by ipmi commands wanting to interact on the dbus
562562
//
563563
/////////////////////////////////////////////////////////////////////
564-
565-
566-
// Simple set routine because some methods are standard.
567-
int set_sensor_dbus_state(uint8_t number, const char *method, const char *value) {
564+
int set_sensor_dbus_state_s(uint8_t number, const char *method, const char *value) {
568565

569566

570567
dbus_interface_t a;
571568
int r;
572569
sd_bus_error error = SD_BUS_ERROR_NULL;
573-
sd_bus_message *reply = NULL, *m=NULL;
570+
sd_bus_message *m=NULL;
574571

575-
fprintf(ipmidbus, "Attempting to set a dbus Sensor 0x%02x via %s with a value of %s\n",
572+
fprintf(ipmidbus, "Attempting to set a dbus Variant Sensor 0x%02x via %s with a value of %s\n",
576573
number, method, value);
577574

578575
r = find_openbmc_path("SENSOR", number, &a);
@@ -582,31 +579,32 @@ int set_sensor_dbus_state(uint8_t number, const char *method, const char *value)
582579
fprintf(stderr, "Failed to create a method call: %s", strerror(-r));
583580
}
584581

585-
r = sd_bus_message_append(m, "s", value);
582+
r = sd_bus_message_append(m, "v", "s", value);
586583
if (r < 0) {
587584
fprintf(stderr, "Failed to create a input parameter: %s", strerror(-r));
588585
}
589586

590-
r = sd_bus_call(bus, m, 0, &error, &reply);
587+
588+
r = sd_bus_call(bus, m, 0, &error, NULL);
591589
if (r < 0) {
592590
fprintf(stderr, "Failed to call the method: %s", strerror(-r));
593591
}
594592

593+
595594
sd_bus_error_free(&error);
596595
sd_bus_message_unref(m);
597596

598597
return 0;
599598
}
600-
601-
int set_sensor_dbus_state_v(uint8_t number, const char *method, char *value) {
599+
int set_sensor_dbus_state_y(uint8_t number, const char *method, const uint8_t value) {
602600

603601

604602
dbus_interface_t a;
605603
int r;
606604
sd_bus_error error = SD_BUS_ERROR_NULL;
607605
sd_bus_message *m=NULL;
608606

609-
fprintf(ipmidbus, "Attempting to set a dbus Variant Sensor 0x%02x via %s with a value of %s\n",
607+
fprintf(ipmidbus, "Attempting to set a dbus Variant Sensor 0x%02x via %s with a value of 0x%02x\n",
610608
number, method, value);
611609

612610
r = find_openbmc_path("SENSOR", number, &a);
@@ -616,7 +614,7 @@ int set_sensor_dbus_state_v(uint8_t number, const char *method, char *value) {
616614
fprintf(stderr, "Failed to create a method call: %s", strerror(-r));
617615
}
618616

619-
r = sd_bus_message_append(m, "v", "s", value);
617+
r = sd_bus_message_append(m, "v", "y", value);
620618
if (r < 0) {
621619
fprintf(stderr, "Failed to create a input parameter: %s", strerror(-r));
622620
}
@@ -632,4 +630,4 @@ int set_sensor_dbus_state_v(uint8_t number, const char *method, char *value) {
632630
sd_bus_message_unref(m);
633631

634632
return 0;
635-
}
633+
}

ipmid.H

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ ipmi_ret_t ipmi_netfn_router(const ipmi_netfn_t, const ipmi_cmd_t, ipmi_request_
2020

2121
extern FILE *ipmiio, *ipmidbus, *ipmicmddetails;
2222

23-
#endif
23+
int set_sensor_dbus_state_s(uint8_t , const char *, const char *);
24+
int set_sensor_dbus_state_y(uint8_t , const char *, const uint8_t);
25+
#endif

ipmisensor.C

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
#include <string.h>
33
#include <stdint.h>
44
#include <malloc.h>
5-
5+
#include <ipmid.H>
6+
#include "sensorhandler.h"
67

78
extern uint8_t find_sensor(uint8_t);
8-
extern int set_sensor_dbus_state_v(uint8_t , const char *, char *);
99

1010

1111
struct sensorRES_t {
@@ -30,19 +30,20 @@ struct lookup_t {
3030
uint8_t sensor_type;
3131
uint8_t offset;
3232
int (*func)(const sensorRES_t *, const lookup_t *, const char *);
33-
char method[16];
33+
char member[16];
3434
char assertion[64];
3535
char deassertion[64];
3636
};
3737

38-
39-
extern int updateDbusInterface(uint8_t , const char *, const char *) ;
40-
extern int set_sensor_dbus_state(uint8_t ,const char *, const char *);
38+
extern int updateDbusInterface(uint8_t , const char *, const char *);
39+
extern int find_openbmc_path(const char *, const uint8_t , dbus_interface_t *) ;
4140

4241

4342
int set_sensor_dbus_state_simple(const sensorRES_t *pRec, const lookup_t *pTable, const char *value) {
4443

45-
return set_sensor_dbus_state(pRec->sensor_number, pTable->method, value);
44+
return set_sensor_dbus_state_s(pRec->sensor_number,
45+
pTable->member,
46+
value);
4647
}
4748

4849
struct event_data_t {
@@ -133,18 +134,17 @@ int set_sensor_dbus_state_fwprogress(const sensorRES_t *pRec, const lookup_t *pT
133134
break;
134135
}
135136

136-
return set_sensor_dbus_state_v(pRec->sensor_number, pTable->method, p);
137+
return set_sensor_dbus_state_s(pRec->sensor_number,
138+
pTable->member,
139+
p);
137140
}
138141

139142
// Handling this special OEM sensor by coping what is in byte 4. I also think that is odd
140143
// considering byte 3 is for sensor reading. This seems like a misuse of the IPMI spec
141144
int set_sensor_dbus_state_osbootcount(const sensorRES_t *pRec, const lookup_t *pTable, const char *value) {
142-
char valuestring[32];
143-
char* pStr = valuestring;
144-
145-
sprintf(valuestring, "%d", pRec->assert_state7_0);
146-
147-
return set_sensor_dbus_state_v(pRec->sensor_number, pTable->method, pStr);
145+
return set_sensor_dbus_state_y(pRec->sensor_number,
146+
"setValue",
147+
pRec->assert_state7_0);
148148
}
149149

150150
int set_sensor_dbus_state_system_event(const sensorRES_t *pRec, const lookup_t *pTable, const char *value) {
@@ -167,7 +167,9 @@ int set_sensor_dbus_state_system_event(const sensorRES_t *pRec, const lookup_t *
167167
break;
168168
}
169169

170-
return set_sensor_dbus_state_v(pRec->sensor_number, pTable->method, p);
170+
return set_sensor_dbus_state_s(pRec->sensor_number,
171+
pTable->member,
172+
p);
171173
}
172174

173175

sensorhandler.C

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <stdio.h>
44
#include <string.h>
55
#include <stdint.h>
6+
#include <systemd/sd-bus.h>
67

78
extern int updateSensorRecordFromSSRAESC(const void *);
89
extern int find_interface_property_fru_type(dbus_interface_t *interface, const char *property_name, char *property_value) ;
@@ -32,6 +33,7 @@ sensorTypemap_t g_SensorTypeMap[] = {
3233
{0x12, 0x6F, "SYSTEM_EVENT"},
3334
{0xC7, 0x03, "SYSTEM"},
3435
{0xC7, 0x03, "MAIN_PLANAR"},
36+
{0xC2, 0x6F, "PowerCap"},
3537
{0xFF, 0x00, ""},
3638
};
3739

@@ -40,6 +42,11 @@ struct sensor_data_t {
4042
uint8_t sennum;
4143
} __attribute__ ((packed)) ;
4244

45+
struct sensorreadingresp_t {
46+
uint8_t value;
47+
uint8_t operation;
48+
uint8_t indication[2];
49+
} __attribute__ ((packed)) ;
4350

4451
uint8_t dbus_to_sensor_type(char *p) {
4552

@@ -104,6 +111,10 @@ uint8_t find_sensor(uint8_t sensor_number) {
104111
return r;
105112
}
106113

114+
115+
116+
117+
107118
ipmi_ret_t ipmi_sen_get_sensor_type(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
108119
ipmi_request_t request, ipmi_response_t response,
109120
ipmi_data_len_t data_len, ipmi_context_t context)
@@ -149,6 +160,72 @@ ipmi_ret_t ipmi_sen_set_sensor(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
149160
return rc;
150161
}
151162

163+
164+
ipmi_ret_t ipmi_sen_get_sensor_reading(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
165+
ipmi_request_t request, ipmi_response_t response,
166+
ipmi_data_len_t data_len, ipmi_context_t context)
167+
{
168+
sensor_data_t *reqptr = (sensor_data_t*)request;
169+
ipmi_ret_t rc = IPMI_CC_SENSOR_INVALID;
170+
uint8_t type;
171+
sensorreadingresp_t *resp = (sensorreadingresp_t*) response;
172+
int r;
173+
dbus_interface_t a;
174+
sd_bus *bus = ipmid_get_sd_bus_connection();
175+
sd_bus_message *reply = NULL;
176+
uint8_t reading;
177+
178+
179+
printf("IPMI GET_SENSOR_READING [0x%02x]\n",reqptr->sennum);
180+
181+
r = find_openbmc_path("SENSOR", reqptr->sennum, &a);
182+
183+
type = find_sensor(reqptr->sennum);
184+
185+
fprintf(stderr, "Bus: %s, Path: %s, Interface: %s\n", a.bus, a.path, a.interface);
186+
187+
*data_len=0;
188+
189+
switch(type) {
190+
case 0xC3:
191+
case 0xC2:
192+
r = sd_bus_get_property(bus,a.bus, a.path, a.interface, "value", NULL, &reply, "y");
193+
if (r < 0) {
194+
fprintf(stderr, "Failed to call sd_bus_get_property:%d, %s\n", r, strerror(-r));
195+
fprintf(stderr, "Bus: %s, Path: %s, Interface: %s\n",
196+
a.bus, a.path, a.interface);
197+
break;
198+
}
199+
200+
r = sd_bus_message_read(reply, "y", &reading);
201+
if (r < 0) {
202+
fprintf(stderr, "Failed to read byte: %s\n", strerror(-r));
203+
break;
204+
}
205+
206+
printf("Contents of a 0x%02x is 0x%02x\n", type, reading);
207+
208+
rc = IPMI_CC_OK;
209+
*data_len=sizeof(sensorreadingresp_t);
210+
211+
resp->value = reading;
212+
resp->operation = 0;
213+
resp->indication[0] = 0;
214+
resp->indication[1] = 0;
215+
break;
216+
217+
default:
218+
*data_len=0;
219+
rc = IPMI_CC_SENSOR_INVALID;
220+
break;
221+
}
222+
223+
224+
sd_bus_message_unref(reply);
225+
226+
return rc;
227+
}
228+
152229
ipmi_ret_t ipmi_sen_wildcard(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
153230
ipmi_request_t request, ipmi_response_t response,
154231
ipmi_data_len_t data_len, ipmi_context_t context)
@@ -173,5 +250,8 @@ void register_netfn_sen_functions()
173250
printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_SET_SENSOR);
174251
ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_SET_SENSOR, NULL, ipmi_sen_set_sensor);
175252

253+
printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_READING);
254+
ipmi_register_callback(NETFUN_SENSOR, IPMI_CMD_GET_SENSOR_READING, NULL, ipmi_sen_get_sensor_reading);
255+
176256
return;
177257
}

sensorhandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// IPMI commands for net functions.
77
enum ipmi_netfn_sen_cmds
88
{
9+
IPMI_CMD_GET_SENSOR_READING = 0x2D,
910
IPMI_CMD_GET_SENSOR_TYPE = 0x2F,
1011
IPMI_CMD_SET_SENSOR = 0x30,
1112
};

testit.C

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,31 @@ char g_results_method[64];
3737
char g_results_value[64];
3838

3939

40-
int set_sensor_dbus_state_v(uint8_t number, const char *method, char *value) {
41-
printf("Attempting to log Variant Sensor 0x%02x via %s with a value of %s\n",
42-
number, method, value);
40+
int set_sensor_dbus_state_s(unsigned char number, const char *member, const char *value) {
41+
printf("Attempting to log 0x%02x via %s with a value of %s\n",
42+
number, member, value);
4343

44-
strcpy(g_results_method, method);
44+
strcpy(g_results_method, member);
4545
strcpy(g_results_value, value);
4646

4747
return 0;
4848
}
4949

50-
int set_sensor_dbus_state(uint8_t number, const char *method, const char *value) {
50+
int set_sensor_dbus_state_y(unsigned char number, char const* member, uint8_t value) {
51+
52+
char val[2];
5153

52-
printf("Attempting to log Sensor 0x%02x via %s with a value of %s\n",
53-
number, method, value);
5454

55-
strcpy(g_results_method, method);
56-
strcpy(g_results_value, value);
55+
printf("Attempting to log Variant Sensor 0x%02x via %s with a value of 0x%02x\n",
56+
number, member, value);
5757

58-
return 0;
58+
59+
snprintf(val, 2, "%d", value);
60+
61+
strcpy(g_results_method, member);
62+
strcpy(g_results_value, val);
63+
64+
return 0;
5965
}
6066

6167

0 commit comments

Comments
 (0)