meta-facebook/meta-fby2/recipes-fby2/fw-util/files/vr.cpp (302 lines of code) (raw):
#include <facebook/bic.h>
#include <openbmc/pal.h>
#include <syslog.h>
#include <cstdio>
#include <cstring>
#include "fw-util.h"
#include "server.h"
using namespace std;
class VrComponent : public Component {
uint8_t slot_id = 0;
Server server;
public:
VrComponent(string fru, string comp, uint8_t _slot_id)
: Component(fru, comp), slot_id(_slot_id), server(_slot_id, fru) {
int slot_type = fby2_get_slot_type(slot_id);
if (slot_type != SLOT_TYPE_SERVER && slot_type != SLOT_TYPE_GPV2) {
(*fru_list)[fru].erase(comp);
if ((*fru_list)[fru].size() == 0) {
fru_list->erase(fru);
}
}
}
int print_version() {
uint8_t ver[32] = {0};
if (fby2_get_slot_type(slot_id) == SLOT_TYPE_GPV2) {
try {
server.ready();
// Print 3V3_VR VR Version
if (bic_get_fw_ver(slot_id, FW_3V3_VR, ver)) {
printf("3V3 VR Version: NA\n");
} else {
printf("3V3 VR Version: 0x%02x\n", ver[0]);
}
// Print 3V3_VR VR Version
if (bic_get_fw_ver(slot_id, FW_0V92, ver)) {
printf("0V92 VR Version: NA\n");
} else {
printf("0V92 VR Version: 0x%02x\n", ver[0]);
}
} catch (const string& err) {
printf("3V3 VR Version: NA (%s)\n", err.c_str());
printf("0V92 VR Version: NA (%s)\n", err.c_str());
}
return 0;
}
int ret;
uint8_t server_type = 0xFF;
ret = fby2_get_server_type(slot_id, &server_type);
if (ret) {
syslog(LOG_ERR, "%s, Get server type failed\n", __func__);
}
switch (server_type) {
case SERVER_TYPE_ND:
try {
server.ready();
if (bic_get_fw_ver(slot_id, FW_PVDDCR_CPU_VR, ver)) {
printf("PVDDCR_CPU VR Version: NA\n");
} else {
printf(
"PVDDCR_CPU VR Version: %02X%02X%02X%02X, Remaining Writes: %u\n",
ver[3], ver[2], ver[1], ver[0], ver[4]);
}
if (bic_get_fw_ver(slot_id, FW_PVDDCR_SOC_VR, ver)) {
printf("PVDDCR_SOC VR Version: NA\n");
} else {
printf(
"PVDDCR_SOC VR Version: %02X%02X%02X%02X, Remaining Writes: %u\n",
ver[3], ver[2], ver[1], ver[0], ver[4]);
}
if (bic_get_fw_ver(slot_id, FW_PVDDIO_ABCD_VR, ver)) {
printf("PVDDIO_ABCD VR Version: NA\n");
} else {
printf(
"PVDDIO_ABCD VR Version: %02X%02X%02X%02X, Remaining Writes: %u\n",
ver[3], ver[2], ver[1], ver[0], ver[4]);
}
if (bic_get_fw_ver(slot_id, FW_PVDDIO_EFGH_VR, ver)) {
printf("PVDDIO_EFGH VR Version: NA\n");
} else {
printf(
"PVDDIO_EFGH VR Version: %02X%02X%02X%02X, Remaining Writes: %u\n",
ver[3], ver[2], ver[1], ver[0], ver[4]);
}
} catch (const string& err) {
printf("PVDDCR_CPU VR Version: NA (%s)\n", err.c_str());
printf("PVDDCR_SOC VR Version: NA (%s)\n", err.c_str());
printf("PVDDIO_ABCD VR Version: NA (%s)\n", err.c_str());
printf("PVDDIO_EFGH VR Version: NA (%s)\n", err.c_str());
}
break;
case SERVER_TYPE_TL:
default:
try {
server.ready();
// Print PVCCIO VR Version
if (bic_get_fw_ver(slot_id, FW_PVCCIO_VR, ver)) {
printf("PVCCIO VR Version: NA\n");
} else {
printf(
"PVCCIO VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
// Print PVCCIN VR Version
if (bic_get_fw_ver(slot_id, FW_PVCCIN_VR, ver)) {
printf("PVCCIN VR Version: NA\n");
} else {
printf(
"PVCCIN VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
// Print PVCCSA VR Version
if (bic_get_fw_ver(slot_id, FW_PVCCSA_VR, ver)) {
printf("PVCCSA VR Version: NA\n");
} else {
printf(
"PVCCSA VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
// Print DDRAB VR Version
if (bic_get_fw_ver(slot_id, FW_DDRAB_VR, ver)) {
printf("DDRAB VR Version: NA\n");
} else {
printf(
"DDRAB VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
// Print DDRDE VR Version
if (bic_get_fw_ver(slot_id, FW_DDRDE_VR, ver)) {
printf("DDRDE VR Version: NA\n");
} else {
printf(
"DDRDE VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
// Print PVNNPCH VR Version
if (bic_get_fw_ver(slot_id, FW_PVNNPCH_VR, ver)) {
printf("PVNNPCH VR Version: NA\n");
} else {
printf(
"PVNNPCH VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
// Print P1V05 VR Version
if (bic_get_fw_ver(slot_id, FW_P1V05_VR, ver)) {
printf("P1V05 VR Version: NA\n");
} else {
printf(
"P1V05 VR Version: 0x%02x%02x, 0x%02x%02x\n",
ver[0],
ver[1],
ver[2],
ver[3]);
}
} catch (const string& err) {
printf("PVCCIO VR Version: NA (%s)\n", err.c_str());
printf("PVCCIN VR Version: NA (%s)\n", err.c_str());
printf("PVCCSA VR Version: NA (%s)\n", err.c_str());
printf("DDRAB VR Version: NA (%s)\n", err.c_str());
printf("DDRDE VR Version: NA (%s)\n", err.c_str());
printf("PVNNPCH VR Version: NA (%s)\n", err.c_str());
printf("P1V05 VR Version: NA (%s)\n", err.c_str());
}
break;
}
return 0;
}
int update(string image) {
int ret;
try {
server.ready();
ret = bic_update_fw(slot_id, UPDATE_VR, (char*)image.c_str());
} catch (const string& err) {
ret = FW_STATUS_NOT_SUPPORTED;
}
return ret;
}
void get_version(json& j);
private:
void get_version_gpv2(json& j);
void get_version_server(json& j);
void get_version_server_nd(json& j);
};
void VrComponent::get_version(json& j)
{
if (fby2_get_slot_type(slot_id) == SLOT_TYPE_GPV2) {
return get_version_gpv2(j);
} else {
int ret;
uint8_t server_type = 0xFF;
ret = fby2_get_server_type(slot_id, &server_type);
if (ret) {
syslog(LOG_ERR, "%s, Get server type failed\n", __func__);
}
switch (server_type) {
case SERVER_TYPE_ND:
get_version_server_nd(j);
break;
case SERVER_TYPE_TL:
default:
get_version_server(j);
break;
}
}
}
void VrComponent::get_version_gpv2(json& j)
{
uint8_t buf[32] = {0};
char ver_str[16] = {0};
const map<uint8_t, string> list = {
{FW_3V3_VR, "3V3"},
{FW_0V92, "0V92"}
};
for ( auto& vr:list ) {
try {
server.ready();
if (bic_get_fw_ver(slot_id, vr.first, buf)) {
throw "Error in getting the version of " + vr.second;
}
snprintf(ver_str, sizeof(ver_str), "0x%02x", buf[0]);
j["VERSION"][vr.second]["version"] = std::string(ver_str);
} catch (const string& err) {
if ( err.find("empty") != string::npos )
j["VERSION"] = "not_present";
else
j["VERSION"] = "error_returned";
return;
}
}
}
void VrComponent::get_version_server(json& j)
{
uint8_t buf[32] = {0};
char ver_str[16] = {0};
const map<uint8_t, string> list = {
{FW_PVCCIO_VR, "PVCCIO"},
{FW_PVCCIN_VR, "PVCCIN"},
{FW_PVCCSA_VR, "PVCCSA"},
{FW_DDRAB_VR, "DDRAB"},
{FW_DDRDE_VR, "DDRDE"},
{FW_PVNNPCH_VR, "PVNNPCH"},
{FW_P1V05_VR, "P1V05"}
};
for ( auto& vr:list ) {
try {
server.ready();
if (bic_get_fw_ver(slot_id, vr.first, buf)) {
throw "Error in getting the version of " + vr.second;
}
snprintf(ver_str, sizeof(ver_str), "0x%02x%02x, 0x%02x%02x", buf[0], buf[1], buf[2], buf[3]);
j["VERSION"][vr.second]["version"] = std::string(ver_str);
} catch (const string& err) {
if ( err.find("empty") != string::npos )
j["VERSION"] = "not_present";
else
j["VERSION"] = "error_returned";
return;
}
}
}
void VrComponent::get_version_server_nd(json& j)
{
uint8_t buf[32] = {0};
char ver_str[16] = {0};
char rmng_w_str[4] = {0};
const map<uint8_t, string> list = {
{FW_PVDDCR_CPU_VR, "PVDDCR_CPU"},
{FW_PVDDCR_SOC_VR, "PVDDCR_SOC"},
{FW_PVDDIO_ABCD_VR, "PVDDIO_ABCD"},
{FW_PVDDIO_EFGH_VR, "PVDDIO_EFGH"}
};
for ( auto& vr:list ) {
try {
server.ready();
if (bic_get_fw_ver(slot_id, vr.first, buf)) {
throw "Error in getting the version of " + vr.second;
}
snprintf(ver_str, sizeof(ver_str), "%02x%02x%02x%02x", buf[3], buf[2], buf[1], buf[0]);
snprintf(rmng_w_str, sizeof(rmng_w_str), "%u", buf[4]);
j["VERSION"][vr.second]["version"] = std::string(ver_str);
j["VERSION"][vr.second]["rmng_w"] = std::string(rmng_w_str);
} catch (const string& err) {
if ( err.find("empty") != string::npos )
j["VERSION"] = "not_present";
else
j["VERSION"] = "error_returned";
return;
}
}
}
VrComponent vr1("slot1", "vr", 1);
VrComponent vr2("slot2", "vr", 2);
VrComponent vr3("slot3", "vr", 3);
VrComponent vr4("slot4", "vr", 4);