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