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