xref: /openbmc/openpower-proc-control/targeting.cpp (revision 2c05aa76075c29297c23c4c6b5a3a956314eaf6a)
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