blob: 34d670a14f45c39ae0c62781c29be1f090b63e05 [file] [log] [blame]
#include "tlbmc/sensors/peci_hwmon_based_sensor.h"
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include "google/protobuf/duration.pb.h"
#include "absl/log/log.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "boost/asio.hpp" // NOLINT: boost::asio is commonly used in BMC
#include "boost/asio/error.hpp" // NOLINT
#include "boost/asio/random_access_file.hpp" // NOLINT: boost::asio is commonly used in BMC
#include "boost/filesystem.hpp" // NOLINT: boost::filesystem is commonly used in BMC
#include "boost/filesystem/operations.hpp" // NOLINT
#include "boost/system/detail/error_code.hpp" // NOLINT: boost::asio is commonly used in BMC
#include "g3/macros.h"
#include "hal_common_config.pb.h"
#include "tlbmc/hal/sysfs/peci.h"
#include "resource.pb.h"
#include "sensor.pb.h"
#include "tlbmc/sensors/hwmon_based_sensor.h"
namespace milotic_tlbmc {
PeciHwmonBasedSensor::PeciHwmonBasedSensor(
const std::string& input_dev_path,
const std::shared_ptr<boost::asio::io_context>& io_context,
SensorAttributesStatic&& sensor_attributes_static,
const ThresholdConfigs& threshold_configs,
std::optional<NotificationCb> on_batch_notify, const PeciSysfs& peci_sysfs)
: HwmonBasedSensor(input_dev_path, io_context,
std::move(sensor_attributes_static),
threshold_configs, on_batch_notify),
peci_sysfs_(peci_sysfs) {}
absl::StatusOr<boost::filesystem::path> PeciHwmonBasedSensor::CreateDevice(
const HalCommonConfig& hal_config) {
// If the device is already created, return the existing path.
if (peci_sysfs_.IsDevicePresent(hal_config)) {
LOG(INFO) << "Device " << hal_config << " already exists";
return peci_sysfs_.GetBusPath(hal_config.bus()) /
peci_sysfs_.GetDeviceDirectoryName(hal_config);
}
ECCLESIA_RETURN_IF_ERROR(peci_sysfs_.NewDevice(hal_config, "peci-client"));
if (!peci_sysfs_.IsDevicePresent(hal_config)) {
return absl::InternalError(absl::StrCat("Failed to find device ",
hal_config, " after creating it"));
}
// Now the device is created, e.g. /sys/bus/peci/devices/peci-0/0-30/
return peci_sysfs_.GetBusPath(hal_config.bus()) /
peci_sysfs_.GetDeviceDirectoryName(hal_config);
}
} // namespace milotic_tlbmc