1b4651b9cSCheng C Yang /* 2b4651b9cSCheng C Yang // Copyright (c) 2018 Intel Corporation 3b4651b9cSCheng C Yang // 4b4651b9cSCheng C Yang // Licensed under the Apache License, Version 2.0 (the "License"); 5b4651b9cSCheng C Yang // you may not use this file except in compliance with the License. 6b4651b9cSCheng C Yang // You may obtain a copy of the License at 7b4651b9cSCheng C Yang // 8b4651b9cSCheng C Yang // http://www.apache.org/licenses/LICENSE-2.0 9b4651b9cSCheng C Yang // 10b4651b9cSCheng C Yang // Unless required by applicable law or agreed to in writing, software 11b4651b9cSCheng C Yang // distributed under the License is distributed on an "AS IS" BASIS, 12b4651b9cSCheng C Yang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b4651b9cSCheng C Yang // See the License for the specific language governing permissions and 14b4651b9cSCheng C Yang // limitations under the License. 15b4651b9cSCheng C Yang */ 16b4651b9cSCheng C Yang 17b4651b9cSCheng C Yang #include "system.hpp" 18b4651b9cSCheng C Yang 19b4651b9cSCheng C Yang #include "mdrv2.hpp" 20b4651b9cSCheng C Yang 2126de0d73SKuiying Wang #include <fstream> 22b4651b9cSCheng C Yang #include <iomanip> 23b4651b9cSCheng C Yang #include <iostream> 24b4651b9cSCheng C Yang #include <sstream> 25*7393e48dSJayaprakash Mutyala 26*7393e48dSJayaprakash Mutyala static constexpr const char* biosActiveObjPath = 27*7393e48dSJayaprakash Mutyala "/xyz/openbmc_project/software/bios_active"; 28*7393e48dSJayaprakash Mutyala static constexpr const char* biosVersionIntf = 29*7393e48dSJayaprakash Mutyala "xyz.openbmc_project.Software.Version"; 30*7393e48dSJayaprakash Mutyala static constexpr const char* biosVersionProp = "Version"; 31*7393e48dSJayaprakash Mutyala 32b4651b9cSCheng C Yang namespace phosphor 33b4651b9cSCheng C Yang { 34b4651b9cSCheng C Yang namespace smbios 35b4651b9cSCheng C Yang { 36b4651b9cSCheng C Yang 37e7770991SJason M. Bills std::string System::uuid(std::string value) 38b4651b9cSCheng C Yang { 39b4651b9cSCheng C Yang uint8_t* dataIn = storage; 40b4651b9cSCheng C Yang dataIn = getSMBIOSTypePtr(dataIn, systemType); 41b4651b9cSCheng C Yang if (dataIn != nullptr) 42b4651b9cSCheng C Yang { 43b4651b9cSCheng C Yang auto systemInfo = reinterpret_cast<struct SystemInfo*>(dataIn); 44b4651b9cSCheng C Yang std::stringstream stream; 45b4651b9cSCheng C Yang stream << std::setfill('0') << std::hex; 46e7770991SJason M. Bills stream << std::setw(8) << systemInfo->uuid.timeLow; 47b4651b9cSCheng C Yang stream << "-"; 48e7770991SJason M. Bills stream << std::setw(4) << systemInfo->uuid.timeMid; 49b4651b9cSCheng C Yang stream << "-"; 50e7770991SJason M. Bills stream << std::setw(4) << systemInfo->uuid.timeHiAndVer; 51b4651b9cSCheng C Yang stream << "-"; 52e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.clockSeqHi); 53b4651b9cSCheng C Yang stream << std::setw(2) 54e7770991SJason M. Bills << static_cast<int>(systemInfo->uuid.clockSeqLow); 55b4651b9cSCheng C Yang stream << "-"; 56e7770991SJason M. Bills static_assert(sizeof(systemInfo->uuid.node) == 6); 57e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[0]); 58e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[1]); 59e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[2]); 60e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[3]); 61e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[4]); 62e7770991SJason M. Bills stream << std::setw(2) << static_cast<int>(systemInfo->uuid.node[5]); 63b4651b9cSCheng C Yang 64e7770991SJason M. Bills return sdbusplus::xyz::openbmc_project::Common::server::UUID::uuid( 65b4651b9cSCheng C Yang stream.str()); 66b4651b9cSCheng C Yang } 67b4651b9cSCheng C Yang 68e7770991SJason M. Bills return sdbusplus::xyz::openbmc_project::Common::server::UUID::uuid( 69b4651b9cSCheng C Yang "00000000-0000-0000-0000-000000000000"); 70b4651b9cSCheng C Yang } 71b4651b9cSCheng C Yang 72*7393e48dSJayaprakash Mutyala static std::string getService(sdbusplus::bus::bus& bus, 73*7393e48dSJayaprakash Mutyala const std::string& objectPath, 74*7393e48dSJayaprakash Mutyala const std::string& interface) 75*7393e48dSJayaprakash Mutyala { 76*7393e48dSJayaprakash Mutyala auto method = 77*7393e48dSJayaprakash Mutyala bus.new_method_call("xyz.openbmc_project.ObjectMapper", 78*7393e48dSJayaprakash Mutyala "/xyz/openbmc_project/object_mapper", 79*7393e48dSJayaprakash Mutyala "xyz.openbmc_project.ObjectMapper", "GetObject"); 80*7393e48dSJayaprakash Mutyala 81*7393e48dSJayaprakash Mutyala method.append(objectPath); 82*7393e48dSJayaprakash Mutyala method.append(std::vector<std::string>({interface})); 83*7393e48dSJayaprakash Mutyala 84*7393e48dSJayaprakash Mutyala std::vector<std::pair<std::string, std::vector<std::string>>> response; 85*7393e48dSJayaprakash Mutyala 86*7393e48dSJayaprakash Mutyala try 87*7393e48dSJayaprakash Mutyala { 88*7393e48dSJayaprakash Mutyala auto reply = bus.call(method); 89*7393e48dSJayaprakash Mutyala reply.read(response); 90*7393e48dSJayaprakash Mutyala } 91*7393e48dSJayaprakash Mutyala catch (const sdbusplus::exception_t& e) 92*7393e48dSJayaprakash Mutyala { 93*7393e48dSJayaprakash Mutyala lg2::error("Error in mapper method call - {ERROR}, SERVICE - " 94*7393e48dSJayaprakash Mutyala "{SERVICE}, PATH - {PATH}", 95*7393e48dSJayaprakash Mutyala "ERROR", e.what(), "SERVICE", objectPath.c_str(), "PATH", 96*7393e48dSJayaprakash Mutyala interface.c_str()); 97*7393e48dSJayaprakash Mutyala 98*7393e48dSJayaprakash Mutyala return std::string{}; 99*7393e48dSJayaprakash Mutyala } 100*7393e48dSJayaprakash Mutyala 101*7393e48dSJayaprakash Mutyala return response[0].first; 102*7393e48dSJayaprakash Mutyala } 103*7393e48dSJayaprakash Mutyala 104*7393e48dSJayaprakash Mutyala static void setProperty(sdbusplus::bus::bus& bus, const std::string& objectPath, 105*7393e48dSJayaprakash Mutyala const std::string& interface, 106*7393e48dSJayaprakash Mutyala const std::string& propertyName, 107*7393e48dSJayaprakash Mutyala const std::string& value) 108*7393e48dSJayaprakash Mutyala { 109*7393e48dSJayaprakash Mutyala auto service = getService(bus, objectPath, interface); 110*7393e48dSJayaprakash Mutyala if (service.empty()) 111*7393e48dSJayaprakash Mutyala { 112*7393e48dSJayaprakash Mutyala return; 113*7393e48dSJayaprakash Mutyala } 114*7393e48dSJayaprakash Mutyala 115*7393e48dSJayaprakash Mutyala auto method = bus.new_method_call(service.c_str(), objectPath.c_str(), 116*7393e48dSJayaprakash Mutyala "org.freedesktop.DBus.Properties", "Set"); 117*7393e48dSJayaprakash Mutyala method.append(interface.c_str(), propertyName.c_str(), 118*7393e48dSJayaprakash Mutyala std::variant<std::string>{value}); 119*7393e48dSJayaprakash Mutyala 120*7393e48dSJayaprakash Mutyala bus.call_noreply(method); 121*7393e48dSJayaprakash Mutyala } 122*7393e48dSJayaprakash Mutyala 123b4651b9cSCheng C Yang std::string System::version(std::string value) 124b4651b9cSCheng C Yang { 125b4651b9cSCheng C Yang std::string result = "No BIOS Version"; 126b4651b9cSCheng C Yang uint8_t* dataIn = storage; 127b4651b9cSCheng C Yang dataIn = getSMBIOSTypePtr(dataIn, biosType); 128b4651b9cSCheng C Yang if (dataIn != nullptr) 129b4651b9cSCheng C Yang { 130b4651b9cSCheng C Yang auto biosInfo = reinterpret_cast<struct BIOSInfo*>(dataIn); 131b4651b9cSCheng C Yang uint8_t biosVerByte = biosInfo->biosVersion; 132b4651b9cSCheng C Yang std::string tempS = 133b4651b9cSCheng C Yang positionToString(biosInfo->biosVersion, biosInfo->length, dataIn); 13426de0d73SKuiying Wang if (std::find_if(tempS.begin(), tempS.end(), 13526de0d73SKuiying Wang [](char ch) { return !isprint(ch); }) != tempS.end()) 13626de0d73SKuiying Wang { 13726de0d73SKuiying Wang std::ofstream smbiosFile(mdrType2File, std::ios_base::trunc); 13826de0d73SKuiying Wang if (!smbiosFile.good()) 13926de0d73SKuiying Wang { 14026de0d73SKuiying Wang phosphor::logging::log<phosphor::logging::level::ERR>( 14126de0d73SKuiying Wang "Open MDRV2 table file failure"); 14226de0d73SKuiying Wang return result; 14326de0d73SKuiying Wang } 14426de0d73SKuiying Wang smbiosFile.clear(); 14526de0d73SKuiying Wang smbiosFile.close(); 14626de0d73SKuiying Wang phosphor::logging::log<phosphor::logging::level::ERR>( 14726de0d73SKuiying Wang "Find non-print char, delete the broken MDRV2 table file!"); 14826de0d73SKuiying Wang return sdbusplus::xyz::openbmc_project::Inventory::Decorator:: 14926de0d73SKuiying Wang server::Revision::version(result); 15026de0d73SKuiying Wang } 151b4651b9cSCheng C Yang result = tempS; 152*7393e48dSJayaprakash Mutyala 153*7393e48dSJayaprakash Mutyala setProperty(bus, biosActiveObjPath, biosVersionIntf, biosVersionProp, 154*7393e48dSJayaprakash Mutyala result); 155b4651b9cSCheng C Yang } 1565f2d6275SAlex Schendel lg2::info("VERSION INFO - BIOS - {VER}", "VER", result); 157*7393e48dSJayaprakash Mutyala 158b4651b9cSCheng C Yang return sdbusplus::xyz::openbmc_project::Inventory::Decorator::server:: 159b4651b9cSCheng C Yang Revision::version(result); 160b4651b9cSCheng C Yang } 161b4651b9cSCheng C Yang 162b4651b9cSCheng C Yang } // namespace smbios 163b4651b9cSCheng C Yang } // namespace phosphor 164