16b492fbfSDeepak Kodihalli #pragma once
26b492fbfSDeepak Kodihalli 
3a8857c50SChris Cain #include "occ_command.hpp"
4*36f9cdedSChris Cain #include "powermode.hpp"
5f3b7514eSGeorge Liu #include "utils.hpp"
6a8857c50SChris Cain 
7a8857c50SChris Cain #include <fmt/core.h>
8a8857c50SChris Cain 
994df8c90SGunnar Mills #include <org/open_power/OCC/PassThrough/server.hpp>
10a8857c50SChris Cain #include <phosphor-logging/log.hpp>
116b492fbfSDeepak Kodihalli #include <sdbusplus/bus.hpp>
126b492fbfSDeepak Kodihalli #include <sdbusplus/server/object.hpp>
13b5ca1015SGeorge Liu 
1494df8c90SGunnar Mills #include <string>
156b492fbfSDeepak Kodihalli 
166b492fbfSDeepak Kodihalli namespace open_power
176b492fbfSDeepak Kodihalli {
186b492fbfSDeepak Kodihalli namespace occ
196b492fbfSDeepak Kodihalli {
206b492fbfSDeepak Kodihalli 
216b492fbfSDeepak Kodihalli using Iface = sdbusplus::server::object::object<
226b492fbfSDeepak Kodihalli     sdbusplus::org::open_power::OCC::server::PassThrough>;
236b492fbfSDeepak Kodihalli 
243e5422edSVishwanatha Subbanna // For waiting on signals
253e5422edSVishwanatha Subbanna namespace sdbusRule = sdbusplus::bus::match::rules;
263e5422edSVishwanatha Subbanna 
276b492fbfSDeepak Kodihalli /** @class PassThrough
286b492fbfSDeepak Kodihalli  *  @brief Implements org.open_power.OCC.PassThrough
296b492fbfSDeepak Kodihalli  */
306b492fbfSDeepak Kodihalli class PassThrough : public Iface
316b492fbfSDeepak Kodihalli {
326b492fbfSDeepak Kodihalli   public:
336b492fbfSDeepak Kodihalli     PassThrough() = delete;
34a8857c50SChris Cain     ~PassThrough() = default;
356b492fbfSDeepak Kodihalli     PassThrough(const PassThrough&) = delete;
366b492fbfSDeepak Kodihalli     PassThrough& operator=(const PassThrough&) = delete;
376b492fbfSDeepak Kodihalli     PassThrough(PassThrough&&) = default;
386b492fbfSDeepak Kodihalli     PassThrough& operator=(PassThrough&&) = default;
396b492fbfSDeepak Kodihalli 
406b492fbfSDeepak Kodihalli     /** @brief Ctor to put pass-through d-bus object on the bus
416b492fbfSDeepak Kodihalli      *  @param[in] path - Path to attach at
426b492fbfSDeepak Kodihalli      */
43*36f9cdedSChris Cain     explicit PassThrough(
44*36f9cdedSChris Cain         const char* path
45*36f9cdedSChris Cain #ifdef POWER10
46*36f9cdedSChris Cain         ,
47*36f9cdedSChris Cain         std::unique_ptr<open_power::occ::powermode::PowerMode>& powerModeRef
48*36f9cdedSChris Cain #endif
49*36f9cdedSChris Cain     );
506b492fbfSDeepak Kodihalli 
51a8857c50SChris Cain     /** @brief Pass through command to OCC from dbus
526b492fbfSDeepak Kodihalli      *  @param[in] command - command to pass-through
536b492fbfSDeepak Kodihalli      *  @returns OCC response as an array
546b492fbfSDeepak Kodihalli      */
5594df8c90SGunnar Mills     std::vector<std::int32_t> send(std::vector<std::int32_t> command) override;
566b492fbfSDeepak Kodihalli 
57a8857c50SChris Cain     /** @brief Pass through command to OCC from openpower-occ-control
58a8857c50SChris Cain      *  @param[in] command - command to pass-through
59a8857c50SChris Cain      *  @returns OCC response as an array
60a8857c50SChris Cain      */
61a8857c50SChris Cain     std::vector<std::uint8_t> send(std::vector<std::uint8_t> command);
62a8857c50SChris Cain 
63*36f9cdedSChris Cain     /** @brief Set a Power Mode
64*36f9cdedSChris Cain      *
65*36f9cdedSChris Cain      *  @param[in] mode - desired System Power Mode
66*36f9cdedSChris Cain      *  @param[in] modeData - data associated some Power Modes
67*36f9cdedSChris Cain      *
68*36f9cdedSChris Cain      *  @returns true if mode change was accepted
69*36f9cdedSChris Cain      */
70*36f9cdedSChris Cain     bool setMode(const uint8_t mode, const uint16_t modeData);
71*36f9cdedSChris Cain 
726b492fbfSDeepak Kodihalli   private:
736b492fbfSDeepak Kodihalli     /** @brief Pass-through occ path on the bus */
746b492fbfSDeepak Kodihalli     std::string path;
75afd21a65SVishwanatha Subbanna 
76*36f9cdedSChris Cain #ifdef POWER10
77*36f9cdedSChris Cain     /** @brief OCC PowerMode object */
78*36f9cdedSChris Cain     std::unique_ptr<open_power::occ::powermode::PowerMode>& pmode;
79*36f9cdedSChris Cain #endif
80*36f9cdedSChris Cain 
81afd21a65SVishwanatha Subbanna     /** @brief OCC device path
82afd21a65SVishwanatha Subbanna      *  For now, here is the hard-coded mapping until
8338b08d79SVishwanatha Subbanna      *  the udev rule is in.
843e5422edSVishwanatha Subbanna      *  occ0 --> /dev/occ1
853e5422edSVishwanatha Subbanna      *  occ1 --> /dev/occ2
86afd21a65SVishwanatha Subbanna      *  ...
87afd21a65SVishwanatha Subbanna      */
883e5422edSVishwanatha Subbanna     std::string devicePath;
8938b08d79SVishwanatha Subbanna 
90a8857c50SChris Cain     /** @brief OCC instance number */
91a8857c50SChris Cain     int occInstance;
92a8857c50SChris Cain 
934f4712d8SEddie James     /** @brief Indicates whether or not the OCC is currently active */
944f4712d8SEddie James     bool occActive = false;
954f4712d8SEddie James 
963e5422edSVishwanatha Subbanna     /** @brief Subscribe to OCC Status signal
973e5422edSVishwanatha Subbanna      *
983e5422edSVishwanatha Subbanna      *  Once the OCC status gets to active, only then we will get /dev/occ2
993e5422edSVishwanatha Subbanna      *  populated and hence need to wait on that before opening that
1003e5422edSVishwanatha Subbanna      */
1013e5422edSVishwanatha Subbanna     sdbusplus::bus::match_t activeStatusSignal;
1023e5422edSVishwanatha Subbanna 
103a8857c50SChris Cain     /** @brief Object to send commands to the OCC */
104a8857c50SChris Cain     OccCommand occCmd;
1053e5422edSVishwanatha Subbanna 
1063e5422edSVishwanatha Subbanna     /** @brief Callback function on OCC Status change signals
1073e5422edSVishwanatha Subbanna      *
1083e5422edSVishwanatha Subbanna      *  @param[in]  msg - Data associated with subscribed signal
1093e5422edSVishwanatha Subbanna      */
1103e5422edSVishwanatha Subbanna     void activeStatusEvent(sdbusplus::message::message& msg);
1116b492fbfSDeepak Kodihalli };
1126b492fbfSDeepak Kodihalli 
1136b492fbfSDeepak Kodihalli } // namespace occ
1146b492fbfSDeepak Kodihalli } // namespace open_power
115