blob: ae608c8fc863b33c0f6b6b78e75da1295486a40e [file] [log] [blame]
Patrick Williams70a47ba2021-09-02 09:53:31 -05001#include "platform_oem_ibm.hpp"
2
Patrick Williams70a47ba2021-09-02 09:53:31 -05003#include "common/utils.hpp"
4#include "libpldmresponder/pdr.hpp"
5
George Liuc453e162022-12-21 17:16:23 +08006#include <libpldm/platform_oem_ibm.h>
George Liuc453e162022-12-21 17:16:23 +08007
Riya Dixit49cfb132023-03-02 04:26:53 -06008#include <phosphor-logging/lg2.hpp>
ArchanaKakanidcf77d62022-08-29 07:04:09 -05009#include <xyz/openbmc_project/Common/error.hpp>
10
Patrick Williams70a47ba2021-09-02 09:53:31 -050011#include <iostream>
12
Riya Dixit49cfb132023-03-02 04:26:53 -060013PHOSPHOR_LOG2_USING;
14
Patrick Williams70a47ba2021-09-02 09:53:31 -050015namespace pldm
16{
17namespace responder
18{
19namespace platform
20{
Patrick Williams70a47ba2021-09-02 09:53:31 -050021int sendBiosAttributeUpdateEvent(
Andrew Jefferya330b2f2023-05-04 14:55:37 +093022 uint8_t eid, pldm::InstanceIdDb* instanceIdDb,
Patrick Williams70a47ba2021-09-02 09:53:31 -050023 const std::vector<uint16_t>& handles,
24 pldm::requester::Handler<pldm::requester::Request>* handler)
25{
26 constexpr auto hostStatePath = "/xyz/openbmc_project/state/host0";
27 constexpr auto hostStateInterface =
28 "xyz.openbmc_project.State.Boot.Progress";
29 constexpr auto hostStateProperty = "BootProgress";
30
31 try
32 {
33 auto propVal = pldm::utils::DBusHandler().getDbusPropertyVariant(
34 hostStatePath, hostStateProperty, hostStateInterface);
35 const auto& currHostState = std::get<std::string>(propVal);
36 if ((currHostState != "xyz.openbmc_project.State.Boot.Progress."
37 "ProgressStages.SystemInitComplete") &&
38 (currHostState != "xyz.openbmc_project.State.Boot.Progress."
39 "ProgressStages.OSRunning") &&
40 (currHostState != "xyz.openbmc_project.State.Boot.Progress."
Andrew Geisslerf2704dc2022-05-23 16:09:45 -040041 "ProgressStages.SystemSetup"))
Patrick Williams70a47ba2021-09-02 09:53:31 -050042 {
43 return PLDM_SUCCESS;
44 }
45 }
ArchanaKakanidcf77d62022-08-29 07:04:09 -050046 catch (
47 const sdbusplus::xyz::openbmc_project::Common::Error::ResourceNotFound&
48 e)
49 {
50 /* Exception is expected to happen in the case when state manager is
51 * started after pldm, this is expected to happen in reboot case
52 * where host is considered to be up. As host is up pldm is expected
53 * to send attribute update event to host so this is not an error
54 * case */
55 }
Patrick Williams84b790c2022-07-22 19:26:56 -050056 catch (const sdbusplus::exception_t& e)
Patrick Williams70a47ba2021-09-02 09:53:31 -050057 {
Riya Dixit49cfb132023-03-02 04:26:53 -060058 error(
59 "Error in getting current host state, {EXCEP_NAME} Continue sending the bios attribute update event ...",
60 "EXCEP_NAME", e.name());
Patrick Williams70a47ba2021-09-02 09:53:31 -050061 }
62
Andrew Jefferya330b2f2023-05-04 14:55:37 +093063 auto instanceId = instanceIdDb->next(eid);
Patrick Williams70a47ba2021-09-02 09:53:31 -050064
65 std::vector<uint8_t> requestMsg(
66 sizeof(pldm_msg_hdr) + sizeof(pldm_bios_attribute_update_event_req) -
67 1 + (handles.size() * sizeof(uint16_t)),
68 0);
69
70 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
71
72 auto rc = encode_bios_attribute_update_event_req(
Manojkiran Eda6a49bb02022-09-02 05:35:26 -050073 instanceId, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION, TERMINUS_ID,
74 handles.size(), reinterpret_cast<const uint8_t*>(handles.data()),
Patrick Williams70a47ba2021-09-02 09:53:31 -050075 requestMsg.size() - sizeof(pldm_msg_hdr), request);
76 if (rc != PLDM_SUCCESS)
77 {
Riya Dixit49cfb132023-03-02 04:26:53 -060078 error(
79 "BIOS Attribute update event message encode failure. PLDM error code = {RC}",
80 "RC", lg2::hex, rc);
Andrew Jefferya330b2f2023-05-04 14:55:37 +093081 instanceIdDb->free(eid, instanceId);
Patrick Williams70a47ba2021-09-02 09:53:31 -050082 return rc;
83 }
84
Patrick Williams6da4f912023-05-10 07:50:53 -050085 auto platformEventMessageResponseHandler =
86 [](mctp_eid_t /*eid*/, const pldm_msg* response, size_t respMsgLen) {
Patrick Williams70a47ba2021-09-02 09:53:31 -050087 if (response == nullptr || !respMsgLen)
88 {
Riya Dixit49cfb132023-03-02 04:26:53 -060089 error("Failed to receive response for platform event message");
Patrick Williams70a47ba2021-09-02 09:53:31 -050090 return;
91 }
92 uint8_t completionCode{};
93 uint8_t status{};
94 auto rc = decode_platform_event_message_resp(response, respMsgLen,
95 &completionCode, &status);
96 if (rc || completionCode)
97 {
Riya Dixit49cfb132023-03-02 04:26:53 -060098 error(
99 "Failed to decode BIOS Attribute update platform_event_message_resp: rc = {RC}, cc= {CC}",
100 "RC", rc, "CC", static_cast<unsigned>(completionCode));
Patrick Williams70a47ba2021-09-02 09:53:31 -0500101 }
102 };
103 rc = handler->registerRequest(
104 eid, instanceId, PLDM_PLATFORM, PLDM_PLATFORM_EVENT_MESSAGE,
105 std::move(requestMsg), std::move(platformEventMessageResponseHandler));
106 if (rc)
107 {
Riya Dixit49cfb132023-03-02 04:26:53 -0600108 error(
109 "Failed to send BIOS Attribute update the platform event message");
Patrick Williams70a47ba2021-09-02 09:53:31 -0500110 }
111
112 return rc;
113}
114
115} // namespace platform
116
117} // namespace responder
118
119} // namespace pldm