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 */ 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