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