xref: /openbmc/phosphor-ipmi-flash/tools/io.hpp (revision d8515a6c)
1 #pragma once
2 
3 #include "internal/sys.hpp"
4 
5 #include <cstdint>
6 #include <string>
7 
8 namespace host_tool
9 {
10 
11 class HostIoInterface
12 {
13   public:
14     virtual ~HostIoInterface() = default;
15 
16     /**
17      * Attempt to read bytes from offset to the destination from the host
18      * memory device.
19      *
20      * @param[in] offset - offset into the host memory device.
21      * @param[in] length - the number of bytes to copy from source.
22      * @param[in] destination - where to write the bytes.
23      * @return true on success, false on failure (such as unable to initialize
24      * device).
25      */
26     virtual bool read(const std::size_t offset, const std::size_t length,
27                       void* const destination) = 0;
28 
29     /**
30      * Attempt to write bytes from source to offset into the host memory device.
31      *
32      * @param[in] offset - offset into the host memory device.
33      * @param[in] length - the number of bytes to copy from source.
34      * @param[in] source - the souce of the bytes to copy to the memory device.
35      * @return true on success, false on failure (such as unable to initialize
36      * device).
37      */
38     virtual bool write(const std::size_t offset, const std::size_t length,
39                        const void* const source) = 0;
40 };
41 
42 class DevMemDevice : public HostIoInterface
43 {
44   public:
45     explicit DevMemDevice(const internal::Sys* sys = &internal::sys_impl) :
46         sys(sys)
47     {
48     }
49 
50     ~DevMemDevice() = default;
51 
52     /* Don't allow copying, assignment or move assignment, only moving. */
53     DevMemDevice(const DevMemDevice&) = delete;
54     DevMemDevice& operator=(const DevMemDevice&) = delete;
55     DevMemDevice(DevMemDevice&&) = default;
56     DevMemDevice& operator=(DevMemDevice&&) = delete;
57 
58     bool read(const std::size_t offset, const std::size_t length,
59               void* const destination) override;
60 
61     bool write(const std::size_t offset, const std::size_t length,
62                const void* const source) override;
63 
64   private:
65     static const std::string devMemPath;
66     int devMemFd = -1;
67     void* devMemMapped = nullptr;
68     const internal::Sys* sys;
69 };
70 
71 class PpcMemDevice : public HostIoInterface
72 {
73   public:
74     explicit PpcMemDevice(const std::string& ppcMemPath,
75                           const internal::Sys* sys = &internal::sys_impl) :
76         ppcMemPath(ppcMemPath),
77         sys(sys)
78     {
79     }
80 
81     ~PpcMemDevice() override;
82 
83     /* Don't allow copying or assignment, only moving. */
84     PpcMemDevice(const PpcMemDevice&) = delete;
85     PpcMemDevice& operator=(const PpcMemDevice&) = delete;
86     PpcMemDevice(PpcMemDevice&&) = default;
87     PpcMemDevice& operator=(PpcMemDevice&&) = default;
88 
89     bool read(const std::size_t offset, const std::size_t length,
90               void* const destination) override;
91 
92     bool write(const std::size_t offset, const std::size_t length,
93                const void* const source) override;
94 
95   private:
96     int ppcMemFd = -1;
97     const std::string ppcMemPath;
98     const internal::Sys* sys;
99 };
100 
101 } // namespace host_tool
102