xref: /openbmc/phosphor-bmc-code-mgmt/eeprom-device/pt5161l/pt5161l.cpp (revision 975fbbeb3f11e01a2ba4bcad5213935019e2568b)
1994a77ffSKevin Tung #include "pt5161l.hpp"
2994a77ffSKevin Tung 
3994a77ffSKevin Tung #include <phosphor-logging/lg2.hpp>
4994a77ffSKevin Tung 
5994a77ffSKevin Tung #include <algorithm>
6994a77ffSKevin Tung #include <fstream>
7994a77ffSKevin Tung #include <iomanip>
8994a77ffSKevin Tung #include <sstream>
9994a77ffSKevin Tung 
10994a77ffSKevin Tung PHOSPHOR_LOG2_USING;
11994a77ffSKevin Tung 
getVersion()12994a77ffSKevin Tung std::string PT5161LDeviceVersion::getVersion()
13994a77ffSKevin Tung {
14994a77ffSKevin Tung     std::string version;
15994a77ffSKevin Tung     std::ostringstream busOss;
16994a77ffSKevin Tung     std::ostringstream addrOss;
17994a77ffSKevin Tung 
18994a77ffSKevin Tung     busOss << std::setw(2) << std::setfill('0') << static_cast<int>(bus);
19994a77ffSKevin Tung     addrOss << std::setw(4) << std::setfill('0') << std::hex << std::nouppercase
20994a77ffSKevin Tung             << static_cast<int>(address);
21994a77ffSKevin Tung 
22994a77ffSKevin Tung     // The PT5161L driver exposes the firmware version through the fw_ver node
23994a77ffSKevin Tung     std::string path = "/sys/kernel/debug/pt5161l/" + busOss.str() + "-" +
24994a77ffSKevin Tung                        addrOss.str() + "/fw_ver";
25994a77ffSKevin Tung 
26994a77ffSKevin Tung     std::ifstream file(path);
27994a77ffSKevin Tung     if (!file)
28994a77ffSKevin Tung     {
29994a77ffSKevin Tung         error("Failed to get version: unable to open file: {PATH}", "PATH",
30994a77ffSKevin Tung               path);
31994a77ffSKevin Tung         return version;
32994a77ffSKevin Tung     }
33994a77ffSKevin Tung 
34994a77ffSKevin Tung     if (!std::getline(file, version) || version.empty())
35994a77ffSKevin Tung     {
36994a77ffSKevin Tung         error("Failed to read version from file: {PATH}", "PATH", path);
37994a77ffSKevin Tung     }
38994a77ffSKevin Tung 
39994a77ffSKevin Tung     return version;
40994a77ffSKevin Tung }
41994a77ffSKevin Tung 
isDeviceReady()42*975fbbebSDaniel Hsu bool PT5161LDeviceVersion::isDeviceReady()
43*975fbbebSDaniel Hsu {
44*975fbbebSDaniel Hsu     std::string status;
45*975fbbebSDaniel Hsu     std::ostringstream busOss;
46*975fbbebSDaniel Hsu     std::ostringstream addrOss;
47*975fbbebSDaniel Hsu 
48*975fbbebSDaniel Hsu     busOss << std::setw(2) << std::setfill('0') << static_cast<int>(bus);
49*975fbbebSDaniel Hsu     addrOss << std::setw(4) << std::setfill('0') << std::hex << std::nouppercase
50*975fbbebSDaniel Hsu             << static_cast<int>(address);
51*975fbbebSDaniel Hsu 
52*975fbbebSDaniel Hsu     std::string fw_load_status = "/sys/kernel/debug/pt5161l/" + busOss.str() +
53*975fbbebSDaniel Hsu                                  "-" + addrOss.str() + "/fw_load_status";
54*975fbbebSDaniel Hsu 
55*975fbbebSDaniel Hsu     std::ifstream file(fw_load_status);
56*975fbbebSDaniel Hsu 
57*975fbbebSDaniel Hsu     if (file && std::getline(file, status) && status == "normal")
58*975fbbebSDaniel Hsu     {
59*975fbbebSDaniel Hsu         return true;
60*975fbbebSDaniel Hsu     }
61*975fbbebSDaniel Hsu 
62*975fbbebSDaniel Hsu     error("Status from file: {PATH} is invalid: {STATUS}", "PATH",
63*975fbbebSDaniel Hsu           fw_load_status, "STATUS", status);
64*975fbbebSDaniel Hsu 
65*975fbbebSDaniel Hsu     return false;
66*975fbbebSDaniel Hsu }
67*975fbbebSDaniel Hsu 
68994a77ffSKevin Tung std::optional<HostPowerInf::HostState>
getHostStateToQueryVersion()69994a77ffSKevin Tung     PT5161LDeviceVersion::getHostStateToQueryVersion()
70994a77ffSKevin Tung {
71994a77ffSKevin Tung     return HostPowerInf::HostState::Running;
72994a77ffSKevin Tung }
73