1 #pragma once
2 
3 #include <string>
4 #include <sdbusplus/bus.hpp>
5 #include <sdbusplus/server/object.hpp>
6 #include <org/open_power/OCC/PassThrough/server.hpp>
7 
8 namespace open_power
9 {
10 namespace occ
11 {
12 
13 using Iface = sdbusplus::server::object::object<
14     sdbusplus::org::open_power::OCC::server::PassThrough>;
15 
16 // For waiting on signals
17 namespace sdbusRule = sdbusplus::bus::match::rules;
18 
19 /** @class PassThrough
20  *  @brief Implements org.open_power.OCC.PassThrough
21  */
22 class PassThrough : public Iface
23 {
24     public:
25         PassThrough() = delete;
26         PassThrough(const PassThrough&) = delete;
27         PassThrough& operator=(const PassThrough&) = delete;
28         PassThrough(PassThrough&&) = default;
29         PassThrough& operator=(PassThrough&&) = default;
30 
31         /** @brief Ctor to put pass-through d-bus object on the bus
32          *  @param[in] bus - Bus to attach to
33          *  @param[in] path - Path to attach at
34          */
35         PassThrough(sdbusplus::bus::bus& bus,
36                     const char* path);
37 
38         ~PassThrough()
39         {
40             closeDevice();
41         }
42 
43         /** @brief Pass through command to OCC
44          *  @param[in] command - command to pass-through
45          *  @returns OCC response as an array
46          */
47         std::vector<std::int32_t>
48             send(std::vector<std::int32_t> command) override;
49 
50     private:
51         /** @brief Pass-through occ path on the bus */
52         std::string path;
53 
54         /** @brief OCC device path
55          *  For now, here is the hard-coded mapping until
56          *  the udev rule is in.
57          *  occ0 --> /dev/occ1
58          *  occ1 --> /dev/occ2
59          *  ...
60          */
61         std::string devicePath;
62 
63         /** @brief Indicates whether or not the OCC is currently active */
64         bool occActive = false;
65 
66         /** brief file descriptor associated with occ device */
67         int fd = -1;
68 
69         /** @brief Subscribe to OCC Status signal
70          *
71          *  Once the OCC status gets to active, only then we will get /dev/occ2
72          *  populated and hence need to wait on that before opening that
73          */
74         sdbusplus::bus::match_t activeStatusSignal;
75 
76         /** Opens devicePath and populates file descritor */
77         void openDevice();
78 
79         /** Closed the fd associated with opened device */
80         void closeDevice();
81 
82         /** @brief Callback function on OCC Status change signals
83          *
84          *  @param[in]  msg - Data associated with subscribed signal
85          */
86         void activeStatusEvent(sdbusplus::message::message& msg);
87 };
88 
89 } // namespace occ
90 } // namespace open_power
91