// Copyright(c) 2018-2020, Intel Corporation
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
/**
* \file metrics_int.h
* \brief fpga metrics utils functions
*/
#ifndef __FPGA_METRICS_INT_H__
#define __FPGA_METRICS_INT_H__
#include "vector.h"
#include "opae/metrics.h"
#include "metrics_metadata.h"
#include "metrics/bmc/bmc.h"
#include "types_int.h"
// Power,Thermal & Performance definations
#define PERF "*perf"
#define PWRMGMT "power_mgmt"
#define THERLGMT "thermal_mgmt"
#define REVISION "revision"
#define PERF_FREEZE "freeze"
#define PERF_ENABLE "enable"
#define PERF_CACHE "cache"
#define PERF_FABRIC "fabric"
#define PERF_IOMMU "iommu"
#define PERFORMANCE "performance"
#define FPGA_LIMIT "fpga_limit"
#define XEON_LIMIT "xeon_limit"
#define TEMP "Centigrade"
#define TEMPERATURE "Temperature"
#define VOLTAGE "Voltage"
#define CURRENT "Current"
#define POWER "Power"
#define CLOCK "Clock"
#define TEMPERATURE_UNITS "Celsius"
#define VOLTAGE_UNITS "Volts"
#define CURRENT_UNITS "Amps"
#define POWER_UNITS "Watts"
#define CLOCK_UNITS "Hz"
#define MAX10_SYSFS_PATH "spi-*/spi_master/spi*/spi*.*"
#define MAX10_SENSOR_SYSFS_PATH "spi-*/spi_master/spi*/spi*.*/sensor*"
#define SENSOR_SYSFS_NAME "name"
#define SENSOR_SYSFS_TYPE "type"
#define SENSOR_SYSFS_ID "id"
#define SENSOR_SYSFS_VALUE "value"
#define MILLI 1000
#define FPGA_DISCRETE_VC_DEVICEID 0x0B30
#define FPGA_DISCRETE_DC_DEVICEID 0x0B2B
#define BMC_LIB "libmodbmc.so"
// AFU DFH Struct
struct DFH {
union {
uint64_t csr;
struct {
uint64_t id:12;
uint64_t revision:4;
uint64_t next_header_offset:24;
uint64_t eol:1;
uint64_t reserved:19;
uint64_t type:4;
};
};
};
struct NEXT_AFU {
union {
uint64_t csr;
struct {
uint32_t next_afu:24;
uint64_t reserved:40;
};
};
};
typedef struct {
struct DFH dfh;
uint64_t guid[2];
struct NEXT_AFU next_afu;
} feature_definition;
// metric group csr
struct metric_bbb_group {
union {
uint64_t csr;
struct {
uint64_t reserved:28;
uint64_t units:8;
uint64_t group_id:8;
uint64_t eol:1;
uint64_t next_group_offset:16;
uint64_t reset:1;
uint64_t reset_access:2;
};
};
};
// metric value csr
struct metric_bbb_value {
union {
uint64_t csr;
struct {
uint64_t reserved:7;
uint64_t eol:1;
uint64_t counter_id:8;
uint64_t value:48;
};
};
};
// Metrics utils functions
fpga_result metric_sysfs_path_is_file(const char *path);
fpga_result metric_sysfs_path_is_dir(const char *path);
fpga_result add_metric_vector(fpga_metric_vector *vector,
uint64_t metric_id,
const char *qualifier_name,
const char *group_name,
const char *group_sysfs,
const char *metric_name,
const char *metric_sysfs,
const char *metric_units,
enum fpga_metric_datatype metric_datatype,
enum fpga_metric_type metric_type,
enum fpga_hw_type hw_type,
uint64_t mmio_offset);
fpga_result enum_thermalmgmt_metrics(fpga_metric_vector *vector,
uint64_t *metric_id,
const char *sysfspath,
enum fpga_hw_type hw_type);
fpga_result enum_powermgmt_metrics(fpga_metric_vector *vector,
uint64_t *metric_id,
const char *sysfspath,
enum fpga_hw_type hw_type);
fpga_result enum_perf_counter_items(fpga_metric_vector *vector,
uint64_t *metric_id,
const char *qualifier_name,
const char *sysfspath,
const char *sysfs_name,
enum fpga_metric_type metric_type,
enum fpga_hw_type hw_type);
fpga_result enum_perf_counter_metrics(fpga_metric_vector *vector,
uint64_t *metric_id,
const char *sysfspath,
enum fpga_hw_type hw_type);
fpga_result enum_fpga_metrics(fpga_handle handle);
fpga_result get_fme_metric_value(fpga_handle handle,
fpga_metric_vector *enum_vector,
uint64_t metric_id,
struct fpga_metric *fpga_metric);
fpga_result add_metric_info(struct _fpga_enum_metric *_enum_metrics,
struct fpga_metric_info *fpga_metric_info);
fpga_result free_fpga_enum_metrics_vector(struct _fpga_handle *_handle);
fpga_result parse_metric_num_name(const char *search_string,
fpga_metric_vector *fpga_enum_metrics_vector,
uint64_t *metric_num);
fpga_result enum_bmc_metrics_info(struct _fpga_handle *_handle,
fpga_metric_vector *vector,
uint64_t *metric_id,
enum fpga_hw_type hw_type);
fpga_result get_fpga_object_type(fpga_handle handle, fpga_objtype *objtype);
fpga_result get_pwr_thermal_value(const char *sysfs_path, uint64_t *value);
fpga_result clear_cached_values(fpga_handle handle);
fpga_result get_performance_counter_value(const char *group_sysfs,
const char *metric_sysfs,
uint64_t *value);
fpga_result get_bmc_metrics_values(fpga_handle handle,
struct _fpga_enum_metric *_fpga_enum_metric,
struct fpga_metric *fpga_metric);
// AFU Metric
fpga_result enum_afu_metrics(fpga_handle handle,
fpga_metric_vector *vector,
uint64_t *metric_id,
uint64_t metrics_offset);
fpga_result get_afu_metric_value(fpga_handle handle,
fpga_metric_vector *enum_vector,
uint64_t metric_num,
struct fpga_metric *fpga_metric);
fpga_result add_afu_metrics_vector(fpga_metric_vector *vector,
uint64_t *metric_id,
uint64_t group_value,
uint64_t metric_value,
uint64_t metric_offset);
fpga_result discover_afu_metrics_feature(fpga_handle handle, uint64_t *offset);
fpga_result get_metric_data_info(const char *group_name,
const char *metric_name,
fpga_metric_metadata *metric_data_search,
uint64_t size,
fpga_metric_metadata *metric_data);
fpga_result xfpga_bmcLoadSDRs(struct _fpga_handle *_handle,
bmc_sdr_handle *records,
uint32_t *num_sensors);
fpga_result xfpga_bmcDestroySDRs(struct _fpga_handle *_handle,
bmc_sdr_handle *records);
fpga_result xfpga_bmcReadSensorValues(struct _fpga_handle *_handle,
bmc_sdr_handle records,
bmc_values_handle *values,
uint32_t *num_values);
fpga_result xfpga_bmcDestroySensorValues(struct _fpga_handle *_handle,
bmc_values_handle *values);
fpga_result xfpga_bmcGetSensorReading(struct _fpga_handle *_handle,
bmc_values_handle values,
uint32_t sensor_number,
uint32_t *is_valid,
double *value);
fpga_result xfpga_bmcGetSDRDetails(struct _fpga_handle *_handle,
bmc_values_handle values,
uint32_t sensor_number,
sdr_details *details);
void *metrics_load_bmc_lib(void);
#endif // __FPGA_METRICS_INT_H__