xref: /openbmc/phosphor-hwmon/sysfs.hpp (revision 754d38cffae079a2efa43735c013d792e8f01500)
1 #pragma once
2 
3 #include <chrono>
4 #include <exception>
5 #include <fstream>
6 #include <string>
7 
8 namespace sysfs {
9 
10 inline std::string make_sysfs_path(const std::string& path,
11                                    const std::string& type,
12                                    const std::string& id,
13                                    const std::string& entry)
14 {
15     using namespace std::literals;
16 
17     return path + "/"s + type + id + "_"s + entry;
18 }
19 
20 /** @brief Return the path to the phandle file matching value in io-channels.
21  *
22  *  This function will take two passed in paths.
23  *  One path is used to find the io-channels file.
24  *  The other path is used to find the phandle file.
25  *  The 4 byte phandle value is read from the phandle file(s).
26  *  The 4 byte phandle value and 4 byte index value is read from io-channels.
27  *  When a match is found, the path to the matching phandle file is returned.
28  *
29  *  @param[in] iochanneldir - Path to file for getting phandle from io-channels
30  *  @param[in] phandledir - Path to use for reading from phandle file
31  *
32  *  @return Path to phandle file with value matching that in io-channels
33  */
34 std::string findPhandleMatch(
35         const std::string& iochanneldir,
36         const std::string& phandledir);
37 
38 /** @brief Find hwmon instances
39  *
40  *  Look for a matching hwmon instance given an
41  *  open firmware device path.
42  *
43  *  @param[in] ofNode- The open firmware device path.
44  *
45  *  @returns[in] - The hwmon instance path or an empty
46  *                 string if no match is found.
47  */
48 std::string findHwmon(const std::string& ofNode);
49 
50 /** @brief Return the path to use for a call out.
51  *
52  *  Return an empty string if a callout path cannot be
53  *  found.
54  *
55  *  @param[in] instancePath - /sys/class/hwmon/hwmon<N> path.
56  *
57  *  @return Path to use for call out
58  */
59 std::string findCalloutPath(const std::string& instancePath);
60 
61 namespace hwmonio
62 {
63 static constexpr auto retries = 10;
64 static constexpr auto delay = std::chrono::milliseconds{100};
65 
66 /** @class HwmonIO
67  *  @brief Convenience wrappers for HWMON sysfs attribute IO.
68  *
69  *  Unburden the rest of the application from having to check
70  *  ENOENT after every hwmon attribute io operation.  Hwmon
71  *  device drivers can be unbound at any time; the program
72  *  cannot always be terminated externally before we try to
73  *  do an io.
74  */
75 class HwmonIO
76 {
77     public:
78         HwmonIO() = delete;
79         HwmonIO(const HwmonIO&) = default;
80         HwmonIO(HwmonIO&&) = default;
81         HwmonIO& operator=(const HwmonIO&) = default;
82         HwmonIO& operator=(HwmonIO&&) = default;
83         ~HwmonIO() = default;
84 
85         /** @brief Constructor
86          *
87          *  @param[in] path - hwmon instance root - eg:
88          *      /sys/class/hwmon/hwmon<N>
89          */
90         explicit HwmonIO(const std::string& path);
91 
92         /** @brief Perform formatted hwmon sysfs read.
93          *
94          *  Propogates any exceptions other than ENOENT.
95          *  ENOENT will result in a call to exit(0) in case
96          *  the underlying hwmon driver is unbound and
97          *  the program is inadvertently left running.
98          *
99          *  For possibly transient errors will retry up to
100          *  the specified number of times.
101          *
102          *  @param[in] type - The hwmon type (ex. temp).
103          *  @param[in] id - The hwmon id (ex. 1).
104          *  @param[in] sensor - The hwmon sensor (ex. input).
105          *  @param[in] retries - The number of times to retry.
106          *  @param[in] delay - The time to sleep between retry attempts.
107          *
108          *  @return val - The read value.
109          */
110         uint32_t read(
111                 const std::string& type,
112                 const std::string& id,
113                 const std::string& sensor,
114                 size_t retries,
115                 std::chrono::milliseconds delay) const;
116 
117         /** @brief Perform formatted hwmon sysfs write.
118          *
119          *  Propogates any exceptions other than ENOENT.
120          *  ENOENT will result in a call to exit(0) in case
121          *  the underlying hwmon driver is unbound and
122          *  the program is inadvertently left running.
123          *
124          *  For possibly transient errors will retry up to
125          *  the specified number of times.
126          *
127          *  @param[in] val - The value to be written.
128          *  @param[in] type - The hwmon type (ex. fan).
129          *  @param[in] id - The hwmon id (ex. 1).
130          *  @param[in] retries - The number of times to retry.
131          *  @param[in] delay - The time to sleep between retry attempts.
132          */
133         void write(
134                 uint32_t val,
135                 const std::string& type,
136                 const std::string& id,
137                 const std::string& sensor,
138                 size_t retries,
139                 std::chrono::milliseconds delay) const;
140 
141 
142         /** @brief Hwmon instance path access.
143          *
144          *  @return path - The hwmon instance path.
145          */
146         std::string path() const;
147 
148     private:
149         std::string p;
150 };
151 } // namespace hwmonio
152 }
153 
154 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
155