oem-ibm: add readFileByTypeIntoMemory handler

Add a handler for file type 'LID', which are host firmware image files
on IBM systems. These would be read by the host firmware as it boots.

Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: I83e3ee398a4c6a4198a40b8b2188a3c11d0e55c4
diff --git a/oem/ibm/libpldmresponder/file_io.cpp b/oem/ibm/libpldmresponder/file_io.cpp
index 692ae1b..0c7216b 100644
--- a/oem/ibm/libpldmresponder/file_io.cpp
+++ b/oem/ibm/libpldmresponder/file_io.cpp
@@ -45,6 +45,8 @@
     registerHandler(PLDM_OEM, PLDM_WRITE_FILE, std::move(writeFile));
     registerHandler(PLDM_OEM, PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
                     std::move(writeFileByTypeFromMemory));
+    registerHandler(PLDM_OEM, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY,
+                    std::move(readFileByTypeIntoMemory));
 }
 
 } // namespace oem_ibm
@@ -536,8 +538,8 @@
     return response;
 }
 
-Response writeFileByTypeFromMemory(const pldm_msg* request,
-                                   size_t payloadLength)
+Response rwFileByTypeIntoMemory(uint8_t cmd, const pldm_msg* request,
+                                size_t payloadLength)
 {
     Response response(
         sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES, 0);
@@ -545,9 +547,9 @@
 
     if (payloadLength != PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES)
     {
-        encode_rw_file_by_type_memory_resp(
-            request->hdr.instance_id, PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
-            PLDM_ERROR_INVALID_LENGTH, 0, responsePtr);
+        encode_rw_file_by_type_memory_resp(request->hdr.instance_id, cmd,
+                                           PLDM_ERROR_INVALID_LENGTH, 0,
+                                           responsePtr);
         return response;
     }
 
@@ -561,18 +563,17 @@
                                                 &length, &address);
     if (rc != PLDM_SUCCESS)
     {
-        encode_rw_file_by_type_memory_resp(request->hdr.instance_id,
-                                           PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
-                                           rc, 0, responsePtr);
+        encode_rw_file_by_type_memory_resp(request->hdr.instance_id, cmd, rc, 0,
+                                           responsePtr);
         return response;
     }
     if (length % dma::minSize)
     {
-        log<level::ERR>("Write length is not a multiple of DMA minSize",
+        log<level::ERR>("Length is not a multiple of DMA minSize",
                         entry("LENGTH=%d", length));
-        encode_rw_file_by_type_memory_resp(
-            request->hdr.instance_id, PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
-            PLDM_INVALID_WRITE_LENGTH, 0, responsePtr);
+        encode_rw_file_by_type_memory_resp(request->hdr.instance_id, cmd,
+                                           PLDM_INVALID_WRITE_LENGTH, 0,
+                                           responsePtr);
         return response;
     }
 
@@ -584,18 +585,32 @@
     catch (const InternalFailure& e)
     {
         log<level::ERR>("unknown file type ", entry("TYPE=%d", fileType));
-        encode_rw_file_by_type_memory_resp(
-            request->hdr.instance_id, PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
-            PLDM_INVALID_FILE_TYPE, 0, responsePtr);
+        encode_rw_file_by_type_memory_resp(request->hdr.instance_id, cmd,
+                                           PLDM_INVALID_FILE_TYPE, 0,
+                                           responsePtr);
         return response;
     }
 
-    rc = handler->writeFromMemory(offset, length, address);
-    encode_rw_file_by_type_memory_resp(request->hdr.instance_id,
-                                       PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY, rc,
+    rc = cmd == PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY
+             ? handler->writeFromMemory(offset, length, address)
+             : handler->readIntoMemory(offset, length, address);
+    encode_rw_file_by_type_memory_resp(request->hdr.instance_id, cmd, rc,
                                        length, responsePtr);
     return response;
 }
 
+Response writeFileByTypeFromMemory(const pldm_msg* request,
+                                   size_t payloadLength)
+{
+    return rwFileByTypeIntoMemory(PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY, request,
+                                  payloadLength);
+}
+
+Response readFileByTypeIntoMemory(const pldm_msg* request, size_t payloadLength)
+{
+    return rwFileByTypeIntoMemory(PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, request,
+                                  payloadLength);
+}
+
 } // namespace responder
 } // namespace pldm