oem ibm: marker LID validation
This commit adds code for writing marker LID
from Host and also send a PlatformEventMessage
after validation.
This commit also subscribes for the interface added
signal to fetch the new image id and sends the relevant
sensor event to host
Change-Id: I92476beca18e6dd255f372dd82d6eaeca18e282c
Signed-off-by: Sampa Misra <sampmisr@in.ibm.com>
diff --git a/common/utils.cpp b/common/utils.cpp
index 74fcd06..ceac7b2 100644
--- a/common/utils.cpp
+++ b/common/utils.cpp
@@ -458,5 +458,36 @@
return PLDM_SUCCESS;
}
+uint16_t findStateSensorId(const pldm_pdr* pdrRepo, uint8_t tid,
+ uint16_t entityType, uint16_t entityInstance,
+ uint16_t containerId, uint16_t stateSetId)
+{
+ auto pdrs = findStateSensorPDR(tid, entityType, stateSetId, pdrRepo);
+ for (auto pdr : pdrs)
+ {
+ auto sensorPdr = reinterpret_cast<pldm_state_sensor_pdr*>(pdr.data());
+ auto compositeSensorCount = sensorPdr->composite_sensor_count;
+ auto possible_states_start = sensorPdr->possible_states;
+
+ for (auto sensors = 0x00; sensors < compositeSensorCount; sensors++)
+ {
+ auto possibleStates =
+ reinterpret_cast<state_sensor_possible_states*>(
+ possible_states_start);
+ auto setId = possibleStates->state_set_id;
+ auto possibleStateSize = possibleStates->possible_states_size;
+ if (entityType == sensorPdr->entity_type &&
+ entityInstance == sensorPdr->entity_instance &&
+ stateSetId == setId && containerId == sensorPdr->container_id)
+ {
+ return sensorPdr->sensor_id;
+ }
+ possible_states_start +=
+ possibleStateSize + sizeof(setId) + sizeof(possibleStateSize);
+ }
+ }
+ return PLDM_INVALID_EFFECTER_ID;
+}
+
} // namespace utils
} // namespace pldm
diff --git a/common/utils.hpp b/common/utils.hpp
index 664169d..79a2ba1 100644
--- a/common/utils.hpp
+++ b/common/utils.hpp
@@ -295,6 +295,21 @@
uint16_t stateSetId,
const pldm_pdr* repo);
+/** @brief Find sensor id from a state sensor PDR
+ *
+ * @param[in] pdrRepo - PDR repository
+ * @param[in] tid - terminus id
+ * @param[in] entityType - entity type
+ * @param[in] entityInstance - entity instance number
+ * @param[in] containerId - container id
+ * @param[in] stateSetId - state set id
+ *
+ * @return uint16_t - the sensor id
+ */
+uint16_t findStateSensorId(const pldm_pdr* pdrRepo, uint8_t tid,
+ uint16_t entityType, uint16_t entityInstance,
+ uint16_t containerId, uint16_t stateSetId);
+
/** @brief Find effecter id from a state effecter pdr
* @param[in] pdrRepo - PDR repository
* @param[in] entityType - entity type
diff --git a/libpldmresponder/oem_handler.hpp b/libpldmresponder/oem_handler.hpp
index 37d785e..ba0077f 100644
--- a/libpldmresponder/oem_handler.hpp
+++ b/libpldmresponder/oem_handler.hpp
@@ -57,7 +57,7 @@
* terms of PLDM completion codes if atleast one state fails to
* be set
*/
- virtual int OemSetStateEffecterStatesHandler(
+ virtual int oemSetStateEffecterStatesHandler(
uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId,
uint8_t compEffecterCnt,
std::vector<set_effecter_state_field>& stateField,
diff --git a/libpldmresponder/platform.cpp b/libpldmresponder/platform.cpp
index 0e5b22d..6796ee5 100644
--- a/libpldmresponder/platform.cpp
+++ b/libpldmresponder/platform.cpp
@@ -260,7 +260,7 @@
entityInstance, stateSetId) &&
oemPlatformHandler != nullptr)
{
- rc = oemPlatformHandler->OemSetStateEffecterStatesHandler(
+ rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
entityType, entityInstance, stateSetId, compEffecterCnt, stateField,
effecterId);
}
diff --git a/oem/ibm/libpldm/file_io.h b/oem/ibm/libpldm/file_io.h
index 2aa7bd4..866a31c 100644
--- a/oem/ibm/libpldm/file_io.h
+++ b/oem/ibm/libpldm/file_io.h
@@ -53,6 +53,7 @@
PLDM_FILE_TYPE_CERT_SIGNING_REQUEST = 4,
PLDM_FILE_TYPE_SIGNED_CERT = 5,
PLDM_FILE_TYPE_ROOT_CERT = 6,
+ PLDM_FILE_TYPE_LID_MARKER = 7,
};
#define PLDM_RW_FILE_MEM_REQ_BYTES 20
diff --git a/oem/ibm/libpldmresponder/file_io_by_type.cpp b/oem/ibm/libpldmresponder/file_io_by_type.cpp
index 43c2b91..bdc1332 100644
--- a/oem/ibm/libpldmresponder/file_io_by_type.cpp
+++ b/oem/ibm/libpldmresponder/file_io_by_type.cpp
@@ -142,6 +142,12 @@
return std::make_unique<LidHandler>(fileHandle, false);
break;
}
+ case PLDM_FILE_TYPE_LID_MARKER:
+ {
+ return std::make_unique<LidHandler>(fileHandle, false,
+ PLDM_FILE_TYPE_LID_MARKER);
+ break;
+ }
case PLDM_FILE_TYPE_DUMP:
{
return std::make_unique<DumpHandler>(fileHandle);
diff --git a/oem/ibm/libpldmresponder/file_io_type_lid.hpp b/oem/ibm/libpldmresponder/file_io_type_lid.hpp
index 531d762..4f42e34 100644
--- a/oem/ibm/libpldmresponder/file_io_type_lid.hpp
+++ b/oem/ibm/libpldmresponder/file_io_type_lid.hpp
@@ -16,6 +16,8 @@
using namespace pldm::responder::dma;
namespace fs = std::filesystem;
+using MarkerLIDremainingSize = uint64_t;
+
/** @class LidHandler
*
* @brief Inherits and implements FileHandler. This class is used
@@ -26,7 +28,8 @@
public:
/** @brief LidHandler constructor
*/
- LidHandler(uint32_t fileHandle, bool permSide) : FileHandler(fileHandle)
+ LidHandler(uint32_t fileHandle, bool permSide, uint8_t lidType = 0) :
+ FileHandler(fileHandle), lidType(lidType)
{
sideToRead = permSide ? Pside : Tside;
isPatchDir = false;
@@ -94,12 +97,16 @@
uint64_t address,
oem_platform::Handler* oemPlatformHandler)
{
+ int rc = PLDM_SUCCESS;
+ bool codeUpdateInProgress = false;
if (oemPlatformHandler != nullptr)
{
pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
oemPlatformHandler);
- if (oemIbmPlatformHandler->codeUpdate->isCodeUpdateInProgress())
+ codeUpdateInProgress =
+ oemIbmPlatformHandler->codeUpdate->isCodeUpdateInProgress();
+ if (codeUpdateInProgress || lidType == PLDM_FILE_TYPE_LID_MARKER)
{
std::string dir = LID_STAGING_DIR;
std::stringstream stream;
@@ -108,9 +115,6 @@
lidPath = std::move(dir) + '/' + lidName;
}
}
- std::cout << "got writeFromMemory() for LID " << lidPath.c_str()
- << " and offset " << offset << " and length " << length
- << "\n";
bool fileExists = fs::exists(lidPath);
int flags{};
if (fileExists)
@@ -130,12 +134,34 @@
}
close(fd);
- auto rc = transferFileData(lidPath, false, offset, length, address);
+ rc = transferFileData(lidPath, false, offset, length, address);
if (rc != PLDM_SUCCESS)
{
- std::cout << "writeFileFromMemory failed with rc= " << rc << " \n";
+ std::cerr << "writeFileFromMemory failed with rc= " << rc << " \n";
return rc;
}
+ if (lidType == PLDM_FILE_TYPE_LID_MARKER)
+ {
+ markerLIDremainingSize -= length;
+ if (markerLIDremainingSize == 0)
+ {
+ pldm::responder::oem_ibm_platform::Handler*
+ oemIbmPlatformHandler = dynamic_cast<
+ pldm::responder::oem_ibm_platform::Handler*>(
+ oemPlatformHandler);
+ auto sensorId =
+ oemIbmPlatformHandler->codeUpdate->getMarkerLidSensor();
+ using namespace pldm::responder::oem_ibm_platform;
+ oemIbmPlatformHandler->sendStateSensorEvent(
+ sensorId, PLDM_STATE_SENSOR_STATE, 0, VALID, VALID);
+ // rc = validate api;
+ rc = PLDM_SUCCESS;
+ }
+ }
+ else if (codeUpdateInProgress)
+ {
+ rc = processCodeUpdateLid(lidPath);
+ }
return rc;
}
@@ -153,12 +179,16 @@
virtual int write(const char* buffer, uint32_t offset, uint32_t& length,
oem_platform::Handler* oemPlatformHandler)
{
+ int rc = PLDM_SUCCESS;
+ bool codeUpdateInProgress = false;
if (oemPlatformHandler != nullptr)
{
pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
oemPlatformHandler);
- if (oemIbmPlatformHandler->codeUpdate->isCodeUpdateInProgress())
+ codeUpdateInProgress =
+ oemIbmPlatformHandler->codeUpdate->isCodeUpdateInProgress();
+ if (codeUpdateInProgress || lidType == PLDM_FILE_TYPE_LID_MARKER)
{
std::string dir = LID_STAGING_DIR;
std::stringstream stream;
@@ -167,9 +197,6 @@
lidPath = std::move(dir) + '/' + lidName;
}
}
- std::cout << "got write() call for LID " << lidPath.c_str()
- << " and offset " << offset << " and length " << length
- << "\n";
bool fileExists = fs::exists(lidPath);
int flags{};
if (fileExists)
@@ -198,14 +225,13 @@
std::cerr << "could not open file " << lidPath.c_str() << "\n";
return PLDM_ERROR;
}
- auto rc = lseek(fd, offset, SEEK_SET);
+ rc = lseek(fd, offset, SEEK_SET);
if (rc == -1)
{
std::cerr << "lseek failed, ERROR=" << errno
<< ", OFFSET=" << offset << "\n";
return PLDM_ERROR;
}
- std::cout << "lseek returned " << rc << "\n";
rc = ::write(fd, buffer, length);
if (rc == -1)
{
@@ -214,6 +240,30 @@
return PLDM_ERROR;
}
close(fd);
+
+ if (lidType == PLDM_FILE_TYPE_LID_MARKER)
+ {
+ markerLIDremainingSize -= length;
+ if (markerLIDremainingSize == 0)
+ {
+ pldm::responder::oem_ibm_platform::Handler*
+ oemIbmPlatformHandler = dynamic_cast<
+ pldm::responder::oem_ibm_platform::Handler*>(
+ oemPlatformHandler);
+ auto sensorId =
+ oemIbmPlatformHandler->codeUpdate->getMarkerLidSensor();
+ using namespace pldm::responder::oem_ibm_platform;
+ oemIbmPlatformHandler->sendStateSensorEvent(
+ sensorId, PLDM_STATE_SENSOR_STATE, 0, VALID, VALID);
+ // validate api
+ rc = PLDM_SUCCESS;
+ }
+ }
+ else if (codeUpdateInProgress)
+ {
+ rc = processCodeUpdateLid(lidPath);
+ }
+
return rc;
}
@@ -232,9 +282,14 @@
return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
}
- virtual int newFileAvailable(uint64_t /*length*/)
+ virtual int newFileAvailable(uint64_t length)
{
+ if (lidType == PLDM_FILE_TYPE_LID_MARKER)
+ {
+ markerLIDremainingSize = length;
+ return PLDM_SUCCESS;
+ }
return PLDM_ERROR_UNSUPPORTED_PLDM_CMD;
}
@@ -247,6 +302,8 @@
std::string lidPath;
std::string sideToRead;
bool isPatchDir;
+ static inline MarkerLIDremainingSize markerLIDremainingSize;
+ uint8_t lidType;
};
} // namespace responder
diff --git a/oem/ibm/libpldmresponder/inband_code_update.cpp b/oem/ibm/libpldmresponder/inband_code_update.cpp
index bb06882..fab3023 100644
--- a/oem/ibm/libpldmresponder/inband_code_update.cpp
+++ b/oem/ibm/libpldmresponder/inband_code_update.cpp
@@ -211,8 +211,40 @@
if (interface.first ==
"xyz.openbmc_project.Software.Activation")
{
- newImageId = path.str;
- break;
+ auto imageInterface =
+ "xyz.openbmc_project.Software.Activation";
+ auto imageObjPath = path.str.c_str();
+ try
+ {
+ auto propVal = dBusIntf->getDbusPropertyVariant(
+ imageObjPath, "Activation", imageInterface);
+ const auto& imageProp = std::get<std::string>(propVal);
+ if (imageProp == "xyz.openbmc_project.Software."
+ "Activation.Activations.Ready" &&
+ isCodeUpdateInProgress())
+ {
+ newImageId = path.str;
+ auto rc = setRequestedActivation();
+ CodeUpdateState state = CodeUpdateState::END;
+ if (rc != PLDM_SUCCESS)
+ {
+ state = CodeUpdateState::FAIL;
+ std::cerr
+ << "could not set RequestedActivation \n";
+ }
+ setCodeUpdateProgress(false);
+ auto sensorId = getFirmwareUpdateSensor();
+ sendStateSensorEvent(
+ sensorId, PLDM_STATE_SENSOR_STATE, 0,
+ uint8_t(state),
+ uint8_t(CodeUpdateState::START));
+ break;
+ }
+ }
+ catch (const sdbusplus::exception::SdBusError& e)
+ {
+ std::cerr << "Error in getting Activation status \n";
+ }
}
}
});
@@ -247,6 +279,39 @@
return;
}
+void CodeUpdate::sendStateSensorEvent(
+ uint16_t sensorId, enum sensor_event_class_states sensorEventClass,
+ uint8_t sensorOffset, uint8_t eventState, uint8_t prevEventState)
+{
+ pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
+ dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
+ oemPlatformHandler);
+ oemIbmPlatformHandler->sendStateSensorEvent(
+ sensorId, sensorEventClass, sensorOffset, eventState, prevEventState);
+}
+
+void CodeUpdate::deleteImage()
+{
+ static constexpr auto UPDATER_SERVICE =
+ "xyz.openbmc_project.Software.BMC.Updater";
+ static constexpr auto SW_OBJ_PATH = "/xyz/openbmc_project/software";
+ static constexpr auto DELETE_INTF =
+ "xyz.openbmc_project.Collection.DeleteAll";
+
+ auto& bus = dBusIntf->getBus();
+ try
+ {
+ auto method = bus.new_method_call(UPDATER_SERVICE, SW_OBJ_PATH,
+ DELETE_INTF, "DeleteAll");
+ bus.call_noreply(method);
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Failed to delete image, ERROR=" << e.what() << "\n";
+ return;
+ }
+}
+
uint8_t fetchBootSide(uint16_t entityInstance, CodeUpdate* codeUpdate)
{
uint8_t sensorOpState = tSideNum;
diff --git a/oem/ibm/libpldmresponder/inband_code_update.hpp b/oem/ibm/libpldmresponder/inband_code_update.hpp
index 77ada56..77f55f1 100644
--- a/oem/ibm/libpldmresponder/inband_code_update.hpp
+++ b/oem/ibm/libpldmresponder/inband_code_update.hpp
@@ -37,6 +37,8 @@
{
currBootSide = Tside;
nextBootSide = Tside;
+ markerLidSensorId = PLDM_INVALID_EFFECTER_ID;
+ firmwareUpdateSensorId = PLDM_INVALID_EFFECTER_ID;
}
/* @brief Method to return the current boot side
@@ -115,6 +117,57 @@
*/
int setRequestedActivation();
+ /* @brief Method to fetch the sensor id for marker lid
+ * validation PDR
+ * @return - sensor id
+ */
+ uint16_t getMarkerLidSensor()
+ {
+ return markerLidSensorId;
+ }
+
+ /* @brief Method to set the sensor id for marker lid
+ * validation
+ * @param[in] sensorId - sensor id for marker lid validation
+ */
+ void setMarkerLidSensor(uint16_t sensorId)
+ {
+ markerLidSensorId = sensorId;
+ }
+
+ /* @brief Method to set the sensor id for firmware update state
+ * @param[in] sensorId - sensor id for firmware update state
+ */
+ void setFirmwareUpdateSensor(uint16_t sensorId)
+ {
+ firmwareUpdateSensorId = sensorId;
+ }
+
+ /* @brief Method to fetch the sensor id for firmware update state
+ * @return - sensor id
+ */
+ uint16_t getFirmwareUpdateSensor()
+ {
+ return firmwareUpdateSensorId;
+ }
+
+ /* @brief Method to send a state sensor event to Host from CodeUpdate class
+ * @param[in] sensorId - sensor id for the event
+ * @param[in] sensorEventClass - sensor event class wrt DSP0248
+ * @param[in] sensorOffset - sensor offset
+ * @param[in] eventState - new event state
+ * @param[in] prevEventState - previous state
+ */
+ void sendStateSensorEvent(uint16_t sensorId,
+ enum sensor_event_class_states sensorEventClass,
+ uint8_t sensorOffset, uint8_t eventState,
+ uint8_t prevEventState);
+
+ /* @brief Method to delete the image from non running side prior to
+ * an inband code update
+ */
+ void deleteImage();
+
virtual ~CodeUpdate()
{}
@@ -135,13 +188,14 @@
//!< new image
pldm::responder::oem_platform::Handler*
oemPlatformHandler; //!< oem platform handler
+ uint16_t markerLidSensorId;
+ uint16_t firmwareUpdateSensorId;
/* @brief Method to take action when the subscribed D-Bus property is
* changed
* @param[in] chProperties - list of properties which have changed
* @return - none
*/
-
void
processPriorityChangeNotification(const DbusChangedProps& chProperties);
};
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
index 09a46a5..2f06bc5 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
@@ -42,7 +42,7 @@
}
int pldm::responder::oem_ibm_platform::Handler::
- OemSetStateEffecterStatesHandler(
+ oemSetStateEffecterStatesHandler(
uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId,
uint8_t compEffecterCnt,
std::vector<set_effecter_state_field>& stateField,
@@ -67,28 +67,57 @@
uint8_t(CodeUpdateState::START))
{
codeUpdate->setCodeUpdateProgress(true);
- rc = codeUpdate->setRequestedApplyTime();
+ startUpdateEvent =
+ std::make_unique<sdeventplus::source::Defer>(
+ event,
+ std::bind(std::mem_fn(&oem_ibm_platform::Handler::
+ _processStartUpdate),
+ this, std::placeholders::_1));
}
else if (stateField[currState].effecter_state ==
uint8_t(CodeUpdateState::END))
{
- codeUpdate->setCodeUpdateProgress(false);
+ rc = PLDM_SUCCESS;
+ assembleImageEvent = std::make_unique<
+ sdeventplus::source::Defer>(
+ event,
+ std::bind(
+ std::mem_fn(
+ &oem_ibm_platform::Handler::_processEndUpdate),
+ this, std::placeholders::_1));
+
+ // sendCodeUpdateEvent(effecterId, END, START);
}
else if (stateField[currState].effecter_state ==
uint8_t(CodeUpdateState::ABORT))
{
codeUpdate->setCodeUpdateProgress(false);
codeUpdate->clearDirPath(LID_STAGING_DIR);
+ auto sensorId = codeUpdate->getFirmwareUpdateSensor();
+ sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
+ uint8_t(CodeUpdateState::ABORT),
+ uint8_t(CodeUpdateState::START));
+ // sendCodeUpdateEvent(effecterId, ABORT, END);
}
else if (stateField[currState].effecter_state ==
uint8_t(CodeUpdateState::ACCEPT))
{
+ auto sensorId = codeUpdate->getFirmwareUpdateSensor();
+ sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
+ uint8_t(CodeUpdateState::ACCEPT),
+ uint8_t(CodeUpdateState::END));
// TODO Set new Dbus property provided by code update app
+ // sendCodeUpdateEvent(effecterId, ACCEPT, END);
}
else if (stateField[currState].effecter_state ==
uint8_t(CodeUpdateState::REJECT))
{
+ auto sensorId = codeUpdate->getFirmwareUpdateSensor();
+ sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
+ uint8_t(CodeUpdateState::REJECT),
+ uint8_t(CodeUpdateState::END));
// TODO Set new Dbus property provided by code update app
+ // sendCodeUpdateEvent(effecterId, REJECT, END);
}
}
else
@@ -153,8 +182,8 @@
}
void buildAllCodeUpdateSensorPDR(platform::Handler* platformHandler,
- uint16_t entityInstance, uint16_t stateSetID,
- pdr_utils::Repo& repo)
+ uint16_t entityType, uint16_t entityInstance,
+ uint16_t stateSetID, pdr_utils::Repo& repo)
{
size_t pdrSize = 0;
pdrSize =
@@ -175,7 +204,7 @@
pdr->hdr.length = sizeof(pldm_state_sensor_pdr) - sizeof(pldm_pdr_hdr);
pdr->terminus_handle = pdr::BmcPldmTerminusHandle;
pdr->sensor_id = platformHandler->getNextSensorId();
- pdr->entity_type = PLDM_ENTITY_VIRTUAL_MACHINE_MANAGER;
+ pdr->entity_type = entityType;
pdr->entity_instance = entityInstance;
pdr->container_id = 0;
pdr->sensor_init = PLDM_NO_INIT;
@@ -189,7 +218,8 @@
possibleStates->possible_states_size = 2;
auto state =
reinterpret_cast<state_sensor_possible_states*>(possibleStates);
- if (stateSetID == PLDM_OEM_IBM_BOOT_STATE)
+ if ((stateSetID == PLDM_OEM_IBM_BOOT_STATE) ||
+ (stateSetID == oem_ibm_platform::PLDM_OEM_IBM_VERIFICATION_STATE))
state->states[0].byte = 6;
else if (stateSetID == PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE)
state->states[0].byte = 126;
@@ -209,12 +239,26 @@
buildAllCodeUpdateEffecterPDR(platformHandler, ENTITY_INSTANCE_0,
PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
- buildAllCodeUpdateSensorPDR(platformHandler, ENTITY_INSTANCE_0,
- PLDM_OEM_IBM_BOOT_STATE, repo);
- buildAllCodeUpdateSensorPDR(platformHandler, ENTITY_INSTANCE_1,
- PLDM_OEM_IBM_BOOT_STATE, repo);
- buildAllCodeUpdateSensorPDR(platformHandler, ENTITY_INSTANCE_0,
- PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
+ buildAllCodeUpdateSensorPDR(
+ platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
+ PLDM_OEM_IBM_BOOT_STATE, repo);
+ buildAllCodeUpdateSensorPDR(
+ platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_1,
+ PLDM_OEM_IBM_BOOT_STATE, repo);
+ buildAllCodeUpdateSensorPDR(
+ platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
+ PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE, repo);
+ buildAllCodeUpdateSensorPDR(
+ platformHandler, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE, ENTITY_INSTANCE_0,
+ PLDM_OEM_IBM_VERIFICATION_STATE, repo);
+ auto sensorId = findStateSensorId(
+ repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+ ENTITY_INSTANCE_0, 0, PLDM_OEM_IBM_VERIFICATION_STATE);
+ codeUpdate->setMarkerLidSensor(sensorId);
+ sensorId = findStateSensorId(
+ repo.getPdr(), 0, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE,
+ ENTITY_INSTANCE_0, 0, PLDM_OEM_IBM_FIRMWARE_UPDATE_STATE);
+ codeUpdate->setFirmwareUpdateSensor(sensorId);
}
void pldm::responder::oem_ibm_platform::Handler::setPlatformHandler(
@@ -265,7 +309,18 @@
<< "\n";
return rc;
}
- std::cout << "returning rc= " << rc << " from sendEventToHost \n";
+ return rc;
+}
+
+int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec,
+ std::vector<uint8_t>& requestMsg, uint8_t instanceId)
+{
+ auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+ auto rc = encode_platform_event_message_req(
+ instanceId, 1 /*formatVersion*/, 0 /*tId*/, eventType,
+ eventDataVec.data(), eventDataVec.size(), request,
+ eventDataVec.size() + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
return rc;
}
@@ -311,21 +366,37 @@
return;
}
-int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec,
- std::vector<uint8_t>& requestMsg, uint8_t instanceId)
+void pldm::responder::oem_ibm_platform::Handler::_processEndUpdate(
+ sdeventplus::source::EventBase& /*source */)
{
- auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+ assembleImageEvent.reset();
+ int retc = assembleCodeUpdateImage();
+ if (retc != PLDM_SUCCESS)
+ {
+ codeUpdate->setCodeUpdateProgress(false);
+ auto sensorId = codeUpdate->getFirmwareUpdateSensor();
+ sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0,
+ uint8_t(CodeUpdateState::FAIL),
+ uint8_t(CodeUpdateState::START));
+ }
+}
- auto rc = encode_platform_event_message_req(
- instanceId, 1 /*formatVersion*/, pldm::responder::pdr::BmcTerminusId,
- eventType, eventDataVec.data(), eventDataVec.size(), request,
- eventDataVec.size() + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
-
- return rc;
+void pldm::responder::oem_ibm_platform::Handler::_processStartUpdate(
+ sdeventplus::source::EventBase& /*source */)
+{
+ codeUpdate->deleteImage();
+ CodeUpdateState state = CodeUpdateState::START;
+ auto rc = codeUpdate->setRequestedApplyTime();
+ if (rc != PLDM_SUCCESS)
+ {
+ std::cerr << "setRequestedApplyTime failed \n";
+ state = CodeUpdateState::FAIL;
+ }
+ auto sensorId = codeUpdate->getFirmwareUpdateSensor();
+ sendStateSensorEvent(sensorId, PLDM_STATE_SENSOR_STATE, 0, uint8_t(state),
+ uint8_t(CodeUpdateState::END));
}
} // namespace oem_ibm_platform
-
} // namespace responder
-
} // namespace pldm
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
index f8d261d..854c96b 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
@@ -17,6 +17,7 @@
#define PLDM_OEM_IBM_BOOT_STATE 32769
static constexpr auto PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE = 24577;
+static constexpr auto PLDM_OEM_IBM_VERIFICATION_STATE = 32770;
constexpr uint16_t ENTITY_INSTANCE_0 = 0;
constexpr uint16_t ENTITY_INSTANCE_1 = 1;
@@ -30,15 +31,23 @@
REJECT = 0x6
};
+enum VerificationStateValues
+{
+ VALID = 0x0,
+ ENTITLEMENT_FAIL = 0x1,
+ BANNED_PLATFORM_FAIL = 0x2,
+ MIN_MIF_FAIL = 0x4,
+};
+
class Handler : public oem_platform::Handler
{
public:
Handler(const pldm::utils::DBusHandler* dBusIntf,
pldm::responder::CodeUpdate* codeUpdate, int mctp_fd,
- uint8_t mctp_eid, Requester& requester) :
+ uint8_t mctp_eid, Requester& requester, sdeventplus::Event& event) :
oem_platform::Handler(dBusIntf),
codeUpdate(codeUpdate), platformHandler(nullptr), mctp_fd(mctp_fd),
- mctp_eid(mctp_eid), requester(requester)
+ mctp_eid(mctp_eid), requester(requester), event(event)
{
codeUpdate->setVersions();
}
@@ -48,7 +57,7 @@
StateSetId stateSetId, CompositeCount compSensorCnt,
std::vector<get_sensor_state_field>& stateField);
- int OemSetStateEffecterStatesHandler(
+ int oemSetStateEffecterStatesHandler(
uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId,
uint8_t compEffecterCnt,
std::vector<set_effecter_state_field>& stateField, uint16_t effecterId);
@@ -104,6 +113,20 @@
*/
int sendEventToHost(std::vector<uint8_t>& requestMsg);
+ /** @brief _processEndUpdate processes the actual work that needs
+ * to be carried out after EndUpdate effecter is set. This is done async
+ * after sending response for EndUpdate set effecter
+ * @param[in] source - sdeventplus event source
+ */
+ void _processEndUpdate(sdeventplus::source::EventBase& source);
+
+ /** @brief _processStartUpdate processes the actual work that needs
+ * to be carried out after StartUpdate effecter is set. This is done async
+ * after sending response for StartUpdate set effecter
+ * @param[in] source - sdeventplus event source
+ */
+ void _processStartUpdate(sdeventplus::source::EventBase& source);
+
~Handler() = default;
pldm::responder::CodeUpdate* codeUpdate; //!< pointer to CodeUpdate object
@@ -120,6 +143,14 @@
* obtain PLDM instance id.
*/
Requester& requester;
+ /** @brief sdeventplus event source */
+ std::unique_ptr<sdeventplus::source::Defer> assembleImageEvent;
+ std::unique_ptr<sdeventplus::source::Defer> startUpdateEvent;
+
+ /** @brief reference of main event loop of pldmd, primarily used to schedule
+ * work
+ */
+ sdeventplus::Event& event;
};
/** @brief Method to encode code update event msg
diff --git a/oem/ibm/test/libpldmresponder_oem_platform_test.cpp b/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
index 3b2d681..aa84403 100644
--- a/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
+++ b/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
@@ -9,6 +9,8 @@
#include "oem/ibm/libpldmresponder/oem_ibm_handler.hpp"
#include "test/mocked_utils.hpp"
+#include <sdeventplus/event.hpp>
+
#include <iostream>
using namespace pldm::utils;
@@ -36,7 +38,7 @@
uint16_t effecterId = 0xA;
sdbusplus::bus::bus bus(sdbusplus::bus::new_default());
Requester requester(bus, "/abc/def");
-
+ auto event = sdeventplus::Event::get_default();
std::vector<get_sensor_state_field> stateField;
auto mockDbusHandler = std::make_unique<MockdBusHandler>();
@@ -45,7 +47,8 @@
std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
- mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, requester);
+ mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, requester,
+ event);
auto rc = oemPlatformHandler->getOemStateSensorReadingsHandler(
entityID_, entityInstance_, stateSetId_, compSensorCnt_, stateField);
@@ -84,13 +87,13 @@
std::vector<set_effecter_state_field> setEffecterStateField;
setEffecterStateField.push_back({PLDM_REQUEST_SET, pSideNum});
- rc = oemPlatformHandler->OemSetStateEffecterStatesHandler(
+ rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
entityID_, entityInstance_, stateSetId_, compSensorCnt_,
setEffecterStateField, effecterId);
ASSERT_EQ(rc, PLDM_SUCCESS);
entityInstance_ = 2;
- rc = oemPlatformHandler->OemSetStateEffecterStatesHandler(
+ rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
entityID_, entityInstance_, stateSetId_, compSensorCnt_,
setEffecterStateField, effecterId);
@@ -99,7 +102,7 @@
entityID_ = 34;
stateSetId_ = 99;
entityInstance_ = 0;
- rc = oemPlatformHandler->OemSetStateEffecterStatesHandler(
+ rc = oemPlatformHandler->oemSetStateEffecterStatesHandler(
entityID_, entityInstance_, stateSetId_, compSensorCnt_,
setEffecterStateField, effecterId);
ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE);
diff --git a/pldmd/pldmd.cpp b/pldmd/pldmd.cpp
index c657d49..c1c864c 100644
--- a/pldmd/pldmd.cpp
+++ b/pldmd/pldmd.cpp
@@ -202,7 +202,8 @@
std::make_unique<pldm::responder::CodeUpdate>(dbusHandler.get());
codeUpdate->clearDirPath(LID_STAGING_DIR);
oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
- dbusHandler.get(), codeUpdate.get(), sockfd, hostEID, dbusImplReq);
+ dbusHandler.get(), codeUpdate.get(), sockfd, hostEID, dbusImplReq,
+ event);
codeUpdate->setOemPlatformHandler(oemPlatformHandler.get());
invoker.registerHandler(
PLDM_OEM, std::make_unique<oem_ibm::Handler>(oemPlatformHandler.get()));