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, Requester& requester, sdeventplus::Event& event, 56 pldm::requester::Handler<pldm::requester::Request>* handler) : 57 oem_platform::Handler(dBusIntf), 58 codeUpdate(codeUpdate), platformHandler(nullptr), mctp_fd(mctp_fd), 59 mctp_eid(mctp_eid), requester(requester), event(event), handler(handler) 60 { 61 codeUpdate->setVersions(); 62 } 63 64 int getOemStateSensorReadingsHandler( 65 EntityType entityType, EntityInstance entityInstance, 66 StateSetId stateSetId, CompositeCount compSensorCnt, 67 std::vector<get_sensor_state_field>& stateField); 68 69 int oemSetStateEffecterStatesHandler( 70 uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId, 71 uint8_t compEffecterCnt, 72 std::vector<set_effecter_state_field>& stateField, uint16_t effecterId); 73 74 /** @brief Method to set the platform handler in the 75 * oem_ibm_handler class 76 * @param[in] handler - pointer to PLDM platform handler 77 */ 78 void setPlatformHandler(pldm::responder::platform::Handler* handler); 79 80 /** @brief Method to fetch the effecter ID of the code update PDRs 81 * 82 * @return platformHandler->getNextEffecterId() - returns the 83 * effecter ID from the platform handler 84 */ 85 virtual uint16_t getNextEffecterId() 86 { 87 return platformHandler->getNextEffecterId(); 88 } 89 90 /** @brief Method to fetch the sensor ID of the code update PDRs 91 * 92 * @return platformHandler->getNextSensorId() - returns the 93 * Sensor ID from the platform handler 94 */ 95 virtual uint16_t getNextSensorId() 96 { 97 return platformHandler->getNextSensorId(); 98 } 99 100 /** @brief Method to Generate the OEM PDRs 101 * 102 * @param[in] repo - instance of concrete implementation of Repo 103 */ 104 void buildOEMPDR(pdr_utils::Repo& repo); 105 106 /** @brief Method to send code update event to host 107 * @param[in] sensorId - sendor ID 108 * @param[in] sensorEventClass - event class of sensor 109 * @param[in] sensorOffset - sensor offset 110 * @param[in] eventState - new code update event state 111 * @param[in] prevEventState - previous code update event state 112 * @return none 113 */ 114 void sendStateSensorEvent(uint16_t sensorId, 115 enum sensor_event_class_states sensorEventClass, 116 uint8_t sensorOffset, uint8_t eventState, 117 uint8_t prevEventState); 118 119 /** @brief Method to send encoded request msg of code update event to host 120 * @param[in] requestMsg - encoded request msg 121 * @param[in] instanceId - instance id of the message 122 * @return PLDM status code 123 */ 124 int sendEventToHost(std::vector<uint8_t>& requestMsg, uint8_t instanceId); 125 126 /** @brief _processEndUpdate processes the actual work that needs 127 * to be carried out after EndUpdate effecter is set. This is done async 128 * after sending response for EndUpdate set effecter 129 * @param[in] source - sdeventplus event source 130 */ 131 void _processEndUpdate(sdeventplus::source::EventBase& source); 132 133 /** @brief _processStartUpdate processes the actual work that needs 134 * to be carried out after StartUpdate effecter is set. This is done async 135 * after sending response for StartUpdate set effecter 136 * @param[in] source - sdeventplus event source 137 */ 138 void _processStartUpdate(sdeventplus::source::EventBase& source); 139 140 /** @brief _processSystemReboot processes the actual work that needs to be 141 * carried out after the System Power State effecter is set to reboot 142 * the system 143 * @param[in] source - sdeventplus event source 144 */ 145 void _processSystemReboot(sdeventplus::source::EventBase& source); 146 147 ~Handler() = default; 148 149 pldm::responder::CodeUpdate* codeUpdate; //!< pointer to CodeUpdate object 150 pldm::responder::platform::Handler* 151 platformHandler; //!< pointer to PLDM platform handler 152 153 /** @brief fd of MCTP communications socket */ 154 int mctp_fd; 155 156 /** @brief MCTP EID of host firmware */ 157 uint8_t mctp_eid; 158 159 /** @brief reference to Requester object, primarily used to access API to 160 * obtain PLDM instance id. 161 */ 162 Requester& requester; 163 /** @brief sdeventplus event source */ 164 std::unique_ptr<sdeventplus::source::Defer> assembleImageEvent; 165 std::unique_ptr<sdeventplus::source::Defer> startUpdateEvent; 166 std::unique_ptr<sdeventplus::source::Defer> systemRebootEvent; 167 168 /** @brief reference of main event loop of pldmd, primarily used to schedule 169 * work 170 */ 171 sdeventplus::Event& event; 172 173 private: 174 /** @brief D-Bus property changed signal match for CurrentPowerState*/ 175 std::unique_ptr<sdbusplus::bus::match::match> chassisOffMatch; 176 177 /** @brief PLDM request handler */ 178 pldm::requester::Handler<pldm::requester::Request>* handler; 179 }; 180 181 /** @brief Method to encode code update event msg 182 * @param[in] eventType - type of event 183 * @param[in] eventDataVec - vector of event data to be sent to host 184 * @param[in/out] requestMsg - request msg to be encoded 185 * @param[in] instanceId - instance ID 186 * @return PLDM status code 187 */ 188 int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec, 189 std::vector<uint8_t>& requestMsg, uint8_t instanceId); 190 191 } // namespace oem_ibm_platform 192 193 } // namespace responder 194 195 } // namespace pldm 196