1ded66d0fSJason Ling #pragma once 2ded66d0fSJason Ling 3ded66d0fSJason Ling #include "data_handler.hpp" 4ded66d0fSJason Ling #include "window_hw_interface.hpp" 5ded66d0fSJason Ling 6ded66d0fSJason Ling #include <cstdint> 7ded66d0fSJason Ling #include <memory> 8ded66d0fSJason Ling #include <vector> 9ded66d0fSJason Ling 10ded66d0fSJason Ling namespace ipmi_flash 11ded66d0fSJason Ling { 12ded66d0fSJason Ling 13ded66d0fSJason Ling struct LpcRegion 14ded66d0fSJason Ling { 15ded66d0fSJason Ling /* Host LPC address where the chunk is to be mapped. */ 16ded66d0fSJason Ling std::uint32_t address; 17ded66d0fSJason Ling 18ded66d0fSJason Ling /* Size of the chunk to be mapped. */ 19ded66d0fSJason Ling std::uint32_t length; 20ded66d0fSJason Ling } __attribute__((packed)); 21ded66d0fSJason Ling 22ded66d0fSJason Ling /** 23ded66d0fSJason Ling * Data Handler for configuration the ASPEED LPC memory region, reading and 24ded66d0fSJason Ling * writing data. 25ded66d0fSJason Ling */ 26ded66d0fSJason Ling class LpcDataHandler : public DataInterface 27ded66d0fSJason Ling { 28ded66d0fSJason Ling public: 29ded66d0fSJason Ling /** 30ded66d0fSJason Ling * Create an LpcDataHandler. 31ded66d0fSJason Ling * 32ded66d0fSJason Ling * @param[in] mapper - pointer to a mapper implementation to use. 33ded66d0fSJason Ling */ LpcDataHandler(std::unique_ptr<HardwareMapperInterface> mapper)34ded66d0fSJason Ling explicit LpcDataHandler(std::unique_ptr<HardwareMapperInterface> mapper) : 35ded66d0fSJason Ling mapper(std::move(mapper)), initialized(false) 36ded66d0fSJason Ling {} 37ded66d0fSJason Ling 38ded66d0fSJason Ling bool open() override; 39ded66d0fSJason Ling bool close() override; 40ded66d0fSJason Ling std::vector<std::uint8_t> copyFrom(std::uint32_t length) override; 41ded66d0fSJason Ling bool writeMeta(const std::vector<std::uint8_t>& configuration) override; 42ded66d0fSJason Ling std::vector<std::uint8_t> readMeta() override; 43ded66d0fSJason Ling 44ded66d0fSJason Ling private: 45*a6065507SPatrick Venture bool setInitializedAndReturn(bool value); 46ded66d0fSJason Ling 47ded66d0fSJason Ling std::unique_ptr<HardwareMapperInterface> mapper; 48ded66d0fSJason Ling bool initialized; 49ded66d0fSJason Ling /* The LPC Handler does not take ownership of this, in case there's cleanup 50ded66d0fSJason Ling * required for close() 51ded66d0fSJason Ling */ 52ded66d0fSJason Ling MemorySet memory = {}; 53ded66d0fSJason Ling 54ded66d0fSJason Ling /* Offset in reserved memory at which host data arrives. */ 55ded66d0fSJason Ling /* Size of the chunk of the memory region in use by the host (e.g. 56ded66d0fSJason Ling * mapped over external block mechanism). 57ded66d0fSJason Ling */ 58ded66d0fSJason Ling WindowMapResult mappingResult = {}; 59ded66d0fSJason Ling }; 60ded66d0fSJason Ling 61ded66d0fSJason Ling } // namespace ipmi_flash 62