blob: 22d19064d322350629962fd64315cde45ab14eb6 [file] [log] [blame]
Patrick Williamsb8c92442022-08-04 13:27:05 -05001#include "config.h"
2
3#include "kunlun_oem.hpp"
4
Xiuzhi Cheng4f3eb902022-06-08 09:06:33 +08005#include <ipmid/api.hpp>
6#include <phosphor-logging/log.hpp>
7
Patrick Williamsb8c92442022-08-04 13:27:05 -05008#include <filesystem>
9#include <fstream>
Xiuzhi Cheng4f3eb902022-06-08 09:06:33 +080010
11namespace ipmi
12{
13
14using namespace phosphor::logging;
15
16// save cpu infomation from bios to file
17// index[in]: cpu index
18// info[in]: data saving to file
Patrick Williamsb8c92442022-08-04 13:27:05 -050019static int saveInfoToFile(uint8_t index, std::vector<char>& info)
Xiuzhi Cheng4f3eb902022-06-08 09:06:33 +080020{
21 char infoPath[PATH_MAX];
22
Patrick Williamsb8c92442022-08-04 13:27:05 -050023 std::snprintf(infoPath, sizeof(infoPath), IPMI_BIOSDATA_DIR "/cpu%02x",
24 index);
Xiuzhi Cheng4f3eb902022-06-08 09:06:33 +080025
26 if (!(std::filesystem::exists(IPMI_BIOSDATA_DIR)))
27 {
28 std::filesystem::create_directory(IPMI_BIOSDATA_DIR);
29 }
30
31 std::ofstream ofs(infoPath, std::ios::out | std::ios::binary);
32 ofs.seekp(0);
33 ofs.write(info.data(), info.size());
34 ofs.close();
35
36 return 0;
37}
38
39// load cpu infomation from file
40// index[in]: cpu index
41// info[out]: data loading from file
Patrick Williamsb8c92442022-08-04 13:27:05 -050042static int loadInfoFromFile(uint8_t index, std::vector<char>& info)
Xiuzhi Cheng4f3eb902022-06-08 09:06:33 +080043{
44 char infoPath[PATH_MAX];
45
Patrick Williamsb8c92442022-08-04 13:27:05 -050046 std::snprintf(infoPath, sizeof(infoPath), IPMI_BIOSDATA_DIR "/cpu%02x",
47 index);
Xiuzhi Cheng4f3eb902022-06-08 09:06:33 +080048
49 if (!(std::filesystem::exists(infoPath)))
50 {
51 std::filesystem::create_directory(infoPath);
52 }
53
54 std::ifstream ifs(infoPath, std::ios::in | std::ios::binary);
55
56 ifs.seekg(0, std::ios::end);
57 auto size = ifs.tellg();
58 ifs.seekg(0, std::ios::beg);
59
60 info.resize(size);
61
62 ifs.read(info.data(), size);
63 ifs.close();
64
65 return 0;
66}
67
68RspType<> setCpuInfo(uint8_t index, std::vector<char> info)
69{
70 saveInfoToFile(index, info);
71
72 return responseSuccess();
73}
74
75RspType<std::vector<char>> getCpuInfo(uint8_t index)
76{
77 std::vector<char> output;
78
79 loadInfoFromFile(index, output);
80
81 return responseSuccess(output);
82}
83
84void register_kunlun_oem_functions(void)
85{
86 registerHandler(prioOemBase, netfnKunlunOem, cmd::cmdSetCpuInfo,
87 Privilege::Admin, setCpuInfo);
88 registerHandler(prioOemBase, netfnKunlunOem, cmd::cmdGetCpuInfo,
89 Privilege::User, getCpuInfo);
90}
91
92void register_kunlun_oem_functions() __attribute__((constructor));
93
94} // namespace ipmi