meta-facebook/meta-fby35/recipes-fby35/plat-utils/files/bic-util/bic-util.c (716 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/fby35_common.h>
#include <facebook/fby35_gpio.h>
#include <sys/time.h>
#include <time.h>
static uint8_t bmc_location = 0xff;
const static char *intf_name[4] = {"Server Board", "Front Expansion Board", "Riser Expansion Board", "Baseboard"};
const uint8_t intf_size = 4;
static const char *option_list[] = {
"--get_gpio",
"--set_gpio [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]",
};
static void
print_usage_help(void) {
int i;
printf("Usage: bic-util <%s> <[0..n]data_bytes_to_send>\n", slot_usage);
printf("Usage: bic-util <%s> <option>\n", slot_usage);
printf(" option:\n");
for (i = 0; i < sizeof(option_list)/sizeof(option_list[0]); i++)
printf(" %s\n", option_list[i]);
}
// Check BIC status
static int
util_check_status(uint8_t slot_id) {
int ret = 0;
uint8_t status;
// 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) {
int ret = 0;
ipmi_dev_id_t id = {0};
ret = bic_get_dev_id(slot_id, &id, NONE_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) {
int ret = 0;
ret = bic_reset(slot_id);
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) {
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_wrapper(slot_id, tbuf[0]>>2, tbuf[1], &tbuf[2], tlen-2, rbuf, &rlen);
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);
}
fclose(fp);
return 0;
}
static int
util_get_gpio(uint8_t slot_id) {
int ret = 0;
uint8_t i;
uint8_t gpio_pin_cnt = y35_get_gpio_list_size();
char gpio_pin_name[32] = "\0";
bic_gpio_t gpio = {0};
ret = bic_get_gpio(slot_id, &gpio, NONE_INTF);
if ( ret < 0 ) {
printf("%s() bic_get_gpio returns %d\n", __func__, ret);
return ret;
}
// Print the gpio index, name and value
for (i = 0; i < gpio_pin_cnt; i++) {
y35_get_gpio_name(slot_id, i, gpio_pin_name);
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 gpio_pin_cnt = y35_get_gpio_list_size();
char gpio_pin_name[32] = "\0";
int ret = -1;
if ( gpio_num > gpio_pin_cnt ) {
printf("slot %d: Invalid GPIO pin number %d\n", slot_id, gpio_num);
return ret;
}
y35_get_gpio_name(slot_id, gpio_num, gpio_pin_name);
printf("slot %d: setting [%d]%s to %d\n", slot_id, gpio_num, gpio_pin_name, gpio_val);
ret = bic_set_gpio(slot_id, gpio_num, gpio_val);
if (ret < 0) {
printf("%s() bic_set_gpio returns %d\n", __func__, ret);
}
return ret;
}
static int
util_perf_test(uint8_t slot_id, int loopCount) {
#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, NONE_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_extend_sensor_reading_t sensor = {0};
uint8_t intf_list[4] = {NONE_INTF};
uint8_t intf_index = 0;
uint8_t config_status = 0xff;
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 ) {
intf_list[2] = REXP_BIC_INTF;
}
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;
}
if (sensor.read_type == STANDARD_CMD) {
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);
} else {
printf("sensor num: 0x%02X: value: 0x%04X, flags: 0x%02X\n", i, sensor.value, sensor.flags);
}
}
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;
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 ) {
intf_list[2] = REXP_BIC_INTF;
}
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) {
return pal_clear_cmos(slot_id);
}
int
bic_comp_init_usb_dev(uint8_t slot_id, usb_dev* udev, char *comp)
{
#define TI_VENDOR_ID_1U 0x1CBF
#define TI_VENDOR_ID_2U 0x1CC0
int ret;
int index = 0;
char found = 0;
ssize_t cnt;
uint16_t vendor_id = SB_USB_VENDOR_ID;
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 = SB_USB_VENDOR_ID;
} 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) && (SB_USB_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 ) {
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;
}
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 = 512;
int transferred = 0;
int retries = 3;
uint8_t tbuf[512] = {0};
int i = 0;
uint8_t rbuf[512] = {0};
int received = 0;
for (i = 0; i < 512 ; i++) tbuf[i]=i+1;
// bic_set_gpio(slot_id, RST_USB_HUB_N_R, GPIO_HIGH);
udev->ci = 1;
udev->epaddr = USB_INPUT_PORT;
// 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) {
goto exit;
}
udev->epaddr = USB_OUTPUT_PORT;
retries = 3;
while(true) {
ret = libusb_bulk_transfer(udev->handle, udev->epaddr, rbuf, 512, &received, 3000);
if( ret != 0 ) {
printf("Error in receiving data! err = %d (%s)\n", ret, libusb_error_name(ret));
retries--;
if (!retries) {
ret = -1;
break;
}
} else{
//printf("Received length: %d\n", received);
printf("Received data: ");
for (i = 0; i < received; ++i) {
printf("%02x ", rbuf[i]);
}
printf("\n");
break;
}
}
exit:
if (ret != 0) {
printf("Check USB port Failed\n");
} else {
printf("Check USB port Successful\n");
}
// close usb device
if (libusb_release_interface(udev->handle, udev->ci) < 0) {
printf("Couldn't release the interface 0x%X\n", udev->ci);
}
if (udev->handle != NULL )
libusb_close(udev->handle);
libusb_exit(NULL);
// bic_set_gpio(slot_id, RST_USB_HUB_N_R, GPIO_LOW);
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;
int i = 0;
if (argc < 3) {
goto err_exit;
}
ret = fby35_common_get_slot_id(argv[1], &slot_id);
if ( ret < 0 ) {
printf("%s is invalid!\n", argv[1]);
goto err_exit;
}
ret = fby35_common_get_bmc_location(&bmc_location);
if ( ret < 0 ) {
printf("%s() Couldn't get the location of BMC\n", __func__);
return -1;
}
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 ( strncmp(argv[2], "--", 2) == 0 ) {
if ( strcmp(argv[2], "--get_gpio") == 0 ) {
return util_get_gpio(slot_id);
} 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);
} else if ( strcmp(argv[2], "--check_status") == 0 ) {
return util_check_status(slot_id);
} else if ( strcmp(argv[2], "--get_dev_id") == 0 ) {
return util_get_device_id(slot_id);
} else if ( strcmp(argv[2], "--get_sdr") == 0 ) {
return util_get_sdr(slot_id);
} else if ( strcmp(argv[2], "--read_sensor") == 0 ) {
return util_read_sensor(slot_id);
} else if ( strcmp(argv[2], "--reset") == 0 ) {
return util_bic_reset(slot_id);
} else if ( strcmp(argv[2], "--get_post_code") == 0 ) {
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]));
} 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 {
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));
} else {
goto err_exit;
}
} else {
goto err_exit;
}
err_exit:
print_usage_help();
return -1;
}