16b492fbfSDeepak Kodihalli #include <memory>
202ba9eccSDeepak Kodihalli #include <algorithm>
302ba9eccSDeepak Kodihalli #include <phosphor-logging/log.hpp>
46b492fbfSDeepak Kodihalli #include "occ_pass_through.hpp"
56b492fbfSDeepak Kodihalli #include "occ_finder.hpp"
66b492fbfSDeepak Kodihalli namespace open_power
76b492fbfSDeepak Kodihalli {
86b492fbfSDeepak Kodihalli namespace occ
96b492fbfSDeepak Kodihalli {
106b492fbfSDeepak Kodihalli namespace pass_through
116b492fbfSDeepak Kodihalli {
126b492fbfSDeepak Kodihalli 
136b492fbfSDeepak Kodihalli void run()
146b492fbfSDeepak Kodihalli {
156b492fbfSDeepak Kodihalli     auto bus = sdbusplus::bus::new_default();
166b492fbfSDeepak Kodihalli     sdbusplus::server::manager::manager objManager(bus,
176b492fbfSDeepak Kodihalli                                                    OCC_PASS_THROUGH_ROOT);
186b492fbfSDeepak Kodihalli 
196b492fbfSDeepak Kodihalli     std::vector<std::unique_ptr<PassThrough>> objects;
206b492fbfSDeepak Kodihalli     auto occs = open_power::occ::finder::get();
216b492fbfSDeepak Kodihalli 
226b492fbfSDeepak Kodihalli     for (const auto& occ : occs)
236b492fbfSDeepak Kodihalli     {
246b492fbfSDeepak Kodihalli         auto occPassThrough = object(occ);
256b492fbfSDeepak Kodihalli         objects.emplace_back(
266b492fbfSDeepak Kodihalli             std::make_unique<PassThrough>(bus, occPassThrough.c_str()));
276b492fbfSDeepak Kodihalli     }
286b492fbfSDeepak Kodihalli     bus.request_name(OCC_PASS_THROUGH_BUSNAME);
296b492fbfSDeepak Kodihalli 
306b492fbfSDeepak Kodihalli     while (true)
316b492fbfSDeepak Kodihalli     {
326b492fbfSDeepak Kodihalli         bus.process_discard();
336b492fbfSDeepak Kodihalli         bus.wait();
346b492fbfSDeepak Kodihalli     }
356b492fbfSDeepak Kodihalli }
366b492fbfSDeepak Kodihalli 
376b492fbfSDeepak Kodihalli PassThrough::PassThrough(
386b492fbfSDeepak Kodihalli     sdbusplus::bus::bus& bus,
396b492fbfSDeepak Kodihalli     const char* path) :
406b492fbfSDeepak Kodihalli     Iface(bus, path),
416b492fbfSDeepak Kodihalli     path(path)
426b492fbfSDeepak Kodihalli {
43*afd21a65SVishwanatha Subbanna     devicePath.append(std::to_string((this->path.back() - '0') + 1));
446b492fbfSDeepak Kodihalli }
456b492fbfSDeepak Kodihalli 
466b492fbfSDeepak Kodihalli std::vector<int32_t> PassThrough::send(std::vector<int32_t> command)
476b492fbfSDeepak Kodihalli {
4802ba9eccSDeepak Kodihalli     std::string msg = "Pass through to OCC ";
4902ba9eccSDeepak Kodihalli     msg += path;
5002ba9eccSDeepak Kodihalli 
5102ba9eccSDeepak Kodihalli     std::string cmd;
5202ba9eccSDeepak Kodihalli     std::for_each(command.cbegin(), command.cend(),
5302ba9eccSDeepak Kodihalli                   [&cmd](const auto& c)
5402ba9eccSDeepak Kodihalli                   {
5502ba9eccSDeepak Kodihalli                       cmd += std::to_string(c);
5602ba9eccSDeepak Kodihalli                       cmd += ',';
5702ba9eccSDeepak Kodihalli                   });
5802ba9eccSDeepak Kodihalli     if (!cmd.empty())
5902ba9eccSDeepak Kodihalli     {
6002ba9eccSDeepak Kodihalli         // Remove trailing ','
6102ba9eccSDeepak Kodihalli         cmd.pop_back();
6202ba9eccSDeepak Kodihalli     }
6302ba9eccSDeepak Kodihalli 
6402ba9eccSDeepak Kodihalli     using namespace phosphor::logging;
6502ba9eccSDeepak Kodihalli     log<level::INFO>(msg.c_str(), entry("COMMAND=%s", cmd.c_str()));
6602ba9eccSDeepak Kodihalli 
676b492fbfSDeepak Kodihalli     return {};
686b492fbfSDeepak Kodihalli }
696b492fbfSDeepak Kodihalli 
706b492fbfSDeepak Kodihalli } // namespace pass_through
716b492fbfSDeepak Kodihalli } // namespace occ
726b492fbfSDeepak Kodihalli } // namespace open_power
73