xref: /openbmc/phosphor-ipmi-flash/bmc/firmware-handler/lpc_nuvoton.hpp (revision 42a44c281cce08be0ca6251955f4fb73d30c8ced)
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 <utility>
9ded66d0fSJason Ling #include <vector>
10ded66d0fSJason Ling 
11ded66d0fSJason Ling namespace ipmi_flash
12ded66d0fSJason Ling {
13ded66d0fSJason Ling 
14ded66d0fSJason Ling class LpcMapperNuvoton : public HardwareMapperInterface
15ded66d0fSJason Ling {
16ded66d0fSJason Ling   public:
17*42a44c28SPatrick Williams     static std::unique_ptr<HardwareMapperInterface> createNuvotonMapper(
18*42a44c28SPatrick Williams         std::uint32_t regionAddress, std::uint32_t regionSize);
19ded66d0fSJason Ling 
20ded66d0fSJason Ling     /**
21ded66d0fSJason Ling      * Create an LpcMapper for Nuvoton.
22ded66d0fSJason Ling      *
23ded66d0fSJason Ling      * @param[in] regionAddress - where to map the window into BMC memory.
24ded66d0fSJason Ling      * @param[in] regionSize - the size to map for copying data.
25ded66d0fSJason Ling      * @param[in] a sys call interface pointer.
26ded66d0fSJason Ling      * @todo Needs reserved memory region's physical address and size.
27ded66d0fSJason Ling      */
LpcMapperNuvoton(std::uint32_t regionAddress,std::uint32_t regionSize,const internal::Sys * sys=& internal::sys_impl)28ded66d0fSJason Ling     LpcMapperNuvoton(std::uint32_t regionAddress, std::uint32_t regionSize,
29ded66d0fSJason Ling                      const internal::Sys* sys = &internal::sys_impl) :
30*42a44c28SPatrick Williams         regionAddress(regionAddress), memoryRegionSize(regionSize), sys(sys) {};
31ded66d0fSJason Ling 
32ded66d0fSJason Ling     /** Attempt to map the window for copying bytes, after mapWindow is called.
33ded66d0fSJason Ling      * throws MapperException
34ded66d0fSJason Ling      */
35ded66d0fSJason Ling     MemorySet open() override;
36ded66d0fSJason Ling 
37ded66d0fSJason Ling     void close() override;
38ded66d0fSJason Ling 
39ded66d0fSJason Ling     WindowMapResult mapWindow(std::uint32_t address,
40ded66d0fSJason Ling                               std::uint32_t length) override;
41ded66d0fSJason Ling 
42ded66d0fSJason Ling   private:
43ded66d0fSJason Ling     std::uint32_t regionAddress;
44ded66d0fSJason Ling     std::uint32_t memoryRegionSize;
45ded66d0fSJason Ling     const internal::Sys* sys;
46ded66d0fSJason Ling 
47ded66d0fSJason Ling     /* The file handle to /dev/mem. */
48ded66d0fSJason Ling     int mappedFd = -1;
49ded66d0fSJason Ling 
50ded66d0fSJason Ling     /* The pointer to the memory-mapped region. */
51ded66d0fSJason Ling     std::uint8_t* mapped = nullptr;
52ded66d0fSJason Ling };
53ded66d0fSJason Ling 
54ded66d0fSJason Ling } // namespace ipmi_flash
55