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