summaryrefslogtreecommitdiffstats
path: root/occ_presence.cpp
blob: 23fece019a6cb7c27538f6e66ad8552d674c3ff0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <phosphor-logging/log.hpp>
#include <phosphor-logging/elog.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
#include <org/open_power/OCC/Device/error.hpp>
#include "occ_presence.hpp"
#include "occ_manager.hpp"
#include "elog-errors.hpp"

namespace open_power
{
namespace occ
{

// Reads the occs_present file and analyzes the data
void Presence::analyzeEvent()
{
    using namespace phosphor::logging;
    using namespace sdbusplus::org::open_power::OCC::Device::Error;

    // Get the number of bytes to read
    int len = -1;
    auto r = ioctl(fd, FIONREAD, &len);
    if (r < 0)
    {
        elog<ConfigFailure>(
            phosphor::logging::org::open_power::OCC::Device::
                ConfigFailure::CALLOUT_ERRNO(errno),
            phosphor::logging::org::open_power::OCC::Device::
                ConfigFailure::CALLOUT_DEVICE_PATH(file.c_str()));
    }

    auto data = readFile(len);
    if (data.empty())
    {
        return;
    }

    // Let stoi determine the base
    auto occsPresent = std::stoi(data, nullptr, 0);
    if (manager.getNumOCCs() != occsPresent)
    {
        log<level::INFO>("OCC presence mismatch",
                         entry("BMC_OCCS=%d", manager.getNumOCCs(),
                         entry("OCC_OCCS=%d", occsPresent)));
        if (callBack)
        {
            callBack(true);
        }
    }
}

} // namespace occ
} // namespace open_power
OpenPOWER on IntegriCloud