Add wistron oem command to switch 250 soc image
(1)Switch to backup flash
ipmitool raw 0x32 0x02 0x00
(2)Switch to default flash
ipmitool raw 0x32 0x02 0x01
Change-Id: Ibe5d0f6869abc54a45f98c90bd9a87bf3d3aa9c8
Signed-off-by: Ben Pai <Ben_Pai@wistron.com>
diff --git a/wistronoem.cpp b/wistronoem.cpp
index 756fac5..b27e248 100644
--- a/wistronoem.cpp
+++ b/wistronoem.cpp
@@ -24,6 +24,7 @@
#define RISERF_SLAVE_ADDRESS 16 /* Hexadecimal value:0x10 */
void register_detect_riserf() __attribute__((constructor));
+void register_switch_image() __attribute__((constructor));
ipmi_ret_t ipmi_wistron_detect_riserf(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_request_t request,
@@ -86,9 +87,47 @@
return IPMI_CC_OK;
}
+ipmi_ret_t ipmi_wistron_switch_image(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)
+{
+ int rc = 0;
+ uint8_t *reqptr = (uint8_t *) request;
+
+ // Switch to backup flash.
+ if (reqptr[0] == 0)
+ {
+ system("gpioset gpiochip1 1=0");
+ }
+
+ // Switch to default flash.
+ else if (reqptr[0] == 1)
+ {
+ system("gpioset gpiochip1 1=1");
+ }
+
+ else
+ {
+ rc = -1;
+ }
+
+ if(rc != 0)
+ {
+ return IPMI_CC_PARM_OUT_OF_RANGE;
+ }
+
+ return IPMI_CC_OK;
+}
void register_detect_riserf()
{
ipmi_register_callback(NETFUN_OEM, IPMI_CMD_DETECT_RISERF, NULL,
ipmi_wistron_detect_riserf, SYSTEM_INTERFACE);
}
+void register_switch_image()
+{
+ ipmi_register_callback(NETFUN_OEM, IPMI_CMD_SWITCH_BITTWARE_IMAGE, NULL,
+ ipmi_wistron_switch_image, SYSTEM_INTERFACE);
+}
diff --git a/wistronoem.hpp b/wistronoem.hpp
index e9edd13..f9952a5 100644
--- a/wistronoem.hpp
+++ b/wistronoem.hpp
@@ -10,6 +10,7 @@
enum ipmi_netfn_oem_cmds
{
IPMI_CMD_DETECT_RISERF = 0x01,
+ IPMI_CMD_SWITCH_BITTWARE_IMAGE = 0x02,
};
constexpr int initError = -1; /* The parameter of definition error */
@@ -28,3 +29,9 @@
ipmi_response_t response,
ipmi_data_len_t data_len,
ipmi_context_t context);
+
+ipmi_ret_t ipmi_wistron_switch_image(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);