16b492fbfSDeepak Kodihalli #pragma once
26b492fbfSDeepak Kodihalli 
3*94df8c90SGunnar Mills #include <org/open_power/OCC/PassThrough/server.hpp>
46b492fbfSDeepak Kodihalli #include <sdbusplus/bus.hpp>
56b492fbfSDeepak Kodihalli #include <sdbusplus/server/object.hpp>
6*94df8c90SGunnar Mills #include <string>
76b492fbfSDeepak Kodihalli 
86b492fbfSDeepak Kodihalli namespace open_power
96b492fbfSDeepak Kodihalli {
106b492fbfSDeepak Kodihalli namespace occ
116b492fbfSDeepak Kodihalli {
126b492fbfSDeepak Kodihalli 
136b492fbfSDeepak Kodihalli using Iface = sdbusplus::server::object::object<
146b492fbfSDeepak Kodihalli     sdbusplus::org::open_power::OCC::server::PassThrough>;
156b492fbfSDeepak Kodihalli 
163e5422edSVishwanatha Subbanna // For waiting on signals
173e5422edSVishwanatha Subbanna namespace sdbusRule = sdbusplus::bus::match::rules;
183e5422edSVishwanatha Subbanna 
196b492fbfSDeepak Kodihalli /** @class PassThrough
206b492fbfSDeepak Kodihalli  *  @brief Implements org.open_power.OCC.PassThrough
216b492fbfSDeepak Kodihalli  */
226b492fbfSDeepak Kodihalli class PassThrough : public Iface
236b492fbfSDeepak Kodihalli {
246b492fbfSDeepak Kodihalli   public:
256b492fbfSDeepak Kodihalli     PassThrough() = delete;
266b492fbfSDeepak Kodihalli     PassThrough(const PassThrough&) = delete;
276b492fbfSDeepak Kodihalli     PassThrough& operator=(const PassThrough&) = delete;
286b492fbfSDeepak Kodihalli     PassThrough(PassThrough&&) = default;
296b492fbfSDeepak Kodihalli     PassThrough& operator=(PassThrough&&) = default;
306b492fbfSDeepak Kodihalli 
316b492fbfSDeepak Kodihalli     /** @brief Ctor to put pass-through d-bus object on the bus
326b492fbfSDeepak Kodihalli      *  @param[in] bus - Bus to attach to
336b492fbfSDeepak Kodihalli      *  @param[in] path - Path to attach at
346b492fbfSDeepak Kodihalli      */
35*94df8c90SGunnar Mills     PassThrough(sdbusplus::bus::bus& bus, const char* path);
366b492fbfSDeepak Kodihalli 
373e5422edSVishwanatha Subbanna     ~PassThrough()
383e5422edSVishwanatha Subbanna     {
393e5422edSVishwanatha Subbanna         closeDevice();
403e5422edSVishwanatha Subbanna     }
413e5422edSVishwanatha Subbanna 
426b492fbfSDeepak Kodihalli     /** @brief Pass through command to OCC
436b492fbfSDeepak Kodihalli      *  @param[in] command - command to pass-through
446b492fbfSDeepak Kodihalli      *  @returns OCC response as an array
456b492fbfSDeepak Kodihalli      */
46*94df8c90SGunnar Mills     std::vector<std::int32_t> send(std::vector<std::int32_t> command) override;
476b492fbfSDeepak Kodihalli 
486b492fbfSDeepak Kodihalli   private:
496b492fbfSDeepak Kodihalli     /** @brief Pass-through occ path on the bus */
506b492fbfSDeepak Kodihalli     std::string path;
51afd21a65SVishwanatha Subbanna 
52afd21a65SVishwanatha Subbanna     /** @brief OCC device path
53afd21a65SVishwanatha Subbanna      *  For now, here is the hard-coded mapping until
5438b08d79SVishwanatha Subbanna      *  the udev rule is in.
553e5422edSVishwanatha Subbanna      *  occ0 --> /dev/occ1
563e5422edSVishwanatha Subbanna      *  occ1 --> /dev/occ2
57afd21a65SVishwanatha Subbanna      *  ...
58afd21a65SVishwanatha Subbanna      */
593e5422edSVishwanatha Subbanna     std::string devicePath;
6038b08d79SVishwanatha Subbanna 
614f4712d8SEddie James     /** @brief Indicates whether or not the OCC is currently active */
624f4712d8SEddie James     bool occActive = false;
634f4712d8SEddie James 
643e5422edSVishwanatha Subbanna     /** brief file descriptor associated with occ device */
653e5422edSVishwanatha Subbanna     int fd = -1;
6638b08d79SVishwanatha Subbanna 
673e5422edSVishwanatha Subbanna     /** @brief Subscribe to OCC Status signal
683e5422edSVishwanatha Subbanna      *
693e5422edSVishwanatha Subbanna      *  Once the OCC status gets to active, only then we will get /dev/occ2
703e5422edSVishwanatha Subbanna      *  populated and hence need to wait on that before opening that
713e5422edSVishwanatha Subbanna      */
723e5422edSVishwanatha Subbanna     sdbusplus::bus::match_t activeStatusSignal;
733e5422edSVishwanatha Subbanna 
743e5422edSVishwanatha Subbanna     /** Opens devicePath and populates file descritor */
753e5422edSVishwanatha Subbanna     void openDevice();
763e5422edSVishwanatha Subbanna 
773e5422edSVishwanatha Subbanna     /** Closed the fd associated with opened device */
783e5422edSVishwanatha Subbanna     void closeDevice();
793e5422edSVishwanatha Subbanna 
803e5422edSVishwanatha Subbanna     /** @brief Callback function on OCC Status change signals
813e5422edSVishwanatha Subbanna      *
823e5422edSVishwanatha Subbanna      *  @param[in]  msg - Data associated with subscribed signal
833e5422edSVishwanatha Subbanna      */
843e5422edSVishwanatha Subbanna     void activeStatusEvent(sdbusplus::message::message& msg);
856b492fbfSDeepak Kodihalli };
866b492fbfSDeepak Kodihalli 
876b492fbfSDeepak Kodihalli } // namespace occ
886b492fbfSDeepak Kodihalli } // namespace open_power
89