xref: /openbmc/phosphor-ipmi-flash/tools/io.hpp (revision 2950c258)
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     ~DevMemDevice() = default;
50 
51     /* Don't allow copying, assignment or move assignment, only moving. */
52     DevMemDevice(const DevMemDevice&) = delete;
53     DevMemDevice& operator=(const DevMemDevice&) = delete;
54     DevMemDevice(DevMemDevice&&) = default;
55     DevMemDevice& operator=(DevMemDevice&&) = delete;
56 
57     bool read(const std::size_t offset, const std::size_t length,
58               void* const destination) override;
59 
60     bool write(const std::size_t offset, const std::size_t length,
61                const void* const source) override;
62 
63   private:
64     static const std::string devMemPath;
65     int devMemFd = -1;
66     void* devMemMapped = nullptr;
67     const internal::Sys* sys;
68 };
69 
70 class PpcMemDevice : public HostIoInterface
71 {
72   public:
73     explicit PpcMemDevice(const std::string& ppcMemPath,
74                           const internal::Sys* sys = &internal::sys_impl) :
75         ppcMemPath(ppcMemPath),
76         sys(sys)
77     {}
78 
79     ~PpcMemDevice() override;
80 
81     /* Don't allow copying or assignment, only moving. */
82     PpcMemDevice(const PpcMemDevice&) = delete;
83     PpcMemDevice& operator=(const PpcMemDevice&) = delete;
84     PpcMemDevice(PpcMemDevice&&) = default;
85     PpcMemDevice& operator=(PpcMemDevice&&) = default;
86 
87     bool read(const std::size_t offset, const std::size_t length,
88               void* const destination) override;
89 
90     bool write(const std::size_t offset, const std::size_t length,
91                const void* const source) override;
92 
93   private:
94     int ppcMemFd = -1;
95     const std::string ppcMemPath;
96     const internal::Sys* sys;
97 };
98 
99 } // namespace host_tool
100