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/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