12c05aa76SMatt Spinler #pragma once 22c05aa76SMatt Spinler 3f78d9042SPatrick Venture #include "filedescriptor.hpp" 4f78d9042SPatrick Venture 52c05aa76SMatt Spinler #include <memory> 62c05aa76SMatt Spinler #include <vector> 72c05aa76SMatt Spinler 82c05aa76SMatt Spinler namespace openpower 92c05aa76SMatt Spinler { 102c05aa76SMatt Spinler namespace targeting 112c05aa76SMatt Spinler { 122c05aa76SMatt Spinler 1360db8b14SJoel Stanley constexpr auto fsiMasterDevPath = "/sys/class/fsi-master/fsi0/slave@00:00/raw"; 142c05aa76SMatt Spinler 1560db8b14SJoel Stanley constexpr auto fsiSlaveBaseDir = "/sys/class/fsi-master/fsi1/"; 168316b77bSEdward A. James 172c05aa76SMatt Spinler /** 182c05aa76SMatt Spinler * Represents a specific P9 processor in the system. Used by 192c05aa76SMatt Spinler * the access APIs to specify the chip to operate on. 202c05aa76SMatt Spinler */ 212c05aa76SMatt Spinler class Target 222c05aa76SMatt Spinler { 232c05aa76SMatt Spinler public: 242c05aa76SMatt Spinler /** 252c05aa76SMatt Spinler * Constructor 262c05aa76SMatt Spinler * 272c05aa76SMatt Spinler * @param[in] - The logical position of the target 282c05aa76SMatt Spinler * @param[in] - The sysfs device path 292c05aa76SMatt Spinler */ Target(size_t position,const std::string & devPath)30afa1d226SJoel Stanley Target(size_t position, const std::string& devPath) : 31afa1d226SJoel Stanley pos(position), cfamPath(devPath) 325e5d4451SBrad Bishop {} 332c05aa76SMatt Spinler 342c05aa76SMatt Spinler Target() = delete; 352c05aa76SMatt Spinler ~Target() = default; 362c05aa76SMatt Spinler Target(const Target&) = default; 372c05aa76SMatt Spinler Target(Target&&) = default; 382c05aa76SMatt Spinler Target& operator=(Target&&) = default; 392c05aa76SMatt Spinler 402c05aa76SMatt Spinler /** 412c05aa76SMatt Spinler * Returns the position 422c05aa76SMatt Spinler */ getPos() const432c05aa76SMatt Spinler inline auto getPos() const 442c05aa76SMatt Spinler { 452c05aa76SMatt Spinler return pos; 462c05aa76SMatt Spinler } 472c05aa76SMatt Spinler 482c05aa76SMatt Spinler /** 49c3bffed7SMatt Spinler * Returns the CFAM sysfs path 502c05aa76SMatt Spinler */ getCFAMPath() const51c3bffed7SMatt Spinler inline auto getCFAMPath() const 522c05aa76SMatt Spinler { 53c3bffed7SMatt Spinler return cfamPath; 542c05aa76SMatt Spinler } 552c05aa76SMatt Spinler 56c3bffed7SMatt Spinler /** 57c3bffed7SMatt Spinler * Returns the file descriptor to use 58c3bffed7SMatt Spinler * for read/writeCFAM operations. 59c3bffed7SMatt Spinler */ 60c3bffed7SMatt Spinler int getCFAMFD(); 61c3bffed7SMatt Spinler 622c05aa76SMatt Spinler private: 632c05aa76SMatt Spinler /** 642c05aa76SMatt Spinler * The logical position of this target 652c05aa76SMatt Spinler */ 662c05aa76SMatt Spinler size_t pos; 672c05aa76SMatt Spinler 682c05aa76SMatt Spinler /** 69c3bffed7SMatt Spinler * The sysfs device path for the CFAM 702c05aa76SMatt Spinler */ 71c3bffed7SMatt Spinler const std::string cfamPath; 72c3bffed7SMatt Spinler 73c3bffed7SMatt Spinler /** 74c3bffed7SMatt Spinler * The file descriptor to use for read/writeCFAMReg 75c3bffed7SMatt Spinler */ 76c3bffed7SMatt Spinler std::unique_ptr<openpower::util::FileDescriptor> cfamFD; 772c05aa76SMatt Spinler }; 782c05aa76SMatt Spinler 792c05aa76SMatt Spinler /** 802c05aa76SMatt Spinler * Class that manages processor targeting for FSI operations. 812c05aa76SMatt Spinler */ 822c05aa76SMatt Spinler class Targeting 832c05aa76SMatt Spinler { 842c05aa76SMatt Spinler public: 852c05aa76SMatt Spinler /** 862c05aa76SMatt Spinler * Scans sysfs to find all processors and creates Target objects 872c05aa76SMatt Spinler * for them. 882c05aa76SMatt Spinler * @param[in] fsiMasterDev - the sysfs device for the master 892c05aa76SMatt Spinler * @param[in] fsiSlaveDirectory - the base sysfs dir for slaves 902c05aa76SMatt Spinler */ 91f78d9042SPatrick Venture Targeting(const std::string& fsiMasterDev, const std::string& fsiSlaveDir); 922c05aa76SMatt Spinler Targeting()93*00dd33efSPatrick Williams Targeting() : Targeting(fsiMasterDevPath, fsiSlaveBaseDir) {} 942c05aa76SMatt Spinler 952c05aa76SMatt Spinler ~Targeting() = default; 962c05aa76SMatt Spinler Targeting(const Targeting&) = default; 972c05aa76SMatt Spinler Targeting(Targeting&&) = default; 982c05aa76SMatt Spinler Targeting& operator=(Targeting&&) = default; 992c05aa76SMatt Spinler 1002c05aa76SMatt Spinler /** 1012c05aa76SMatt Spinler * Returns a const iterator to the first target 1022c05aa76SMatt Spinler */ begin()1032c05aa76SMatt Spinler inline auto begin() 1042c05aa76SMatt Spinler { 1052c05aa76SMatt Spinler return targets.cbegin(); 1062c05aa76SMatt Spinler } 1072c05aa76SMatt Spinler 1082c05aa76SMatt Spinler /** 1092c05aa76SMatt Spinler * Returns a const iterator to the last (highest position) target. 1102c05aa76SMatt Spinler */ end()1112c05aa76SMatt Spinler inline auto end() 1122c05aa76SMatt Spinler { 1132c05aa76SMatt Spinler return targets.cend(); 1142c05aa76SMatt Spinler } 1152c05aa76SMatt Spinler 1162c05aa76SMatt Spinler /** 1172c05aa76SMatt Spinler * Returns the number of targets 1182c05aa76SMatt Spinler */ size()1192c05aa76SMatt Spinler inline auto size() 1202c05aa76SMatt Spinler { 1212c05aa76SMatt Spinler return targets.size(); 1222c05aa76SMatt Spinler } 1232c05aa76SMatt Spinler 124be407166SMichael Tritz /** 125be407166SMichael Tritz * Returns a target by position. 126be407166SMichael Tritz */ 127be407166SMichael Tritz std::unique_ptr<Target>& getTarget(size_t pos); 128be407166SMichael Tritz 1292c05aa76SMatt Spinler private: 1302c05aa76SMatt Spinler /** 1312c05aa76SMatt Spinler * The path to the fsi-master sysfs device to access 1322c05aa76SMatt Spinler */ 1338316b77bSEdward A. James std::string fsiMasterPath; 1342c05aa76SMatt Spinler 1352c05aa76SMatt Spinler /** 1362c05aa76SMatt Spinler * The path to the fsi slave sysfs base directory 1372c05aa76SMatt Spinler */ 1388316b77bSEdward A. James std::string fsiSlaveBasePath; 1392c05aa76SMatt Spinler 1402c05aa76SMatt Spinler /** 1412c05aa76SMatt Spinler * A container of Targets in the system 1422c05aa76SMatt Spinler */ 1432c05aa76SMatt Spinler std::vector<std::unique_ptr<Target>> targets; 1442c05aa76SMatt Spinler }; 1452c05aa76SMatt Spinler 146f78d9042SPatrick Venture } // namespace targeting 147f78d9042SPatrick Venture } // namespace openpower 148