fb-ipmi-oem: yosemitev2: Add Ipmi implementation to handle BIC request
Added Implementation to handle BIC Request from host to BMC and
send the response back to host. We are able to see the BMC
information in the host BIOS.
TESTED : Built Facebook YosemiteV2 images and loaded on
the target hardware. We are able to see BMC information
on two host's BIOS.
Signed-off-by: Kumar Thangavel <thangavel.k@hcl.com>
Change-Id: I7586426809973b5d670d45495daf76e91b82ff23
diff --git a/src/biccommands.cpp b/src/biccommands.cpp
new file mode 100644
index 0000000..4c6ea4e
--- /dev/null
+++ b/src/biccommands.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018 Intel Corporation.
+ * Copyright (c) 2018-present Facebook.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ipmid/api.hpp>
+#include <ipmid/api-types.hpp>
+
+#include <commandutils.hpp>
+#include <biccommands.hpp>
+#include <phosphor-logging/log.hpp>
+
+#include <vector>
+#include <iostream>
+
+namespace ipmi
+{
+
+using namespace phosphor::logging;
+
+static void registerBICFunctions() __attribute__((constructor));
+
+extern message::Response::ptr executeIpmiCommand(message::Request::ptr);
+
+//----------------------------------------------------------------------
+// ipmiOemBicHandler (IPMI/Section - ) (CMD_OEM_BIC_INFO)
+// This Function will handle BIC request for netfn=0x38 and cmd=1
+// send the response back to the sender.
+//----------------------------------------------------------------------
+
+ipmi::RspType<std::array<uint8_t, 3>, uint8_t, uint2_t, uint6_t, uint8_t,
+ uint8_t, ipmi::message::Payload>
+ ipmiOemBicHandler(ipmi::Context::ptr ctx, std::array<uint8_t, 3> iana,
+ uint8_t interface, uint2_t lun, uint6_t netFnReq,
+ uint8_t cmdReq, std::vector<uint8_t> data)
+{
+
+ ipmi::message::Response::ptr res;
+
+ // Updating the correct netfn and cmd in the ipmi Context
+ ctx->netFn = ((uint8_t)netFnReq);
+ ctx->cmd = cmdReq;
+
+ // creating ipmi message request for calling executeIpmiCommand function
+ auto req = std::make_shared<ipmi::message::Request>(
+ ctx, std::forward<std::vector<uint8_t>>(data));
+
+ // Calling executeIpmiCommand request function
+ res = ipmi::executeIpmiCommand(req);
+
+ // sending the response with headers and payload
+ return ipmi::responseSuccess(iana, interface, lun, ++netFnReq, cmdReq,
+ res->cc, res->payload);
+}
+
+static void registerBICFunctions(void)
+{
+
+ phosphor::logging::log<phosphor::logging::level::INFO>(
+ "Registering BIC commands");
+
+ ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnOemFive,
+ cmdOemBicInfo, ipmi::Privilege::User,
+ ipmiOemBicHandler);
+ return;
+}
+
+} // namespace ipmi