Add Target and Targeting classes

These classes are used to target certain processors
for operations.

Change-Id: Iab7a9fc0f1b0a901963e4e899ded370435cfb418
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/targeting.hpp b/targeting.hpp
new file mode 100644
index 0000000..92c224e
--- /dev/null
+++ b/targeting.hpp
@@ -0,0 +1,137 @@
+#pragma once
+
+#include <memory>
+#include <vector>
+
+namespace openpower
+{
+namespace targeting
+{
+
+constexpr auto fsiMasterDevPath =
+    "/sys/devices/platform/fsi-master/slave@00:00/raw";
+
+constexpr auto fsiSlaveBaseDir = "/sys/devices/hub@00/";
+
+/**
+ * Represents a specific P9 processor in the system.  Used by
+ * the access APIs to specify the chip to operate on.
+ */
+class Target
+{
+    public:
+
+        /**
+         * Constructor
+         *
+         * @param[in] - The logical position of the target
+         * @param[in] - The sysfs device path
+         */
+        Target(size_t position, const std::string& devPath) :
+            pos(position), path(devPath)
+        {
+        }
+
+        Target() = delete;
+        ~Target() = default;
+        Target(const Target&) = default;
+        Target(Target&&) = default;
+        Target& operator=(Target&&) = default;
+
+        /**
+         * Returns the position
+         */
+        inline auto getPos() const
+        {
+            return pos;
+        }
+
+        /**
+         * Returns the path
+         */
+        inline auto getPath() const
+        {
+            return path;
+        }
+
+    private:
+
+        /**
+         * The logical position of this target
+         */
+        size_t pos;
+
+        /**
+         * The sysfs device path
+         */
+        const std::string path;
+};
+
+
+/**
+ * Class that manages processor targeting for FSI operations.
+ */
+class Targeting
+{
+    public:
+
+        /**
+         * Scans sysfs to find all processors and creates Target objects
+         * for them.
+         * @param[in] fsiMasterDev - the sysfs device for the master
+         * @param[in] fsiSlaveDirectory - the base sysfs dir for slaves
+         */
+        Targeting(const std::string& fsiMasterDev,
+                  const std::string& fsiSlaveDir);
+
+        Targeting() : Targeting(fsiMasterDevPath, fsiSlaveBaseDir) {}
+
+        ~Targeting() = default;
+        Targeting(const Targeting&) = default;
+        Targeting(Targeting&&) = default;
+        Targeting& operator=(Targeting&&) = default;
+
+        /**
+         * Returns a const iterator to the first target
+         */
+        inline auto begin()
+        {
+            return targets.cbegin();
+        }
+
+        /**
+         * Returns a const iterator to the last (highest position) target.
+         */
+        inline auto end()
+        {
+            return targets.cend();
+        }
+
+        /**
+         * Returns the number of targets
+         */
+        inline auto size()
+        {
+            return targets.size();
+        }
+
+    private:
+
+        /**
+         * The path to the fsi-master sysfs device to access
+         */
+        const std::string fsiMasterPath;
+
+        /**
+         * The path to the fsi slave sysfs base directory
+         */
+        const std::string fsiSlaveBasePath;
+
+        /**
+         * A container of Targets in the system
+         */
+        std::vector<std::unique_ptr<Target>> targets;
+};
+
+}
+}