12c05aa76SMatt Spinler /** 22c05aa76SMatt Spinler * Copyright © 2017 IBM Corporation 32c05aa76SMatt Spinler * 42c05aa76SMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License"); 52c05aa76SMatt Spinler * you may not use this file except in compliance with the License. 62c05aa76SMatt Spinler * You may obtain a copy of the License at 72c05aa76SMatt Spinler * 82c05aa76SMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0 92c05aa76SMatt Spinler * 102c05aa76SMatt Spinler * Unless required by applicable law or agreed to in writing, software 112c05aa76SMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS, 122c05aa76SMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c05aa76SMatt Spinler * See the License for the specific language governing permissions and 142c05aa76SMatt Spinler * limitations under the License. 152c05aa76SMatt Spinler */ 162c05aa76SMatt Spinler #include <experimental/filesystem> 172c05aa76SMatt Spinler #include <phosphor-logging/log.hpp> 182c05aa76SMatt Spinler #include <regex> 192c05aa76SMatt Spinler #include "targeting.hpp" 202c05aa76SMatt Spinler 212c05aa76SMatt Spinler namespace openpower 222c05aa76SMatt Spinler { 232c05aa76SMatt Spinler namespace targeting 242c05aa76SMatt Spinler { 252c05aa76SMatt Spinler 262c05aa76SMatt Spinler using namespace phosphor::logging; 272c05aa76SMatt Spinler namespace fs = std::experimental::filesystem; 282c05aa76SMatt Spinler 29c3bffed7SMatt Spinler int Target::getCFAMFD() 30c3bffed7SMatt Spinler { 31c3bffed7SMatt Spinler if (cfamFD.get() == nullptr) 32c3bffed7SMatt Spinler { 33c3bffed7SMatt Spinler cfamFD = std::make_unique< 34c3bffed7SMatt Spinler openpower::util::FileDescriptor>(getCFAMPath()); 35c3bffed7SMatt Spinler } 36c3bffed7SMatt Spinler 37c3bffed7SMatt Spinler return cfamFD->get(); 38c3bffed7SMatt Spinler } 39c3bffed7SMatt Spinler 40c3bffed7SMatt Spinler 412c05aa76SMatt Spinler Targeting::Targeting(const std::string& fsiMasterDev, 422c05aa76SMatt Spinler const std::string& fsiSlaveDir) : 432c05aa76SMatt Spinler fsiMasterPath(fsiMasterDev), 442c05aa76SMatt Spinler fsiSlaveBasePath(fsiSlaveDir) 452c05aa76SMatt Spinler { 462c05aa76SMatt Spinler //Always create P0, the FSI master. 472c05aa76SMatt Spinler targets.push_back(std::make_unique<Target>(0, fsiMasterPath)); 482c05aa76SMatt Spinler 492c05aa76SMatt Spinler //Find the the remaining P9s dynamically based on which files show up 50*fabe92e8SMatt Spinler std::regex exp{"hub@00/slave@([0-9]{2}):00", std::regex::extended}; 512c05aa76SMatt Spinler 522c05aa76SMatt Spinler for (auto& file : fs::directory_iterator(fsiSlaveBasePath)) 532c05aa76SMatt Spinler { 542c05aa76SMatt Spinler std::smatch match; 552c05aa76SMatt Spinler std::string path = file.path(); 562c05aa76SMatt Spinler if (std::regex_search(path, match, exp)) 572c05aa76SMatt Spinler { 582c05aa76SMatt Spinler auto pos = atoi(match[1].str().c_str()); 592c05aa76SMatt Spinler if (pos == 0) 602c05aa76SMatt Spinler { 612c05aa76SMatt Spinler log<level::ERR>("Unexpected FSI slave device name found", 62*fabe92e8SMatt Spinler entry("DEVICE_NAME=%s", path.c_str())); 632c05aa76SMatt Spinler continue; 642c05aa76SMatt Spinler } 652c05aa76SMatt Spinler 662c05aa76SMatt Spinler path += "/raw"; 672c05aa76SMatt Spinler 682c05aa76SMatt Spinler targets.push_back(std::make_unique<Target>(pos, path)); 692c05aa76SMatt Spinler } 702c05aa76SMatt Spinler } 712c05aa76SMatt Spinler 722c05aa76SMatt Spinler auto sortTargets = [](const std::unique_ptr<Target>& left, 732c05aa76SMatt Spinler const std::unique_ptr<Target>& right) 742c05aa76SMatt Spinler { 752c05aa76SMatt Spinler return left->getPos() < right->getPos(); 762c05aa76SMatt Spinler }; 772c05aa76SMatt Spinler std::sort(targets.begin(), targets.end(), sortTargets); 782c05aa76SMatt Spinler } 792c05aa76SMatt Spinler 802c05aa76SMatt Spinler } 812c05aa76SMatt Spinler } 82