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