xref: /openbmc/openpower-proc-control/targeting.hpp (revision 597e05c9cdd6c5dc767ec0b811e842bb48bda948)
1 #pragma once
2 
3 #include <memory>
4 #include <vector>
5 
6 namespace openpower
7 {
8 namespace targeting
9 {
10 
11 constexpr auto fsiMasterDevPath =
12     "/sys/devices/platform/fsi-master/slave@00:00/raw";
13 
14 constexpr auto fsiSlaveBaseDir = "/sys/devices/hub@00/";
15 
16 /**
17  * Represents a specific P9 processor in the system.  Used by
18  * the access APIs to specify the chip to operate on.
19  */
20 class Target
21 {
22     public:
23 
24         /**
25          * Constructor
26          *
27          * @param[in] - The logical position of the target
28          * @param[in] - The sysfs device path
29          */
30         Target(size_t position, const std::string& devPath) :
31             pos(position), path(devPath)
32         {
33         }
34 
35         Target() = delete;
36         ~Target() = default;
37         Target(const Target&) = default;
38         Target(Target&&) = default;
39         Target& operator=(Target&&) = default;
40 
41         /**
42          * Returns the position
43          */
44         inline auto getPos() const
45         {
46             return pos;
47         }
48 
49         /**
50          * Returns the path
51          */
52         inline auto getPath() const
53         {
54             return path;
55         }
56 
57     private:
58 
59         /**
60          * The logical position of this target
61          */
62         size_t pos;
63 
64         /**
65          * The sysfs device path
66          */
67         const std::string path;
68 };
69 
70 
71 /**
72  * Class that manages processor targeting for FSI operations.
73  */
74 class Targeting
75 {
76     public:
77 
78         /**
79          * Scans sysfs to find all processors and creates Target objects
80          * for them.
81          * @param[in] fsiMasterDev - the sysfs device for the master
82          * @param[in] fsiSlaveDirectory - the base sysfs dir for slaves
83          */
84         Targeting(const std::string& fsiMasterDev,
85                   const std::string& fsiSlaveDir);
86 
87         Targeting() : Targeting(fsiMasterDevPath, fsiSlaveBaseDir) {}
88 
89         ~Targeting() = default;
90         Targeting(const Targeting&) = default;
91         Targeting(Targeting&&) = default;
92         Targeting& operator=(Targeting&&) = default;
93 
94         /**
95          * Returns a const iterator to the first target
96          */
97         inline auto begin()
98         {
99             return targets.cbegin();
100         }
101 
102         /**
103          * Returns a const iterator to the last (highest position) target.
104          */
105         inline auto end()
106         {
107             return targets.cend();
108         }
109 
110         /**
111          * Returns the number of targets
112          */
113         inline auto size()
114         {
115             return targets.size();
116         }
117 
118     private:
119 
120         /**
121          * The path to the fsi-master sysfs device to access
122          */
123         const std::string fsiMasterPath;
124 
125         /**
126          * The path to the fsi slave sysfs base directory
127          */
128         const std::string fsiSlaveBasePath;
129 
130         /**
131          * A container of Targets in the system
132          */
133         std::vector<std::unique_ptr<Target>> targets;
134 };
135 
136 }
137 }
138