blob: 2f025ecab11c4628125b886e8626bcaee08fc6c9 [file] [log] [blame]
#pragma once
#include "filedescriptor.hpp"
#include <memory>
#include <vector>
namespace openpower
{
namespace targeting
{
constexpr auto fsiMasterDevPath = "/sys/class/fsi-master/fsi0/slave@00:00/raw";
constexpr auto fsiSlaveBaseDir = "/sys/class/fsi-master/fsi1/";
/**
* 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), cfamPath(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 CFAM sysfs path
*/
inline auto getCFAMPath() const
{
return cfamPath;
}
/**
* Returns the file descriptor to use
* for read/writeCFAM operations.
*/
int getCFAMFD();
private:
/**
* The logical position of this target
*/
size_t pos;
/**
* The sysfs device path for the CFAM
*/
const std::string cfamPath;
/**
* The file descriptor to use for read/writeCFAMReg
*/
std::unique_ptr<openpower::util::FileDescriptor> cfamFD;
};
/**
* 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();
}
/**
* Returns a target by position.
*/
std::unique_ptr<Target>& getTarget(size_t pos);
private:
/**
* The path to the fsi-master sysfs device to access
*/
std::string fsiMasterPath;
/**
* The path to the fsi slave sysfs base directory
*/
std::string fsiSlaveBasePath;
/**
* A container of Targets in the system
*/
std::vector<std::unique_ptr<Target>> targets;
};
} // namespace targeting
} // namespace openpower