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