meta-yosemitev2: add system get/set guid support

Added get/set system GUID command for multi host YosemiteV2,
it reads/writes guid to the corresponding hosts Bridge IC(BIC).

Tested:

Verified this with host reboot(BIOS automatically
sends get GUID command to BMC).

Verified this ipmitool.
 Get System GUID:
 ipmitool raw 60x37

 Set System GUID:
 ipmitool raw 0x30 0xEF 0 252 109 1 0 135 236 73 26
 54 249 84 1 1 80 7 8

Signed-off-by: Manikandan Elumalai <manikandan.hcl.ers.epl@gmail.com>
Change-Id: I4d24a2fb4bf98f38afd7c0d07df0005c22535d48
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index be03ca3..e700d11 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -25,6 +25,9 @@
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 
+#include <ipmid/api.hpp>
+#include <ipmid/api-types.hpp>
+
 #include <array>
 #include <cstring>
 #include <fstream>
@@ -44,6 +47,7 @@
 static void registerOEMFunctions() __attribute__((constructor));
 sdbusplus::bus::bus dbus(ipmid_get_sd_bus_connection()); // from ipmid/api.h
 static constexpr size_t maxFRUStringLength = 0x3F;
+constexpr uint8_t cmdSetSystemGuid = 0xEF;
 
 int plat_udbg_get_post_desc(uint8_t, uint8_t*, uint8_t, uint8_t*, uint8_t*,
                             uint8_t*);
@@ -55,6 +59,9 @@
                                    uint8_t*);
 int sendMeCmd(uint8_t, uint8_t, std::vector<uint8_t>&, std::vector<uint8_t>&);
 
+int sendBicCmd(uint8_t, uint8_t, uint8_t, std::vector<uint8_t>&,
+               std::vector<uint8_t>&);
+
 nlohmann::json oemData __attribute__((init_priority(101)));
 
 static constexpr size_t GUID_SIZE = 16;
@@ -857,6 +864,29 @@
 //----------------------------------------------------------------------
 // Set System GUID (CMD_OEM_SET_SYSTEM_GUID)
 //----------------------------------------------------------------------
+#if BIC_ENABLED
+ipmi::RspType<> ipmiOemSetSystemGuid(ipmi::Context::ptr ctx, uint8_t cmdReq,
+                                     std::vector<uint8_t> reqData)
+{
+    std::vector<uint8_t> respData;
+
+    if (reqData.size() != GUID_SIZE) // 16bytes
+    {
+
+        return ipmi::responseReqDataLenInvalid();
+    }
+
+    auto ptrReqData = reqData.insert(reqData.begin(), reqData.size());
+
+    uint8_t bicAddr = (uint8_t)ctx->hostIdx << 2;
+
+    if (sendBicCmd(ctx->netFn, ctx->cmd, bicAddr, reqData, respData))
+        return ipmi::responseUnspecifiedError();
+
+    return ipmi::responseSuccess();
+}
+
+#else
 ipmi_ret_t ipmiOemSetSystemGuid(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
                                 ipmi_request_t request,
                                 ipmi_response_t response,
@@ -879,6 +909,7 @@
     }
     return IPMI_CC_OK;
 }
+#endif
 
 //----------------------------------------------------------------------
 // Set Bios Flash Info (CMD_OEM_SET_BIOS_FLASH_INFO)
@@ -1664,9 +1695,17 @@
     ipmiPrintAndRegister(NETFUN_NONE, CMD_OEM_SET_PPIN_INFO, NULL,
                          ipmiOemSetPPINInfo,
                          PRIVILEGE_USER); // Set PPIN Info
+#if BIC_ENABLED
+
+    ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnOemOne,
+                          ipmi::cmdSetSystemGuid, ipmi::Privilege::User,
+                          ipmiOemSetSystemGuid);
+#else
+
     ipmiPrintAndRegister(NETFUN_NONE, CMD_OEM_SET_SYSTEM_GUID, NULL,
                          ipmiOemSetSystemGuid,
                          PRIVILEGE_USER); // Set System GUID
+#endif
     ipmiPrintAndRegister(NETFUN_NONE, CMD_OEM_SET_ADR_TRIGGER, NULL,
                          ipmiOemSetAdrTrigger,
                          PRIVILEGE_USER); // Set ADR Trigger