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