1 #pragma once 2 #include "libpldm/entity.h" 3 #include "libpldm/platform.h" 4 5 #include "inband_code_update.hpp" 6 #include "libpldmresponder/oem_handler.hpp" 7 #include "libpldmresponder/pdr_utils.hpp" 8 #include "libpldmresponder/platform.hpp" 9 #include "requester/handler.hpp" 10 11 namespace pldm 12 { 13 namespace responder 14 { 15 namespace oem_ibm_platform 16 { 17 18 #define PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE 32768 19 #define PLDM_OEM_IBM_BOOT_STATE 32769 20 #define PLDM_OEM_IBM_SYSTEM_POWER_STATE 32771 21 22 static constexpr auto PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE = 24577; 23 static constexpr auto PLDM_OEM_IBM_VERIFICATION_STATE = 32770; 24 constexpr uint16_t ENTITY_INSTANCE_0 = 0; 25 constexpr uint16_t ENTITY_INSTANCE_1 = 1; 26 27 enum class CodeUpdateState : uint8_t 28 { 29 START = 0x1, 30 END = 0x2, 31 FAIL = 0x3, 32 ABORT = 0x4, 33 ACCEPT = 0x5, 34 REJECT = 0x6 35 }; 36 37 enum VerificationStateValues 38 { 39 VALID = 0x0, 40 ENTITLEMENT_FAIL = 0x1, 41 BANNED_PLATFORM_FAIL = 0x2, 42 MIN_MIF_FAIL = 0x4, 43 }; 44 45 enum SystemPowerStates 46 { 47 POWER_CYCLE_HARD = 0x1, 48 }; 49 50 class Handler : public oem_platform::Handler 51 { 52 public: 53 Handler(const pldm::utils::DBusHandler* dBusIntf, 54 pldm::responder::CodeUpdate* codeUpdate, int mctp_fd, 55 uint8_t mctp_eid, pldm::dbus_api::Requester& requester, 56 sdeventplus::Event& event, 57 pldm::requester::Handler<pldm::requester::Request>* handler) : 58 oem_platform::Handler(dBusIntf), 59 codeUpdate(codeUpdate), platformHandler(nullptr), mctp_fd(mctp_fd), 60 mctp_eid(mctp_eid), requester(requester), event(event), handler(handler) 61 { 62 codeUpdate->setVersions(); 63 } 64 65 int getOemStateSensorReadingsHandler( 66 EntityType entityType, pldm::pdr::EntityInstance entityInstance, 67 pldm::pdr::StateSetId stateSetId, 68 pldm::pdr::CompositeCount compSensorCnt, 69 std::vector<get_sensor_state_field>& stateField); 70 71 int oemSetStateEffecterStatesHandler( 72 uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId, 73 uint8_t compEffecterCnt, 74 std::vector<set_effecter_state_field>& stateField, uint16_t effecterId); 75 76 /** @brief Method to set the platform handler in the 77 * oem_ibm_handler class 78 * @param[in] handler - pointer to PLDM platform handler 79 */ 80 void setPlatformHandler(pldm::responder::platform::Handler* handler); 81 82 /** @brief Method to fetch the effecter ID of the code update PDRs 83 * 84 * @return platformHandler->getNextEffecterId() - returns the 85 * effecter ID from the platform handler 86 */ 87 virtual uint16_t getNextEffecterId() 88 { 89 return platformHandler->getNextEffecterId(); 90 } 91 92 /** @brief Method to fetch the sensor ID of the code update PDRs 93 * 94 * @return platformHandler->getNextSensorId() - returns the 95 * Sensor ID from the platform handler 96 */ 97 virtual uint16_t getNextSensorId() 98 { 99 return platformHandler->getNextSensorId(); 100 } 101 102 /** @brief Method to Generate the OEM PDRs 103 * 104 * @param[in] repo - instance of concrete implementation of Repo 105 */ 106 void buildOEMPDR(pdr_utils::Repo& repo); 107 108 /** @brief Method to send code update event to host 109 * @param[in] sensorId - sendor ID 110 * @param[in] sensorEventClass - event class of sensor 111 * @param[in] sensorOffset - sensor offset 112 * @param[in] eventState - new code update event state 113 * @param[in] prevEventState - previous code update event state 114 * @return none 115 */ 116 void sendStateSensorEvent(uint16_t sensorId, 117 enum sensor_event_class_states sensorEventClass, 118 uint8_t sensorOffset, uint8_t eventState, 119 uint8_t prevEventState); 120 121 /** @brief Method to send encoded request msg of code update event to host 122 * @param[in] requestMsg - encoded request msg 123 * @param[in] instanceId - instance id of the message 124 * @return PLDM status code 125 */ 126 int sendEventToHost(std::vector<uint8_t>& requestMsg, uint8_t instanceId); 127 128 /** @brief _processEndUpdate processes the actual work that needs 129 * to be carried out after EndUpdate effecter is set. This is done async 130 * after sending response for EndUpdate set effecter 131 * @param[in] source - sdeventplus event source 132 */ 133 void _processEndUpdate(sdeventplus::source::EventBase& source); 134 135 /** @brief _processStartUpdate processes the actual work that needs 136 * to be carried out after StartUpdate effecter is set. This is done async 137 * after sending response for StartUpdate set effecter 138 * @param[in] source - sdeventplus event source 139 */ 140 void _processStartUpdate(sdeventplus::source::EventBase& source); 141 142 /** @brief _processSystemReboot processes the actual work that needs to be 143 * carried out after the System Power State effecter is set to reboot 144 * the system 145 * @param[in] source - sdeventplus event source 146 */ 147 void _processSystemReboot(sdeventplus::source::EventBase& source); 148 149 ~Handler() = default; 150 151 pldm::responder::CodeUpdate* codeUpdate; //!< pointer to CodeUpdate object 152 pldm::responder::platform::Handler* 153 platformHandler; //!< pointer to PLDM platform handler 154 155 /** @brief fd of MCTP communications socket */ 156 int mctp_fd; 157 158 /** @brief MCTP EID of host firmware */ 159 uint8_t mctp_eid; 160 161 /** @brief reference to Requester object, primarily used to access API to 162 * obtain PLDM instance id. 163 */ 164 pldm::dbus_api::Requester& requester; 165 /** @brief sdeventplus event source */ 166 std::unique_ptr<sdeventplus::source::Defer> assembleImageEvent; 167 std::unique_ptr<sdeventplus::source::Defer> startUpdateEvent; 168 std::unique_ptr<sdeventplus::source::Defer> systemRebootEvent; 169 170 /** @brief reference of main event loop of pldmd, primarily used to schedule 171 * work 172 */ 173 sdeventplus::Event& event; 174 175 private: 176 /** @brief D-Bus property changed signal match for CurrentPowerState*/ 177 std::unique_ptr<sdbusplus::bus::match::match> chassisOffMatch; 178 179 /** @brief PLDM request handler */ 180 pldm::requester::Handler<pldm::requester::Request>* handler; 181 }; 182 183 /** @brief Method to encode code update event msg 184 * @param[in] eventType - type of event 185 * @param[in] eventDataVec - vector of event data to be sent to host 186 * @param[in/out] requestMsg - request msg to be encoded 187 * @param[in] instanceId - instance ID 188 * @return PLDM status code 189 */ 190 int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec, 191 std::vector<uint8_t>& requestMsg, uint8_t instanceId); 192 193 } // namespace oem_ibm_platform 194 195 } // namespace responder 196 197 } // namespace pldm 198