xref: /openbmc/phosphor-power/pmbus.hpp (revision 57868bc5cae12bd6d838cf7b976fad3f281a018b)
1015e3adeSMatt Spinler #pragma once
2015e3adeSMatt Spinler 
3015e3adeSMatt Spinler #include <experimental/filesystem>
4015e3adeSMatt Spinler #include <string>
5015e3adeSMatt Spinler #include <vector>
6015e3adeSMatt Spinler 
7015e3adeSMatt Spinler namespace witherspoon
8015e3adeSMatt Spinler {
9015e3adeSMatt Spinler namespace pmbus
10015e3adeSMatt Spinler {
11015e3adeSMatt Spinler 
12015e3adeSMatt Spinler /**
13*57868bc5SMatt Spinler  * If the access should be done in the base
14*57868bc5SMatt Spinler  * device directory or the hwmon directory.
15*57868bc5SMatt Spinler  */
16*57868bc5SMatt Spinler enum class Type
17*57868bc5SMatt Spinler {
18*57868bc5SMatt Spinler     Base,
19*57868bc5SMatt Spinler     Hwmon
20*57868bc5SMatt Spinler };
21*57868bc5SMatt Spinler 
22*57868bc5SMatt Spinler /**
23015e3adeSMatt Spinler  * @class PMBus
24015e3adeSMatt Spinler  *
25015e3adeSMatt Spinler  * This class is an interface to communicating with PMBus devices
26015e3adeSMatt Spinler  * by reading and writing sysfs files.
27*57868bc5SMatt Spinler  *
28*57868bc5SMatt Spinler  * Based on the Type parameter, the accesses can either be done
29*57868bc5SMatt Spinler  * in the base device directory (the one passed into the constructor),
30*57868bc5SMatt Spinler  * or in the hwmon directory for the device.
31015e3adeSMatt Spinler  */
32015e3adeSMatt Spinler class PMBus
33015e3adeSMatt Spinler {
34015e3adeSMatt Spinler     public:
35015e3adeSMatt Spinler 
36015e3adeSMatt Spinler         PMBus() = delete;
37015e3adeSMatt Spinler         ~PMBus() = default;
38015e3adeSMatt Spinler         PMBus(const PMBus&) = default;
39015e3adeSMatt Spinler         PMBus& operator=(const PMBus&) = default;
40015e3adeSMatt Spinler         PMBus(PMBus&&) = default;
41015e3adeSMatt Spinler         PMBus& operator=(PMBus&&) = default;
42015e3adeSMatt Spinler 
43015e3adeSMatt Spinler         /**
44015e3adeSMatt Spinler          * Constructor
45015e3adeSMatt Spinler          *
46015e3adeSMatt Spinler          * @param[in] path - path to the sysfs directory
47015e3adeSMatt Spinler          */
48015e3adeSMatt Spinler         PMBus(const std::string& path) :
49015e3adeSMatt Spinler             basePath(path)
50015e3adeSMatt Spinler         {
51*57868bc5SMatt Spinler             findHwmonRelativePath();
52015e3adeSMatt Spinler         }
53015e3adeSMatt Spinler 
54015e3adeSMatt Spinler         /**
55015e3adeSMatt Spinler          * Reads a file in sysfs that represents a single bit,
56015e3adeSMatt Spinler          * therefore doing a PMBus read.
57015e3adeSMatt Spinler          *
58015e3adeSMatt Spinler          * @param[in] name - path concatenated to
59015e3adeSMatt Spinler          *                   basePath to read
60*57868bc5SMatt Spinler          * @param[in] type - either Base or Hwmon
61015e3adeSMatt Spinler          *
62015e3adeSMatt Spinler          * @return bool - false if result was 0, else true
63015e3adeSMatt Spinler          */
64*57868bc5SMatt Spinler         bool readBit(const std::string& name, Type type);
65015e3adeSMatt Spinler 
66015e3adeSMatt Spinler         /**
67015e3adeSMatt Spinler          * Reads a file in sysfs that represents a single bit,
68015e3adeSMatt Spinler          * where the page number passed in is substituted
69015e3adeSMatt Spinler          * into the name in place of the 'P' character in it.
70015e3adeSMatt Spinler          *
71015e3adeSMatt Spinler          * @param[in] name - path concatenated to
72015e3adeSMatt Spinler          *                   basePath to read
73015e3adeSMatt Spinler          * @param[in] page - page number
74*57868bc5SMatt Spinler          * @param[in] type - either Base or Hwmon
75015e3adeSMatt Spinler          *
76015e3adeSMatt Spinler          * @return bool - false if result was 0, else true
77015e3adeSMatt Spinler          */
78015e3adeSMatt Spinler         bool readBitInPage(const std::string& name,
79*57868bc5SMatt Spinler                            size_t page,
80*57868bc5SMatt Spinler                            Type type);
81015e3adeSMatt Spinler 
82015e3adeSMatt Spinler         /**
83015e3adeSMatt Spinler          * Writes an integer value to the file, therefore doing
84015e3adeSMatt Spinler          * a PMBus write.
85015e3adeSMatt Spinler          *
86015e3adeSMatt Spinler          * @param[in] name - path concatenated to
87015e3adeSMatt Spinler          *                   basePath to write
88015e3adeSMatt Spinler          * @param[in] value - the value to write
89*57868bc5SMatt Spinler          * @param[in] type - either Base or Hwmon
90015e3adeSMatt Spinler          */
91*57868bc5SMatt Spinler         void write(const std::string& name, int value, Type type);
92015e3adeSMatt Spinler 
93015e3adeSMatt Spinler         /**
94015e3adeSMatt Spinler          * Returns the sysfs base path of this device
95015e3adeSMatt Spinler          */
96015e3adeSMatt Spinler         inline const auto& path() const
97015e3adeSMatt Spinler         {
98015e3adeSMatt Spinler             return basePath;
99015e3adeSMatt Spinler         }
100015e3adeSMatt Spinler 
101015e3adeSMatt Spinler         /**
102015e3adeSMatt Spinler          * Replaces the 'P' in the string passed in with
103015e3adeSMatt Spinler          * the page number passed in.
104015e3adeSMatt Spinler          *
105015e3adeSMatt Spinler          * For example:
106015e3adeSMatt Spinler          *   insertPageNum("inP_enable", 42)
107015e3adeSMatt Spinler          *   returns "in42_enable"
108015e3adeSMatt Spinler          *
109015e3adeSMatt Spinler          * @param[in] templateName - the name string, with a 'P' in it
110015e3adeSMatt Spinler          * @param[in] page - the page number to insert where the P was
111015e3adeSMatt Spinler          *
112015e3adeSMatt Spinler          * @return string - the new string with the page number in it
113015e3adeSMatt Spinler          */
114015e3adeSMatt Spinler         static std::string insertPageNum(const std::string& templateName,
115015e3adeSMatt Spinler                                          size_t page);
116015e3adeSMatt Spinler 
117*57868bc5SMatt Spinler         /**
118*57868bc5SMatt Spinler          * Finds the path relative to basePath to the hwmon directory
119*57868bc5SMatt Spinler          * for the device and stores it in hwmonRelPath.
120*57868bc5SMatt Spinler          */
121*57868bc5SMatt Spinler          void findHwmonRelativePath();
122*57868bc5SMatt Spinler 
123015e3adeSMatt Spinler     private:
124015e3adeSMatt Spinler 
125015e3adeSMatt Spinler         /**
126015e3adeSMatt Spinler          * The sysfs device path
127015e3adeSMatt Spinler          */
128015e3adeSMatt Spinler         std::experimental::filesystem::path basePath;
129015e3adeSMatt Spinler 
130*57868bc5SMatt Spinler         /**
131*57868bc5SMatt Spinler          * The relative (to basePath) path to the hwmon directory
132*57868bc5SMatt Spinler          */
133*57868bc5SMatt Spinler         std::experimental::filesystem::path hwmonRelPath;
134*57868bc5SMatt Spinler 
135015e3adeSMatt Spinler };
136015e3adeSMatt Spinler 
137015e3adeSMatt Spinler }
138015e3adeSMatt Spinler }
139