xref: /openbmc/openpower-proc-control/targeting.hpp (revision 00dd33efc3a2f32aabb3981c81f64ad238716ce0)
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