blob: d8a41c40047fde00f64fd035aa2f5b7003de0580 [file] [log] [blame]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_FRU_SCANNER_FRAM_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_FRU_SCANNER_FRAM_H_
#include <cstdint>
#include <memory>
#include <string>
#include <vector>
#include "absl/status/statusor.h"
#include "absl/time/time.h"
#include "io/ioctl.h"
#include "io/smbus/kernel_dev.h"
#include "io/smbus/smbus.h"
#include "time/clock.h"
#include "tlbmc/hal/fru_scanner.h"
namespace milotic_tlbmc {
// Fru scanner for reading from fram
class FruScannerFram : public FruScanner {
public:
struct Options {
std::string i2c_dev_dir = "/dev";
// TODO(b/435256084): Refine FRAM reading to use the Log Offset
// from the status register instead of a fixed size.
// Currently, 4096 is used based on experimental validation for Cavium HSM
// FRAM..
uint32_t fram_size = 4096;
// Currently the only FRAM FRU we need to scan. When we have
// multiple, we can add support for bus and address ranges in the future.
int bus = 6;
int address = 0x52; // Decimal 82
};
static std::unique_ptr<FruScannerFram> Create(const Options& options);
~FruScannerFram() override;
absl::StatusOr<std::unique_ptr<I2cFruInfo>> GetI2cFruInfoFromBus(
int bus, int address, absl::Duration delay_between_reads) const override;
absl::StatusOr<std::vector<std::unique_ptr<I2cFruInfo>>> ScanAllI2cFrus()
const override;
protected:
explicit FruScannerFram(const Options& options)
: options_(options),
sys_ioctl_(),
smbus_access_(std::make_unique<ecclesia::KernelSmbusAccess>(
options.i2c_dev_dir, &sys_ioctl_)) {}
const Options options_;
ecclesia::SysIoctl sys_ioctl_;
std::unique_ptr<ecclesia::SmbusAccessInterface> smbus_access_;
ecclesia::Clock* clock_ = ecclesia::Clock::RealClock();
private:
void SleepIfNeeded(absl::Duration delay) const;
};
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_FRU_SCANNER_FRAM_H_