blob: 52a8f7178ff8ce20b0d7bc93982970746e3b4982 [file] [log] [blame]
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -05001#pragma once
2
Chris Caina8857c52021-01-27 11:53:05 -06003#include "occ_command.hpp"
Chris Cain36f9cde2021-11-22 11:18:21 -06004#include "powermode.hpp"
George Liuf3b75142021-06-10 11:22:50 +08005#include "utils.hpp"
Chris Caina8857c52021-01-27 11:53:05 -06006
7#include <fmt/core.h>
8
Gunnar Mills94df8c92018-09-14 14:50:03 -05009#include <org/open_power/OCC/PassThrough/server.hpp>
Chris Caina8857c52021-01-27 11:53:05 -060010#include <phosphor-logging/log.hpp>
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050011#include <sdbusplus/bus.hpp>
12#include <sdbusplus/server/object.hpp>
George Liub5ca1012021-09-10 12:53:11 +080013
Gunnar Mills94df8c92018-09-14 14:50:03 -050014#include <string>
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050015
16namespace open_power
17{
18namespace occ
19{
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050020
21using Iface = sdbusplus::server::object::object<
22 sdbusplus::org::open_power::OCC::server::PassThrough>;
23
Vishwanatha Subbanna3e5422e2017-08-10 18:25:26 +053024// For waiting on signals
25namespace sdbusRule = sdbusplus::bus::match::rules;
26
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050027/** @class PassThrough
28 * @brief Implements org.open_power.OCC.PassThrough
29 */
30class PassThrough : public Iface
31{
Gunnar Mills94df8c92018-09-14 14:50:03 -050032 public:
33 PassThrough() = delete;
Chris Caina8857c52021-01-27 11:53:05 -060034 ~PassThrough() = default;
Gunnar Mills94df8c92018-09-14 14:50:03 -050035 PassThrough(const PassThrough&) = delete;
36 PassThrough& operator=(const PassThrough&) = delete;
37 PassThrough(PassThrough&&) = default;
38 PassThrough& operator=(PassThrough&&) = default;
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050039
Gunnar Mills94df8c92018-09-14 14:50:03 -050040 /** @brief Ctor to put pass-through d-bus object on the bus
Gunnar Mills94df8c92018-09-14 14:50:03 -050041 * @param[in] path - Path to attach at
42 */
Chris Cain36f9cde2021-11-22 11:18:21 -060043 explicit PassThrough(
44 const char* path
45#ifdef POWER10
46 ,
47 std::unique_ptr<open_power::occ::powermode::PowerMode>& powerModeRef
48#endif
49 );
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050050
Chris Caina8857c52021-01-27 11:53:05 -060051 /** @brief Pass through command to OCC from dbus
Gunnar Mills94df8c92018-09-14 14:50:03 -050052 * @param[in] command - command to pass-through
53 * @returns OCC response as an array
54 */
55 std::vector<std::int32_t> send(std::vector<std::int32_t> command) override;
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -050056
Chris Caina8857c52021-01-27 11:53:05 -060057 /** @brief Pass through command to OCC from openpower-occ-control
58 * @param[in] command - command to pass-through
59 * @returns OCC response as an array
60 */
61 std::vector<std::uint8_t> send(std::vector<std::uint8_t> command);
62
Chris Cain36f9cde2021-11-22 11:18:21 -060063 /** @brief Set a Power Mode
64 *
65 * @param[in] mode - desired System Power Mode
66 * @param[in] modeData - data associated some Power Modes
67 *
68 * @returns true if mode change was accepted
69 */
70 bool setMode(const uint8_t mode, const uint16_t modeData);
71
Gunnar Mills94df8c92018-09-14 14:50:03 -050072 private:
73 /** @brief Pass-through occ path on the bus */
74 std::string path;
Vishwanatha Subbannaafd21a62017-04-13 20:17:13 +053075
Chris Cain36f9cde2021-11-22 11:18:21 -060076#ifdef POWER10
77 /** @brief OCC PowerMode object */
78 std::unique_ptr<open_power::occ::powermode::PowerMode>& pmode;
79#endif
80
Gunnar Mills94df8c92018-09-14 14:50:03 -050081 /** @brief OCC device path
82 * For now, here is the hard-coded mapping until
83 * the udev rule is in.
84 * occ0 --> /dev/occ1
85 * occ1 --> /dev/occ2
86 * ...
87 */
88 std::string devicePath;
Vishwanatha Subbanna38b08d72017-04-14 18:12:14 +053089
Chris Caina8857c52021-01-27 11:53:05 -060090 /** @brief OCC instance number */
91 int occInstance;
92
Gunnar Mills94df8c92018-09-14 14:50:03 -050093 /** @brief Indicates whether or not the OCC is currently active */
94 bool occActive = false;
Eddie James4f4712d2018-06-21 15:57:02 -050095
Gunnar Mills94df8c92018-09-14 14:50:03 -050096 /** @brief Subscribe to OCC Status signal
97 *
98 * Once the OCC status gets to active, only then we will get /dev/occ2
99 * populated and hence need to wait on that before opening that
100 */
101 sdbusplus::bus::match_t activeStatusSignal;
Vishwanatha Subbanna3e5422e2017-08-10 18:25:26 +0530102
Chris Caina8857c52021-01-27 11:53:05 -0600103 /** @brief Object to send commands to the OCC */
104 OccCommand occCmd;
Vishwanatha Subbanna3e5422e2017-08-10 18:25:26 +0530105
Gunnar Mills94df8c92018-09-14 14:50:03 -0500106 /** @brief Callback function on OCC Status change signals
107 *
108 * @param[in] msg - Data associated with subscribed signal
109 */
110 void activeStatusEvent(sdbusplus::message::message& msg);
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -0500111};
112
Deepak Kodihalli6b492fb2017-03-18 01:09:28 -0500113} // namespace occ
114} // namespace open_power