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