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