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);