meta-facebook/meta-fby3/recipes-fby3/plat-utils/files/bic-util/bic-util.c (1,383 lines of code) (raw):
/*
* bic-util
*
* 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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>
#include <stdint.h>
#include <pthread.h>
#include <ctype.h>
#include <facebook/bic.h>
#include <openbmc/ipmi.h>
#include <openbmc/pal.h>
#include <facebook/fby3_common.h>
#include <facebook/fby3_gpio.h>
#include <sys/time.h>
#include <time.h>
static uint8_t bmc_location = 0xff;
static uint8_t riser_board = UNKNOWN_BOARD;
static uint8_t expFru = 0xff;
const static char *intf_name[4] = {"Server Board", "Front Expansion Board", "Riser Expansion Board", "Baseboard"};
const uint8_t intf_size = 4;
static const uint8_t gpio_sb_usbhub[] = {GPIO_RST_USB_HUB};
static const uint8_t gpio_cwc_usbhub[] = {CWC_GPIO_RST_USB_HUB};
static const uint8_t gpio_gpv3_usbhub[] = {GPV3_GPIO_RST_USB_HUB1, GPV3_GPIO_RST_USB_HUB2, GPV3_GPIO_RST_USB_HUB3};
static const uint8_t gpio_cwc_usbmux[] = {CWC_GPIO_USB_MUX};
static const char *option_list[] = {
"--get_gpio",
"--set_gpio [gpio_num] [value]",
"--get_gpio_config",
"--set_gpio_config $gpio_num $value",
"--check_status",
"--get_dev_id",
"--reset",
"--get_post_code",
"--get_sdr",
"--read_sensor",
"--perf_test [loop_count] (0 to run forever)",
"--clear_cmos",
"--file [path]",
"--check_usb_port [sb|1ou|2ou]",
"--get_board_revision 1ou",
};
static const char *class2_options[] = {
"--get_slot_id",
"--set_usb_hub [0|1|2|all] [on|off|reset|to-bmc|to-usbc]",
"--get_usb_hub [0|1|2|all]",
"--get_pci_link",
};
static void
print_usage_help(void) {
int i;
if (riser_board == UNKNOWN_BOARD) {
pal_get_2ou_board_type(FRU_SLOT1, &riser_board);
}
printf("Usage: bic-util <%s> <[0..n]data_bytes_to_send>\n", slot_usage);
if ( riser_board == CWC_MCHP_BOARD ) {
printf("Usage: bic-util <slot1-2U-exp|slot1-2U-top|slot1-2U-bot> <[0..n]data_bytes_to_send>\n");
}
printf("Usage: bic-util <%s> <option>\n", slot_usage);
if ( riser_board == CWC_MCHP_BOARD ) {
printf("Usage: bic-util <slot1-2U-exp|slot1-2U-top|slot1-2U-bot> <--reset|--get_gpio|--set_gpio|--get_dev_id|--set_usb_hub|--get_usb_hub>\n");
} else {
printf("Usage: bic-util <slot1-2U|slot3-2U> <--reset|--get_gpio|--set_gpio|--get_gpio_config|--set_gpio_config|--get_dev_id>\n");
}
printf(" option:\n");
for (i = 0; i < sizeof(option_list)/sizeof(option_list[0]); i++)
printf(" %s\n", option_list[i]);
if ( riser_board == CWC_MCHP_BOARD || riser_board == GPV3_MCHP_BOARD ) {
for (i = 0; i < sizeof(class2_options)/sizeof(class2_options[0]); i++) {
printf(" %s\n", class2_options[i]);
}
}
}
static int
util_check_exp_status(uint8_t exp) {
uint8_t status = 0, intf = 0;
int ret = 0;
switch (exp) {
case FRU_CWC:
intf = REXP_BIC_INTF;
break;
case FRU_2U_TOP:
intf = RREXP_BIC_INTF1;
break;
case FRU_2U_BOT:
intf = RREXP_BIC_INTF2;
break;
default:
printf("Unknown exp fru : %d\n", exp);
return -1;
}
ret = pal_is_fru_prsnt(exp, &status);
if (ret < 0) {
printf("unable to check fru presence\n");
} else {
if (status == 1) {
ret = pal_get_exp_power(exp, &status);
} else {
printf("Fru is empty, unable to check BIC status\n");
return -1;
}
}
if (ret < 0) {
printf("unable to check fru power\n");
} else {
if (status == SERVER_12V_ON) {
if ( is_bic_ready(exp, intf) == BIC_STATUS_SUCCESS ) {
printf("BIC status ok\n");
ret = 0;
} else {
printf("Error: BIC not ready\n");
ret = -1;
}
} else {
printf("Fru is 12V-off, unable to check BIC status\n");
ret = -1;
}
}
return ret;
}
// Check BIC status
static int
util_check_status(uint8_t slot_id) {
int ret = 0;
uint8_t status;
if (slot_id == FRU_SLOT1 &&
(expFru == FRU_CWC || expFru == FRU_2U_TOP || expFru == FRU_2U_BOT)) {
return util_check_exp_status(expFru);
}
// BIC status is only valid if 12V-on. check this first
ret = pal_get_server_12v_power(slot_id, &status);
if ( (ret < 0) || (SERVER_12V_OFF == status) ) {
ret = pal_is_fru_prsnt(slot_id, &status);
if (ret < 0) {
printf("unable to check BIC status\n");
return ret;
}
if (status == 0) {
printf("Slot is empty, unable to check BIC status\n");
} else {
printf("Slot is 12V-off, unable to check BIC status\n");
}
ret = 0;
} else {
if ( is_bic_ready(slot_id, NONE_INTF) == BIC_STATUS_SUCCESS ) {
printf("BIC status ok\n");
ret = 0;
} else {
printf("Error: BIC not ready\n");
ret = -1;
}
}
return ret;
}
// Test to Get device ID
static int
util_get_device_id(uint8_t slot_id, uint8_t intf) {
int ret = 0;
ipmi_dev_id_t id = {0};
ret = bic_get_dev_id(slot_id, &id, intf);
if (ret) {
printf("util_get_device_id: bic_get_dev_id returns %d\n", ret);
return ret;
}
// Print response
printf("Device ID: 0x%X\n", id.dev_id);
printf("Device Revision: 0x%X\n", id.dev_rev);
printf("Firmware Revision: 0x%X:0x%X\n", id.fw_rev1, id.fw_rev2);
printf("IPMI Version: 0x%X\n", id.ipmi_ver);
printf("Device Support: 0x%X\n", id.dev_support);
printf("Manufacturer ID: 0x%X:0x%X:0x%X\n", id.mfg_id[2], id.mfg_id[1], id.mfg_id[0]);
printf("Product ID: 0x%X:0x%X\n", id.prod_id[1], id.prod_id[0]);
printf("Aux. FW Rev: 0x%X:0x%X:0x%X:0x%X\n", id.aux_fw_rev[0], id.aux_fw_rev[1],id.aux_fw_rev[2],id.aux_fw_rev[3]);
return ret;
}
// reset BIC
static int
util_bic_reset(uint8_t slot_id, uint8_t intf) {
int ret = 0;
ret = bic_reset(slot_id, intf);
printf("Performing BIC reset, status %d\n", ret);
return ret;
}
static int
util_is_numeric(char **argv) {
int j = 0;
int len = 0;
for (int i = 0; i < 2; i++) { //check netFn cmd
len = strlen(argv[i]);
if (len > 2 && argv[i][0] == '0' && (argv[i][1] == 'x' || argv[i][1] == 'X')) {
j=2;
for (; j < len; j++) {
if (!isxdigit(argv[i][j]))
return 0;
}
} else {
j=0;
for (; j < len; j++) {
if (!isdigit(argv[i][j]))
return 0;
}
}
}
return 1;
}
static int
process_command(uint8_t slot_id, int argc, char **argv, uint8_t intf) {
int i, ret, retry = 2;
uint8_t tbuf[256] = {0x00};
uint8_t rbuf[256] = {0x00};
uint8_t tlen = 0;
uint8_t rlen = 0;
for (i = 0; i < argc; i++) {
tbuf[tlen++] = (uint8_t)strtoul(argv[i], NULL, 0);
}
while (retry >= 0) {
ret = bic_ipmb_send(slot_id, tbuf[0]>>2, tbuf[1], &tbuf[2], tlen-2, rbuf, &rlen, intf);
if (ret == 0)
break;
retry--;
}
if (ret) {
printf("BIC no response!\n");
return ret;
}
for (i = 0; i < rlen; i++) {
if (!(i % 16) && i)
printf("\n");
printf("%02X ", rbuf[i]);
}
printf("\n");
return 0;
}
static int
process_file(uint8_t slot_id, char *path) {
#define MAX_ARG_NUM 64
FILE *fp;
int argc;
char buf[1024];
char *str, *next, *del=" \n";
char *argv[MAX_ARG_NUM] = {NULL};
if (!(fp = fopen(path, "r"))) {
syslog(LOG_WARNING, "Failed to open %s", path);
return -1;
}
while (fgets(buf, sizeof(buf), fp) != NULL) {
str = strtok_r(buf, del, &next);
for (argc = 0; argc < MAX_ARG_NUM && str; argc++, str = strtok_r(NULL, del, &next)) {
if (str[0] == '#')
break;
if (!argc && !strcmp(str, "echo")) {
printf("%s", (*next) ? next : "\n");
break;
}
argv[argc] = str;
}
if (argc <= 1) {
continue;
}
process_command(slot_id, argc, argv, NONE_INTF);
}
fclose(fp);
return 0;
}
#define BIT_VALUE(list, index) \
((((uint8_t*)&list)[index/8]) >> (index % 8)) & 0x1\
static int
util_get_gpio(uint8_t slot_id, uint8_t intf) {
int ret = 0;
uint8_t i;
uint8_t gpio_pin_cnt = fby3_get_gpio_list_size(intf);
char gpio_pin_name[32] = "\0";
bic_gpio_t gpio = {0};
ret = bic_get_gpio(slot_id, &gpio, intf);
if ( ret < 0 ) {
printf("%s() bic_get_gpio returns %d\n", __func__, ret);
return ret;
}
if (expFru == FRU_CWC || expFru == FRU_2U_TOP || expFru == FRU_2U_BOT) {
gpio_pin_cnt = fby3_get_exp_gpio_list_size(expFru);
}
// Print the gpio index, name and value
for (i = 0; i < gpio_pin_cnt; i++) {
if (expFru == FRU_CWC || expFru == FRU_2U_TOP || expFru == FRU_2U_BOT) {
fby3_get_exp_gpio_name(expFru, i, gpio_pin_name);
} else {
fby3_get_gpio_name(slot_id, i, gpio_pin_name, intf);
}
printf("%d %s: %d\n",i , gpio_pin_name, BIT_VALUE(gpio, i));
}
return ret;
}
static int
util_set_gpio(uint8_t slot_id, uint8_t gpio_num, uint8_t gpio_val, uint8_t intf) {
uint8_t gpio_pin_cnt = fby3_get_gpio_list_size(intf);
char gpio_pin_name[32] = "\0";
int ret = -1;
if (expFru == FRU_CWC || expFru == FRU_2U_TOP || expFru == FRU_2U_BOT) {
gpio_pin_cnt = fby3_get_exp_gpio_list_size(expFru);
}
if ( gpio_num > gpio_pin_cnt ) {
printf("slot %d: Invalid GPIO pin number %d\n", slot_id, gpio_num);
return ret;
}
if (expFru == FRU_CWC || expFru == FRU_2U_TOP || expFru == FRU_2U_BOT) {
fby3_get_exp_gpio_name(expFru, gpio_num, gpio_pin_name);
} else {
fby3_get_gpio_name(slot_id, gpio_num, gpio_pin_name, intf);
}
printf("slot %d: setting [%d]%s to %d\n", slot_id, gpio_num, gpio_pin_name, gpio_val);
ret = remote_bic_set_gpio(slot_id, gpio_num, gpio_val, intf);
if (ret < 0) {
printf("%s() bic_set_gpio returns %d\n", __func__, ret);
}
return ret;
}
static int
util_get_gpio_config(uint8_t slot_id, uint8_t intf) {
int ret = 0;
uint8_t i;
uint8_t gpio_pin_cnt = fby3_get_gpio_list_size(intf);
char gpio_pin_name[32] = "\0";
bic_gpio_config_t gpio_config = {0};
// Print the gpio index, name and value
for (i = 0; i < gpio_pin_cnt; i++) {
fby3_get_gpio_name(slot_id, i, gpio_pin_name, intf);
//printf("%d %s: %d\n",i , gpio_pin_name, BIT_VALUE(gpio, i));
if ( intf != NONE_INTF ) {
ret = remote_bic_get_gpio_config(slot_id, i, (uint8_t *)&gpio_config,intf);
} else {
ret = bic_get_gpio_config(slot_id, i, (uint8_t *)&gpio_config);
}
if ( ret < 0 ) {
printf("Failed to get %s config\n\n", gpio_pin_name);
continue;
}
printf("gpio_config for pin#%d (%s):\n", i, gpio_pin_name);
printf("Direction: %s", gpio_config.dir > 0?"Output,":"Input, ");
printf(" Interrupt: %s", gpio_config.ie > 0?"Enabled, ":"Disabled,");
printf(" Trigger: %s", gpio_config.edge?"Level ":"Edge ");
if (gpio_config.trig == 0x0) {
printf("Trigger, Edge: %s\n", "Falling Edge");
} else if (gpio_config.trig == 0x1) {
printf("Trigger, Edge: %s\n", "Rising Edge");
} else if (gpio_config.trig == 0x2) {
printf("Trigger, Edge: %s\n", "Both Edges");
} else {
printf("Trigger, Edge: %s\n", "Reserved");
}
}
return 0;
}
static int
util_set_gpio_config(uint8_t slot_id, uint8_t gpio_num, uint8_t config_val, uint8_t intf) {
int ret = 0;
uint8_t gpio_pin_cnt = fby3_get_gpio_list_size(intf);
char gpio_pin_name[32] = "\0";
if ( gpio_num > gpio_pin_cnt ) {
printf("slot %d: Invalid GPIO pin number %d\n", slot_id, gpio_num);
return ret;
}
fby3_get_gpio_name(slot_id, gpio_num, gpio_pin_name, intf);
printf("slot %d: setting GPIO [%d]%s config to 0x%02x\n", slot_id, gpio_num, gpio_pin_name, config_val);
if ( intf != NONE_INTF ) {
ret = remote_bic_set_gpio_config(slot_id, gpio_num, config_val,intf);
} else {
ret = bic_set_gpio_config(slot_id, gpio_num, config_val);
}
if (ret < 0) {
printf("%s() bic_set_gpio_config returns %d\n", __func__, ret);
}
return 0;
}
static int
util_perf_test(uint8_t slot_id, int loopCount, uint8_t intf) {
#define NUM_SLOTS FRU_SLOT4
enum cmd_profile_type {
CMD_AVG_DURATION = 0x0,
CMD_MIN_DURATION,
CMD_MAX_DURATION,
CMD_NUM_SAMPLES,
CMD_PROFILE_NUM
};
long double cmd_profile[NUM_SLOTS][CMD_PROFILE_NUM] = {0};
int ret = 0;
ipmi_dev_id_t id = {0};
int i = 0;
int index = slot_id -1;
long double elapsedTime = 0;
cmd_profile[index][CMD_MIN_DURATION] = 3000000;
cmd_profile[index][CMD_MAX_DURATION] = 0;
cmd_profile[index][CMD_NUM_SAMPLES] = 0;
cmd_profile[index][CMD_AVG_DURATION] = 0;
printf("bic-util: perf test on slot%d for ", slot_id);
if (loopCount)
printf("%d cycles\n", loopCount);
else
printf("infinite cycles\n");
struct timeval tv1, tv2;
while(1) {
gettimeofday(&tv1, NULL);
ret = bic_get_dev_id(slot_id, &id, intf);
if (ret) {
printf("util_perf_test: bic_get_dev_id returns %d, loop=%d\n", ret, i);
return ret;
}
gettimeofday(&tv2, NULL);
elapsedTime = (((long double)(tv2.tv_usec - tv1.tv_usec) / 1000000 +
(long double)(tv2.tv_sec - tv1.tv_sec)) * 1000000);
cmd_profile[index][CMD_AVG_DURATION] += elapsedTime;
cmd_profile[index][CMD_NUM_SAMPLES] += 1;
if (cmd_profile[index][CMD_MAX_DURATION] < elapsedTime)
cmd_profile[index][CMD_MAX_DURATION] = elapsedTime;
if (cmd_profile[index][CMD_MIN_DURATION] > elapsedTime && elapsedTime > 0)
cmd_profile[index][CMD_MIN_DURATION] = elapsedTime;
++i;
if ((i & 0xfff) == 0) {
printf("slot%d stats: loop %d num cmds=%d, avg duration(us)=%d, min duration(us)=%d, max duration(us)=%d\n",
slot_id, i,
(int)cmd_profile[index][CMD_NUM_SAMPLES],
(int)(cmd_profile[index][CMD_AVG_DURATION]/cmd_profile[index][CMD_NUM_SAMPLES]),
(int)cmd_profile[index][CMD_MIN_DURATION],
(int)cmd_profile[index][CMD_MAX_DURATION]
);
}
if (loopCount != 0 && i==loopCount) {
printf("slot%d stats after loop %d\n num cmds=%d, avg duration(us)=%d, min duration(us)=%d, max duration(us)=%d\n",
slot_id, i,
(int)cmd_profile[index][CMD_NUM_SAMPLES],
(int)(cmd_profile[index][CMD_AVG_DURATION]/cmd_profile[index][CMD_NUM_SAMPLES]),
(int)cmd_profile[index][CMD_MIN_DURATION],
(int)cmd_profile[index][CMD_MAX_DURATION]
);
break;
}
}
return ret;
}
static int
util_read_sensor(uint8_t slot_id) {
int ret = 0;
int i = 0;
ipmi_sensor_reading_t sensor = {0};
uint8_t intf_list[4] = {NONE_INTF};
uint8_t intf_index = 0;
uint8_t config_status = 0xff;
uint8_t type_2ou = UNKNOWN_BOARD;
ret = bic_is_m2_exp_prsnt(slot_id);
if ( ret < 0 ) {
printf("%s() Couldn't get the status of 1OU/2OU\n", __func__);
return -1;
}
config_status = (uint8_t) ret;
if ( (config_status & PRESENT_1OU) == PRESENT_1OU && (bmc_location != NIC_BMC) ) {
intf_list[1] = FEXP_BIC_INTF;
} else if ( (config_status & PRESENT_2OU) == PRESENT_2OU ) {
if ( fby3_common_get_2ou_board_type(slot_id, &type_2ou) < 0) {
printf("%s() Couldn't get 2OU board type\n", __func__);
return -1;
}
switch (type_2ou) {
case DP_RISER_BOARD:
break;
default:
intf_list[2] = REXP_BIC_INTF;
break;
}
}
if ( bmc_location == NIC_BMC ) {
intf_list[3] = BB_BIC_INTF;
}
for ( intf_index = 0; intf_index < intf_size; intf_index++ ) {
if ( intf_list[intf_index] == 0 ) {
continue;
}
printf("%s:\n", intf_name[intf_index]);
//TODO: If a sensor is not existed, a warning message is logged in /var/log/messages
for (i = 0; i < MAX_SENSOR_NUM; i++) {
ret = bic_get_sensor_reading(slot_id, i, &sensor, intf_list[intf_index]);
if (ret < 0 ) {
continue;
}
printf("sensor num: 0x%02X: value: 0x%02X, flags: 0x%02X, status: 0x%02X, ext_status: 0x%02X\n",
i, sensor.value, sensor.flags, sensor.status, sensor.ext_status);
}
printf("\n");
}
return ret;
}
static int
util_get_sdr(uint8_t slot_id) {
#define LAST_RECORD_ID 0xFFFF
#define BYTES_ENTIRE_RECORD 0xFF
int ret = 0;
uint8_t rlen = 0;
uint8_t rbuf[MAX_IPMB_RES_LEN] = {0};
uint8_t intf_list[4] = {NONE_INTF};
uint8_t intf_index = 0;
uint8_t config_status = 0xff;
uint8_t type_2ou = UNKNOWN_BOARD;
ipmi_sel_sdr_req_t req;
ipmi_sel_sdr_res_t *res = (ipmi_sel_sdr_res_t *) rbuf;
ret = bic_is_m2_exp_prsnt(slot_id);
if ( ret < 0 ) {
printf("%s() Couldn't get the status of 1OU/2OU\n", __func__);
return -1;
}
config_status = (uint8_t) ret;
if ( (config_status & PRESENT_1OU) == PRESENT_1OU && (bmc_location != NIC_BMC) ) {
intf_list[1] = FEXP_BIC_INTF;
} else if ( (config_status & PRESENT_2OU) == PRESENT_2OU ) {
if ( fby3_common_get_2ou_board_type(slot_id, &type_2ou) < 0) {
printf("%s() Couldn't get 2OU board type\n", __func__);
return -1;
}
switch (type_2ou) {
case DP_RISER_BOARD:
break;
default:
intf_list[2] = REXP_BIC_INTF;
break;
}
}
if ( bmc_location == NIC_BMC ) {
intf_list[3] = BB_BIC_INTF;
}
for( intf_index = 0; intf_index < intf_size; intf_index++ ) {
if ( intf_list[intf_index] == 0 ) {
continue;
}
printf("%s:\n", intf_name[intf_index]);
req.rsv_id = 0;
req.rec_id = 0;
req.offset = 0;
req.nbytes = BYTES_ENTIRE_RECORD;
for ( ;req.rec_id != LAST_RECORD_ID; ) {
ret = bic_get_sdr(slot_id, &req, res, &rlen, intf_list[intf_index]);
if (ret) {
printf("util_get_sdr:bic_get_sdr returns %d\n", ret);
continue;
}
sdr_full_t *sdr = (sdr_full_t *)res->data;
printf("type: %d, ", sdr->type);
printf("sensor num: 0x%02X, ", sdr->sensor_num);
printf("type: 0x%02X, ", sdr->sensor_type);
printf("evt_read_type: 0x%02X, ", sdr->evt_read_type);
printf("m_val: 0x%02X, ", sdr->m_val);
printf("m_tol: 0x%02X, ", sdr->m_tolerance);
printf("b_val: 0x%02X, ", sdr->b_val);
printf("b_acc: 0x%02X, ", sdr->b_accuracy);
printf("acc_dir: 0x%02X, ", sdr->accuracy_dir);
printf("rb_exp: 0x%02X,\n", sdr->rb_exp);
req.rec_id = res->next_rec_id;
}
printf("This record is LAST record\n");
printf("\n");
}
return ret;
}
static int
util_get_postcode(uint8_t slot_id) {
int ret = 0;
uint8_t buf[MAX_IPMB_RES_LEN] = {0x0};
uint8_t len = 0;
int i = 0;
ret = bic_get_80port_record(slot_id, buf, &len, NONE_INTF);
if ( ret < 0 ) {
printf("%s: Failed to get POST code of slot%d\n", __func__, slot_id);
return ret;
}
printf("%s: returns %d bytes\n", __func__, len);
for (i = 0; i < len; i++) {
if (!(i % 16) && i)
printf("\n");
printf("%02X ", buf[i]);
}
printf("\n");
return ret;
}
static int
util_bic_clear_cmos(uint8_t slot_id) {
int ret = 0;
uint8_t power_status = 0;
ret = pal_get_server_power(slot_id, &power_status);
if (ret < 0) {
printf("Failed to get server power status\n");
goto out;
} else if (power_status == SERVER_POWER_ON) {
printf("Can't performing CMOS clear while server is powered ON\n");
goto out;
}
ret = bic_clear_cmos(slot_id);
printf("Performing CMOS clear, status %d\n", ret);
ret = pal_set_nic_perst(slot_id, NIC_PE_RST_HIGH);
if (ret < 0) {
printf("Failed to set nic card PERST high\n");
}
out:
return ret;
}
int
bic_comp_init_usb_dev(uint8_t slot_id, usb_dev* udev, char *comp)
{
#define TI_VENDOR_ID_SB 0x1CBE
#define TI_VENDOR_ID_1U 0x1CBF
#define TI_VENDOR_ID_2U 0x1CC0
#define TI_PRODUCT_ID 0x0007
int ret;
int index = 0;
char found = 0;
ssize_t cnt;
uint8_t bmc_location = 0;
uint16_t vendor_id = TI_VENDOR_ID_SB;
int recheck = MAX_CHECK_DEVICE_TIME;
ret = libusb_init(NULL);
if (ret < 0) {
printf("Failed to initialise libusb\n");
goto error_exit;
} else {
printf("Init libusb Successful!\n");
}
if (strcmp("sb", comp) == 0) {
vendor_id = TI_VENDOR_ID_SB;
} else if (strcmp("1ou", comp)== 0) {
vendor_id = TI_VENDOR_ID_1U;
} else if (strcmp("2ou", comp)== 0) {
vendor_id = TI_VENDOR_ID_2U;
}
do {
cnt = libusb_get_device_list(NULL, &udev->devs);
if (cnt < 0) {
printf("There are no USB devices on bus\n");
goto error_exit;
}
index = 0;
while ((udev->dev = udev->devs[index++]) != NULL) {
ret = libusb_get_device_descriptor(udev->dev, &udev->desc);
if ( ret < 0 ) {
printf("Failed to get device descriptor -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
ret = libusb_open(udev->dev,&udev->handle);
if ( ret < 0 ) {
printf("Error opening device -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
if( (vendor_id == udev->desc.idVendor) && (TI_PRODUCT_ID == udev->desc.idProduct) ) {
ret = libusb_get_string_descriptor_ascii(udev->handle, udev->desc.iManufacturer, (unsigned char*) udev->manufacturer, sizeof(udev->manufacturer));
if ( ret < 0 ) {
printf("Error get Manufacturer string descriptor -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
ret = libusb_get_port_numbers(udev->dev, udev->path, sizeof(udev->path));
if (ret < 0) {
printf("Error get port number\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
if ( (bmc_location == BB_BMC) || (bmc_location == DVT_BB_BMC) ) {
if ( udev->path[1] != slot_id) {
continue;
}
}
printf("%04x:%04x (bus %d, device %d)",udev->desc.idVendor, udev->desc.idProduct, libusb_get_bus_number(udev->dev), libusb_get_device_address(udev->dev));
printf(" path: %d", udev->path[0]);
for (index = 1; index < ret; index++) {
printf(".%d", udev->path[index]);
}
printf("\n");
ret = libusb_get_string_descriptor_ascii(udev->handle, udev->desc.iProduct, (unsigned char*) udev->product, sizeof(udev->product));
if ( ret < 0 ) {
printf("Error get Product string descriptor -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
printf("Manufactured : %s\n",udev->manufacturer);
printf("Product : %s\n",udev->product);
printf("----------------------------------------\n");
printf("Device Descriptors:\n");
printf("Vendor ID : %x\n",udev->desc.idVendor);
printf("Product ID : %x\n",udev->desc.idProduct);
printf("Serial Number : %x\n",udev->desc.iSerialNumber);
printf("Size of Device Descriptor : %d\n",udev->desc.bLength);
printf("Type of Descriptor : %d\n",udev->desc.bDescriptorType);
printf("USB Specification Release Number : %d\n",udev->desc.bcdUSB);
printf("Device Release Number : %d\n",udev->desc.bcdDevice);
printf("Device Class : %d\n",udev->desc.bDeviceClass);
printf("Device Sub-Class : %d\n",udev->desc.bDeviceSubClass);
printf("Device Protocol : %d\n",udev->desc.bDeviceProtocol);
printf("Max. Packet Size : %d\n",udev->desc.bMaxPacketSize0);
printf("No. of Configuraions : %d\n",udev->desc.bNumConfigurations);
found = 1;
break;
}
}
if ( found != 1) {
sleep(3);
} else {
break;
}
} while ((--recheck) > 0);
if ( found == 0 ) {
printf("Device NOT found -- exit\n");
libusb_free_device_list(udev->devs,1);
ret = -1;
goto error_exit;
}
ret = libusb_get_configuration(udev->handle, &udev->config);
if ( ret != 0 ) {
printf("Error in libusb_get_configuration -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
printf("Configured value : %d\n", udev->config);
if ( udev->config != 1 ) {
libusb_set_configuration(udev->handle, 1);
if ( ret != 0 ) {
printf("Error in libusb_set_configuration -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
printf("Device is in configured state!\n");
}
libusb_free_device_list(udev->devs, 1);
if(libusb_kernel_driver_active(udev->handle, udev->ci) == 1) {
printf("Kernel Driver Active\n");
if(libusb_detach_kernel_driver(udev->handle, udev->ci) == 0) {
printf("Kernel Driver Detached!");
} else {
printf("Couldn't detach kernel driver -- exit\n");
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
}
ret = libusb_claim_interface(udev->handle, udev->ci);
if ( ret < 0 ) {
printf("Couldn't claim interface -- exit. err:%s\n", libusb_error_name(ret));
libusb_free_device_list(udev->devs,1);
goto error_exit;
}
printf("Claimed Interface: %d, EP addr: 0x%02X\n", udev->ci, udev->epaddr);
active_config(udev->dev, udev->handle);
return 0;
error_exit:
return -1;
}
static int
util_get_board_revision(uint8_t slot_id, char *comp) {
int ret = 0;
int retry = 0;
uint8_t type_1ou = 0;
uint8_t tbuf[5] = {0x9C, 0x9C, 0x00, 0x00, 0x00};
uint8_t rbuf[256] = {0};
uint8_t tlen = 5;
uint8_t rlen = 0;
uint8_t board_rev_id0 = 0, board_rev_id1 = 0, board_rev_id2 = 0;
if (strcmp("1ou", comp) == 0) {
ret = bic_is_m2_exp_prsnt_cache(slot_id);
if ( ret < 0 ) {
printf("Couldn't read bic_is_m2_exp_prsnt_cache\n");
return -1;
}
if ( (ret & PRESENT_1OU) != PRESENT_1OU ) {
printf("1OU board is not present\n");
return -1;
}
if ( bic_get_1ou_type(slot_id, &type_1ou) < 0 || type_1ou != EDSFF_1U ) {
printf("get_board_revision only support in E1S 1OU board, board type %02X (Expected: %02X)\n", type_1ou, EDSFF_1U);
return -1;
}
tbuf[4] = 50; //FW_BOARD_REV_ID0
do {
ret = bic_ipmb_send(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_SINGLE_GPIO_CONFIG, tbuf, tlen, rbuf, &rlen, FEXP_BIC_INTF);
} while (ret && (retry++ <= 3));
if (ret) {
printf("get BOARD_REV_ID0 fail, retry 3 times\n");
return -1;
}
board_rev_id0 = rbuf[3] ? 1 : 0;
printf("BOARD_REV_ID0: %d\n", board_rev_id0);
tbuf[4] = 51; //FW_BOARD_REV_ID1
retry = 0;
do {
ret = bic_ipmb_send(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_SINGLE_GPIO_CONFIG, tbuf, tlen, rbuf, &rlen, FEXP_BIC_INTF);
} while (ret && (retry++ <= 3));
if (ret) {
printf("get BOARD_REV_ID1 fail, retry 3 times\n");
return -1;
}
board_rev_id1 = rbuf[3] ? 1 : 0;
printf("BOARD_REV_ID1: %d\n", board_rev_id1);
tbuf[4] = 73; //FW_BOARD_REV_ID2
retry = 0;
do {
ret = bic_ipmb_send(slot_id, NETFN_OEM_1S_REQ, CMD_OEM_1S_SINGLE_GPIO_CONFIG, tbuf, tlen, rbuf, &rlen, FEXP_BIC_INTF);
} while (ret && (retry++ <= 3));
if (ret) {
printf("get BOARD_REV_ID2 fail, retry 3 times\n");
return -1;
}
board_rev_id2 = rbuf[3] ? 1 : 0;
printf("BOARD_REV_ID2: %d\n", board_rev_id2);
if ( board_rev_id0 && board_rev_id1 ) {
printf("Efuse: Maxim, ");
} else {
printf("Efuse: TI, ");
}
if ( board_rev_id2 ) {
printf("Clock buffer: IDT1 \n");
} else {
printf("Clock buffer: IDT2 \n");
}
}
return 0;
}
static int
util_check_usb_port(uint8_t slot_id, char *comp) {
int ret = -1;
usb_dev bic_udev;
usb_dev* udev = &bic_udev;
int transferlen = 64;
int transferred = 0;
uint8_t tbuf[64] = {0};
int retries = 3;
bic_set_gpio(slot_id, RST_USB_HUB_N, GPIO_HIGH);
udev->ci = 1;
udev->epaddr = 0x1;
// init usb device
ret = bic_comp_init_usb_dev(slot_id, udev, comp);
if (ret < 0) {
return ret;
}
printf("Input test data, USB timeout: 3000ms\n");
while(true)
{
ret = libusb_bulk_transfer(udev->handle, udev->epaddr, tbuf, transferlen, &transferred, 3000);
if(((ret != 0) || (transferlen != transferred))) {
printf("Error in transferring data! err = %d and transferred = %d(expected data length 64)\n",ret ,transferred);
printf("Retry since %s\n", libusb_error_name(ret));
retries--;
if (!retries) {
ret = -1;
break;
}
msleep(100);
} else
break;
}
if (ret != 0) {
printf("Check USB port Failed\n");
} else {
printf("Check USB port Successful\n");
}
bic_set_gpio(slot_id, RST_USB_HUB_N, GPIO_LOW);
printf("\n");
return ret;
}
static int
util_get_slot_id() {
uint8_t index = 0;
if (bic_get_mb_index(&index) != 0) {
return -1;
}
printf("Slot ID = %d\n", index);
return 0;
}
static int
set_single_usb_hub(uint8_t slot, uint8_t nb, uint8_t ctl, uint8_t intf) {
int ret = 0;
if (ctl == 2) { //reset
ret = remote_bic_set_gpio(slot, nb, 0, intf);
if (ret == 0) {
sleep(3); //for usb devices to be released
ret = remote_bic_set_gpio(slot, nb, 1, intf);
}
} else if (ctl == 0 || ctl == 1) {
ret = remote_bic_set_gpio(slot, nb, ctl, intf);
} else {
return -1;
}
return ret;
}
static int
set_usb_hub_mux(uint8_t slot, uint8_t nb, uint8_t ctl, uint8_t intf) {
uint8_t mux = 0;
if (ctl == 10) { //to bmc
mux = 0;
} else if (ctl == 11) { //to usb c
mux = 1;
} else {
return -1;
}
return remote_bic_set_gpio(slot, nb, mux, intf);
}
static int
util_set_usb_hub(uint8_t hub, uint8_t on_off, uint8_t fru, uint8_t intf) {
int ret = 0;
switch (fru) {
case FRU_CWC:
if (hub == 0xff || hub == 0) {
if (on_off == 10 || on_off == 11) {
ret = set_usb_hub_mux(FRU_SLOT1, gpio_cwc_usbmux[0], on_off, intf);
} else {
ret = set_single_usb_hub(FRU_SLOT1, gpio_cwc_usbhub[0], on_off, intf);
}
} else {
printf("Wrong usb hub number!\n");
return -1;
}
break;
case FRU_2U_TOP:
case FRU_2U_BOT:
if (hub == 0xff) { //all
ret = set_single_usb_hub(FRU_SLOT1, gpio_gpv3_usbhub[1], on_off, intf);
ret = set_single_usb_hub(FRU_SLOT1, gpio_gpv3_usbhub[0], on_off, intf);
ret = set_single_usb_hub(FRU_SLOT1, gpio_gpv3_usbhub[2], on_off, intf);
} else if (hub <= 2) {
ret = set_single_usb_hub(FRU_SLOT1, gpio_gpv3_usbhub[hub], on_off, intf);
} else {
printf("Wrong usb hub number!\n");
return -1;
}
break;
case FRU_SLOT1:
if (hub == 0xff || hub == 0) {
ret = set_single_usb_hub(FRU_SLOT1, gpio_sb_usbhub[0], on_off, intf);
} else {
printf("Wrong usb hub number!\n");
return -1;
}
break;
default:
printf("Unknown fru!\n");
ret = -1;
}
if (ret) {
printf("Fail to set usb hub status\n");
}
return ret;
}
static int
print_usb_hub_status(bic_gpio_t gpio, const uint8_t *gpio_nb, uint8_t gpio_len, uint8_t mux) {
uint8_t i = 0, nb = 0;
uint32_t offset = 0, mask = 0;
for (i = 0; i < gpio_len; ++i) {
nb = gpio_nb[i];
offset = 0;
mask = 0;
while (nb >= 32) {
nb -= 32;
offset++;
}
mask = 1 << nb;
if (gpio.gpio[offset] & mask) {
if (gpio_nb[i] == mux) {
printf("USB HUB is switched to usb c\n");
} else if (gpio_len == 1) {
printf("USB HUB is on\n");
} else {
printf("USB HUB%d is on\n", i);
}
} else {
if (gpio_nb[i] == mux) {
printf("USB HUB is switched to bmc\n");
} else if (gpio_len == 1) {
printf("USB HUB is off\n");
} else {
printf("USB HUB%d is off\n", i);
}
}
}
return 0;
}
static int
util_get_usb_hub(uint8_t hub, uint8_t fru, uint8_t intf) {
int ret = 0;
bic_gpio_t gpio = {0};
uint8_t len = 0, mux = 0xff;
uint8_t cwc_gpio[2] = {0};
const uint8_t *start = NULL;
switch (fru) {
case FRU_CWC:
if (hub > 0 && hub != 0xff) {
printf("Wrong usb hub number!\n");
return -1;
}
len = 2;
cwc_gpio[0] = gpio_cwc_usbhub[0];
cwc_gpio[1] = gpio_cwc_usbmux[0];
mux = gpio_cwc_usbmux[0];
start = cwc_gpio;
ret = bic_get_gpio(FRU_SLOT1, &gpio, intf);
break;
case FRU_2U_TOP:
case FRU_2U_BOT:
if (hub == 0xff) {
len = 3;
start = &gpio_gpv3_usbhub[0];
} else if (hub <= 2) {
len = 1;
start = &gpio_gpv3_usbhub[hub];
} else {
printf("Wrong usb hub number!\n");
return -1;
}
ret = bic_get_gpio(FRU_SLOT1, &gpio, intf);
break;
case FRU_SLOT1:
if (hub > 0 && hub != 0xff) {
printf("Wrong usb hub number!\n");
return -1;
}
len = 1;
start = &gpio_sb_usbhub[0];
ret = bic_get_gpio(FRU_SLOT1, &gpio, intf);
break;
default:
printf("Unknown fru!\n");
ret = -1;
}
if (ret == 0) {
print_usb_hub_status(gpio, start, len, mux);
} else {
printf("Fail to get usb hub status\n");
}
return ret;
}
static int
util_get_pci_link(uint8_t fru) {
// the bit mapping table for singel/dual M2
uint8_t sgl_m2_tbl[] = {5, 4, 15, 14, 13, 12, 8, 9, 11, 10, 2, 3, 1, 0};
uint8_t dual_m2_tbl[] = {4, 14, 12, 8, 10, 2, 1, 0};
uint8_t intf_list[3] = {REXP_BIC_INTF, RREXP_BIC_INTF1, RREXP_BIC_INTF2};
size_t intf_end = 3;
size_t intf_st = 0;
int ret = -1;
enum {
GPV3_84CH_DUAL = 0x4,
GPV3_100CH_DUAL = 0x6,
};
if ( riser_board == GPV3_MCHP_BOARD ) {
intf_st = 0;
intf_end = 1;
} else if ( riser_board == CWC_MCHP_BOARD ) {
intf_st = 1;
intf_end = 3;
} else {
printf("The system may not support the feature\n");
return -1;
}
for ( size_t i = intf_st; i < intf_end; i++ ) {
// start getting data
uint8_t rbuf[8] = {0};
uint8_t rlen = 0;
ret = bic_get_gpv3_pci_link(fru, rbuf, &rlen, intf_list[i]);
if ( ret < 0 ) {
printf("Failed to get PCI link status\n");
break;
}
uint16_t result = (rbuf[3] << 8 | rbuf[4]);
uint8_t m2_cfg = pal_get_gpv3_cfg();
uint8_t *tbl_p = sgl_m2_tbl;
size_t tbl_size = sizeof(sgl_m2_tbl);
bool is_dual = false;
// print data
if ( m2_cfg == GPV3_84CH_DUAL || m2_cfg == GPV3_100CH_DUAL ) {
tbl_size = sizeof(dual_m2_tbl);
is_dual = true;
tbl_p = dual_m2_tbl;
}
uint8_t e1s_offset = tbl_size - 2;
if ( intf_list[i] == REXP_BIC_INTF ) printf("2U GPv3:\n");
else if ( intf_list[i] == RREXP_BIC_INTF1 ) printf("4U TOP GPv3:\n");
else printf("4U BOT GPv3:\n");
for ( size_t j = 0 ; j < tbl_size; j++ ) {
char *link_status = ((result >> tbl_p[j]) & 0x1)?"Up":"Down";
if ( j >= e1s_offset ) printf("E1S_%d Link status: %s\n", (j - e1s_offset), link_status);
else {
char *m2_type = (is_dual == true)?"Dual":"Single";
uint8_t idx = (is_dual == true)?((j*2)+1):j;
printf("%s M2_%d Link status: %s\n", m2_type, idx, link_status);
}
}
printf("\n");
}
return ret;
}
int
main(int argc, char **argv) {
uint8_t slot_id = 0;
uint8_t is_fru_present = 0;
int ret = 0;
uint8_t gpio_num = 0;
uint8_t gpio_val = 0;
uint8_t intf = NONE_INTF;
int i = 0;
uint8_t hub = 0, ctl = 0;
if (argc < 3) {
goto err_exit;
}
// because the usage of bic-util is displayed based on the platform
// we should get the information first
ret = fby3_common_get_bmc_location(&bmc_location);
if ( ret < 0 ) {
printf("%s() Couldn't get the location of BMC\n", __func__);
return -1;
}
// check the expansion
if ( bmc_location == NIC_BMC ) {
ret = bic_is_m2_exp_prsnt(FRU_SLOT1);
if ( ret < 0 ) {
printf("Failed to run bic_is_m2_exp_prsnt()\n");
return -1;
}
// check if the exp presence
if ( (ret & PRESENT_2OU) == PRESENT_2OU ) {
ret = fby3_common_get_2ou_board_type(FRU_SLOT1, &riser_board);
if ( ret < 0 ) {
printf("Failed to run fby3_common_get_2ou_board_type()\n");
return -1;
}
}
ret = fby3_common_get_slot_id(argv[1], &slot_id);
if ( ret < 0 ) {
if ( (riser_board == CWC_MCHP_BOARD || riser_board == GPV3_MCHP_BOARD || riser_board == GPV3_BRCM_BOARD) &&
pal_get_fru_id(argv[1], &expFru) ) {
printf("%s is invalid!\n", argv[1]);
goto err_exit;
}
}
} else {
ret = fby3_common_get_slot_id(argv[1], &slot_id);
if ( ret < 0 ) {
char exp_slot[16] = {0};
char *str;
strncpy(exp_slot, argv[1], sizeof(exp_slot)-1);
str = strtok(exp_slot,"-");
ret = fby3_common_get_slot_id(str, &slot_id);
if ( ret < 0 ) {
printf("%s is invalid!\n", str);
goto err_exit;
}
// Check Config D GPv3
ret = bic_is_m2_exp_prsnt(slot_id);
if ( ret < 0 ) {
printf("Failed to run bic_is_m2_exp_prsnt()\n");
return -1;
}
// check if the exp presence
if ( (ret & PRESENT_2OU) == PRESENT_2OU ) {
ret = fby3_common_get_2ou_board_type(slot_id, &riser_board);
if ( ret < 0 ) {
printf("Failed to run fby3_common_get_2ou_board_type()\n");
return -1;
}
}
if ( (riser_board == GPV3_MCHP_BOARD || riser_board == GPV3_BRCM_BOARD) &&
pal_get_fru_id(argv[1], &expFru) ) {
printf("%s is invalid!\n", argv[1]);
goto err_exit;
}
}
}
if (expFru != 0xff && pal_get_fru_slot(expFru, &slot_id)) {
printf("Fail to get fru:%d slot id!\n", expFru);
goto err_exit;
}
if ( slot_id != FRU_ALL ) {
if ( bmc_location == NIC_BMC && slot_id != FRU_SLOT1 ) {
printf("slot%d is not supported!\n", slot_id);
return -1;
}
ret = pal_is_fru_prsnt(slot_id, &is_fru_present);
if ( ret < 0 || is_fru_present == 0 ) {
printf("%s is not present!\n", argv[1]);
return -1;
}
}
if ( riser_board == CWC_MCHP_BOARD ) {
switch (expFru) {
case FRU_CWC:
intf = REXP_BIC_INTF;
break;
case FRU_2U_TOP:
intf = RREXP_BIC_INTF1;
break;
case FRU_2U_BOT:
intf = RREXP_BIC_INTF2;
break;
}
if ( intf != NONE_INTF ) {
ret = pal_is_fru_prsnt(expFru, &is_fru_present);
if ( ret < 0 || is_fru_present == 0 ) {
printf("exp:%d is not present!\n", expFru);
return -1;
}
}
} else {
// get the argv_idx and intf
if (expFru == FRU_2U || expFru == FRU_2U_SLOT3) {
intf = REXP_BIC_INTF;
}
// check if 1/2OU present
if ( intf != NONE_INTF ) {
ret = bic_is_m2_exp_prsnt_cache(slot_id);
if ( ret < 0 ) {
printf("Couldn't read bic_is_m2_exp_prsnt_cache\n");
return BIC_STATUS_FAILURE;
}
//return if the 1ou/2ou is not present
if ( intf == FEXP_BIC_INTF ) {
if ( (bmc_location == NIC_BMC) || (ret & PRESENT_1OU) != PRESENT_1OU ) {
printf("1OU is not present\n");
return BIC_STATUS_FAILURE;
}
} else {
if ( (ret & PRESENT_2OU) != PRESENT_2OU ) {
printf("2OU is not present\n");
return BIC_STATUS_FAILURE;
}
}
}
}
if ( strncmp(argv[2], "--", 2) == 0 ) {
if ( strcmp(argv[2], "--get_gpio") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_get_gpio(slot_id, intf);
} else if ( strcmp(argv[2], "--set_gpio") == 0 ) {
if ( argc != 5 ) goto err_exit;
gpio_num = atoi(argv[3]);
gpio_val = atoi(argv[4]);
if ( gpio_num > 0xff || gpio_val > 1 ) goto err_exit;
return util_set_gpio(slot_id, gpio_num, gpio_val, intf);
} else if ( strcmp(argv[2], "--get_gpio_config") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_get_gpio_config(slot_id, intf);
} else if ( strcmp(argv[2], "--set_gpio_config") == 0 ) {
if ( argc != 5 ) goto err_exit;
gpio_num = atoi(argv[3]);
gpio_val = (uint8_t)strtol(argv[4], NULL, 0);
if ( gpio_num > 0xff ) goto err_exit;
else return util_set_gpio_config(slot_id, gpio_num, gpio_val, intf);
} else if ( strcmp(argv[2], "--check_status") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_check_status(slot_id);
} else if ( strcmp(argv[2], "--get_dev_id") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_get_device_id(slot_id, intf);
} else if ( strcmp(argv[2], "--get_sdr") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_get_sdr(slot_id);
} else if ( strcmp(argv[2], "--read_sensor") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_read_sensor(slot_id);
} else if ( strcmp(argv[2], "--reset") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_bic_reset(slot_id, intf);
} else if ( strcmp(argv[2], "--get_post_code") == 0 ) {
if ( argc != 3 ) goto err_exit;
return util_get_postcode(slot_id);
} else if ( strcmp(argv[2], "--perf_test") == 0 ) {
if ( argc != 4 ) goto err_exit;
else return util_perf_test(slot_id, atoi(argv[3]), intf);
} else if (!strcmp(argv[2], "--clear_cmos")) {
if (argc != 3) goto err_exit;
return util_bic_clear_cmos(slot_id);
} else if ( strcmp(argv[2], "--file") == 0 ) {
if ( argc != 4 ) goto err_exit;
if ( slot_id == FRU_ALL ) {
if ( bmc_location != NIC_BMC ) {
for ( i = FRU_SLOT1; i <= FRU_SLOT4; i++ ) {
ret = pal_is_fru_prsnt(i, &is_fru_present);
if ( ret < 0 || is_fru_present == 0 ) {
printf("slot%d is not present!\n", i);
} else process_file(i, argv[3]);
}
} else process_file(FRU_SLOT1, argv[3]);
return 0;
} else return process_file(slot_id, argv[3]);
} else if ( strcmp(argv[2], "--check_usb_port") == 0 ) {
if ( argc != 4 ) goto err_exit;
if ( (strcmp("sb", argv[3]) != 0) && (strcmp("1ou", argv[3]) != 0) && (strcmp("2ou", argv[3]) != 0) ){
printf("Invalid component: %s\n", argv[3]);
goto err_exit;
}
return util_check_usb_port(slot_id, argv[3]);
} else if ( strcmp(argv[2], "--get_slot_id") == 0 ) {
if (bmc_location != NIC_BMC) {
printf("Option not supported for this sku!\n");
return -1;
}
if (argc != 3) {
goto err_exit;
}
return util_get_slot_id();
} else if ( strcmp(argv[2], "--get_board_revision") == 0 ) {
if ( argc != 4 ) goto err_exit;
if ( (strcmp("1ou", argv[3]) != 0) ) {
printf("Invalid component: %s\n", argv[3]);
goto err_exit;
}
return util_get_board_revision(slot_id, argv[3]);
} else if ( strcmp(argv[2], "--get_pci_link") == 0 ) {
return util_get_pci_link(slot_id);
} else if ( strcmp(argv[2], "--set_usb_hub") == 0 ) {
if ( riser_board == CWC_MCHP_BOARD ) {
if ( argc == 5 ) {
if ( strcmp(argv[3], "all") == 0 ) {
hub = 0xff;
} else {
hub = atoi(argv[3]);
}
if ( strcmp(argv[4], "on") == 0 ) {
ctl = 1;
} else if ( strcmp(argv[4], "off") == 0 ) {
ctl = 0;
} else if ( strcmp(argv[4], "reset") == 0 ) {
ctl = 2;
} else if ( strcmp(argv[4], "to-bmc") == 0 ) {
ctl = 10;
} else if ( strcmp(argv[4], "to-usbc") == 0 ) {
ctl = 11;
} else {
goto err_exit;
}
if (expFru == FRU_ALL) {
util_set_usb_hub(hub, ctl, FRU_SLOT1, NONE_INTF);
util_set_usb_hub(hub, ctl, FRU_CWC, REXP_BIC_INTF);
if (pal_is_fru_prsnt(FRU_2U_TOP, &is_fru_present) == 0 && is_fru_present > 0) {
util_set_usb_hub(hub, ctl, FRU_2U_TOP, RREXP_BIC_INTF1);
} else {
printf("Top gpv3 is not present!\n");
}
if (pal_is_fru_prsnt(FRU_2U_BOT, &is_fru_present) == 0 && is_fru_present > 0) {
util_set_usb_hub(hub, ctl, FRU_2U_BOT, RREXP_BIC_INTF2);
} else {
printf("Bot gpv3 is not present!\n");
}
return 0;
} else {
return util_set_usb_hub(hub, ctl, expFru == 0xff ? slot_id : expFru, intf);
}
} else {
goto err_exit;
}
} else {
printf("Command not support!\n");
goto err_exit;
}
} else if ( strcmp(argv[2], "--get_usb_hub") == 0 ) {
if ( riser_board == CWC_MCHP_BOARD ) {
if ( argc == 4 ) {
if ( strcmp(argv[3], "all") == 0 ) {
hub = 0xff;
} else {
hub = atoi(argv[3]);
}
if (expFru == FRU_ALL) {
printf("Top GPV3:\n");
if (pal_is_fru_prsnt(FRU_2U_TOP, &is_fru_present) == 0 && is_fru_present > 0) {
util_get_usb_hub(hub, FRU_2U_TOP, RREXP_BIC_INTF1);
} else {
printf("Top gpv3 is not present!\n");
}
printf("Bot GPV3:\n");
if (pal_is_fru_prsnt(FRU_2U_BOT, &is_fru_present) == 0 && is_fru_present > 0) {
util_get_usb_hub(hub, FRU_2U_BOT, RREXP_BIC_INTF2);
} else {
printf("Bot gpv3 is not present!\n");
}
printf("CWC:\n");
util_get_usb_hub(hub, FRU_CWC, REXP_BIC_INTF);
printf("Slot1:\n");
util_get_usb_hub(hub, FRU_SLOT1, NONE_INTF);
return 0;
} else {
return util_get_usb_hub(hub, expFru == 0xff ? slot_id : expFru, intf);
}
} else {
goto err_exit;
}
} else {
printf("Command not support!\n");
goto err_exit;
}
} else {
printf("Invalid option: %s\n", argv[2]);
goto err_exit;
}
} else if (argc >= 4) {
if (util_is_numeric(argv + 2)) {
return process_command(slot_id, (argc - 2), (argv + 2), intf);
} else {
goto err_exit;
}
} else {
goto err_exit;
}
err_exit:
print_usage_help();
return -1;
}