1 #pragma once
2 
3 #include "data_handler.hpp"
4 #include "internal/sys.hpp"
5 
6 #include <cstdint>
7 #include <string>
8 #include <vector>
9 
10 namespace ipmi_flash
11 {
12 
13 /**
14  * Data handler for reading and writing data via the P2A bridge.
15  *
16  * @note: Currently implemented to support only aspeed-p2a-ctrl.
17  */
18 class PciDataHandler : public DataInterface
19 {
20   public:
PciDataHandler(std::uint32_t regionAddress,std::size_t regionSize,const internal::Sys * sys=& internal::sys_impl)21     PciDataHandler(std::uint32_t regionAddress, std::size_t regionSize,
22                    const internal::Sys* sys = &internal::sys_impl) :
23         regionAddress(regionAddress), memoryRegionSize(regionSize), sys(sys) {};
24 
25     bool open() override;
26     bool close() override;
27     std::vector<std::uint8_t> copyFrom(std::uint32_t length) override;
28     bool writeMeta(const std::vector<std::uint8_t>& configuration) override;
29     std::vector<std::uint8_t> readMeta() override;
30 
31   private:
32     std::uint32_t regionAddress;
33     std::uint32_t memoryRegionSize;
34     const internal::Sys* sys;
35 
36     int mappedFd = -1;
37     std::uint8_t* mapped = nullptr;
38     static const std::string p2aControlPath;
39 };
40 
41 } // namespace ipmi_flash
42