16b492fbfSDeepak Kodihalli #pragma once 26b492fbfSDeepak Kodihalli 3a8857c50SChris Cain #include "occ_command.hpp" 436f9cdedSChris 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 21*af40808fSPatrick Williams using Iface = sdbusplus::server::object_t< 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 */ 4336f9cdedSChris Cain explicit PassThrough( 4436f9cdedSChris Cain const char* path 4536f9cdedSChris Cain #ifdef POWER10 4636f9cdedSChris Cain , 4736f9cdedSChris Cain std::unique_ptr<open_power::occ::powermode::PowerMode>& powerModeRef 4836f9cdedSChris Cain #endif 4936f9cdedSChris 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 6336f9cdedSChris Cain /** @brief Set a Power Mode 6436f9cdedSChris Cain * 6536f9cdedSChris Cain * @param[in] mode - desired System Power Mode 6636f9cdedSChris Cain * @param[in] modeData - data associated some Power Modes 6736f9cdedSChris Cain * 6836f9cdedSChris Cain * @returns true if mode change was accepted 6936f9cdedSChris Cain */ 7036f9cdedSChris Cain bool setMode(const uint8_t mode, const uint16_t modeData); 7136f9cdedSChris Cain 726b492fbfSDeepak Kodihalli private: 736b492fbfSDeepak Kodihalli /** @brief Pass-through occ path on the bus */ 746b492fbfSDeepak Kodihalli std::string path; 75afd21a65SVishwanatha Subbanna 7636f9cdedSChris Cain #ifdef POWER10 7736f9cdedSChris Cain /** @brief OCC PowerMode object */ 7836f9cdedSChris Cain std::unique_ptr<open_power::occ::powermode::PowerMode>& pmode; 7936f9cdedSChris Cain #endif 8036f9cdedSChris 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 */ 110*af40808fSPatrick Williams void activeStatusEvent(sdbusplus::message_t& msg); 1116b492fbfSDeepak Kodihalli }; 1126b492fbfSDeepak Kodihalli 1136b492fbfSDeepak Kodihalli } // namespace occ 1146b492fbfSDeepak Kodihalli } // namespace open_power 115