meta-facebook/meta-grandcanyon/recipes-grandcanyon/plat-libs/files/pal/pal.h (381 lines of code) (raw):
/*
*
* Copyright 2015-present Facebook. All Rights Reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __PAL_H__
#define __PAL_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <openbmc/obmc-pal.h>
#include <openbmc/kv.h>
#include <openbmc/ncsi.h>
#include <openbmc/nl-wrapper.h>
#include <openbmc/phymem.h>
#include <openbmc/nvme-mi.h>
#include <facebook/fbgc_common.h>
#include <facebook/fbgc_fruid.h>
#include <facebook/bic.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include "pal_sensors.h"
#include "pal_power.h"
#define MAX_NUM_FRUS (FRU_CNT-1)
#define MAX_NODES 1
#define FRUID_SIZE 512
#define CUSTOM_FRU_LIST 1
#define FRU_DEVICE_LIST 1
#define MAX_FRU_CMD_STR 16
#define OFFSET_SYS_GUID 0x17F0
#define OFFSET_DEV_GUID 0x1800
// ADS1015
#define IOCM_ADS1015_DRIVER_BIND_NAME "ti_ads1015"
#define IOCM_ADS1015_DRIVER_NAME "ads1015"
#define IOCM_ADS1015_BIND_DIR "/sys/bus/i2c/drivers/ads1015/13-0049/"
#define IOCM_ADS1015_ADDR (0x49)
// LTC2990
#define IOCM_LTC2990_DRIVER_NAME "ltc2990"
#define IOCM_LTC2990_BIND_DIR "/sys/bus/i2c/drivers/ltc2990/13-004c/"
#define IOCM_LTC2990_ADDR (0x4c)
// IOCM TMP75
#define IOCM_TMP75_BIND_DIR "/sys/bus/i2c/drivers/lm75/13-004a"
#define IOCM_TMP75_DRIVER_NAME "lm75"
#define IOCM_TMP75_ADDR (0x4a)
// IOCM EEPROM
#define IOCM_EEPROM_BIND_DIR "/sys/bus/i2c/drivers/at24/13-0050"
#define IOCM_EEPROM_DRIVER_NAME "at24"
#define IOCM_EEPROM_ADDR (0x50)
#define MAX_NUM_OF_BOARD_REV_ID_GPIO 3
#define MAX_NUM_ERR_CODES 256
#define MAX_NUM_EXP_ERR_CODES 100
#define MAX_NUM_ERR_CODES_ARRAY 32
#define MAX_NUM_EXP_ERR_CODES_ARRAY 13
#define BMC_ERR_CODE_START_NUM 0xCE
#define ERR_CODE_BIN "/tmp/error_code.bin"
#define ERR_CODE_ENABLE 1
#define ERR_CODE_DISABLE 0
#define ERR_CODE_CPU_UTILIZA 0xCE
#define ERR_CODE_MEM_UTILIZA 0xCF
#define ERR_CODE_ECC_RECOVERABLE 0xE0
#define ERR_CODE_ECC_UNRECOVERABLE 0xE1
// For FRUs missing error code
#define ERR_CODE_SERVER_MISSING 0xE2
#define ERR_CODE_SCC_MISSING 0xE3
#define ERR_CODE_NIC_MISSING 0xE4
#define ERR_CODE_E1S_MISSING 0xE5
#define ERR_CODE_IOCM_MISSING 0xE6
// For I2C bus crash error code
#define MAX_NUM_I2C_BUS 16
#define ERR_CODE_I2C_CRASH_BASE 0xE7
// For BMC health error code
#define ERR_CODE_SERVER_HEALTH 0xF7
#define ERR_CODE_UIC_HEALTH 0xF8
#define ERR_CODE_DPB_HEALTH 0xF9
#define ERR_CODE_SCC_HEALTH 0xFA
#define ERR_CODE_NIC_HEALTH 0xFB
#define ERR_CODE_BMC_REMOTE_HB_HEALTH 0xFC
#define ERR_CODE_SCC_LOCAL_HB_HEALTH 0xFD
#define ERR_CODE_SCC_REMOTE_HB_HEALTH 0xFE
#define ERR_CODE_BIC_HB_HEALTH 0xFF
// Host Interface Control Register
#define LPC_CTR_BASE 0x1E789000
#define HICR9_ADDR 0x098
#define HICRA_ADDR 0x09C
// System Control Unit (SCU) Register
#define SCU_BASE 0x1E6E2000
#define REG_SCU014 0x14
#define REG_SCU074 0x74
#define OFFSET_SRST_EVENT_LOG (1 << 0)
#define OFFSET_BMC_REV_ID (16)
// Boot magic
#define SRAM_BMC_REBOOT_BASE 0x10015000
#define BOOT_MAGIC_OFFSET 0xC08
#define BOOT_MAGIC 0xFB420054
#define ROUTE_UART2_TO_IO2 (0)
#define ROUTE_UART6_TO_IO6 ((1 << 9) | (1 << 11))
#define ROUTE_IO2_TO_IO6 ((1 << 9) | (1 << 10))
#define ROUTE_IO6_TO_IO2 ((1 << 3) | (1 << 4) | (1 << 5))
#define NVME_SMART_WARNING_MASK 0x1F // check bit 0~4
#define NVME_STATUS_MASK 0x28 // check bit 3, 5
#define NVME_STATUS_NORMAL 0x28 // bit3 = 1, bit5 = 1
#define MAX_SERIAL_NUM_SIZE 20
#define SERVER_CRASHDUMP_PID_PATH "/var/run/autodump.pid"
#define SERVER_CRASHDUMP_KV_KEY "server_crashdump"
#define CRASHDUMP_BIN "/usr/bin/crashdump/autodump.sh"
#define STR_VALUE_0 "0"
#define STR_VALUE_1 "1"
#define MAX_PLATFORM_NAME_SIZE 16
#define PLATFORM_NAME "Grand Canyon"
#define WWID_SIZE (8)
#define WWID_OFFSET (0x400)
#define MAX_FPGA_VER_LEN 4
#define GET_FPGA_VER_ADDR 0x40
#define GET_FPGA_VER_OFFSET (0x28002000)
#define E1S_IOCM_SLOT_NUM 2
#define BIOS_POST_CMPLT 67
#define ERROR_ID_LOG_LEN 16
#define HEARTBEAT_NORMAL 1
#define HEARTBEAT_ABNORMAL 0
typedef enum {
STATUS_LED_OFF,
STATUS_LED_YELLOW,
STATUS_LED_BLUE,
} status_led_color;
typedef enum {
ID_E1S0_LED,
ID_E1S1_LED,
} e1s_led_id;
extern const char pal_fru_list_print[];
extern const char pal_fru_list_rw[];
extern const char pal_fru_list_sensor_history[];
extern const char pal_fru_list[];
extern const char pal_pwm_list[];
extern const char pal_dev_pwr_list[];
extern const char pal_dev_pwr_option_list[];
extern const char pal_tach_list[];
extern const char pal_server_list[];
extern size_t pal_pwm_cnt;
extern size_t pal_tach_cnt;
enum {
BOOT_DEVICE_IPV4 = 0x1,
BOOT_DEVICE_HDD = 0x2,
BOOT_DEVICE_CDROM = 0x3,
BOOT_DEVICE_OTHERS = 0x4,
BOOT_DEVICE_IPV6 = 0x9,
BOOT_DEVICE_RESERVED = 0xff,
};
enum {
FRU_ABSENT = 0,
FRU_PRESENT,
};
enum {
PCIE_CONFIG_TYPE5 = 0x6,
PCIE_CONFIG_TYPE7 = 0x8,
};
//Server board Discrete/SEL Sensors
enum {
BIC_SENSOR_VRHOT = 0xB4,
BIC_SENSOR_SYSTEM_STATUS = 0x46,
BIC_SENSOR_PROC_FAIL = 0x65,
};
enum {
SCC_DRAWER = 0x00,
};
enum {
SEL_SNR_TYPE = 10,
SEL_SNR_NUM = 11,
SEL_EVENT_TYPE = 12,
SEL_EVENT_DATA = 13,
};
//Event/Reading Type Code Ranges, reference from IPMI spec v2.0 sec 42 Sensor and Event Code Tables
enum {
GENERIC = 0x05,
SENSOR_SPECIFIC = 0x6F,
};
//Sensor Type Codes
enum {
PHYSICAL_SECURITY = 0x05,
};
//Sensor-specific Offset of Physical Security
enum {
GENERAL_CHASSIS_INTRUSION = 0x00,
};
//System status event
enum {
SYS_THERM_TRIP = 0x00,
SYS_FIVR_FAULT = 0x01,
SYS_SURGE_CURR = 0x02,
SYS_PCH_PROCHOT = 0x03,
SYS_UV_DETECT = 0x04,
SYS_OC_DETECT = 0x05,
SYS_OCP_FAULT_WARN = 0x06,
SYS_FW_TRIGGER = 0x07,
SYS_HSC_FAULT = 0x08,
SYS_RSVD = 0x09,
SYS_VR_WDT_TIMEOUT = 0x0A,
SYS_M2_VPP = 0x0B,
SYS_M2_PGOOD = 0x0C,
SYS_VCCIO_FAULT = 0x0D,
SYS_SMI_STUCK_LOW = 0x0E,
SYS_OV_DETECT = 0x0F,
};
enum {
NIC_PE_RST_LOW = 0x00,
NIC_PE_RST_HIGH = 0x01,
};
// BMC hardware revision ID
enum {
ASPEED_A0 = 0x0,
ASPEED_A1 = 0x1,
ASPEED_A2 = 0x2,
ASPEED_A3 = 0x3
};
// BIC mode
enum {
BIC_MODE_NORMAL = 0x01,
BIC_MODE_UPDATE = 0x0F,
};
typedef struct {
uint8_t pcie_cfg;
uint8_t completion_code;
} get_pcie_config_response;
typedef struct {
uint8_t target;
uint8_t data[MAX(MAX_IPMB_REQ_LEN, sizeof(NCSI_NL_MSG_T))];
} bypass_cmd;
typedef struct {
uint8_t netdev;
uint8_t channel;
uint8_t cmd;
unsigned char data[NCSI_MAX_PAYLOAD];
} bypass_ncsi_req;
typedef struct {
uint8_t payload_id;
uint8_t netfn;
uint8_t cmd;
uint8_t target;
uint8_t bypass_netfn;
uint8_t bypass_cmd;
} bypass_ipmi_header;
typedef struct {
uint8_t payload_id;
uint8_t netfn;
uint8_t cmd;
uint8_t target;
} bypass_me_header;
typedef struct {
uint8_t cc;
} bypass_me_resp_header;
typedef struct {
uint8_t payload_id;
uint8_t netfn;
uint8_t cmd;
uint8_t target;
uint8_t netdev;
uint8_t channel;
uint8_t ncsi_cmd;
} bypass_ncsi_header;
typedef struct {
uint8_t netdev;
uint8_t action;
} network_cmd;
typedef struct {
uint8_t payload_id;
uint8_t netfn;
uint8_t cmd;
uint8_t target;
uint8_t netdev;
uint8_t action;
} bypass_network_header;
typedef struct {
uint8_t component;
uint8_t status;
} ioc_fw_recovery_req;
typedef struct {
uint8_t component;
uint8_t wwid[WWID_SIZE];
} ioc_wwid_req;
typedef struct {
uint8_t exp_uart_bridging_cmd_code;
uint8_t exp_uart_bridging_mode;
} exp_uart_bridging_cmd;
typedef struct {
uint8_t err_id;
char *err_desc;
} PCIE_ERR_DECODE;
enum {
UIC_SIDEA = 1,
UIC_SIDEB = 2,
};
enum {
PLAT_INFO_SKUID_TYPE5A = 2,
PLAT_INFO_SKUID_TYPE5B = 3,
PLAT_INFO_SKUID_TYPE7_HEADNODE = 4,
};
enum {
DEBUG_UART_SEL_BMC = 0xE0,
DEBUG_UART_SEL_HOST = 0xE1,
DEBUG_UART_SEL_BIC = 0xE2,
DEBUG_UART_SEL_EXP_SMART = 0xE3,
DEBUG_UART_SEL_EXP_SDB = 0xE4,
DEBUG_UART_SEL_IOC_T5_SMART = 0xE5,
DEBUG_UART_SEL_IOC_T7_SMART = 0xE6,
};
enum {
CHASSIS_IN = 0,
CHASSIS_OUT = 1,
};
enum IOC_RECOVERY_COMPONENT {
IOC_RECOVERY_SCC = 0x0,
IOC_RECOVERY_IOCM = 0x1,
};
enum IOC_RECOVERY_STATUS {
DISABLE_IOC_RECOVERY = 0x0,
ENABLE_IOC_RECOVERY = 0x1,
};
enum {
EVENT_ASSERT = 0,
EVENT_DEASSERT,
};
enum {
DUAL_FAN_CNT = 0x08,
SINGLE_FAN_CNT = 0x04,
UNKNOWN_FAN_CNT = 0x00,
};
enum {
HEARTBEAT_BIC = 1,
HEARTBEAT_REMOTE_BMC = 3,
HEARTBEAT_LOCAL_SCC = 4,
HEARTBEAT_REMOTE_SCC = 5,
};
enum IOC_WWID_COMPONENT {
SCC_IOC_WWID = 0x0,
IOCM_IOC_WWID = 0x1,
};
enum exp_uart_bridging_status {
DISABLE_BRIDGING = 0x0,
ENABLE_BRIDGING = 0x1,
};
enum DEV_ACTION {
GET_DEV_POWER = 0x0,
SET_DEV_POWER = 0x1,
GET_DEV_LED = 0x2,
SET_DEV_LED = 0x3,
GET_DEV_PRESENT = 0x4,
};
enum DEV_LED_STATUS {
DEV_LED_OFF = 0x0,
DEV_LED_ON = 0x1,
DEV_LED_BLINKING = 0x2,
};
int pal_set_id_led(uint8_t slot, enum LED_HIGH_ACTIVE status);
int pal_set_status_led(uint8_t fru, status_led_color color);
int pal_set_e1s_led(uint8_t fru, e1s_led_id id, enum LED_HIGH_ACTIVE status);
int pal_sensor_sdr_init(uint8_t fru, sensor_info_t *sinfo);
int pal_check_gpio_prsnt(uint8_t gpio, int presnt_expect);
int pal_add_i2c_device(uint8_t bus, uint8_t addr, char *device_name);
int pal_del_i2c_device(uint8_t bus, uint8_t addr);
int pal_bind_i2c_device(uint8_t bus, uint8_t addr, char *driver_name, char *bind_dir);
int pal_unbind_i2c_device(uint8_t bus, uint8_t addr, char *driver_name, char *bind_dir);
int pal_get_sku(platformInformation *pal_sku);
int pal_get_uic_location(uint8_t *uic_id);
int pal_copy_eeprom_to_bin(const char *eeprom_file, const char *bin_file);
int pal_get_debug_card_uart_sel(uint8_t *uart_sel);
int pal_is_debug_card_present(uint8_t *status);
int pal_get_fan_latch(uint8_t *chassis_status);
void pal_specific_plat_fan_check(bool status);
int pal_get_uic_board_id(uint8_t *board_id);
int pal_post_display(uint8_t status);
int pal_get_current_led_post_code(uint8_t *post_code);
int pal_get_80port_record(uint8_t slot_id, uint8_t *res_data, size_t max_len, size_t *res_len);
int pal_get_num_slots(uint8_t *num);
int pal_write_error_code_file(unsigned char error_code_update, uint8_t error_code_status);
int pal_read_error_code_file(uint8_t *error_code_array, uint8_t error_code_array_len);
int pal_get_error_code(uint8_t *data, uint8_t* error_count);
void pal_set_error_code(unsigned char error_num, uint8_t error_code_status);
int pal_bmc_err_enable(const char *error_item);
int pal_bmc_err_disable(const char *error_item);
void pal_i2c_crash_assert_handle(int i2c_bus_num);
void pal_i2c_crash_deassert_handle(int i2c_bus_num);
int pal_get_drive_health(const char* i2c_bus_dev);
int pal_get_drive_status(const char* i2c_bus_dev);
int pal_is_crashdump_ongoing(uint8_t fru);
int pal_sel_handler(uint8_t fru, uint8_t snr_num, uint8_t *event_data);
int pal_get_tach_cnt();
bool pal_is_heartbeat_ok(uint8_t component);
int pal_handle_oem_1s_intr(uint8_t fru, uint8_t *data);
int pal_handle_oem_1s_asd_msg_in(uint8_t fru, uint8_t *data, uint8_t data_len);
int pal_set_nic_perst(uint8_t val);
bool pal_is_ioc_ready(uint8_t i2c_bus);
int pal_check_fru_is_valid(const char* fruid_path);
int pal_get_cached_value(char *key, char *value);
int pal_set_cached_value(char *key, char *value);
int pal_get_fpga_ver_cache(uint8_t bus, uint8_t addr, char *ver_str);
int pal_set_fpga_ver_cache(uint8_t bus, uint8_t addr);
int pal_clear_event_only_error_ack();
int pal_check_server_power_change_correct(uint8_t action);
int pal_get_fanfru_serial_num(int fan_id, uint8_t *serial_num, uint8_t serial_len);
int pal_get_sysfw_ver_from_bic(uint8_t slot, uint8_t *ver);
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* __PAL_H__ */