16b492fbfSDeepak Kodihalli #pragma once
26b492fbfSDeepak Kodihalli 
36b492fbfSDeepak Kodihalli #include <string>
46b492fbfSDeepak Kodihalli #include <sdbusplus/bus.hpp>
56b492fbfSDeepak Kodihalli #include <sdbusplus/server/object.hpp>
69bb065b8SVishwanatha Subbanna #include <org/open_power/OCC/PassThrough/server.hpp>
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          */
356b492fbfSDeepak Kodihalli         PassThrough(sdbusplus::bus::bus& bus,
366b492fbfSDeepak Kodihalli                     const char* path);
376b492fbfSDeepak Kodihalli 
383e5422edSVishwanatha Subbanna         ~PassThrough()
393e5422edSVishwanatha Subbanna         {
403e5422edSVishwanatha Subbanna             closeDevice();
413e5422edSVishwanatha Subbanna         }
423e5422edSVishwanatha Subbanna 
436b492fbfSDeepak Kodihalli         /** @brief Pass through command to OCC
446b492fbfSDeepak Kodihalli          *  @param[in] command - command to pass-through
456b492fbfSDeepak Kodihalli          *  @returns OCC response as an array
466b492fbfSDeepak Kodihalli          */
476b492fbfSDeepak Kodihalli         std::vector<std::int32_t>
486b492fbfSDeepak Kodihalli             send(std::vector<std::int32_t> command) override;
496b492fbfSDeepak Kodihalli 
506b492fbfSDeepak Kodihalli     private:
516b492fbfSDeepak Kodihalli         /** @brief Pass-through occ path on the bus */
526b492fbfSDeepak Kodihalli         std::string path;
53afd21a65SVishwanatha Subbanna 
54afd21a65SVishwanatha Subbanna         /** @brief OCC device path
55afd21a65SVishwanatha Subbanna          *  For now, here is the hard-coded mapping until
5638b08d79SVishwanatha Subbanna          *  the udev rule is in.
573e5422edSVishwanatha Subbanna          *  occ0 --> /dev/occ1
583e5422edSVishwanatha Subbanna          *  occ1 --> /dev/occ2
59afd21a65SVishwanatha Subbanna          *  ...
60afd21a65SVishwanatha Subbanna          */
613e5422edSVishwanatha Subbanna         std::string devicePath;
6238b08d79SVishwanatha Subbanna 
63*4f4712d8SEddie James         /** @brief Indicates whether or not the OCC is currently active */
64*4f4712d8SEddie James         bool occActive = false;
65*4f4712d8SEddie James 
663e5422edSVishwanatha Subbanna         /** brief file descriptor associated with occ device */
673e5422edSVishwanatha Subbanna         int fd = -1;
6838b08d79SVishwanatha Subbanna 
693e5422edSVishwanatha Subbanna         /** @brief Subscribe to OCC Status signal
703e5422edSVishwanatha Subbanna          *
713e5422edSVishwanatha Subbanna          *  Once the OCC status gets to active, only then we will get /dev/occ2
723e5422edSVishwanatha Subbanna          *  populated and hence need to wait on that before opening that
733e5422edSVishwanatha Subbanna          */
743e5422edSVishwanatha Subbanna         sdbusplus::bus::match_t activeStatusSignal;
753e5422edSVishwanatha Subbanna 
763e5422edSVishwanatha Subbanna         /** Opens devicePath and populates file descritor */
773e5422edSVishwanatha Subbanna         void openDevice();
783e5422edSVishwanatha Subbanna 
793e5422edSVishwanatha Subbanna         /** Closed the fd associated with opened device */
803e5422edSVishwanatha Subbanna         void closeDevice();
813e5422edSVishwanatha Subbanna 
823e5422edSVishwanatha Subbanna         /** @brief Callback function on OCC Status change signals
833e5422edSVishwanatha Subbanna          *
843e5422edSVishwanatha Subbanna          *  @param[in]  msg - Data associated with subscribed signal
853e5422edSVishwanatha Subbanna          */
863e5422edSVishwanatha Subbanna         void activeStatusEvent(sdbusplus::message::message& msg);
876b492fbfSDeepak Kodihalli };
886b492fbfSDeepak Kodihalli 
896b492fbfSDeepak Kodihalli } // namespace occ
906b492fbfSDeepak Kodihalli } // namespace open_power
91