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