diff options
author | Chris Austen <austenc@us.ibm.com> | 2015-10-13 12:40:40 -0500 |
---|---|---|
committer | Chris Austen <austenc@us.ibm.com> | 2015-10-13 12:40:40 -0500 |
commit | 6caf28bd4653890dedfaf8179b68eb2262b96ff0 (patch) | |
tree | 6963a2477353954ce7672198f758031015ce9872 | |
parent | 4f1c79d059c85095137dde110be7eaf141155916 (diff) | |
download | phosphor-host-ipmid-6caf28bd4653890dedfaf8179b68eb2262b96ff0.tar.gz phosphor-host-ipmid-6caf28bd4653890dedfaf8179b68eb2262b96ff0.zip |
Add more ipmi commands for app function
-rwxr-xr-x | apphandler.C | 137 | ||||
-rw-r--r-- | apphandler.h | 6 |
2 files changed, 133 insertions, 10 deletions
diff --git a/apphandler.C b/apphandler.C index c86997f..596ec9c 100755 --- a/apphandler.C +++ b/apphandler.C @@ -1,12 +1,62 @@ #include "apphandler.h" #include "ipmid-api.h" +#include "ipmid.H" #include <stdio.h> #include <string.h> +#include <stdint.h> -void register_netfn_app_cap_bit() __attribute__((constructor)); -void register_netfn_app_wildcard() __attribute__((constructor)); +void register_netfn_app_functions() __attribute__((constructor)); -ipmi_ret_t ipmi_app_cap_bit_handler(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + +ipmi_ret_t ipmi_app_read_event(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; + *data_len = 0; + + printf("IPMI APP READ EVENT Ignoring for now\n"); + return rc; + +} + + +ipmi_ret_t ipmi_app_set_acpi_power_state(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; + *data_len = 0; + + printf("IPMI SET ACPI STATE Ignoring for now\n"); + return rc; +} + +ipmi_ret_t ipmi_app_get_device_id(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; + + // TODO GET REAL VALUES HERE.... I made these ones up because + // we are in bringup mode. Version Major and Minor can be what we + // want like v1.03 but the IANA really should be something that + // we own. I would suggest getting the IANA from Hostboot as + // long as IBM owns it then no problem. If some other company + // gave us the IANA to use then use the one we have from the + // FSP ipmi code. + uint8_t str[] = {0x00, 0, 1, 1,2, 0xD, 0x41, 0xA7, 0x00, 0x43, 0x40}; + + // Data length + *data_len = sizeof(str); + + // Pack the actual response + memcpy(response, &str, *data_len); + return rc; +} + + +ipmi_ret_t ipmi_app_get_bt_capabilities(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) { @@ -15,7 +65,7 @@ ipmi_ret_t ipmi_app_cap_bit_handler(ipmi_netfn_t netfn, ipmi_cmd_t cmd, // Status code. ipmi_ret_t rc = IPMI_CC_OK; - unsigned char str[] = {0x00, 0x01, 0xFE, 0xFF, 0x0A, 0x01}; + uint8_t str[] = {0x01, MAX_IPMI_BUFFER, MAX_IPMI_BUFFER, 0x0A, 0x01}; // Data length *data_len = sizeof(str); @@ -26,6 +76,60 @@ ipmi_ret_t ipmi_app_cap_bit_handler(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return rc; } + +struct set_wd_data_t { + uint8_t t_use; + uint8_t t_action; + uint8_t preset; + uint8_t flags; + uint8_t ls; + uint8_t ms; +} __attribute__ ((packed)); + + + +ipmi_ret_t ipmi_app_set_watchdog(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) +{ + + set_wd_data_t *reqptr = (set_wd_data_t*) request; + uint16_t timer = 0; + // Status code. + ipmi_ret_t rc = IPMI_CC_OK; + + *data_len = 0; + + timer = (((uint16_t)reqptr->ms) << 8) + reqptr->ls; + + printf("WATCHDOG SET Timer:[0x%X] 100ms intervals\n",timer); + + // TODO: Right here is where we would call some dbus method as a timer. + // If the timer expires it would iniate a reboot of the host. + + return rc; +} + + +ipmi_ret_t ipmi_app_reset_watchdog(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) +{ + // Status code. + ipmi_ret_t rc = IPMI_CC_OK; + *data_len = 0; + + printf("WATCHDOG RESET\n"); + // TODO Right here is where we would call some sdbus timer. + // If your are experiencing dejavu you are right. the + // set and the reset do similar things + return rc; +} + + + + + ipmi_ret_t ipmi_app_wildcard_handler(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) @@ -43,16 +147,29 @@ ipmi_ret_t ipmi_app_wildcard_handler(ipmi_netfn_t netfn, ipmi_cmd_t cmd, return rc; } -void register_netfn_app_cap_bit() +void register_netfn_app_functions() { printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_GET_CAP_BIT); - ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CAP_BIT, NULL, ipmi_app_cap_bit_handler); - return; -} + ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CAP_BIT, NULL, ipmi_app_get_bt_capabilities); -void register_netfn_app_wildcard() -{ printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_WILDCARD); ipmi_register_callback(NETFUN_APP, IPMI_CMD_WILDCARD, NULL, ipmi_app_wildcard_handler); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_RESET_WD); + ipmi_register_callback(NETFUN_APP, IPMI_CMD_RESET_WD, NULL, ipmi_app_reset_watchdog); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_SET_WD); + ipmi_register_callback(NETFUN_APP, IPMI_CMD_SET_WD, NULL, ipmi_app_set_watchdog); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_GET_DEVICE_ID); + ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_DEVICE_ID, NULL, ipmi_app_get_device_id); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_SET_ACPI); + ipmi_register_callback(NETFUN_APP, IPMI_CMD_SET_ACPI, NULL, ipmi_app_set_acpi_power_state); + + printf("Registering NetFn:[0x%X], Cmd:[0x%X]\n",NETFUN_APP, IPMI_CMD_READ_EVENT); + ipmi_register_callback(NETFUN_APP, IPMI_CMD_READ_EVENT, NULL, ipmi_app_read_event); return; } + + diff --git a/apphandler.h b/apphandler.h index 602801b..2c4ea22 100644 --- a/apphandler.h +++ b/apphandler.h @@ -5,7 +5,13 @@ enum ipmi_netfn_app_cmds { // Get capability bits + IPMI_CMD_RESET_WD = 0x22, + IPMI_CMD_SET_WD = 0x24, IPMI_CMD_GET_CAP_BIT = 0x36, + IPMI_CMD_GET_DEVICE_ID = 0x00, + IPMI_CMD_SET_ACPI = 0x06, + IPMI_CMD_READ_EVENT = 0x35, + }; #endif |