1 #pragma once
2 
3 #include "internal/sys.hpp"
4 #include "window_hw_interface.hpp"
5 
6 #include <cstdint>
7 #include <memory>
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 namespace ipmi_flash
13 {
14 
15 class LpcMapperAspeed : public HardwareMapperInterface
16 {
17   public:
18     static std::unique_ptr<HardwareMapperInterface>
19         createAspeedMapper(std::uint32_t regionAddress, std::size_t regionSize);
20 
21     /* NOTE: This object is created and then never destroyed (unless ipmid
22      * stops/crashes, etc)
23      */
LpcMapperAspeed(std::uint32_t regionAddress,std::size_t regionSize,const internal::Sys * sys=& internal::sys_impl)24     LpcMapperAspeed(std::uint32_t regionAddress, std::size_t regionSize,
25                     const internal::Sys* sys = &internal::sys_impl) :
26         regionAddress(regionAddress),
27         regionSize(regionSize), sys(sys){};
28 
29     LpcMapperAspeed(const LpcMapperAspeed&) = delete;
30     LpcMapperAspeed& operator=(const LpcMapperAspeed&) = delete;
31     LpcMapperAspeed(LpcMapperAspeed&&) = default;
32     LpcMapperAspeed& operator=(LpcMapperAspeed&&) = default;
33 
34     /* throws MapperException */
35     MemorySet open() override;
36 
37     void close() override;
38 
39     WindowMapResult mapWindow(std::uint32_t address,
40                               std::uint32_t length) override;
41 
42     /**
43      * Attempt to mmap the region.
44      *
45      * @return true on success, false otherwise.
46      */
47     bool mapRegion();
48 
49   private:
50     static const std::string lpcControlPath;
51     int mappedFd = -1;
52     std::uint8_t* mappedRegion = nullptr;
53     std::uint32_t regionAddress;
54     std::size_t regionSize;
55     const internal::Sys* sys;
56 };
57 
58 } // namespace ipmi_flash
59