xref: /openbmc/phosphor-hwmon/hwmonio.hpp (revision 043d32306e00484afc446a44789b61869ea14f84)
1 #pragma once
2 
3 #include <chrono>
4 #include <string>
5 
6 namespace hwmonio
7 {
8 
9 static constexpr auto retries = 10;
10 static constexpr auto delay = std::chrono::milliseconds{100};
11 
12 /** @class HwmonIOInterface
13  *  @brief Abstract base class defining a HwmonIOInterface.
14  *
15  *  This is initially to provide easier testing through injection,
16  *  however, could in theory support non-sysfs handling of hwmon IO.
17  */
18 class HwmonIOInterface
19 {
20   public:
21     virtual ~HwmonIOInterface() = default;
22 
23     virtual int64_t read(const std::string& type, const std::string& id,
24                          const std::string& sensor, size_t retries,
25                          std::chrono::milliseconds delay) const = 0;
26 
27     virtual void write(uint32_t val, const std::string& type,
28                        const std::string& id, const std::string& sensor,
29                        size_t retries,
30                        std::chrono::milliseconds delay) const = 0;
31 
32     virtual std::string path() const = 0;
33 };
34 
35 /** @class HwmonIO
36  *  @brief Convenience wrappers for HWMON sysfs attribute IO.
37  *
38  *  Unburden the rest of the application from having to check
39  *  ENOENT after every hwmon attribute io operation.  Hwmon
40  *  device drivers can be unbound at any time; the program
41  *  cannot always be terminated externally before we try to
42  *  do an io.
43  */
44 class HwmonIO : public HwmonIOInterface
45 {
46   public:
47     HwmonIO() = delete;
48     HwmonIO(const HwmonIO&) = default;
49     HwmonIO(HwmonIO&&) = default;
50     HwmonIO& operator=(const HwmonIO&) = default;
51     HwmonIO& operator=(HwmonIO&&) = default;
52     ~HwmonIO() = default;
53 
54     /** @brief Constructor
55      *
56      *  @param[in] path - hwmon instance root - eg:
57      *      /sys/class/hwmon/hwmon<N>
58      */
59     explicit HwmonIO(const std::string& path);
60 
61     /** @brief Perform formatted hwmon sysfs read.
62      *
63      *  Propagates any exceptions other than ENOENT.
64      *  ENOENT will result in a call to exit(0) in case
65      *  the underlying hwmon driver is unbound and
66      *  the program is inadvertently left running.
67      *
68      *  For possibly transient errors will retry up to
69      *  the specified number of times.
70      *
71      *  @param[in] type - The hwmon type (ex. temp).
72      *  @param[in] id - The hwmon id (ex. 1).
73      *  @param[in] sensor - The hwmon sensor (ex. input).
74      *  @param[in] retries - The number of times to retry.
75      *  @param[in] delay - The time to sleep between retry attempts.
76      *
77      *  @return val - The read value.
78      */
79     int64_t read(const std::string& type, const std::string& id,
80                  const std::string& sensor, size_t retries,
81                  std::chrono::milliseconds delay) const override;
82 
83     /** @brief Perform formatted hwmon sysfs write.
84      *
85      *  Propagates any exceptions other than ENOENT.
86      *  ENOENT will result in a call to exit(0) in case
87      *  the underlying hwmon driver is unbound and
88      *  the program is inadvertently left running.
89      *
90      *  For possibly transient errors will retry up to
91      *  the specified number of times.
92      *
93      *  @param[in] val - The value to be written.
94      *  @param[in] type - The hwmon type (ex. fan).
95      *  @param[in] id - The hwmon id (ex. 1).
96      *  @param[in] retries - The number of times to retry.
97      *  @param[in] delay - The time to sleep between retry attempts.
98      */
99     void write(uint32_t val, const std::string& type, const std::string& id,
100                const std::string& sensor, size_t retries,
101                std::chrono::milliseconds delay) const override;
102 
103     /** @brief Hwmon instance path access.
104      *
105      *  @return path - The hwmon instance path.
106      */
107     std::string path() const override;
108 
109   private:
110     std::string p;
111 };
112 } // namespace hwmonio
113 
114 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
115