diff options
Diffstat (limited to 'meta-ibs/meta-cp2-5422/recipes-ibs/ipmi/intel-ipmi-oem/0001-Rikor-smbios-mdrv1-support.patch')
-rw-r--r-- | meta-ibs/meta-cp2-5422/recipes-ibs/ipmi/intel-ipmi-oem/0001-Rikor-smbios-mdrv1-support.patch | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/meta-ibs/meta-cp2-5422/recipes-ibs/ipmi/intel-ipmi-oem/0001-Rikor-smbios-mdrv1-support.patch b/meta-ibs/meta-cp2-5422/recipes-ibs/ipmi/intel-ipmi-oem/0001-Rikor-smbios-mdrv1-support.patch new file mode 100644 index 0000000000..8c6bdb0aa8 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-ibs/ipmi/intel-ipmi-oem/0001-Rikor-smbios-mdrv1-support.patch @@ -0,0 +1,222 @@ +diff --git a/src/smbioshandler.cpp b/src/smbioshandler.cpp +index e330e5a..632274f 100644 +--- a/src/smbioshandler.cpp ++++ b/src/smbioshandler.cpp +@@ -26,6 +26,7 @@ + #include <iostream> + #include <string> + #include <vector> ++#include <functional> + + using InternalFailure = + sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; +@@ -43,6 +44,8 @@ ipmi_ret_t cmd_region_status(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) + { ++ std::cout << __PRETTY_FUNCTION__ << std::endl; ++ + auto requestData = reinterpret_cast<const RegionStatusRequest*>(request); + std::vector<uint8_t> status; + +@@ -127,7 +130,7 @@ static int set_regionId(uint8_t regionId, std::string& service) + return 0; + } + +-ipmi_ret_t cmd_region_complete(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ++ipmi_ret_t cmd_region_complete_base(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) + { +@@ -145,6 +148,10 @@ ipmi_ret_t cmd_region_complete(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + uint8_t regionId = requestData->regionId - 1; + *data_len = 0; + ++ std::cout << __PRETTY_FUNCTION__ ++ << " session: " << static_cast<int>(requestData->sessionId) ++ << " regionId: " << static_cast<int>(requestData->regionId) << std::endl; ++ + if (regionId >= maxMDRId) + { + phosphor::logging::log<level::ERR>("Invalid region"); +@@ -170,15 +177,15 @@ ipmi_ret_t cmd_region_complete(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE; + } + +- if (0 > sdplus_mdrv1_get_property("SessionId", value, service)) +- { +- phosphor::logging::log<level::ERR>("Error getting sessionId"); +- return IPMI_CC_UNSPECIFIED_ERROR; +- } +- if (requestData->sessionId != std::get<uint8_t>(value)) +- { +- return IPMI_CC_OEM_SET_IN_PROCESS; +- } ++ // if (0 > sdplus_mdrv1_get_property("SessionId", value, service)) ++ // { ++ // phosphor::logging::log<level::ERR>("Error getting sessionId"); ++ // return IPMI_CC_UNSPECIFIED_ERROR; ++ // } ++ // if (requestData->sessionId != std::get<uint8_t>(value)) ++ // { ++ // return IPMI_CC_OEM_SET_IN_PROCESS; ++ // } + + auto method = bus->new_method_call(service.c_str(), MDRV1_PATH, + MDRV1_INTERFACE, "RegionComplete"); +@@ -204,10 +211,22 @@ ipmi_ret_t cmd_region_complete(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + return IPMI_CC_OK; + } + ++ipmi_ret_t cmd_region_complete(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) ++{ ++ auto retval = cmd_region_complete_base(netfn, cmd, request, response, data_len, context); ++ std::cout << __FUNCTION__ << " retval: " << static_cast<int>(retval) << std::endl; ++ return retval; ++} ++ ++ + ipmi_ret_t cmd_region_read(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) + { ++ std::cout << __PRETTY_FUNCTION__ << std::endl; ++ + auto requestData = reinterpret_cast<const RegionReadRequest*>(request); + auto responseData = reinterpret_cast<RegionReadResponse*>(response); + std::variant<uint8_t, uint16_t> regUsedVal; +@@ -303,6 +322,8 @@ ipmi_ret_t cmd_region_write(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) + { ++ std::cout << __PRETTY_FUNCTION__ << std::endl; ++ + auto requestData = reinterpret_cast<const RegionWriteRequest*>(request); + uint8_t regionId = requestData->regionId - 1; + std::string res; +@@ -336,36 +357,60 @@ ipmi_ret_t cmd_region_write(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + return IPMI_CC_UNSPECIFIED_ERROR; + } + +- if (0 > sdplus_mdrv1_get_property("LockPolicy", value, service)) +- { +- phosphor::logging::log<level::ERR>("Error getting lockPolicy"); +- return IPMI_CC_UNSPECIFIED_ERROR; +- } +- if (regionLockUnlocked == std::get<uint8_t>(value)) +- { +- return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE; +- } +- +- if (0 > sdplus_mdrv1_get_property("SessionId", value, service)) +- { +- phosphor::logging::log<level::ERR>("Error getting sessionId"); +- return IPMI_CC_UNSPECIFIED_ERROR; +- } +- if (requestData->sessionId != std::get<uint8_t>(value)) +- { +- return IPMI_CC_OEM_SET_IN_PROCESS; +- } +- +- std::copy(&(requestData->length), &(requestData->data[requestData->length]), +- tmp); ++ // if (0 > sdplus_mdrv1_get_property("LockPolicy", value, service)) ++ // { ++ // phosphor::logging::log<level::ERR>("Error getting lockPolicy"); ++ // return IPMI_CC_UNSPECIFIED_ERROR; ++ // } ++ // if (regionLockUnlocked == std::get<uint8_t>(value)) ++ // { ++ // std::cout << "shaj: regionLockUnlocked " << regionLockUnlocked << " " << std::get<uint8_t>(value) << std::endl; ++ // return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE; ++ // } ++ ++ // if (0 > sdplus_mdrv1_get_property("SessionId", value, service)) ++ // { ++ // phosphor::logging::log<level::ERR>("Error getting sessionId"); ++ // return IPMI_CC_UNSPECIFIED_ERROR; ++ // } ++ // if (requestData->sessionId != std::get<uint8_t>(value)) ++ // { ++ // std::cout << "shaj: requestData->sessionId " << static_cast<int>(requestData->sessionId) << std::endl; ++ // std::cout << "shaj: requestData (value) " << static_cast<int>(std::get<uint8_t>(value)) << std::endl; ++ // return IPMI_CC_OEM_SET_IN_PROCESS; ++ // } ++ ++ std::copy(&(requestData->length), &(requestData->data[requestData->length]), tmp); + writeData.push_back(regionId); + for (index = 0; index < minInputLen + requestData->length - 2; index++) + { + writeData.push_back(tmp[index]); + } + +- auto method = bus->new_method_call(service.c_str(), MDRV1_PATH, +- MDRV1_INTERFACE, "RegionWrite"); ++ // [Строка](https://github.com/openbmc/entity-manager/blob/e45d8c71bdbae39f14a638137da9dc03474536c1/include/utils.hpp#L112) ++ // std::hash<std::vector<uint8_t>> h_f; ++ // std::hash<std::string> h_f; ++ ++ size_t d_hash = 0; ++ std::for_each(writeData.cbegin()+3, writeData.cend(), [&d_hash](auto c){d_hash ^= std::hash<uint8_t>{}(c);}); ++ ++ std::cout << "shaj: HOST string hash: " << d_hash << std::endl; ++ ++ // std::cout << "shaj: mdrv1 write: " << service.c_str() << " " << MDRV1_PATH << " " << MDRV1_INTERFACE ++ // << " region Id " << static_cast<int>(regionId) << std::endl; ++ ++ // std::cout << std::hex; ++ // for(int ii=0; ii<3; ii++) ++ // { ++ // for(int jj=0; jj<16; jj++) ++ // { ++ // std::cout << std::setfill('0') << std::setw(2) << static_cast<int>(tmp[ii*16+jj]) << " "; ++ // } ++ // std::cout << std::endl; ++ // } ++ // std::cout << std::resetiosflags(std::ios_base::basefield); ++ ++ auto method = bus->new_method_call(service.c_str(), MDRV1_PATH, MDRV1_INTERFACE, "RegionWrite"); + + method.append(writeData); + +@@ -394,7 +439,7 @@ ipmi_ret_t cmd_region_write(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + return IPMI_CC_OK; + } + +-ipmi_ret_t cmd_region_lock(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ++ipmi_ret_t cmd_region_lock_base(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) + { +@@ -404,6 +449,10 @@ ipmi_ret_t cmd_region_lock(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + auto res = reinterpret_cast<uint8_t*>(response); + uint8_t lockResponse; + ++ std::cout << __PRETTY_FUNCTION__ ++ << " session: " << static_cast<int>(requestData->sessionId) ++ << " regionId: " << static_cast<int>(requestData->regionId) << std::endl; ++ + if (*data_len != sizeof(RegionLockRequest)) + { + *data_len = 0; +@@ -476,6 +525,18 @@ ipmi_ret_t cmd_region_lock(ipmi_netfn_t netfn, ipmi_cmd_t cmd, + return IPMI_CC_OK; + } + ++ ++ipmi_ret_t cmd_region_lock(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) ++{ ++ auto retval = cmd_region_lock_base(netfn, cmd, request, response, data_len, context); ++ std::cout << __FUNCTION__ << " retval: " << static_cast<int>(retval) << std::endl; ++ std::cout << "shaj: sessionId: " << static_cast<int>(*(reinterpret_cast<uint8_t*>(response))) << std::endl; ++ return retval; ++} ++ ++ + static void register_netfn_smbios_functions(void) + { + #ifdef MDR_V1_SUPPORT |