1854e61f2SSampa Misra #pragma once 2854e61f2SSampa Misra 3854e61f2SSampa Misra #include "file_io.hpp" 4854e61f2SSampa Misra 5854e61f2SSampa Misra namespace pldm 6854e61f2SSampa Misra { 7854e61f2SSampa Misra 8854e61f2SSampa Misra namespace responder 9854e61f2SSampa Misra { 10854e61f2SSampa Misra 11854e61f2SSampa Misra namespace fs = std::filesystem; 12854e61f2SSampa Misra 13854e61f2SSampa Misra /** 14854e61f2SSampa Misra * @class FileHandler 15854e61f2SSampa Misra * 16854e61f2SSampa Misra * Base class to handle read/write of all oem file types 17854e61f2SSampa Misra */ 18854e61f2SSampa Misra class FileHandler 19854e61f2SSampa Misra { 20854e61f2SSampa Misra public: 21854e61f2SSampa Misra /** @brief Method to write an oem file type from host memory. Individual 22854e61f2SSampa Misra * file types need to override this method to do the file specific 23854e61f2SSampa Misra * processing 24854e61f2SSampa Misra * @param[in] offset - offset to read/write 25854e61f2SSampa Misra * @param[in] length - length to be read/write mentioned by Host 26854e61f2SSampa Misra * @param[in] address - DMA address 2769508503SSampa Misra * @param[in] oemPlatformHandler - oem handler for PLDM platform related 2869508503SSampa Misra * tasks 29854e61f2SSampa Misra * @return PLDM status code 30854e61f2SSampa Misra */ 31854e61f2SSampa Misra virtual int writeFromMemory(uint32_t offset, uint32_t length, 3269508503SSampa Misra uint64_t address, 3369508503SSampa Misra oem_platform::Handler* oemPlatformHandler) = 0; 34854e61f2SSampa Misra 35f6d3a830SDeepak Kodihalli /** @brief Method to read an oem file type into host memory. Individual 36f6d3a830SDeepak Kodihalli * file types need to override this method to do the file specific 37f6d3a830SDeepak Kodihalli * processing 38f6d3a830SDeepak Kodihalli * @param[in] offset - offset to read 39*56c78807SKamalkumar Patel * @param[in] length - length to be read mentioned by Host 40f6d3a830SDeepak Kodihalli * @param[in] address - DMA address 4169508503SSampa Misra * @param[in] oemPlatformHandler - oem handler for PLDM platform related 4269508503SSampa Misra * tasks 43f6d3a830SDeepak Kodihalli * @return PLDM status code 44f6d3a830SDeepak Kodihalli */ 45*56c78807SKamalkumar Patel virtual int readIntoMemory(uint32_t offset, uint32_t length, 4669508503SSampa Misra uint64_t address, 4769508503SSampa Misra oem_platform::Handler* oemPlatformHandler) = 0; 48f6d3a830SDeepak Kodihalli 4975e02f84SDeepak Kodihalli /** @brief Method to read an oem file type's content into the PLDM response. 5075e02f84SDeepak Kodihalli * @param[in] offset - offset to read 5175e02f84SDeepak Kodihalli * @param[in/out] length - length to be read 5275e02f84SDeepak Kodihalli * @param[in] response - PLDM response 5369508503SSampa Misra * @param[in] oemPlatformHandler - oem handler for PLDM platform related 5469508503SSampa Misra * tasks 5575e02f84SDeepak Kodihalli * @return PLDM status code 5675e02f84SDeepak Kodihalli */ 5769508503SSampa Misra virtual int read(uint32_t offset, uint32_t& length, Response& response, 5869508503SSampa Misra oem_platform::Handler* oemPlatformHandler) = 0; 5975e02f84SDeepak Kodihalli 6018967161SSampa Misra /** @brief Method to write an oem file by type 6118967161SSampa Misra * @param[in] buffer - buffer to be written to file 6218967161SSampa Misra * @param[in] offset - offset to write to 6318967161SSampa Misra * @param[in/out] length - length to be written 6469508503SSampa Misra * @param[in] oemPlatformHandler - oem handler for PLDM platform related 6569508503SSampa Misra * tasks 6618967161SSampa Misra * @return PLDM status code 6718967161SSampa Misra */ 6869508503SSampa Misra virtual int write(const char* buffer, uint32_t offset, uint32_t& length, 6969508503SSampa Misra oem_platform::Handler* oemPlatformHandler) = 0; 7018967161SSampa Misra 712da1bfeaSDeepak Kodihalli virtual int fileAck(uint8_t fileStatus) = 0; 722da1bfeaSDeepak Kodihalli 7318967161SSampa Misra /** @brief Method to process a new file available notification from the 7418967161SSampa Misra * host. The bmc can chose to do different actions based on the file type. 7518967161SSampa Misra * 7618967161SSampa Misra * @param[in] length - size of the file content to be transferred 7718967161SSampa Misra * 7818967161SSampa Misra * @return PLDM status code 7918967161SSampa Misra */ 8018967161SSampa Misra virtual int newFileAvailable(uint64_t length) = 0; 8118967161SSampa Misra 8275e02f84SDeepak Kodihalli /** @brief Method to read an oem file type's content into the PLDM response. 8375e02f84SDeepak Kodihalli * @param[in] filePath - file to read from 8475e02f84SDeepak Kodihalli * @param[in] offset - offset to read 8575e02f84SDeepak Kodihalli * @param[in/out] length - length to be read 8675e02f84SDeepak Kodihalli * @param[in] response - PLDM response 8775e02f84SDeepak Kodihalli * @return PLDM status code 8875e02f84SDeepak Kodihalli */ 8975e02f84SDeepak Kodihalli virtual int readFile(const std::string& filePath, uint32_t offset, 9075e02f84SDeepak Kodihalli uint32_t& length, Response& response); 9175e02f84SDeepak Kodihalli 92854e61f2SSampa Misra /** @brief Method to do the file content transfer ove DMA between host and 93854e61f2SSampa Misra * bmc. This method is made virtual to be overridden in test case. And need 94854e61f2SSampa Misra * not be defined in other child classes 95854e61f2SSampa Misra * 96854e61f2SSampa Misra * @param[in] path - file system path where read/write will be done 97854e61f2SSampa Misra * @param[in] upstream - direction of DMA transfer. "false" means a 98854e61f2SSampa Misra * transfer from host to BMC 99854e61f2SSampa Misra * @param[in] offset - offset to read/write 10075e02f84SDeepak Kodihalli * @param[in/out] length - length to be read/write mentioned by Host 101854e61f2SSampa Misra * @param[in] address - DMA address 102854e61f2SSampa Misra * 103854e61f2SSampa Misra * @return PLDM status code 104854e61f2SSampa Misra */ 105854e61f2SSampa Misra virtual int transferFileData(const fs::path& path, bool upstream, 10675e02f84SDeepak Kodihalli uint32_t offset, uint32_t& length, 107854e61f2SSampa Misra uint64_t address); 108854e61f2SSampa Misra 10915211b43SDeepak Kodihalli virtual int transferFileData(int fd, bool upstream, uint32_t offset, 11015211b43SDeepak Kodihalli uint32_t& length, uint64_t address); 11115211b43SDeepak Kodihalli 112ce1c96fbSRavi Teja virtual int transferFileDataToSocket(int fd, uint32_t& length, 113ce1c96fbSRavi Teja uint64_t address); 114ce1c96fbSRavi Teja 115854e61f2SSampa Misra /** @brief Constructor to create a FileHandler object 116854e61f2SSampa Misra */ FileHandler(uint32_t fileHandle)1176da4f91bSPatrick Williams FileHandler(uint32_t fileHandle) : fileHandle(fileHandle) {} 118854e61f2SSampa Misra 119854e61f2SSampa Misra /** FileHandler destructor 120854e61f2SSampa Misra */ ~FileHandler()1216da4f91bSPatrick Williams virtual ~FileHandler() {} 122854e61f2SSampa Misra 123854e61f2SSampa Misra protected: 124854e61f2SSampa Misra uint32_t fileHandle; //!< file handle indicating name of file or invalid 125854e61f2SSampa Misra }; 126854e61f2SSampa Misra 127854e61f2SSampa Misra /** @brief Method to create individual file handler objects based on file type 128854e61f2SSampa Misra * 129854e61f2SSampa Misra * @param[in] fileType - type of file 130854e61f2SSampa Misra * @param[in] fileHandle - file handle 131854e61f2SSampa Misra */ 132854e61f2SSampa Misra 133854e61f2SSampa Misra std::unique_ptr<FileHandler> getHandlerByType(uint16_t fileType, 134854e61f2SSampa Misra uint32_t fileHandle); 135854e61f2SSampa Misra } // namespace responder 136854e61f2SSampa Misra } // namespace pldm 137