1*2c05aa76SMatt Spinler /** 2*2c05aa76SMatt Spinler * Copyright © 2017 IBM Corporation 3*2c05aa76SMatt Spinler * 4*2c05aa76SMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License"); 5*2c05aa76SMatt Spinler * you may not use this file except in compliance with the License. 6*2c05aa76SMatt Spinler * You may obtain a copy of the License at 7*2c05aa76SMatt Spinler * 8*2c05aa76SMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0 9*2c05aa76SMatt Spinler * 10*2c05aa76SMatt Spinler * Unless required by applicable law or agreed to in writing, software 11*2c05aa76SMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS, 12*2c05aa76SMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*2c05aa76SMatt Spinler * See the License for the specific language governing permissions and 14*2c05aa76SMatt Spinler * limitations under the License. 15*2c05aa76SMatt Spinler */ 16*2c05aa76SMatt Spinler #include <experimental/filesystem> 17*2c05aa76SMatt Spinler #include <phosphor-logging/log.hpp> 18*2c05aa76SMatt Spinler #include <regex> 19*2c05aa76SMatt Spinler #include "targeting.hpp" 20*2c05aa76SMatt Spinler 21*2c05aa76SMatt Spinler namespace openpower 22*2c05aa76SMatt Spinler { 23*2c05aa76SMatt Spinler namespace targeting 24*2c05aa76SMatt Spinler { 25*2c05aa76SMatt Spinler 26*2c05aa76SMatt Spinler using namespace phosphor::logging; 27*2c05aa76SMatt Spinler namespace fs = std::experimental::filesystem; 28*2c05aa76SMatt Spinler 29*2c05aa76SMatt Spinler Targeting::Targeting(const std::string& fsiMasterDev, 30*2c05aa76SMatt Spinler const std::string& fsiSlaveDir) : 31*2c05aa76SMatt Spinler fsiMasterPath(fsiMasterDev), 32*2c05aa76SMatt Spinler fsiSlaveBasePath(fsiSlaveDir) 33*2c05aa76SMatt Spinler { 34*2c05aa76SMatt Spinler //Always create P0, the FSI master. 35*2c05aa76SMatt Spinler targets.push_back(std::make_unique<Target>(0, fsiMasterPath)); 36*2c05aa76SMatt Spinler 37*2c05aa76SMatt Spinler //Find the the remaining P9s dynamically based on which files show up 38*2c05aa76SMatt Spinler std::regex exp{"slave@([0-9]{2}):00", std::regex::extended}; 39*2c05aa76SMatt Spinler 40*2c05aa76SMatt Spinler for (auto& file : fs::directory_iterator(fsiSlaveBasePath)) 41*2c05aa76SMatt Spinler { 42*2c05aa76SMatt Spinler std::smatch match; 43*2c05aa76SMatt Spinler std::string path = file.path(); 44*2c05aa76SMatt Spinler if (std::regex_search(path, match, exp)) 45*2c05aa76SMatt Spinler { 46*2c05aa76SMatt Spinler auto pos = atoi(match[1].str().c_str()); 47*2c05aa76SMatt Spinler if (pos == 0) 48*2c05aa76SMatt Spinler { 49*2c05aa76SMatt Spinler log<level::ERR>("Unexpected FSI slave device name found", 50*2c05aa76SMatt Spinler entry("DEVICE_NAME=%d", path.c_str())); 51*2c05aa76SMatt Spinler continue; 52*2c05aa76SMatt Spinler } 53*2c05aa76SMatt Spinler 54*2c05aa76SMatt Spinler path += "/raw"; 55*2c05aa76SMatt Spinler 56*2c05aa76SMatt Spinler targets.push_back(std::make_unique<Target>(pos, path)); 57*2c05aa76SMatt Spinler } 58*2c05aa76SMatt Spinler } 59*2c05aa76SMatt Spinler 60*2c05aa76SMatt Spinler auto sortTargets = [](const std::unique_ptr<Target>& left, 61*2c05aa76SMatt Spinler const std::unique_ptr<Target>& right) 62*2c05aa76SMatt Spinler { 63*2c05aa76SMatt Spinler return left->getPos() < right->getPos(); 64*2c05aa76SMatt Spinler }; 65*2c05aa76SMatt Spinler std::sort(targets.begin(), targets.end(), sortTargets); 66*2c05aa76SMatt Spinler } 67*2c05aa76SMatt Spinler 68*2c05aa76SMatt Spinler } 69*2c05aa76SMatt Spinler } 70