1 // SPDX-License-Identifier: Apache-2.0 2 3 #include "pldm_utils.hpp" 4 5 #include "dump_utils.hpp" 6 #include "xyz/openbmc_project/Common/error.hpp" 7 8 #include <fmt/core.h> 9 10 #include <phosphor-logging/elog-errors.hpp> 11 #include <phosphor-logging/log.hpp> 12 13 namespace phosphor 14 { 15 namespace dump 16 { 17 namespace pldm 18 { 19 20 using namespace phosphor::logging; 21 using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed; 22 using Reason = xyz::openbmc_project::Common::NotAllowed::REASON; 23 24 int openPLDM() 25 { 26 auto fd = pldm_open(); 27 if (fd < 0) 28 { 29 auto e = errno; 30 log<level::ERR>( 31 fmt::format("pldm_open failed, errno({}), FD({})", e, fd).c_str()); 32 elog<NotAllowed>(Reason("Required host dump action via pldm is not " 33 "allowed due to pldm_open failed")); 34 } 35 return fd; 36 } 37 38 uint8_t getPLDMInstanceID(uint8_t eid) 39 { 40 constexpr auto pldmRequester = "xyz.openbmc_project.PLDM.Requester"; 41 constexpr auto pldm = "/xyz/openbmc_project/pldm"; 42 uint8_t instanceID = 0; 43 44 try 45 { 46 auto bus = sdbusplus::bus::new_default(); 47 auto service = phosphor::dump::getService(bus, pldm, pldmRequester); 48 49 auto method = bus.new_method_call(service.c_str(), pldm, pldmRequester, 50 "GetInstanceId"); 51 method.append(eid); 52 auto reply = bus.call(method); 53 54 reply.read(instanceID); 55 56 log<level::INFO>( 57 fmt::format("Got instanceId({}) from PLDM eid({})", instanceID, eid) 58 .c_str()); 59 } 60 catch (const sdbusplus::exception::SdBusError& e) 61 { 62 log<level::ERR>( 63 fmt::format("Failed to get instance id error({})", e.what()) 64 .c_str()); 65 elog<NotAllowed>(Reason("Failure in communicating with pldm service, " 66 "service may not be running")); 67 } 68 return instanceID; 69 } 70 71 } // namespace pldm 72 } // namespace dump 73 } // namespace phosphor 74