blob: 5d2db87f3a3097f5f839bf1201c12af9828c83c1 [file] [log] [blame]
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +05301#pragma once
2
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +05303#include "config.h"
Gunnar Mills94df8c92018-09-14 14:50:03 -05004
5#include "occ_events.hpp"
6
7#include <unistd.h>
8
George Liubcef3b42021-09-10 12:39:02 +08009#include <filesystem>
Gunnar Mills94df8c92018-09-14 14:50:03 -050010#include <functional>
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053011namespace open_power
12{
13namespace occ
14{
15
George Liubcef3b42021-09-10 12:39:02 +080016namespace fs = std::filesystem;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053017
Eddie James9789e712022-05-25 15:43:40 -050018constexpr auto PRESENCE_ERROR_PATH =
Matt Spinlerfec4b0b2024-01-04 15:10:37 -060019 "org.open_power.OCC.Firmware.Error.PresenceMismatch";
20constexpr auto SAFE_ERROR_PATH = "org.open_power.OCC.Device.Error.SafeState";
Chris Cain4b82f3e2024-04-22 14:44:29 -050021constexpr auto MISSING_OCC_SENSORS_PATH =
22 "org.open_power.OCC.Firmware.Error.MissingOCCSensors";
Eddie James9789e712022-05-25 15:43:40 -050023
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053024/** @class Error
25 * @brief Monitors for OCC device error condition
26 */
27class Error
28{
Gunnar Mills94df8c92018-09-14 14:50:03 -050029 public:
30 Error() = delete;
31 Error(const Error&) = delete;
32 Error& operator=(const Error&) = delete;
33 Error(Error&&) = default;
34 Error& operator=(Error&&) = default;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053035
Gunnar Mills94df8c92018-09-14 14:50:03 -050036 /** @brief Constructs the Error object
37 *
38 * @param[in] event - reference to sd_event unique_ptr
39 * @param[in] file - File used by driver to communicate errors
40 * @param[in] callBack - Optional function callback on error condition
41 */
42 Error(EventPtr& event, const fs::path& file,
Eddie James9789e712022-05-25 15:43:40 -050043 std::function<void(int)> callBack = nullptr) :
Gunnar Mills94df8c92018-09-14 14:50:03 -050044 event(event),
Eddie James774f9af2019-03-19 20:58:53 +000045 file(file), callBack(callBack)
Gunnar Mills94df8c92018-09-14 14:50:03 -050046 {
47 // Nothing to do here.
48 }
49
George Liubddcf852021-09-08 08:46:22 +080050 virtual ~Error()
Gunnar Mills94df8c92018-09-14 14:50:03 -050051 {
52 if (fd >= 0)
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053053 {
Gunnar Mills94df8c92018-09-14 14:50:03 -050054 close(fd);
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053055 }
Gunnar Mills94df8c92018-09-14 14:50:03 -050056 }
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053057
Eddie James9789e712022-05-25 15:43:40 -050058 /** @class Descriptor
59 * @brief Contains data relevant to an error that occurred.
60 */
61 class Descriptor
62 {
63 public:
64 Descriptor(const Descriptor&) = default;
65 Descriptor& operator=(const Descriptor&) = default;
66 Descriptor(Descriptor&&) = default;
67 Descriptor& operator=(Descriptor&&) = default;
68
Patrick Williamsa49c9872023-05-10 07:50:35 -050069 Descriptor() : log(false), err(0), callout(nullptr), path(nullptr) {}
Eddie James9789e712022-05-25 15:43:40 -050070
71 /** @brief Constructs the Descriptor object
72 *
73 * @param[in] path - the DBus error path
74 * @param[in] err - Optional error return code
75 * @param[in] callout - Optional PEL callout path
76 */
77 Descriptor(const char* path, int err = 0,
78 const char* callout = nullptr) :
79 log(true),
80 err(err), callout(callout), path(path)
81 {}
82
83 bool log;
84 int err;
85 const char* callout;
86 const char* path;
87 };
88
Eddie James774f9af2019-03-19 20:58:53 +000089 /** @brief Starts to monitor for error conditions
90 *
91 * @param[in] poll - Indicates whether or not the error file should
92 * actually be polled for changes. Disabling polling is
93 * necessary for error files that don't support the poll
94 * file operation.
95 */
96 void addWatch(bool poll = true);
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +053097
Gunnar Mills94df8c92018-09-14 14:50:03 -050098 /** @brief Removes error watch */
99 void removeWatch();
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530100
Eddie James774f9af2019-03-19 20:58:53 +0000101 inline void setFile(const fs::path& f)
102 {
103 file = f;
104 }
105
Gunnar Mills94df8c92018-09-14 14:50:03 -0500106 private:
107 /** @brief sd_event wrapped in unique_ptr */
108 EventPtr& event;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530109
Gunnar Mills94df8c92018-09-14 14:50:03 -0500110 /** @brief event source wrapped in unique_ptr */
111 EventSourcePtr eventSource;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530112
Gunnar Mills94df8c92018-09-14 14:50:03 -0500113 /** @brief Current state of error watching */
114 bool watching = false;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530115
Gunnar Mills94df8c92018-09-14 14:50:03 -0500116 /** @brief attaches FD to events and sets up callback handler */
117 void registerCallBack();
Vishwanatha Subbanna2dc9b1a2017-08-18 18:29:41 +0530118
Gunnar Mills94df8c92018-09-14 14:50:03 -0500119 /** @brief Opens the file and populates fd */
120 void openFile();
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530121
Gunnar Mills94df8c92018-09-14 14:50:03 -0500122 /** @brief Callback handler when the FD has some activity on it
123 *
124 * @param[in] es - Populated event source
125 * @param[in] fd - Associated File descriptor
126 * @param[in] revents - Type of event
127 * @param[in] userData - User data that was passed during registration
128 *
129 * @return - 0 or positive number on success and negative
130 * errno otherwise
131 */
132 static int processEvents(sd_event_source* es, int fd, uint32_t revents,
133 void* userData);
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530134
Gunnar Mills94df8c92018-09-14 14:50:03 -0500135 /** @brief When the error event is received, analyzes it
136 * and makes a callback to error handler if the
137 * content denotes an error condition
138 */
139 virtual void analyzeEvent();
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530140
Gunnar Mills94df8c92018-09-14 14:50:03 -0500141 protected:
142 /** @brief File descriptor to watch for errors */
143 int fd = -1;
Edward A. James636577f2017-10-06 10:53:55 -0500144
Gunnar Mills94df8c92018-09-14 14:50:03 -0500145 /** Error file */
Eddie James774f9af2019-03-19 20:58:53 +0000146 fs::path file;
Edward A. James636577f2017-10-06 10:53:55 -0500147
Gunnar Mills94df8c92018-09-14 14:50:03 -0500148 /** @brief Optional function to call on error scenario */
Eddie James9789e712022-05-25 15:43:40 -0500149 std::function<void(int)> callBack;
Edward A. James636577f2017-10-06 10:53:55 -0500150
Gunnar Mills94df8c92018-09-14 14:50:03 -0500151 /** @brief Reads file data
152 *
153 * @return data read. Since its a /sysfs entry,
154 * it would be a string
155 */
156 std::string readFile(int) const;
Vishwanatha Subbannaee4d83d2017-06-29 18:35:00 +0530157};
158
159} // namespace occ
160} // namespace open_power