16b492fbfSDeepak Kodihalli #include <memory>
202ba9eccSDeepak Kodihalli #include <algorithm>
3*38b08d79SVishwanatha Subbanna #include <fcntl.h>
402ba9eccSDeepak Kodihalli #include <phosphor-logging/log.hpp>
56b492fbfSDeepak Kodihalli #include "occ_pass_through.hpp"
66b492fbfSDeepak Kodihalli #include "occ_finder.hpp"
76b492fbfSDeepak Kodihalli namespace open_power
86b492fbfSDeepak Kodihalli {
96b492fbfSDeepak Kodihalli namespace occ
106b492fbfSDeepak Kodihalli {
116b492fbfSDeepak Kodihalli namespace pass_through
126b492fbfSDeepak Kodihalli {
136b492fbfSDeepak Kodihalli 
146b492fbfSDeepak Kodihalli void run()
156b492fbfSDeepak Kodihalli {
166b492fbfSDeepak Kodihalli     auto bus = sdbusplus::bus::new_default();
176b492fbfSDeepak Kodihalli     sdbusplus::server::manager::manager objManager(bus,
186b492fbfSDeepak Kodihalli                                                    OCC_PASS_THROUGH_ROOT);
196b492fbfSDeepak Kodihalli 
206b492fbfSDeepak Kodihalli     std::vector<std::unique_ptr<PassThrough>> objects;
216b492fbfSDeepak Kodihalli     auto occs = open_power::occ::finder::get();
226b492fbfSDeepak Kodihalli 
236b492fbfSDeepak Kodihalli     for (const auto& occ : occs)
246b492fbfSDeepak Kodihalli     {
256b492fbfSDeepak Kodihalli         auto occPassThrough = object(occ);
266b492fbfSDeepak Kodihalli         objects.emplace_back(
276b492fbfSDeepak Kodihalli             std::make_unique<PassThrough>(bus, occPassThrough.c_str()));
286b492fbfSDeepak Kodihalli     }
296b492fbfSDeepak Kodihalli     bus.request_name(OCC_PASS_THROUGH_BUSNAME);
306b492fbfSDeepak Kodihalli 
316b492fbfSDeepak Kodihalli     while (true)
326b492fbfSDeepak Kodihalli     {
336b492fbfSDeepak Kodihalli         bus.process_discard();
346b492fbfSDeepak Kodihalli         bus.wait();
356b492fbfSDeepak Kodihalli     }
366b492fbfSDeepak Kodihalli }
376b492fbfSDeepak Kodihalli 
386b492fbfSDeepak Kodihalli PassThrough::PassThrough(
396b492fbfSDeepak Kodihalli     sdbusplus::bus::bus& bus,
406b492fbfSDeepak Kodihalli     const char* path) :
416b492fbfSDeepak Kodihalli     Iface(bus, path),
42*38b08d79SVishwanatha Subbanna     path(path),
43*38b08d79SVishwanatha Subbanna     fd(openDevice())
446b492fbfSDeepak Kodihalli {
45*38b08d79SVishwanatha Subbanna     // Nothing to do.
46*38b08d79SVishwanatha Subbanna }
47*38b08d79SVishwanatha Subbanna 
48*38b08d79SVishwanatha Subbanna int PassThrough::openDevice()
49*38b08d79SVishwanatha Subbanna {
50*38b08d79SVishwanatha Subbanna     // Device instance number starts from 1.
51afd21a65SVishwanatha Subbanna     devicePath.append(std::to_string((this->path.back() - '0') + 1));
52*38b08d79SVishwanatha Subbanna 
53*38b08d79SVishwanatha Subbanna     int fd = open(devicePath.c_str(), O_RDWR | O_NONBLOCK);
54*38b08d79SVishwanatha Subbanna     if (fd < 0)
55*38b08d79SVishwanatha Subbanna     {
56*38b08d79SVishwanatha Subbanna         // This is for completion. This is getting replaced by elog
57*38b08d79SVishwanatha Subbanna         // in the next commit
58*38b08d79SVishwanatha Subbanna         throw std::runtime_error("Error opening " + devicePath);
59*38b08d79SVishwanatha Subbanna     }
60*38b08d79SVishwanatha Subbanna     return fd;
616b492fbfSDeepak Kodihalli }
626b492fbfSDeepak Kodihalli 
636b492fbfSDeepak Kodihalli std::vector<int32_t> PassThrough::send(std::vector<int32_t> command)
646b492fbfSDeepak Kodihalli {
656b492fbfSDeepak Kodihalli     return {};
666b492fbfSDeepak Kodihalli }
676b492fbfSDeepak Kodihalli 
686b492fbfSDeepak Kodihalli } // namespace pass_through
696b492fbfSDeepak Kodihalli } // namespace occ
706b492fbfSDeepak Kodihalli } // namespace open_power
71