blob: f3436ee915faddbed01431f6108a784389ff12db [file] [log] [blame]
Michael Tritzbe407162017-03-30 16:52:24 -05001#include <fstream>
2#include <sstream>
3#include <iostream>
4#include "cfam_access.hpp"
5#include "p9_cfam.hpp"
6#include "registration.hpp"
7#include "targeting.hpp"
Dhruvaraj Subhashchandran7ce535c2017-05-15 05:06:36 -05008#include "elog-errors.hpp"
9#include <xyz/openbmc_project/Common/error.hpp>
Michael Tritzbe407162017-03-30 16:52:24 -050010
11/* File /var/lib/obmc/cfam_overrides requires whitespace-separated parameters
12Pos Address Data Mask with one register write per line. For example:
130 0x283F 0x12345678 0xF0F0F0F0
140 0x283F 0x87654321 0x0F0F0F0F
15Blank lines and comment lines beginning with # will be ignored. */
16
17namespace openpower
18{
19namespace p9
20{
21
22using namespace openpower::cfam::access;
23using namespace openpower::targeting;
24using namespace openpower::util;
25
26void CFAMOverride() {
27 int pos = 0;
28 cfam_address_t address = 0;
29 cfam_data_t data = 0;
30 cfam_mask_t mask = 0;
31
32 Targeting targets;
33
34 std::string line;
35
36 std::ifstream overrides("/var/lib/obmc/cfam_overrides");
37
38 if (overrides.is_open())
39 {
40 while (std::getline(overrides,line))
41 {
42 if (!line.empty())
43 {
44 line.erase(0, line.find_first_not_of(" \t\r\n"));
45 if (!line.empty() && line.at(0) != '#')
46 {
47 mask = 0xFFFFFFFF;
48 if (sscanf(line.c_str(), "%x %hx %x %x", &pos, &address,
49 &data, &mask) >= 3)
50 {
51 const auto& target = targets.getTarget(pos);
52 writeRegWithMask(target, address, data, mask);
53 }
54 else
55 {
Dhruvaraj Subhashchandran7ce535c2017-05-15 05:06:36 -050056 namespace error =
57 sdbusplus::xyz::openbmc_project::Common::Error;
58 namespace metadata =
59 phosphor::logging::xyz::openbmc_project::Common;
60 phosphor::logging::elog<error::InvalidArgument>(
61 metadata::InvalidArgument::ARGUMENT_NAME("line"),
62 metadata::InvalidArgument::ARGUMENT_VALUE(line.c_str()));
Michael Tritzbe407162017-03-30 16:52:24 -050063 }
64 }
65 }
66 }
67 overrides.close();
68 }
69
70 return;
71}
72
73REGISTER_PROCEDURE("CFAMOverride", CFAMOverride);
74
75}
76}