diff options
author | Lei YU <mine260309@gmail.com> | 2017-07-13 17:02:23 +0800 |
---|---|---|
committer | Lei YU <mine260309@gmail.com> | 2017-08-28 10:31:42 +0800 |
commit | 0ab90ca75b825db8e2427ea62ea3ee212c9accbb (patch) | |
tree | 6d7934495cf7233f54f5bd882469056c4f700142 /occ_manager.hpp | |
parent | 3ace7576176afed9196fb308c766de6b1252d3ea (diff) | |
download | openpower-occ-control-0ab90ca75b825db8e2427ea62ea3ee212c9accbb.tar.gz openpower-occ-control-0ab90ca75b825db8e2427ea62ea3ee212c9accbb.zip |
Add I2C OCC support for P8 systems
P8 system uses I2C OCC and it uses different driver for occ-hwmon.
Add `--enable-i2c-occ` configure option to enable the support.
It searches i2c device names in sysfs to get all occ-hwmon devices and
use the i2c device name to bind/unbind the driver.
The occ control object path for I2C OCC hwmon becomes something like
/org/open_power/control/3_0050, where 3_0050 is the i2c address.
Change-Id: I8b9d8d4429c563528dc88fb2679b265c53d7a2d5
Signed-off-by: Lei YU <mine260309@gmail.com>
Diffstat (limited to 'occ_manager.hpp')
-rw-r--r-- | occ_manager.hpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/occ_manager.hpp b/occ_manager.hpp index e79ac3c..7bb1042 100644 --- a/occ_manager.hpp +++ b/occ_manager.hpp @@ -12,6 +12,7 @@ #include "occ_status.hpp" #include "occ_finder.hpp" #include "config.h" +#include "i2c_occ.hpp" namespace sdbusRule = sdbusplus::bus::match::rules; namespace open_power @@ -43,6 +44,10 @@ struct Manager bus(bus), event(event) { +#ifdef I2C_OCC + // I2C OCC status objects are initialized directly + initStatusObjects(); +#else // Check if CPU inventory exists already. auto occs = open_power::occ::finder::get(bus); if (occs.empty()) @@ -67,6 +72,7 @@ struct Manager createObjects(occ); } } +#endif } private: @@ -187,6 +193,31 @@ struct Manager /** @brief Number of OCCs that are bound */ uint8_t activeCount = 0; + +#ifdef I2C_OCC + /** @brief Init Status objects for I2C OCC devices + * + * It iterates in /sys/bus/i2c/devices, finds all occ hwmon devices + * and creates status objects. + */ + void initStatusObjects() + { + // Make sure we have a valid path string + static_assert(sizeof(DEV_PATH) != 0); + + auto deviceNames = i2c_occ::getOccHwmonDevices(DEV_PATH); + for (auto& name : deviceNames) + { + i2c_occ::i2cToDbus(name); + auto path = fs::path(OCC_CONTROL_ROOT) / name; + statusObjects.emplace_back( + std::make_unique<Status>( + bus, + event, + path.c_str())); + } + } +#endif }; } // namespace occ |