Blame tools/libboard/board_rc/board_rc.c

Packit 534379
// Copyright(c) 2019-2020, Intel Corporation
Packit 534379
//
Packit 534379
// Redistribution  and  use  in source  and  binary  forms,  with  or  without
Packit 534379
// modification, are permitted provided that the following conditions are met:
Packit 534379
//
Packit 534379
// * Redistributions of  source code  must retain the  above copyright notice,
Packit 534379
//   this list of conditions and the following disclaimer.
Packit 534379
// * Redistributions in binary form must reproduce the above copyright notice,
Packit 534379
//   this list of conditions and the following disclaimer in the documentation
Packit 534379
//   and/or other materials provided with the distribution.
Packit 534379
// * Neither the name  of Intel Corporation  nor the names of its contributors
Packit 534379
//   may be used to  endorse or promote  products derived  from this  software
Packit 534379
//   without specific prior written permission.
Packit 534379
//
Packit 534379
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit 534379
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,  BUT NOT LIMITED TO,  THE
Packit 534379
// IMPLIED WARRANTIES OF  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 534379
// ARE DISCLAIMED.  IN NO EVENT  SHALL THE COPYRIGHT OWNER  OR CONTRIBUTORS BE
Packit 534379
// LIABLE  FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR
Packit 534379
// CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT  NOT LIMITED  TO,  PROCUREMENT  OF
Packit 534379
// SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  DATA, OR PROFITS;  OR BUSINESS
Packit 534379
// INTERRUPTION)  HOWEVER CAUSED  AND ON ANY THEORY  OF LIABILITY,  WHETHER IN
Packit 534379
// CONTRACT,  STRICT LIABILITY,  OR TORT  (INCLUDING NEGLIGENCE  OR OTHERWISE)
Packit 534379
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  EVEN IF ADVISED OF THE
Packit 534379
// POSSIBILITY OF SUCH DAMAGE.
Packit 534379
Packit 534379
#include <glob.h>
Packit 534379
#include <stdio.h>
Packit 534379
#include <errno.h>
Packit 534379
#include <string.h>
Packit 534379
#include <unistd.h>
Packit 534379
#include <sys/stat.h>
Packit 534379
#include <opae/properties.h>
Packit 534379
#include <opae/utils.h>
Packit 534379
#include <opae/fpga.h>
Packit 534379
Packit 534379
#include "board_rc.h"
Packit 534379
Packit 534379
// BMC sysfs path
Packit 534379
#define SYSFS_DEVID_FILE "avmmi-bmc.*.auto/bmc_info/device_id"
Packit 534379
#define SYSFS_RESET_FILE "avmmi-bmc.*.auto/bmc_info/reset_cause"
Packit 534379
#define SYSFS_PWRDN_FILE "avmmi-bmc.*.auto/bmc_info/power_down_cause"
Packit 534379
Packit 534379
#define SYSFS_TCM_GLOB "tcm/*"
Packit 534379
#define SYSFS_TCM_BIP_VER "tcm/bip_version"
Packit 534379
#define SYSFS_TCM_BMC_CANCEL "tcm/bmc_canceled_csks"
Packit 534379
#define SYSFS_TCM_BMC_FLASH_COUNT "tcm/bmc_flash_count"
Packit 534379
#define SYSFS_TCM_BMC_FWVERS "tcm/bmcfw_version"
Packit 534379
#define SYSFS_TCM_BMC_ROOT "tcm/bmc_root_hash"
Packit 534379
#define SYSFS_TCM_CRYPTO_VER "tcm/crypto_version"
Packit 534379
#define SYSFS_TCM_PR_CANCEL "tcm/pr_canceled_csks"
Packit 534379
#define SYSFS_TCM_PR_ROOT "tcm/pr_root_hash"
Packit 534379
#define SYSFS_TCM_QSPI_COUNT "tcm/qspi_flash_count"
Packit 534379
#define SYSFS_TCM_SR_CANCEL "tcm/sr_canceled_csks"
Packit 534379
#define SYSFS_TCM_SR_ROOT "tcm/sr_root_hash"
Packit 534379
#define SYSFS_TCM_FW_VER "tcm/tcmfw_version"
Packit 534379
#define FPGA_STR_SIZE     256
Packit 534379
#define SDR_HEADER_LEN    3
Packit 534379
#define SDR_MSG_LEN       40
Packit 534379
Packit 534379
typedef struct _bmc_powerdown_cause {
Packit 534379
	uint8_t _header[SDR_HEADER_LEN];
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t iana[SDR_HEADER_LEN];
Packit 534379
	uint8_t count;
Packit 534379
	uint8_t message[SDR_MSG_LEN];
Packit 534379
} bmc_powerdown_cause;
Packit 534379
Packit 534379
typedef struct _bmc_reset_cause {
Packit 534379
	uint8_t _header[SDR_HEADER_LEN];
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t iana[SDR_HEADER_LEN];
Packit 534379
	uint8_t reset_cause;
Packit 534379
} bmc_reset_cause;
Packit 534379
Packit 534379
Packit 534379
typedef enum {
Packit 534379
	CHIP_RESET_CAUSE_POR = 0x01,
Packit 534379
	CHIP_RESET_CAUSE_EXTRST = 0x02,
Packit 534379
	CHIP_RESET_CAUSE_BOD_IO = 0x04,
Packit 534379
	CHIP_RESET_CAUSE_WDT = 0x08,
Packit 534379
	CHIP_RESET_CAUSE_OCD = 0x10,
Packit 534379
	CHIP_RESET_CAUSE_SOFT = 0x20,
Packit 534379
	CHIP_RESET_CAUSE_SPIKE = 0x40,
Packit 534379
} bmc_ResetCauses;
Packit 534379
Packit 534379
typedef struct _bmc_device_id {
Packit 534379
	uint8_t _header[SDR_HEADER_LEN];
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t device_id;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t device_revision : 3;
Packit 534379
			uint8_t _unused : 3;
Packit 534379
			uint8_t provides_sdrs : 2;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} device_revision;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t device_available : 7;
Packit 534379
			uint8_t major_fw_revision : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} firmware_revision_1;
Packit 534379
	uint8_t firmware_revision_2;
Packit 534379
	uint8_t ipmi_version;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t sensor_device : 1;
Packit 534379
			uint8_t sdr_repository_device : 1;
Packit 534379
			uint8_t sel_device : 1;
Packit 534379
			uint8_t fru_inventory_device : 1;
Packit 534379
			uint8_t ipmb_event_receiver : 1;
Packit 534379
			uint8_t ipmb_event_generator : 1;
Packit 534379
			uint8_t bridge : 1;
Packit 534379
			uint8_t chassis_device : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} additional_device_support;
Packit 534379
	uint8_t manufacturer_id_0_7;
Packit 534379
	uint8_t manufacturer_id_8_15;
Packit 534379
	uint8_t manufacturer_id_16_23;
Packit 534379
	uint8_t product_id_0_7;
Packit 534379
	uint8_t product_id_8_15;
Packit 534379
	uint8_t aux_fw_rev_0_7;
Packit 534379
	uint8_t aux_fw_rev_8_15;
Packit 534379
	uint8_t aux_fw_rev_16_23;
Packit 534379
	uint8_t aux_fw_rev_24_31;
Packit 534379
} bmc_device_id;
Packit 534379
Packit 534379
Packit 534379
// Read bmc version
Packit 534379
fpga_result read_bmc_version(fpga_token token, int *version)
Packit 534379
{
Packit 534379
	fpga_result res               = FPGA_OK;
Packit 534379
	fpga_result resval            = FPGA_OK;
Packit 534379
	bmc_device_id bmc_dev;
Packit 534379
	fpga_object bmc_object;
Packit 534379
Packit 534379
	if (version == NULL) {
Packit 534379
		OPAE_ERR("Invalid input parameter");
Packit 534379
		return FPGA_INVALID_PARAM;
Packit 534379
	}
Packit 534379
Packit 534379
	res = fpgaTokenGetObject(token, SYSFS_DEVID_FILE, &bmc_object, FPGA_OBJECT_GLOB);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to get token Object");
Packit 534379
		return res;
Packit 534379
	}
Packit 534379
Packit 534379
	memset(&bmc_dev, 0, sizeof(bmc_dev));
Packit 534379
Packit 534379
	res = fpgaObjectRead(bmc_object, (uint8_t *)(&bmc_dev), 0, sizeof(bmc_dev), 0);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Read object ");
Packit 534379
		resval = res;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	*version = bmc_dev.aux_fw_rev_0_7
Packit 534379
		| (bmc_dev.aux_fw_rev_8_15 << 8)
Packit 534379
		| (bmc_dev.aux_fw_rev_16_23 << 16)
Packit 534379
		| (bmc_dev.aux_fw_rev_24_31 << 24);
Packit 534379
Packit 534379
Packit 534379
out_destroy:
Packit 534379
	res = fpgaDestroyObject(&bmc_object);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Destroy Object");
Packit 534379
	}
Packit 534379
Packit 534379
Packit 534379
	return resval;
Packit 534379
}
Packit 534379
Packit 534379
// Read power down cause
Packit 534379
fpga_result read_bmc_pwr_down_cause(fpga_token token, char *pwr_down_cause)
Packit 534379
{
Packit 534379
	fpga_result res               = FPGA_OK;
Packit 534379
	fpga_result resval            = FPGA_OK;
Packit 534379
	fpga_object bmc_object;
Packit 534379
	bmc_powerdown_cause bmc_pd;
Packit 534379
Packit 534379
	if (pwr_down_cause == NULL) {
Packit 534379
		OPAE_ERR("Invalid input parameter");
Packit 534379
		return FPGA_INVALID_PARAM;
Packit 534379
	}
Packit 534379
Packit 534379
	res = fpgaTokenGetObject(token, SYSFS_PWRDN_FILE, &bmc_object, FPGA_OBJECT_GLOB);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to get token Object");
Packit 534379
		return res;
Packit 534379
	}
Packit 534379
Packit 534379
	memset(&bmc_pd, 0, sizeof(bmc_pd));
Packit 534379
Packit 534379
	res = fpgaObjectRead(bmc_object, (uint8_t *)(&bmc_pd), 0, sizeof(bmc_pd), 0);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Read object ");
Packit 534379
		resval = res;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_pd.completion_code == 0) {
Packit 534379
		strncpy(pwr_down_cause, (char *)bmc_pd.message, bmc_pd.count);
Packit 534379
	} else {
Packit 534379
		OPAE_ERR("unavailable read power down cause: %d ", bmc_pd.completion_code);
Packit 534379
		resval = FPGA_EXCEPTION;
Packit 534379
	}
Packit 534379
Packit 534379
Packit 534379
out_destroy:
Packit 534379
	res = fpgaDestroyObject(&bmc_object);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Destroy Object");
Packit 534379
		resval = res;
Packit 534379
	}
Packit 534379
Packit 534379
	return resval;
Packit 534379
}
Packit 534379
Packit 534379
Packit 534379
// Read reset cause
Packit 534379
fpga_result read_bmc_reset_cause(fpga_token token, char *reset_cause_str)
Packit 534379
{
Packit 534379
	fpga_result res              = FPGA_OK;
Packit 534379
	fpga_result resval           = FPGA_OK;
Packit 534379
	fpga_object bmc_object;
Packit 534379
	bmc_reset_cause bmc_rc;
Packit 534379
Packit 534379
	if (reset_cause_str == NULL) {
Packit 534379
		OPAE_ERR("Invalid input parameter");
Packit 534379
		return FPGA_INVALID_PARAM;
Packit 534379
	}
Packit 534379
Packit 534379
	res = fpgaTokenGetObject(token, SYSFS_RESET_FILE, &bmc_object, FPGA_OBJECT_GLOB);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to get token Object");
Packit 534379
		return res;
Packit 534379
	}
Packit 534379
Packit 534379
	memset(&bmc_rc, 0, sizeof(bmc_rc));
Packit 534379
Packit 534379
	res = fpgaObjectRead(bmc_object, (uint8_t *)(&bmc_rc), 0, sizeof(bmc_rc), 0);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Read Object ");
Packit 534379
		resval = res;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.completion_code != 0) {
Packit 534379
		OPAE_ERR("Failed to Read Reset cause \n");
Packit 534379
		resval = FPGA_EXCEPTION;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	if (0 == bmc_rc.reset_cause) {
Packit 534379
		strncpy(reset_cause_str, "None", 5);
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_EXTRST) {
Packit 534379
		strncpy(reset_cause_str, "External reset", 15);
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_BOD_IO) {
Packit 534379
		strncpy(reset_cause_str, "Brown-out detected", 19);
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_OCD) {
Packit 534379
		strncpy(reset_cause_str, "On-chip debug system", 21);
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_POR) {
Packit 534379
		strncpy(reset_cause_str, "Power-on-reset", 15);
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_SOFT) {
Packit 534379
		strncpy(reset_cause_str, "Software reset", 15);
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_SPIKE) {
Packit 534379
		strncpy(reset_cause_str, "Spike detected", 15);
Packit 534379
	}
Packit 534379
Packit 534379
	if (bmc_rc.reset_cause & CHIP_RESET_CAUSE_WDT) {
Packit 534379
		strncpy(reset_cause_str, "Watchdog timeout", 17);
Packit 534379
	}
Packit 534379
Packit 534379
Packit 534379
out_destroy:
Packit 534379
	res = fpgaDestroyObject(&bmc_object);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Destroy Object");
Packit 534379
	}
Packit 534379
Packit 534379
	return resval;
Packit 534379
}
Packit 534379
Packit 534379
// Print BMC version, Power down cause and Reset cause
Packit 534379
fpga_result print_board_info(fpga_token token)
Packit 534379
{
Packit 534379
	fpga_result res                         = FPGA_OK;
Packit 534379
	int version                             = 0;
Packit 534379
	char pwr_down_cause[FPGA_STR_SIZE]      = { 0 };
Packit 534379
	char reset_cause[FPGA_STR_SIZE]         = { 0 };
Packit 534379
	struct stat st;
Packit 534379
	fpga_object bmc_object;
Packit 534379
Packit 534379
Packit 534379
	if (!stat("/sys/bus/pci/drivers/dfl-pci", &st)) {
Packit 534379
		res = fpgaTokenGetObject(token, SYSFS_DEVID_FILE, &bmc_object, FPGA_OBJECT_GLOB);
Packit 534379
		if (res != FPGA_OK) {
Packit 534379
			printf("Board Management Controller, microcontroller FW version: %s\n", "Not Supported");
Packit 534379
			printf("Last Power down cause: %s\n", "Not Supported");
Packit 534379
			printf("Last Reset cause: %s\n", "Not Supported");
Packit 534379
			return res;
Packit 534379
		}
Packit 534379
		res = fpgaDestroyObject(&bmc_object);
Packit 534379
		if (res != FPGA_OK) {
Packit 534379
			OPAE_ERR("Failed to Destroy Object");
Packit 534379
		}
Packit 534379
Packit 534379
	}
Packit 534379
Packit 534379
	res = read_bmc_version(token, &version);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to read BMC FW version");
Packit 534379
	}
Packit 534379
Packit 534379
	res = read_bmc_pwr_down_cause(token, pwr_down_cause);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to read power down cause");
Packit 534379
	}
Packit 534379
Packit 534379
	res = read_bmc_reset_cause(token, reset_cause);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to read reset cause");
Packit 534379
	}
Packit 534379
Packit 534379
	// Print BMC info
Packit 534379
	printf("Board Management Controller, microcontroller FW version: %d\n", version);
Packit 534379
	printf("Last Power down cause:%s\n", pwr_down_cause);
Packit 534379
	printf("Last Reset cause: %s\n", reset_cause);
Packit 534379
Packit 534379
	return res;
Packit 534379
}
Packit 534379
Packit 534379
fpga_result read_sysfs(fpga_token token, char *sysfs_path, char *sysfs_name)
Packit 534379
{
Packit 534379
	fpga_result res                 = FPGA_OK;
Packit 534379
	fpga_result resval              = FPGA_OK;
Packit 534379
	uint32_t size                   = 0;
Packit 534379
	char name[FPGA_STR_SIZE]        = { 0, };
Packit 534379
	fpga_object sec_object;
Packit 534379
	size_t len;
Packit 534379
Packit 534379
	if (sysfs_path == NULL ||
Packit 534379
		sysfs_name == NULL) {
Packit 534379
		OPAE_ERR("Invalid input parameter");
Packit 534379
		return FPGA_INVALID_PARAM;
Packit 534379
	}
Packit 534379
Packit 534379
	res = fpgaTokenGetObject(token, sysfs_path, &sec_object, FPGA_OBJECT_GLOB);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to get token Object");
Packit 534379
		return res;
Packit 534379
	}
Packit 534379
Packit 534379
	res = fpgaObjectGetSize(sec_object, &size, 0);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to get object size ");
Packit 534379
		resval = res;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	if (size > FPGA_STR_SIZE) {
Packit 534379
		OPAE_ERR("object size bigger then buffer size");
Packit 534379
		resval = FPGA_EXCEPTION;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	res = fpgaObjectRead(sec_object, (uint8_t *)(&name), 0, size, 0);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Read object ");
Packit 534379
		resval = res;
Packit 534379
		goto out_destroy;
Packit 534379
	}
Packit 534379
Packit 534379
	len = strnlen(name, FPGA_STR_SIZE - 1);
Packit 534379
	strncpy(sysfs_name, name, len + 1);
Packit 534379
Packit 534379
out_destroy:
Packit 534379
	res = fpgaDestroyObject(&sec_object);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_ERR("Failed to Destroy Object");
Packit 534379
		resval = res;
Packit 534379
	}
Packit 534379
Packit 534379
	return resval;
Packit 534379
}
Packit 534379
Packit 534379
Packit 534379
fpga_result print_sec_info(fpga_token token)
Packit 534379
{
Packit 534379
	fpga_result res = FPGA_OK;
Packit 534379
	fpga_object tcm_object;
Packit 534379
	char name[FPGA_STR_SIZE] = { 0 };
Packit 534379
Packit 534379
	res = fpgaTokenGetObject(token, SYSFS_TCM_GLOB, &tcm_object, FPGA_OBJECT_GLOB);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_MSG("Failed to get token Object");
Packit 534379
		return res;
Packit 534379
	}
Packit 534379
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_BMC_FWVERS, name) == FPGA_OK)
Packit 534379
		printf("BMC FW Version: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read BMC FW Version");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_BIP_VER, name) == FPGA_OK)
Packit 534379
		printf("BIP Version: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read BIP Version");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_FW_VER, name) == FPGA_OK)
Packit 534379
		printf("TCM FW Version: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read TCM FW Version");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_CRYPTO_VER, name) == FPGA_OK)
Packit 534379
		printf("Crypto block Version: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read Crypto block Version");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_SR_ROOT, name) == FPGA_OK)
Packit 534379
		printf("FIM root entry hash: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read FIM root entry hash");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_BMC_ROOT, name) == FPGA_OK)
Packit 534379
		printf("BMC root entry hash: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read TCM BMC root entry hash");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_PR_ROOT, name) == FPGA_OK)
Packit 534379
		printf("PR root entry hash: %s", name);
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_BMC_FLASH_COUNT, name) == FPGA_OK)
Packit 534379
		printf("BMC flash update counter: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read BMC flash update counter");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_QSPI_COUNT, name) == FPGA_OK)
Packit 534379
		printf("User flash update counter: %s", name);
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read User flash update counter");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_SR_CANCEL, name) == FPGA_OK)
Packit 534379
		printf("FIM CSK IDs canceled : %s", strlen(name) > 1 ? name : "None\n");
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read FIM CSK IDs canceled");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_BMC_CANCEL, name) == FPGA_OK)
Packit 534379
		printf("BMC CSK IDs canceled: %s", strlen(name) > 1 ? name : "None\n");
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read BMC CSK IDs canceled");
Packit 534379
Packit 534379
	memset(name, 0, sizeof(name));
Packit 534379
	if (read_sysfs(token, SYSFS_TCM_PR_CANCEL, name) == FPGA_OK)
Packit 534379
		printf("AFU CSK IDs canceled: %s", strlen(name) > 1 ? name : "None\n");
Packit 534379
	else
Packit 534379
		OPAE_MSG("Failed to Read AFU CSK IDs canceled");
Packit 534379
Packit 534379
	res = fpgaDestroyObject(&tcm_object);
Packit 534379
	if (res != FPGA_OK) {
Packit 534379
		OPAE_MSG("Failed to Destroy Object");
Packit 534379
	}
Packit 534379
Packit 534379
	return res;
Packit 534379
}