16b492fbfSDeepak Kodihalli #pragma once
26b492fbfSDeepak Kodihalli 
36b492fbfSDeepak Kodihalli #include <string>
46b492fbfSDeepak Kodihalli #include <vector>
5*38b08d79SVishwanatha Subbanna #include <unistd.h>
66b492fbfSDeepak Kodihalli #include <sdbusplus/bus.hpp>
76b492fbfSDeepak Kodihalli #include <sdbusplus/server/object.hpp>
86b492fbfSDeepak Kodihalli #include "org/open_power/OCC/PassThrough/server.hpp"
96b492fbfSDeepak Kodihalli #include "config.h"
10*38b08d79SVishwanatha Subbanna #include "file.hpp"
116b492fbfSDeepak Kodihalli 
126b492fbfSDeepak Kodihalli namespace open_power
136b492fbfSDeepak Kodihalli {
146b492fbfSDeepak Kodihalli namespace occ
156b492fbfSDeepak Kodihalli {
166b492fbfSDeepak Kodihalli namespace pass_through
176b492fbfSDeepak Kodihalli {
186b492fbfSDeepak Kodihalli 
196b492fbfSDeepak Kodihalli /** @brief Make occ pass-through d-bus object pathname
206b492fbfSDeepak Kodihalli  *  @param[in] occ - occ name
216b492fbfSDeepak Kodihalli  *  @returns occ pass-through path
226b492fbfSDeepak Kodihalli  */
236b492fbfSDeepak Kodihalli inline auto object(const std::string& occ)
246b492fbfSDeepak Kodihalli {
256b492fbfSDeepak Kodihalli     return std::string(OCC_PASS_THROUGH_ROOT) +
266b492fbfSDeepak Kodihalli            '/' +
276b492fbfSDeepak Kodihalli            occ;
286b492fbfSDeepak Kodihalli }
296b492fbfSDeepak Kodihalli 
306b492fbfSDeepak Kodihalli /** @brief Put occ pass through objects on the bus
316b492fbfSDeepak Kodihalli  */
326b492fbfSDeepak Kodihalli void run();
336b492fbfSDeepak Kodihalli 
346b492fbfSDeepak Kodihalli using Iface = sdbusplus::server::object::object<
356b492fbfSDeepak Kodihalli     sdbusplus::org::open_power::OCC::server::PassThrough>;
366b492fbfSDeepak Kodihalli 
376b492fbfSDeepak Kodihalli /** @class PassThrough
386b492fbfSDeepak Kodihalli  *  @brief Implements org.open_power.OCC.PassThrough
396b492fbfSDeepak Kodihalli  */
406b492fbfSDeepak Kodihalli class PassThrough : public Iface
416b492fbfSDeepak Kodihalli {
426b492fbfSDeepak Kodihalli     public:
436b492fbfSDeepak Kodihalli         PassThrough() = delete;
44*38b08d79SVishwanatha Subbanna         ~PassThrough() = default;
456b492fbfSDeepak Kodihalli         PassThrough(const PassThrough&) = delete;
466b492fbfSDeepak Kodihalli         PassThrough& operator=(const PassThrough&) = delete;
476b492fbfSDeepak Kodihalli         PassThrough(PassThrough&&) = default;
486b492fbfSDeepak Kodihalli         PassThrough& operator=(PassThrough&&) = default;
496b492fbfSDeepak Kodihalli 
506b492fbfSDeepak Kodihalli         /** @brief Ctor to put pass-through d-bus object on the bus
516b492fbfSDeepak Kodihalli          *  @param[in] bus - Bus to attach to
526b492fbfSDeepak Kodihalli          *  @param[in] path - Path to attach at
536b492fbfSDeepak Kodihalli          */
546b492fbfSDeepak Kodihalli         PassThrough(sdbusplus::bus::bus& bus,
556b492fbfSDeepak Kodihalli                     const char* path);
566b492fbfSDeepak Kodihalli 
576b492fbfSDeepak Kodihalli         /** @brief Pass through command to OCC
586b492fbfSDeepak Kodihalli          *  @param[in] command - command to pass-through
596b492fbfSDeepak Kodihalli          *  @returns OCC response as an array
606b492fbfSDeepak Kodihalli          */
616b492fbfSDeepak Kodihalli         std::vector<std::int32_t>
626b492fbfSDeepak Kodihalli             send(std::vector<std::int32_t> command) override;
636b492fbfSDeepak Kodihalli 
646b492fbfSDeepak Kodihalli     private:
656b492fbfSDeepak Kodihalli         /** @brief Pass-through occ path on the bus */
666b492fbfSDeepak Kodihalli         std::string path;
67afd21a65SVishwanatha Subbanna 
68afd21a65SVishwanatha Subbanna         /** @brief OCC device path
69afd21a65SVishwanatha Subbanna          *  For now, here is the hard-coded mapping until
70*38b08d79SVishwanatha Subbanna          *  the udev rule is in.
71afd21a65SVishwanatha Subbanna          *  occ0 --> /dev/occfifo1
72afd21a65SVishwanatha Subbanna          *  occ1 --> /dev/occfifo2
73afd21a65SVishwanatha Subbanna          *  ...
74afd21a65SVishwanatha Subbanna          */
75afd21a65SVishwanatha Subbanna         std::string devicePath = "/dev/occfifo";
76*38b08d79SVishwanatha Subbanna 
77*38b08d79SVishwanatha Subbanna         /** @brief File descriptor manager */
78*38b08d79SVishwanatha Subbanna         FileDescriptor fd;
79*38b08d79SVishwanatha Subbanna 
80*38b08d79SVishwanatha Subbanna         /** Opens devicePath and returns file descritor */
81*38b08d79SVishwanatha Subbanna         int openDevice();
826b492fbfSDeepak Kodihalli };
836b492fbfSDeepak Kodihalli 
846b492fbfSDeepak Kodihalli } // namespace pass_through
856b492fbfSDeepak Kodihalli } // namespace occ
866b492fbfSDeepak Kodihalli } // namespace open_power
87