xref: /openbmc/phosphor-power/pmbus.hpp (revision 57868bc5)
1 #pragma once
2 
3 #include <experimental/filesystem>
4 #include <string>
5 #include <vector>
6 
7 namespace witherspoon
8 {
9 namespace pmbus
10 {
11 
12 /**
13  * If the access should be done in the base
14  * device directory or the hwmon directory.
15  */
16 enum class Type
17 {
18     Base,
19     Hwmon
20 };
21 
22 /**
23  * @class PMBus
24  *
25  * This class is an interface to communicating with PMBus devices
26  * by reading and writing sysfs files.
27  *
28  * Based on the Type parameter, the accesses can either be done
29  * in the base device directory (the one passed into the constructor),
30  * or in the hwmon directory for the device.
31  */
32 class PMBus
33 {
34     public:
35 
36         PMBus() = delete;
37         ~PMBus() = default;
38         PMBus(const PMBus&) = default;
39         PMBus& operator=(const PMBus&) = default;
40         PMBus(PMBus&&) = default;
41         PMBus& operator=(PMBus&&) = default;
42 
43         /**
44          * Constructor
45          *
46          * @param[in] path - path to the sysfs directory
47          */
48         PMBus(const std::string& path) :
49             basePath(path)
50         {
51             findHwmonRelativePath();
52         }
53 
54         /**
55          * Reads a file in sysfs that represents a single bit,
56          * therefore doing a PMBus read.
57          *
58          * @param[in] name - path concatenated to
59          *                   basePath to read
60          * @param[in] type - either Base or Hwmon
61          *
62          * @return bool - false if result was 0, else true
63          */
64         bool readBit(const std::string& name, Type type);
65 
66         /**
67          * Reads a file in sysfs that represents a single bit,
68          * where the page number passed in is substituted
69          * into the name in place of the 'P' character in it.
70          *
71          * @param[in] name - path concatenated to
72          *                   basePath to read
73          * @param[in] page - page number
74          * @param[in] type - either Base or Hwmon
75          *
76          * @return bool - false if result was 0, else true
77          */
78         bool readBitInPage(const std::string& name,
79                            size_t page,
80                            Type type);
81 
82         /**
83          * Writes an integer value to the file, therefore doing
84          * a PMBus write.
85          *
86          * @param[in] name - path concatenated to
87          *                   basePath to write
88          * @param[in] value - the value to write
89          * @param[in] type - either Base or Hwmon
90          */
91         void write(const std::string& name, int value, Type type);
92 
93         /**
94          * Returns the sysfs base path of this device
95          */
96         inline const auto& path() const
97         {
98             return basePath;
99         }
100 
101         /**
102          * Replaces the 'P' in the string passed in with
103          * the page number passed in.
104          *
105          * For example:
106          *   insertPageNum("inP_enable", 42)
107          *   returns "in42_enable"
108          *
109          * @param[in] templateName - the name string, with a 'P' in it
110          * @param[in] page - the page number to insert where the P was
111          *
112          * @return string - the new string with the page number in it
113          */
114         static std::string insertPageNum(const std::string& templateName,
115                                          size_t page);
116 
117         /**
118          * Finds the path relative to basePath to the hwmon directory
119          * for the device and stores it in hwmonRelPath.
120          */
121          void findHwmonRelativePath();
122 
123     private:
124 
125         /**
126          * The sysfs device path
127          */
128         std::experimental::filesystem::path basePath;
129 
130         /**
131          * The relative (to basePath) path to the hwmon directory
132          */
133         std::experimental::filesystem::path hwmonRelPath;
134 
135 };
136 
137 }
138 }
139