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 
41     constexpr auto pldmRequester = "xyz.openbmc_project.PLDM.Requester";
42     constexpr auto pldm = "/xyz/openbmc_project/pldm";
43     uint8_t instanceID = 0;
44 
45     try
46     {
47         auto bus = sdbusplus::bus::new_default();
48         auto service = phosphor::dump::getService(bus, pldm, pldmRequester);
49 
50         auto method = bus.new_method_call(service.c_str(), pldm, pldmRequester,
51                                           "GetInstanceId");
52         method.append(eid);
53         auto reply = bus.call(method);
54 
55         reply.read(instanceID);
56 
57         log<level::INFO>(
58             fmt::format("Got instanceId({}) from PLDM eid({})", instanceID, eid)
59                 .c_str());
60     }
61     catch (const sdbusplus::exception::SdBusError& e)
62     {
63         log<level::ERR>(
64             fmt::format("Failed to get instance id error({})", e.what())
65                 .c_str());
66         elog<NotAllowed>(Reason("Failure in communicating with pldm service, "
67                                 "service may not be running"));
68     }
69     return instanceID;
70 }
71 
72 } // namespace pldm
73 } // namespace dump
74 } // namespace phosphor
75