Blame lib/ipmi_picmg.c

Packit d14fb6
/*
Packit d14fb6
  Copyright (c) Kontron. All right reserved
Packit d14fb6
Packit d14fb6
 * Redistribution and use in source and binary forms, with or without
Packit d14fb6
 * modification, are permitted provided that the following conditions
Packit d14fb6
 * are met:
Packit d14fb6
 *
Packit d14fb6
 * Redistribution of source code must retain the above copyright
Packit d14fb6
 * notice, this list of conditions and the following disclaimer.
Packit d14fb6
 *
Packit d14fb6
 * Redistribution in binary form must reproduce the above copyright
Packit d14fb6
 * notice, this list of conditions and the following disclaimer in the
Packit d14fb6
 * documentation and/or other materials provided with the distribution.
Packit d14fb6
 *
Packit d14fb6
 * Neither the name of Kontron, or the names of
Packit d14fb6
 * contributors may be used to endorse or promote products derived
Packit d14fb6
 * from this software without specific prior written permission.
Packit d14fb6
 *
Packit d14fb6
 * This software is provided "AS IS," without a warranty of any kind.
Packit d14fb6
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
Packit d14fb6
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
Packit d14fb6
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
Packit d14fb6
 * DELL COMPUTERS ("DELL") AND ITS LICENSORS SHALL NOT BE LIABLE
Packit d14fb6
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
Packit d14fb6
 * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
Packit d14fb6
 * DELL OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
Packit d14fb6
 * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
Packit d14fb6
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
Packit d14fb6
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
Packit d14fb6
 * EVEN IF DELL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Packit d14fb6
 */
Packit d14fb6
Packit d14fb6
Packit d14fb6
#include <ipmitool/ipmi_intf.h>
Packit d14fb6
#include <ipmitool/ipmi_picmg.h>
Packit d14fb6
#include <ipmitool/ipmi_fru.h>		/* for access to link descriptor defines */
Packit d14fb6
#include <ipmitool/ipmi_strings.h>
Packit d14fb6
#include <ipmitool/log.h>
Packit d14fb6
Packit d14fb6
#define PICMG_EXTENSION_ATCA_MAJOR_VERSION  2
Packit d14fb6
#define PICMG_EXTENSION_AMC0_MAJOR_VERSION  4
Packit d14fb6
#define PICMG_EXTENSION_UTCA_MAJOR_VERSION  5
Packit d14fb6
Packit d14fb6
Packit d14fb6
#define PICMG_EKEY_MODE_QUERY          0
Packit d14fb6
#define PICMG_EKEY_MODE_PRINT_ALL      1
Packit d14fb6
#define PICMG_EKEY_MODE_PRINT_ENABLED  2
Packit d14fb6
#define PICMG_EKEY_MODE_PRINT_DISABLED 3
Packit d14fb6
Packit d14fb6
#define PICMG_EKEY_MAX_CHANNEL          16
Packit d14fb6
#define PICMG_EKEY_MAX_FABRIC_CHANNEL   15
Packit d14fb6
#define PICMG_EKEY_MAX_INTERFACE 3
Packit d14fb6
Packit d14fb6
#define PICMG_EKEY_AMC_MAX_CHANNEL  16
Packit d14fb6
#define PICMG_EKEY_AMC_MAX_DEVICE   15 /* 4 bits */
Packit d14fb6
Packit d14fb6
Packit d14fb6
typedef enum picmg_bused_resource_mode {
Packit d14fb6
	PICMG_BUSED_RESOURCE_SUMMARY,
Packit d14fb6
} t_picmg_bused_resource_mode ;
Packit d14fb6
Packit d14fb6
Packit d14fb6
typedef enum picmg_card_type {
Packit d14fb6
	PICMG_CARD_TYPE_CPCI,
Packit d14fb6
	PICMG_CARD_TYPE_ATCA,
Packit d14fb6
	PICMG_CARD_TYPE_AMC,
Packit d14fb6
	PICMG_CARD_TYPE_RESERVED
Packit d14fb6
} t_picmg_card_type ;
Packit d14fb6
Packit d14fb6
/* This is the version of the PICMG Extenstion */
Packit d14fb6
static t_picmg_card_type PicmgCardType = PICMG_CARD_TYPE_RESERVED;
Packit d14fb6
Packit d14fb6
void
Packit d14fb6
ipmi_picmg_help (void)
Packit d14fb6
{
Packit d14fb6
	lprintf(LOG_NOTICE, "PICMG commands:");
Packit d14fb6
	lprintf(LOG_NOTICE, " properties           - get PICMG properties");
Packit d14fb6
	lprintf(LOG_NOTICE, " frucontrol           - FRU control");
Packit d14fb6
	lprintf(LOG_NOTICE, " addrinfo             - get address information");
Packit d14fb6
	lprintf(LOG_NOTICE, " activate             - activate a FRU");
Packit d14fb6
	lprintf(LOG_NOTICE, " deactivate           - deactivate a FRU");
Packit d14fb6
	lprintf(LOG_NOTICE, " policy get           - get the FRU activation policy");
Packit d14fb6
	lprintf(LOG_NOTICE, " policy set           - set the FRU activation policy");
Packit d14fb6
	lprintf(LOG_NOTICE, " portstate get        - get port state");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" portstate getdenied  - get all denied[disabled] port description");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" portstate getgranted - get all granted[enabled] port description");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" portstate getall     - get all port state description");
Packit d14fb6
	lprintf(LOG_NOTICE, " portstate set        - set port state");
Packit d14fb6
	lprintf(LOG_NOTICE, " amcportstate get     - get port state");
Packit d14fb6
	lprintf(LOG_NOTICE, " amcportstate set     - set port state");
Packit d14fb6
	lprintf(LOG_NOTICE, " led prop             - get led properties");
Packit d14fb6
	lprintf(LOG_NOTICE, " led cap              - get led color capabilities");
Packit d14fb6
	lprintf(LOG_NOTICE, " led get              - get led state");
Packit d14fb6
	lprintf(LOG_NOTICE, " led set              - set led state");
Packit d14fb6
	lprintf(LOG_NOTICE, " power get            - get power level info");
Packit d14fb6
	lprintf(LOG_NOTICE, " power set            - set power level");
Packit d14fb6
	lprintf(LOG_NOTICE, " clk get              - get clk state");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" clk getdenied        - get all(up to 16) denied[disabled] clock descriptions");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" clk getgranted       - get all(up to 16) granted[enabled] clock descriptions");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" clk getall           - get all(up to 16) clock descriptions");
Packit d14fb6
	lprintf(LOG_NOTICE, " clk set              - set clk state");
Packit d14fb6
	lprintf(LOG_NOTICE,
Packit d14fb6
			" busres summary       - display brief bused resource status info");
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
struct sAmcAddrMap {
Packit d14fb6
	unsigned char ipmbLAddr;
Packit d14fb6
	char*         amcBayId;
Packit d14fb6
	unsigned char siteNum;
Packit d14fb6
} amcAddrMap[] = {
Packit d14fb6
	{0xFF, "reserved", 0},
Packit d14fb6
	{0x72, "A1"      , 1},
Packit d14fb6
	{0x74, "A2"      , 2},
Packit d14fb6
	{0x76, "A3"      , 3},
Packit d14fb6
	{0x78, "A4"      , 4},
Packit d14fb6
	{0x7A, "B1"      , 5},
Packit d14fb6
	{0x7C, "B2"      , 6},
Packit d14fb6
	{0x7E, "B3"      , 7},
Packit d14fb6
	{0x80, "B4"      , 8},
Packit d14fb6
	{0x82, "reserved", 0},
Packit d14fb6
	{0x84, "reserved", 0},
Packit d14fb6
	{0x86, "reserved", 0},
Packit d14fb6
	{0x88, "reserved", 0},
Packit d14fb6
};
Packit d14fb6
Packit d14fb6
/* is_amc_channel - wrapper to convert user input into integer
Packit d14fb6
 * AMC Channel range seems to be <0..255>, bits [7:0]
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @amc_chan_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_amc_channel(const char *argv_ptr, uint8_t *amc_chan_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !amc_chan_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_amc_channel(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, amc_chan_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given AMC Channel '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_amc_dev - wrapper to convert user input into integer.
Packit d14fb6
 * AMC Dev ID limits are uknown.
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @amc_dev_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_amc_dev(const char *argv_ptr, int32_t *amc_dev_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !amc_dev_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_amc_dev(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2int(argv_ptr, amc_dev_ptr) == 0 && *amc_dev_ptr >= 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given PICMG Device '%s' is invalid.",
Packit d14fb6
			argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_amc_intf - wrapper to convert user input into integer.
Packit d14fb6
 * AMC Interface (ID) limits are uknown.
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @amc_intf_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_amc_intf(const char *argv_ptr, int32_t *amc_intf_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !amc_intf_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_amc_intf(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2int(argv_ptr, amc_intf_ptr) == 0 && *amc_intf_ptr >= 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given PICMG Interface '%s' is invalid.",
Packit d14fb6
			argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_amc_port - wrapper to convert user input into integer.
Packit d14fb6
 * AMC Port limits are uknown.
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @amc_port_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_amc_port(const char *argv_ptr, int32_t *amc_port_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !amc_port_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_amc_port(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2int(argv_ptr, amc_port_ptr) == 0 && *amc_port_ptr >= 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given PICMG Port '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_acc - wrapper to convert user input into integer.
Packit d14fb6
 * Clock Accuracy limits are uknown[1byte by spec].
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_acc_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_acc(const char *argv_ptr, uint8_t *clk_acc_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_acc_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_acc(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, clk_acc_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Clock Accuracy '%s' is invalid.",
Packit d14fb6
			argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_family - wrapper to convert user input into integer.
Packit d14fb6
 * Clock Family limits are uknown[1byte by spec].
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_family_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_family(const char *argv_ptr, uint8_t *clk_family_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_family_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_family(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, clk_family_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Clock Family '%s' is invalid.",
Packit d14fb6
			argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_freq - wrapper to convert user input into integer.
Packit d14fb6
 * Clock Frequency limits are uknown, but specification says
Packit d14fb6
 * 3Bytes + 1B checksum
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_freq_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_freq(const char *argv_ptr, uint32_t *clk_freq_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_freq_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_freq(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uint(argv_ptr, clk_freq_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Clock Frequency '%s' is invalid.",
Packit d14fb6
			argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_id - wrapper to convert user input into integer.
Packit d14fb6
 * Clock ID limits are uknown, however it's 1B by specification and I've
Packit d14fb6
 * found two ranges: <1..5> or <0..15>
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_id_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_id(const char *argv_ptr, uint8_t *clk_id_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_id_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_id(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, clk_id_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Clock ID '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_index - wrapper to convert user input into integer.
Packit d14fb6
 * Clock Index limits are uknown[1B by spec]
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_index_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_index(const char *argv_ptr, uint8_t *clk_index_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_index_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_index(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, clk_index_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Clock Index '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_resid - wrapper to convert user input into integer.
Packit d14fb6
 * Clock Resource Index(?) limits are uknown, but maximum seems to be 15.
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_resid_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_resid(const char *argv_ptr, int8_t *clk_resid_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_resid_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_resid(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2char(argv_ptr, clk_resid_ptr) == 0
Packit d14fb6
			&& *clk_resid_ptr > (-1)) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Resource ID '%s' is invalid.",
Packit d14fb6
			clk_resid_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_clk_setting - wrapper to convert user input into integer.
Packit d14fb6
 * Clock Setting is a 1B bitfield:
Packit d14fb6
 * x [7:4] - reserved
Packit d14fb6
 * x [3] - state - 0/1
Packit d14fb6
 * x [2] - direction - 0/1
Packit d14fb6
 * x [1:0] - PLL ctrl - 00/01/10/11[Reserved]
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @clk_setting_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_clk_setting(const char *argv_ptr, uint8_t *clk_setting_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !clk_setting_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_clk_setting(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, clk_setting_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	/* FIXME - validate bits 4-7 are 0 ? */
Packit d14fb6
	lprintf(LOG_ERR, "Given Clock Setting '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_enable - wrapper to convert user input into integer.
Packit d14fb6
 * Valid input range for Enable is <0..1>.
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @enable_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_enable(const char *argv_ptr, uint8_t *enable_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !enable_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_enable(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, enable_ptr) == 0
Packit d14fb6
			&& (*enable_ptr == 0 || *enable_ptr == 1)) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Enable '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_enable - wrapper to convert user input into integer.
Packit d14fb6
 * LED colors: 
Packit d14fb6
 * - valid <1..6>, <0xE..0xF>
Packit d14fb6
 * - reserved [0, 7]
Packit d14fb6
 * - undefined <8..D>
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @enable_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_led_color(const char *argv_ptr, uint8_t *led_color_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !led_color_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_led_color(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, led_color_ptr) != 0) {
Packit d14fb6
		lprintf(LOG_ERR, "Given LED Color '%s' is invalid.",
Packit d14fb6
				argv_ptr);
Packit d14fb6
		lprintf(LOG_ERR,
Packit d14fb6
				"LED Color must be from ranges: <1..6>, <0xE..0xF>");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if ((*led_color_ptr >= 1 && *led_color_ptr <= 6)
Packit d14fb6
			|| (*led_color_ptr >= 0xE && *led_color_ptr <= 0xF)) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given LED Color '%s' is out of range.", argv_ptr);
Packit d14fb6
	lprintf(LOG_ERR, "LED Color must be from ranges: <1..6>, <0xE..0xF>");
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_led_function - wrapper to convert user input into integer.
Packit d14fb6
 * LED functions, however, might differ by OEM:
Packit d14fb6
 * - 0x00 - off override
Packit d14fb6
 * - <0x01..0xFA> - blinking override
Packit d14fb6
 * - 0xFB - lamp test state
Packit d14fb6
 * - 0xFC - state restored to local ctrl state
Packit d14fb6
 * - <0xFD..0xFE> - reserved
Packit d14fb6
 * - 0xFF - on override
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @led_fn_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_led_function(const char *argv_ptr, uint8_t *led_fn_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !led_fn_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_led_function(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, led_fn_ptr) == 0
Packit d14fb6
			&& (*led_fn_ptr < 0xFD || *led_fn_ptr > 0xFE)) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given LED Function '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_led_id - wrapper to convert user input into integer.
Packit d14fb6
 * LED ID range seems to be <0..255>
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @led_id_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_led_id(const char *argv_ptr, uint8_t *led_id_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !led_id_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_led_id(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, led_id_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given LED ID '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_link_group - wrapper to convert user input into integer.
Packit d14fb6
 * Link Grouping ID limis are unknown, bits [31:24] by spec.
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @link_grp_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_link_group(const char *argv_ptr, uint8_t *link_grp_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !link_grp_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_link_group(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, link_grp_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Link Group '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_link_type - wrapper to convert user input into integer.
Packit d14fb6
 * Link Type limits are unknown, bits [19:12]
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @link_type_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_link_type(const char *argv_ptr, uint8_t *link_type_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !link_type_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_link_type(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, link_type_ptr) == 0) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	lprintf(LOG_ERR, "Given Link Type '%s' is invalid.", argv_ptr);
Packit d14fb6
	return (-1);
Packit d14fb6
}
Packit d14fb6
/* is_link_type_ext - wrapper to convert user input into integer.
Packit d14fb6
 * Link Type Extension limits are unknown, bits [23:20] => <0..15> ?
Packit d14fb6
 *
Packit d14fb6
 * @argv_ptr: source string to convert from; usually argv
Packit d14fb6
 * @link_type_ext_ptr: pointer where to store result
Packit d14fb6
 * returns: zero on success, other values mean error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
is_link_type_ext(const char *argv_ptr, uint8_t *link_type_ext_ptr)
Packit d14fb6
{
Packit d14fb6
	if (!argv_ptr || !link_type_ext_ptr) {
Packit d14fb6
		lprintf(LOG_ERR, "is_link_type_ext(): invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv_ptr, link_type_ext_ptr) != 0
Packit d14fb6
			|| *link_type_ext_ptr > 15) {
Packit d14fb6
		lprintf(LOG_ERR,
Packit d14fb6
				"Given Link Type Extension '%s' is invalid.",
Packit d14fb6
				argv_ptr);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_getaddr(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
	unsigned char msg_data[5];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd = PICMG_GET_ADDRESS_INFO_CMD;
Packit d14fb6
	req.msg.data = msg_data;
Packit d14fb6
	req.msg.data_len = 2;
Packit d14fb6
	msg_data[0] = 0;   /* picmg identifier */
Packit d14fb6
	msg_data[1] = 0;   /* default fru id */
Packit d14fb6
Packit d14fb6
	if(argc > 0) {
Packit d14fb6
		if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
			return (-1);
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "Error. No valid response received.");
Packit d14fb6
		return (-1);
Packit d14fb6
	} else if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Error getting address information CC: 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("Hardware Address : 0x%02x\n", rsp->data[1]);
Packit d14fb6
	printf("IPMB-0 Address   : 0x%02x\n", rsp->data[2]);
Packit d14fb6
	printf("FRU ID           : 0x%02x\n", rsp->data[4]);
Packit d14fb6
	printf("Site ID          : 0x%02x\n", rsp->data[5]);
Packit d14fb6
Packit d14fb6
	printf("Site Type        : ");
Packit d14fb6
	switch (rsp->data[6]) {
Packit d14fb6
	case PICMG_ATCA_BOARD:
Packit d14fb6
		printf("ATCA board\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_POWER_ENTRY:
Packit d14fb6
		printf("Power Entry Module\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_SHELF_FRU:
Packit d14fb6
		printf("Shelf FRU\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_DEDICATED_SHMC:
Packit d14fb6
		printf("Dedicated Shelf Manager\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_FAN_TRAY:
Packit d14fb6
		printf("Fan Tray\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_FAN_FILTER_TRAY:
Packit d14fb6
		printf("Fan Filter Tray\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_ALARM:
Packit d14fb6
		printf("Alarm module\n");
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_AMC:
Packit d14fb6
		printf("AMC");
Packit d14fb6
		printf("  -> IPMB-L Address: 0x%02x\n", amcAddrMap[rsp->data[5]].ipmbLAddr);
Packit d14fb6
		break;
Packit d14fb6
	case PICMG_PMC:
Packit d14fb6
		printf("PMC\n");
Packit d14fb6
		break;
Packit d14fb6
	 case PICMG_RTM:
Packit d14fb6
		printf("RTM\n");
Packit d14fb6
		break;
Packit d14fb6
	default:
Packit d14fb6
		if (rsp->data[6] >= 0xc0 && rsp->data[6] <= 0xcf) {
Packit d14fb6
			printf("OEM\n");
Packit d14fb6
		} else {
Packit d14fb6
			printf("unknown\n");
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_properties(struct ipmi_intf * intf, int show )
Packit d14fb6
{
Packit d14fb6
	unsigned char PicmgExtMajorVersion;
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
	unsigned char msg_data;
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn    = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd      = PICMG_GET_PICMG_PROPERTIES_CMD;
Packit d14fb6
	req.msg.data     = &msg_data;
Packit d14fb6
	req.msg.data_len = 1;
Packit d14fb6
	msg_data = 0;
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
	if (!rsp  || rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Error getting address information.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if( show )
Packit d14fb6
	{
Packit d14fb6
		printf("PICMG identifier	: 0x%02x\n", rsp->data[0]);
Packit d14fb6
		printf("PICMG Ext. Version : %i.%i\n",	 rsp->data[1]&0x0f,
Packit d14fb6
															 (rsp->data[1]&0xf0) >> 4);
Packit d14fb6
		printf("Max FRU Device ID	: 0x%02x\n", rsp->data[2]);
Packit d14fb6
		printf("FRU Device ID		: 0x%02x\n", rsp->data[3]);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
   /* We cache the major extension version ...
Packit d14fb6
      to know how to format some commands */
Packit d14fb6
	PicmgExtMajorVersion = rsp->data[1]&0x0f;
Packit d14fb6
Packit d14fb6
	if( PicmgExtMajorVersion == PICMG_CPCI_MAJOR_VERSION  ) { 
Packit d14fb6
		PicmgCardType = PICMG_CARD_TYPE_CPCI;
Packit d14fb6
   }
Packit d14fb6
	else if(  PicmgExtMajorVersion == PICMG_ATCA_MAJOR_VERSION) {
Packit d14fb6
		PicmgCardType = PICMG_CARD_TYPE_ATCA;
Packit d14fb6
   }
Packit d14fb6
	else if(  PicmgExtMajorVersion == PICMG_AMC_MAJOR_VERSION) {
Packit d14fb6
		PicmgCardType = PICMG_CARD_TYPE_AMC;
Packit d14fb6
   }
Packit d14fb6
    
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
Packit d14fb6
#define PICMG_FRU_DEACTIVATE	(unsigned char) 0x00
Packit d14fb6
#define PICMG_FRU_ACTIVATE	(unsigned char) 0x01
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_fru_activation(struct ipmi_intf * intf, int argc, char ** argv, unsigned char state)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	struct picmg_set_fru_activation_cmd cmd;
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn    = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd      = PICMG_FRU_ACTIVATION_CMD;
Packit d14fb6
	req.msg.data     = (unsigned char*) &cm;;
Packit d14fb6
	req.msg.data_len = 3;
Packit d14fb6
Packit d14fb6
	cmd.picmg_id  = 0;						/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &(cmd.fru_id)) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	cmd.fru_state = state;
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp  || rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Error activation/deactivation of FRU.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
	if (rsp->data[0] != 0x00) {
Packit d14fb6
		lprintf(LOG_ERR, "Error activation/deactivation of FRU.");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_fru_activation_policy_get(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[4];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn    = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd      = PICMG_GET_FRU_POLICY_CMD;
Packit d14fb6
	req.msg.data     = msg_data;
Packit d14fb6
	req.msg.data_len = 2;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0;								/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "FRU activation policy get failed with CC code 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf(" %s\n", ((rsp->data[1] & 0x01) == 0x01) ?
Packit d14fb6
	                           "activation locked" : "activation not locked");
Packit d14fb6
	printf(" %s\n", ((rsp->data[1] & 0x02) == 0x02) ?
Packit d14fb6
	                            "deactivation locked" : "deactivation not locked");
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_fru_activation_policy_set(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[4];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn    = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd      = PICMG_SET_FRU_POLICY_CMD;
Packit d14fb6
	req.msg.data     = msg_data;
Packit d14fb6
	req.msg.data_len = 4;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0;								            /* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv[1], &msg_data[2]) != 0 || msg_data[2] > 3) {
Packit d14fb6
		/* FRU Lock Mask */
Packit d14fb6
		lprintf(LOG_ERR, "Given FRU Lock Mask '%s' is invalid.",
Packit d14fb6
				argv[1]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	if (str2uchar(argv[2], &msg_data[3]) != 0 || msg_data[3] > 3) {
Packit d14fb6
		/* FRU Act Policy */
Packit d14fb6
		lprintf(LOG_ERR,
Packit d14fb6
				"Given FRU Activation Policy '%s' is invalid.",
Packit d14fb6
				argv[2]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "FRU activation policy set failed with CC code 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
#define PICMG_MAX_LINK_PER_CHANNEL 4
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_portstate_get(struct ipmi_intf * intf, int32_t interface,
Packit d14fb6
		uint8_t channel, int mode)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp = NULL;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[4];
Packit d14fb6
Packit d14fb6
	struct fru_picmgext_link_desc* d; /* descriptor pointer for rec. data */
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn    = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd      = PICMG_GET_PORT_STATE_CMD;
Packit d14fb6
	req.msg.data     = msg_data;
Packit d14fb6
	req.msg.data_len = 2;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;						/* PICMG identifier */
Packit d14fb6
	msg_data[1] = (interface & 0x3)<<6;	/* interface      */
Packit d14fb6
	msg_data[1] |= (channel & 0x3F);	/* channel number */
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		if( mode == PICMG_EKEY_MODE_QUERY ){
Packit d14fb6
			lprintf(LOG_ERR, "FRU portstate get failed with CC code 0x%02x",
Packit d14fb6
					rsp->ccode);
Packit d14fb6
		}
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->data_len >= 6) {
Packit d14fb6
		int index;
Packit d14fb6
		/* add support for more than one link per channel */
Packit d14fb6
		for(index=0;index
Packit d14fb6
			if( rsp->data_len > (1+ (index*5))){
Packit d14fb6
				d = (struct fru_picmgext_link_desc *) &(rsp->data[1 + (index*5)]);
Packit d14fb6
Packit d14fb6
				if
Packit d14fb6
				(
Packit d14fb6
					mode == PICMG_EKEY_MODE_PRINT_ALL
Packit d14fb6
					||
Packit d14fb6
					mode == PICMG_EKEY_MODE_QUERY
Packit d14fb6
					||
Packit d14fb6
					(
Packit d14fb6
						mode == PICMG_EKEY_MODE_PRINT_ENABLED
Packit d14fb6
						&&
Packit d14fb6
						rsp->data[5 + (index*5) ] == 0x01
Packit d14fb6
					)
Packit d14fb6
					||
Packit d14fb6
					(
Packit d14fb6
						mode == PICMG_EKEY_MODE_PRINT_DISABLED
Packit d14fb6
						&&
Packit d14fb6
						rsp->data[5 + (index*5) ] == 0x00
Packit d14fb6
					)
Packit d14fb6
				)
Packit d14fb6
				{
Packit d14fb6
					printf("      Link Grouping ID:     0x%02x\n", d->grouping);
Packit d14fb6
					printf("      Link Type Extension:  0x%02x\n", d->ext);
Packit d14fb6
					printf("      Link Type:            0x%02x  ", d->type);
Packit d14fb6
					if (d->type == 0 || d->type == 0xff)
Packit d14fb6
					{
Packit d14fb6
						printf("Reserved %d\n",d->type);
Packit d14fb6
					}
Packit d14fb6
					else if (d->type >= 0x06 && d->type <= 0xef)
Packit d14fb6
					{
Packit d14fb6
						printf("Reserved\n");
Packit d14fb6
					}
Packit d14fb6
					else if (d->type >= 0xf0 && d->type <= 0xfe)
Packit d14fb6
					{
Packit d14fb6
						printf("OEM GUID Definition\n");
Packit d14fb6
					}
Packit d14fb6
					else
Packit d14fb6
					{
Packit d14fb6
						switch (d->type)
Packit d14fb6
						{
Packit d14fb6
							case FRU_PICMGEXT_LINK_TYPE_BASE:
Packit d14fb6
								printf("PICMG 3.0 Base Interface 10/100/1000\n");
Packit d14fb6
							break;
Packit d14fb6
							case FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET:
Packit d14fb6
								printf("PICMG 3.1 Ethernet Fabric Interface\n");
Packit d14fb6
							break;
Packit d14fb6
							case FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND:
Packit d14fb6
								printf("PICMG 3.2 Infiniband Fabric Interface\n");
Packit d14fb6
							break;
Packit d14fb6
							case FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR:
Packit d14fb6
								printf("PICMG 3.3 Star Fabric Interface\n");
Packit d14fb6
							break;
Packit d14fb6
							case  FRU_PICMGEXT_LINK_TYPE_PCIE:
Packit d14fb6
								printf("PCI Express Fabric Interface\n");
Packit d14fb6
							break;
Packit d14fb6
							default:
Packit d14fb6
							printf("Invalid\n");
Packit d14fb6
							break;
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
					printf("      Link Designator: \n");
Packit d14fb6
					printf("        Port Flag:          0x%02x\n", d->desig_port);
Packit d14fb6
					printf("        Interface:          0x%02x - ", d->desig_if);
Packit d14fb6
					switch (d->desig_if)
Packit d14fb6
					{
Packit d14fb6
						case FRU_PICMGEXT_DESIGN_IF_BASE:
Packit d14fb6
							printf("Base Interface\n");
Packit d14fb6
						break;
Packit d14fb6
						case FRU_PICMGEXT_DESIGN_IF_FABRIC:
Packit d14fb6
							printf("Fabric Interface\n");
Packit d14fb6
						break;
Packit d14fb6
						case FRU_PICMGEXT_DESIGN_IF_UPDATE_CHANNEL:
Packit d14fb6
							printf("Update Channel\n");
Packit d14fb6
						break;
Packit d14fb6
						case FRU_PICMGEXT_DESIGN_IF_RESERVED:
Packit d14fb6
							printf("Reserved\n");
Packit d14fb6
						break;
Packit d14fb6
						default:
Packit d14fb6
							printf("Invalid");
Packit d14fb6
						break;
Packit d14fb6
					}
Packit d14fb6
					printf("        Channel Number:     0x%02x\n", d->desig_channel);
Packit d14fb6
					printf("      STATE:                %s\n",
Packit d14fb6
							( rsp->data[5 +(index*5)] == 0x01) ?"enabled":"disabled");
Packit d14fb6
					printf("\n");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	else
Packit d14fb6
	{
Packit d14fb6
		lprintf(LOG_ERR, "Unexpected answer, can't print result.");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_portstate_set(struct ipmi_intf * intf, int32_t interface,
Packit d14fb6
		uint8_t channel, int32_t port, uint8_t type,
Packit d14fb6
		uint8_t typeext, uint8_t group, uint8_t enable)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn    = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd      = PICMG_SET_PORT_STATE_CMD;
Packit d14fb6
	req.msg.data     = msg_data;
Packit d14fb6
	req.msg.data_len = 6;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;												/* PICMG identifier */
Packit d14fb6
	msg_data[1] = (channel & 0x3f) | ((interface & 3) << 6);
Packit d14fb6
	msg_data[2] = (port & 0xf) | ((type & 0xf) << 4);
Packit d14fb6
	msg_data[3] = ((type >> 4) & 0xf) | ((typeext & 0xf) << 4);
Packit d14fb6
	msg_data[4] = group & 0xff;
Packit d14fb6
	msg_data[5] = (enable & 0x01); /* enable/disable */
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Picmg portstate set failed with CC code 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
Packit d14fb6
/* AMC.0 commands */
Packit d14fb6
Packit d14fb6
#define PICMG_AMC_MAX_LINK_PER_CHANNEL 4
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_amc_portstate_get(struct ipmi_intf * intf, int32_t device,
Packit d14fb6
		uint8_t channel, int mode)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[4];
Packit d14fb6
Packit d14fb6
	struct fru_picmgext_amc_link_info* d; /* descriptor pointer for rec. data */
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn	  = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd		  = PICMG_AMC_GET_PORT_STATE_CMD;
Packit d14fb6
	req.msg.data	  = msg_data;
Packit d14fb6
Packit d14fb6
	/* FIXME : add check for AMC or carrier device */
Packit d14fb6
	if(device == -1 || PicmgCardType != PICMG_CARD_TYPE_ATCA ){
Packit d14fb6
		req.msg.data_len = 2;	/* for amc only channel */
Packit d14fb6
	}else{
Packit d14fb6
		req.msg.data_len = 3;	/* for carrier channel and device */
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;						/* PICMG identifier */
Packit d14fb6
	msg_data[1] = channel ;
Packit d14fb6
	msg_data[2] = device ;
Packit d14fb6
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		if( mode == PICMG_EKEY_MODE_QUERY ){
Packit d14fb6
			lprintf(LOG_ERR, "Amc portstate get failed with CC code 0x%02x",
Packit d14fb6
					rsp->ccode);
Packit d14fb6
		}
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->data_len >= 5) {
Packit d14fb6
		int index;
Packit d14fb6
Packit d14fb6
		/* add support for more than one link per channel */
Packit d14fb6
		for(index=0;index
Packit d14fb6
Packit d14fb6
			if( rsp->data_len > (1+ (index*4))){
Packit d14fb6
				unsigned char type;
Packit d14fb6
				unsigned char ext;
Packit d14fb6
				unsigned char grouping;
Packit d14fb6
				unsigned char port;
Packit d14fb6
				unsigned char enabled;
Packit d14fb6
				d = (struct fru_picmgext_amc_link_info *)&(rsp->data[1 + (index*4)]);
Packit d14fb6
Packit d14fb6
Packit d14fb6
				/* Removed endianness check here, probably not required
Packit d14fb6
					as we dont use bitfields  */
Packit d14fb6
				port = d->linkInfo[0] & 0x0F;
Packit d14fb6
				type = ((d->linkInfo[0] & 0xF0) >> 4 )|(d->linkInfo[1] & 0x0F );
Packit d14fb6
				ext  = ((d->linkInfo[1] & 0xF0) >> 4 );
Packit d14fb6
				grouping = d->linkInfo[2];
Packit d14fb6
Packit d14fb6
Packit d14fb6
				enabled =  rsp->data[4 + (index*4) ];
Packit d14fb6
Packit d14fb6
				if
Packit d14fb6
				(
Packit d14fb6
					mode == PICMG_EKEY_MODE_PRINT_ALL
Packit d14fb6
					||
Packit d14fb6
					mode == PICMG_EKEY_MODE_QUERY
Packit d14fb6
					||
Packit d14fb6
					(
Packit d14fb6
						mode == PICMG_EKEY_MODE_PRINT_ENABLED
Packit d14fb6
						&&
Packit d14fb6
						enabled == 0x01
Packit d14fb6
					)
Packit d14fb6
					||
Packit d14fb6
					(
Packit d14fb6
						mode == PICMG_EKEY_MODE_PRINT_DISABLED
Packit d14fb6
						&&
Packit d14fb6
						enabled	== 0x00
Packit d14fb6
					)
Packit d14fb6
				)
Packit d14fb6
				{
Packit d14fb6
					if(device == -1 || PicmgCardType != PICMG_CARD_TYPE_ATCA ){
Packit d14fb6
						printf("   Link device :         AMC\n");
Packit d14fb6
					}else{
Packit d14fb6
                  printf("   Link device :         0x%02x\n", device );
Packit d14fb6
					}
Packit d14fb6
Packit d14fb6
					printf("   Link Grouping ID:     0x%02x\n", grouping);
Packit d14fb6
Packit d14fb6
					if (type == 0 || type == 1 ||type == 0xff)
Packit d14fb6
					{
Packit d14fb6
						printf("   Link Type Extension:  0x%02x\n", ext);
Packit d14fb6
						printf("   Link Type:            Reserved\n");
Packit d14fb6
					}
Packit d14fb6
					else if (type >= 0xf0 && type <= 0xfe)
Packit d14fb6
					{
Packit d14fb6
						printf("   Link Type Extension:  0x%02x\n", ext);
Packit d14fb6
						printf("   Link Type:            OEM GUID Definition\n");
Packit d14fb6
					}
Packit d14fb6
					else
Packit d14fb6
					{
Packit d14fb6
						if (type <= FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE )
Packit d14fb6
						{
Packit d14fb6
							printf("   Link Type Extension:  %s\n",
Packit d14fb6
                                      amc_link_type_ext_str[type][ext]);
Packit d14fb6
							printf("   Link Type:            %s\n",
Packit d14fb6
                                      amc_link_type_str[type]);
Packit d14fb6
						}
Packit d14fb6
						else{
Packit d14fb6
							printf("   Link Type Extension:  0x%02x\n", ext);
Packit d14fb6
							printf("   Link Type:            undefined\n");
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
					printf("   Link Designator: \n");
Packit d14fb6
					printf("      Channel Number:    0x%02x\n", channel);
Packit d14fb6
					printf("      Port Flag:         0x%02x\n", port );
Packit d14fb6
					printf("   STATE:                %s\n",
Packit d14fb6
                              ( enabled == 0x01 )?"enabled":"disabled");
Packit d14fb6
					printf("\n");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	else
Packit d14fb6
	{
Packit d14fb6
		lprintf(LOG_NOTICE,"ipmi_picmg_amc_portstate_get"\
Packit d14fb6
							"Unexpected answer, can't print result");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_amc_portstate_set(struct ipmi_intf * intf, uint8_t channel,
Packit d14fb6
		int32_t port, uint8_t type, uint8_t typeext,
Packit d14fb6
		uint8_t group, uint8_t enable, int32_t device)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs	 * rsp;
Packit d14fb6
	struct ipmi_rq	 req;
Packit d14fb6
	unsigned char	 msg_data[7];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn	  = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd		  = PICMG_AMC_SET_PORT_STATE_CMD;
Packit d14fb6
	req.msg.data	  = msg_data;
Packit d14fb6
Packit d14fb6
	msg_data[0]	 = 0x00;						 /* PICMG identifier*/
Packit d14fb6
	msg_data[1]	 = channel;					 /* channel id */
Packit d14fb6
	msg_data[2]	 = port & 0xF;				 /* port flags */
Packit d14fb6
	msg_data[2] |= (type & 0x0F)<<4;		 /* type	 */
Packit d14fb6
	msg_data[3]	 = (type & 0xF0)>>4;		 /* type */
Packit d14fb6
	msg_data[3] |= (typeext & 0x0F)<<4;	 /* extension */
Packit d14fb6
	msg_data[4]	 = (group & 0xFF);		 /* group */
Packit d14fb6
	msg_data[5]	 = (enable & 0x01);		 /* state */
Packit d14fb6
	req.msg.data_len = 6;
Packit d14fb6
Packit d14fb6
	/* device id - only for carrier needed */
Packit d14fb6
	if (device >= 0) {
Packit d14fb6
		msg_data[6]	 = device;
Packit d14fb6
		req.msg.data_len = 7;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Amc portstate set failed with CC code 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_get_led_properties(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_GET_FRU_LED_PROPERTIES_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
	req.msg.data_len = 2;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "LED get properties failed with CC code 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("General Status LED Properties:  0x%2x\n", rsp->data[1] );
Packit d14fb6
	printf("App. Specific  LED Count:       0x%2x\n", rsp->data[2] );
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_get_led_capabilities(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	int i;
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_GET_LED_COLOR_CAPABILITIES_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
	req.msg.data_len = 3;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0
Packit d14fb6
			|| is_led_id(argv[1], &msg_data[2]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "LED get capabilities failed with CC code 0x%02x",
Packit d14fb6
				rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("LED Color Capabilities: ");
Packit d14fb6
	for ( i=0 ; i<8 ; i++ ) {
Packit d14fb6
		if ( rsp->data[1] & (0x01 << i) ) {
Packit d14fb6
			printf("%s, ", led_color_str[ i ]);
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	printf("\n");
Packit d14fb6
Packit d14fb6
	printf("Default LED Color in\n");
Packit d14fb6
	printf("      LOCAL control:  %s\n", led_color_str[ rsp->data[2] ] );
Packit d14fb6
	printf("      OVERRIDE state: %s\n", led_color_str[ rsp->data[3] ] );
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_get_led_state(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_GET_FRU_LED_STATE_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
	req.msg.data_len = 3;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0
Packit d14fb6
			|| is_led_id(argv[1], &msg_data[2]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "LED get state failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("LED states:						  %x	", rsp->data[1] );
Packit d14fb6
Packit d14fb6
	if (!(rsp->data[1] & 0x1)) {
Packit d14fb6
		printf("[NO LOCAL CONTROL]\n");
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("[LOCAL CONTROL");
Packit d14fb6
Packit d14fb6
	if (rsp->data[1] & 0x2) {
Packit d14fb6
		printf("|OVERRIDE");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->data[1] & 0x4) {
Packit d14fb6
		printf("|LAMPTEST");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("]\n");
Packit d14fb6
Packit d14fb6
	printf("  Local Control function:     %x  ", rsp->data[2] );
Packit d14fb6
	if (rsp->data[2] == 0x0) {
Packit d14fb6
		printf("[OFF]\n");
Packit d14fb6
	} else if (rsp->data[2] == 0xff) {
Packit d14fb6
		printf("[ON]\n");
Packit d14fb6
	} else {
Packit d14fb6
		printf("[BLINKING]\n");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("  Local Control On-Duration:  %x\n", rsp->data[3] );
Packit d14fb6
	printf("  Local Control Color:        %x  [%s]\n", rsp->data[4], led_color_str[ rsp->data[4] ]);
Packit d14fb6
Packit d14fb6
	/* override state or lamp test */
Packit d14fb6
	if (rsp->data[1] & 0x02) {
Packit d14fb6
		printf("  Override function:     %x  ", rsp->data[5] );
Packit d14fb6
		if (rsp->data[2] == 0x0) {
Packit d14fb6
			printf("[OFF]\n");
Packit d14fb6
		} else if (rsp->data[2] == 0xff) {
Packit d14fb6
			printf("[ON]\n");
Packit d14fb6
		} else {
Packit d14fb6
			printf("[BLINKING]\n");
Packit d14fb6
		}
Packit d14fb6
Packit d14fb6
		printf("  Override On-Duration:  %x\n", rsp->data[6] );
Packit d14fb6
		printf("  Override Color:        %x  [%s]\n", rsp->data[7], led_color_str[ rsp->data[7] ]);
Packit d14fb6
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->data[1] & 0x04) {
Packit d14fb6
		printf("  Lamp test duration:    %x\n", rsp->data[8] );
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_set_led_state(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd = PICMG_SET_FRU_LED_STATE_CMD;
Packit d14fb6
	req.msg.data = msg_data;
Packit d14fb6
	req.msg.data_len = 6;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0
Packit d14fb6
			|| is_led_id(argv[1], &msg_data[2]) != 0
Packit d14fb6
			|| is_led_function(argv[2], &msg_data[3]) != 0
Packit d14fb6
			|| is_led_color(argv[4], &msg_data[5]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	/* Validating the LED duration is not as simple as the other arguments, as
Packit d14fb6
	 * the range of valid durations depends on the LED function.  From the spec:
Packit d14fb6
	 *
Packit d14fb6
	 * ``On-duration: LED on-time in tens of milliseconds if (1 <= Byte 4 <= FAh)
Packit d14fb6
	 * Lamp Test time in hundreds of milliseconds if (Byte 4 = FBh). Lamp Test
Packit d14fb6
	 * time value must be less than 128. Other values when Byte 4 = FBh are
Packit d14fb6
	 * reserved. Otherwise, this field is ignored and shall be set to 0h.''
Packit d14fb6
	 *
Packit d14fb6
	 * If we're doing a lamp test, then the allowed values are 0 -> 127.
Packit d14fb6
	 * Otherwise, the allowed values are 0 -> 255.  However, if the function is
Packit d14fb6
	 * not a lamp test (0xFB) and outside the range 0x01 -> 0xFA then the value
Packit d14fb6
	 * should be set to 0.
Packit d14fb6
	 *
Packit d14fb6
	 * Start by checking we have a parameter.
Packit d14fb6
	 */
Packit d14fb6
	if (!argv[3]) {
Packit d14fb6
		lprintf(LOG_ERR, "LED Duration: invalid argument(s).");
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* Next check we have a number. */
Packit d14fb6
	if (str2uchar(argv[3], &msg_data[4]) != 0) {
Packit d14fb6
		lprintf(LOG_ERR, "Given LED Duration '%s' is invalid", argv[3]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* If we have a lamp test, ensure it's not too long a duration. */
Packit d14fb6
	if (msg_data[3] == 0xFB && msg_data[4] > 127) {
Packit d14fb6
		lprintf(LOG_ERR, "Given LED Duration '%s' is invalid", argv[3]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* If we're outside the range that allows durations, set the duration to 0.
Packit d14fb6
	 * Warn the user that we're doing this.
Packit d14fb6
	 */
Packit d14fb6
	if (msg_data[4] != 0 && (msg_data[3] == 0 || msg_data[3] > 0xFB)) {
Packit d14fb6
		lprintf(LOG_WARN, "Setting LED Duration '%s' to '0'", argv[3]);
Packit d14fb6
		msg_data[4] = 0;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "LED set state failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_get_power_level(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	int i;
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_GET_POWER_LEVEL_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
	req.msg.data_len = 3;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* PICMG Power Type - <0..3> */
Packit d14fb6
	if (str2uchar(argv[1], &msg_data[2]) != 0 || msg_data[2] > 3) {
Packit d14fb6
		lprintf(LOG_ERR, "Given Power Type '%s' is invalid",
Packit d14fb6
				argv[1]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Power level get failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("Dynamic Power Configuration: %s\n", (rsp->data[1]&0x80)==0x80?"enabled":"disabled" );
Packit d14fb6
	printf("Actual Power Level:          %i\n", (rsp->data[1] & 0xf));
Packit d14fb6
	printf("Delay to stable Power:       %i\n", rsp->data[2]);
Packit d14fb6
	printf("Power Multiplier:            %i\n", rsp->data[3]);
Packit d14fb6
Packit d14fb6
Packit d14fb6
	for ( i = 1; i+3 < rsp->data_len ; i++ ) {
Packit d14fb6
		printf("   Power Draw %i:            %i\n", i, (rsp->data[i+3]) * rsp->data[3] / 10);
Packit d14fb6
	}
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_set_power_level(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_SET_POWER_LEVEL_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
	req.msg.data_len = 4;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;					/* PICMG identifier	 */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* PICMG Power Level - <0x00..0x14>, [0xFF] */
Packit d14fb6
	if (str2uchar(argv[1], &msg_data[2]) != 0
Packit d14fb6
			|| (msg_data[2] > 0x14 && msg_data[2] != 0xFF)) {
Packit d14fb6
		lprintf(LOG_ERR,
Packit d14fb6
				"Given PICMG Power Level '%s' is invalid.",
Packit d14fb6
				argv[1]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* PICMG Present-to-desired - <0..1> */
Packit d14fb6
	if (str2uchar(argv[2], &msg_data[3]) != 0 || msg_data[3] > 1) {
Packit d14fb6
		lprintf(LOG_ERR,
Packit d14fb6
				"Given PICMG Present-to-desired '%s' is invalid.",
Packit d14fb6
				argv[2]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Power level set failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_bused_resource(struct ipmi_intf * intf, t_picmg_bused_resource_mode mode)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
   int status = 0;
Packit d14fb6
   switch ( mode ) {
Packit d14fb6
      case PICMG_BUSED_RESOURCE_SUMMARY:
Packit d14fb6
      {
Packit d14fb6
         t_picmg_busres_resource_id resource;
Packit d14fb6
         t_picmg_busres_board_cmd_types cmd =PICMG_BUSRES_BOARD_CMD_QUERY;
Packit d14fb6
Packit d14fb6
         req.msg.netfn	  = IPMI_NETFN_PICMG;
Packit d14fb6
         req.msg.cmd	     = PICMG_BUSED_RESOURCE_CMD;
Packit d14fb6
         req.msg.data	  = msg_data;
Packit d14fb6
         req.msg.data_len = 3;
Packit d14fb6
Packit d14fb6
         /* IF BOARD
Packit d14fb6
            query for all resources
Packit d14fb6
         */
Packit d14fb6
         for( resource=PICMG_BUSRES_METAL_TEST_BUS_1;resource<=PICMG_BUSRES_SYNC_CLOCK_GROUP_3;resource+=(t_picmg_busres_resource_id)1 ) {
Packit d14fb6
            msg_data[0] = 0x00;					/* PICMG identifier */
Packit d14fb6
            msg_data[1] = (unsigned char) cmd;
Packit d14fb6
            msg_data[2] = (unsigned char) resource;
Packit d14fb6
            rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
            if (!rsp) {
Packit d14fb6
               printf("bused resource control: no response\n");
Packit d14fb6
               return -1;
Packit d14fb6
            }
Packit d14fb6
Packit d14fb6
            if (rsp->ccode) {
Packit d14fb6
               printf("bused resource control: returned CC code 0x%02x\n", rsp->ccode);
Packit d14fb6
               return -1;
Packit d14fb6
            } else {
Packit d14fb6
               printf("Resource 0x%02x '%-26s' : 0x%02x [%s] \n" , 
Packit d14fb6
                       resource, val2str(resource,picmg_busres_id_vals),
Packit d14fb6
                       rsp->data[1], oemval2str(cmd,rsp->data[1],
Packit d14fb6
                      picmg_busres_board_status_vals));
Packit d14fb6
            }
Packit d14fb6
         }
Packit d14fb6
      }
Packit d14fb6
      break;
Packit d14fb6
      default :
Packit d14fb6
      break;
Packit d14fb6
   }
Packit d14fb6
Packit d14fb6
   return status;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_fru_control(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn	  = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_FRU_CONTROL_CMD;
Packit d14fb6
	req.msg.data	  = msg_data;
Packit d14fb6
	req.msg.data_len = 3;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;					/* PICMG identifier */
Packit d14fb6
	if (is_fru_id(argv[0], &msg_data[1]) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
	/* FRU Control Option, valid range: <0..4> */
Packit d14fb6
	if (str2uchar(argv[1], &msg_data[2]) != 0 || msg_data[2] > 4) {
Packit d14fb6
		lprintf(LOG_ERR,
Packit d14fb6
				"Given FRU Control Option '%s' is invalid.",
Packit d14fb6
				argv[1]);
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	printf("FRU Device Id: %d FRU Control Option: %s\n", msg_data[1],  \
Packit d14fb6
				val2str( msg_data[2], picmg_frucontrol_vals));
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "frucontrol failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	} else {
Packit d14fb6
      printf("frucontrol: ok\n");
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_clk_get(struct ipmi_intf * intf, uint8_t clk_id, int8_t clk_res,
Packit d14fb6
		int mode)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char enabled;
Packit d14fb6
	unsigned char direction;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[6];
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd   = PICMG_AMC_GET_CLK_STATE_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier	 */
Packit d14fb6
	msg_data[1] = clk_id;
Packit d14fb6
Packit d14fb6
	if(clk_res == -1 || PicmgCardType != PICMG_CARD_TYPE_ATCA ){
Packit d14fb6
		req.msg.data_len = 2;	/* for amc only channel */
Packit d14fb6
	}else{
Packit d14fb6
		req.msg.data_len = 3;	/* for carrier channel and device */
Packit d14fb6
      msg_data[2] = clk_res;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode && (mode == PICMG_EKEY_MODE_QUERY) ) {
Packit d14fb6
		lprintf(LOG_ERR, "Clk get failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode == 0 ) {
Packit d14fb6
		enabled	 = (rsp->data[1]&0x8)!=0;
Packit d14fb6
		direction = (rsp->data[1]&0x4)!=0;
Packit d14fb6
Packit d14fb6
		if
Packit d14fb6
		( 
Packit d14fb6
			mode == PICMG_EKEY_MODE_QUERY
Packit d14fb6
 			||
Packit d14fb6
 			mode == PICMG_EKEY_MODE_PRINT_ALL
Packit d14fb6
 			||
Packit d14fb6
 			(
Packit d14fb6
 				mode == PICMG_EKEY_MODE_PRINT_DISABLED
Packit d14fb6
 				&&
Packit d14fb6
 				enabled == 0
Packit d14fb6
 			)
Packit d14fb6
 			||
Packit d14fb6
 			(
Packit d14fb6
 				mode == PICMG_EKEY_MODE_PRINT_ENABLED
Packit d14fb6
 				&&
Packit d14fb6
 				enabled == 1
Packit d14fb6
         )	
Packit d14fb6
		) {
Packit d14fb6
			if( PicmgCardType != PICMG_CARD_TYPE_AMC ) {
Packit d14fb6
				printf("CLK resource id   : %3d [ %s ]\n", clk_res ,
Packit d14fb6
					oemval2str( ((clk_res>>6)&0x03), (clk_res&0x0F),
Packit d14fb6
														picmg_clk_resource_vals));				
Packit d14fb6
			} else {
Packit d14fb6
				printf("CLK resource id   : N/A [ AMC Module ]\n");
Packit d14fb6
				clk_res = 0x40; /* Set */
Packit d14fb6
			} 
Packit d14fb6
         printf("CLK id            : %3d [ %s ]\n", clk_id,
Packit d14fb6
					oemval2str( ((clk_res>>6)&0x03), clk_id ,
Packit d14fb6
														picmg_clk_id_vals));				
Packit d14fb6
Packit d14fb6
Packit d14fb6
			printf("CLK setting       : 0x%02x\n", rsp->data[1]);
Packit d14fb6
			printf(" - state:     %s\n", (enabled)?"enabled":"disabled");
Packit d14fb6
			printf(" - direction: %s\n", (direction)?"Source":"Receiver");
Packit d14fb6
			printf(" - PLL ctrl:  0x%x\n", rsp->data[1]&0x3);
Packit d14fb6
Packit d14fb6
		   if(enabled){
Packit d14fb6
		      unsigned long freq = 0;
Packit d14fb6
		      freq = (  rsp->data[5] <<  0
Packit d14fb6
		              | rsp->data[6] <<  8
Packit d14fb6
		              | rsp->data[7] << 16
Packit d14fb6
		              | rsp->data[8] << 24 );
Packit d14fb6
		      printf("  - Index:  %3d\n", rsp->data[2]);
Packit d14fb6
		      printf("  - Family: %3d [ %s ] \n", rsp->data[3], 
Packit d14fb6
						val2str( rsp->data[3], picmg_clk_family_vals));
Packit d14fb6
		      printf("  - AccLVL: %3d [ %s ] \n", rsp->data[4], 
Packit d14fb6
						oemval2str( rsp->data[3], rsp->data[4],
Packit d14fb6
											picmg_clk_accuracy_vals));
Packit d14fb6
		
Packit d14fb6
		      printf("  - Freq:   %ld\n", freq);
Packit d14fb6
		   }
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_clk_set(struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	struct ipmi_rs * rsp;
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
Packit d14fb6
	unsigned char msg_data[11] = {0};
Packit d14fb6
	uint32_t freq = 0;
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd	  = PICMG_AMC_SET_CLK_STATE_CMD;
Packit d14fb6
	req.msg.data  = msg_data;
Packit d14fb6
Packit d14fb6
	msg_data[0] = 0x00;									/* PICMG identifier	 */
Packit d14fb6
	if (is_clk_id(argv[0], &msg_data[1]) != 0
Packit d14fb6
			|| is_clk_index(argv[1], &msg_data[2]) != 0
Packit d14fb6
			|| is_clk_setting(argv[2], &msg_data[3]) != 0
Packit d14fb6
			|| is_clk_family(argv[3], &msg_data[4]) != 0
Packit d14fb6
			|| is_clk_acc(argv[4], &msg_data[5]) != 0
Packit d14fb6
			|| is_clk_freq(argv[5], &freq) != 0) {
Packit d14fb6
		return (-1);
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	msg_data[6] = (freq >> 0)& 0xFF;		/* freq					 */
Packit d14fb6
	msg_data[7] = (freq >> 8)& 0xFF;		/* freq					 */
Packit d14fb6
	msg_data[8] = (freq >>16)& 0xFF;		/* freq					 */
Packit d14fb6
	msg_data[9] = (freq >>24)& 0xFF;		/* freq					 */
Packit d14fb6
Packit d14fb6
	req.msg.data_len = 10;
Packit d14fb6
   if( PicmgCardType == PICMG_CARD_TYPE_ATCA  )
Packit d14fb6
   {
Packit d14fb6
      if( argc > 7)
Packit d14fb6
      {
Packit d14fb6
         req.msg.data_len = 11;
Packit d14fb6
		 if (is_clk_resid(argv[6], &msg_data[10]) != 0) {
Packit d14fb6
			 return (-1);
Packit d14fb6
		 }
Packit d14fb6
      }
Packit d14fb6
      else
Packit d14fb6
      {
Packit d14fb6
         lprintf(LOG_ERR, "Missing resource id for atca board.");
Packit d14fb6
         return -1;
Packit d14fb6
      }
Packit d14fb6
   }
Packit d14fb6
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
	if (!rsp) {
Packit d14fb6
		lprintf(LOG_ERR, "No valid response received.");
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	if (rsp->ccode) {
Packit d14fb6
		lprintf(LOG_ERR, "Clk set failed with CC code 0x%02x", rsp->ccode);
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
Packit d14fb6
int
Packit d14fb6
ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv)
Packit d14fb6
{
Packit d14fb6
	int rc = 0;
Packit d14fb6
	int showProperties = 0;
Packit d14fb6
Packit d14fb6
	if (argc == 0 || (!strncmp(argv[0], "help", 4))) {
Packit d14fb6
		ipmi_picmg_help();
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	/* Get PICMG properties is called to obtain version information */
Packit d14fb6
	if (argc !=0 && !strncmp(argv[0], "properties", 10)) {
Packit d14fb6
		showProperties =1;
Packit d14fb6
	}
Packit d14fb6
	rc = ipmi_picmg_properties(intf,showProperties);
Packit d14fb6
Packit d14fb6
	/* address info command */
Packit d14fb6
	if (!strncmp(argv[0], "addrinfo", 8)) {
Packit d14fb6
		rc = ipmi_picmg_getaddr(intf, argc-1, &argv[1]);
Packit d14fb6
	}
Packit d14fb6
	else if (!strncmp(argv[0], "busres", 6)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "summary", 7)) {
Packit d14fb6
				ipmi_picmg_bused_resource(intf, PICMG_BUSED_RESOURCE_SUMMARY );
Packit d14fb6
			}
Packit d14fb6
		} else {
Packit d14fb6
			lprintf(LOG_NOTICE, "usage: busres summary");
Packit d14fb6
      }
Packit d14fb6
	}
Packit d14fb6
	/* fru control command */
Packit d14fb6
	else if (!strncmp(argv[0], "frucontrol", 10)) {
Packit d14fb6
		if (argc > 2) {
Packit d14fb6
			rc = ipmi_picmg_fru_control(intf, argc-1, &(argv[1]));
Packit d14fb6
		}
Packit d14fb6
		else {
Packit d14fb6
			lprintf(LOG_NOTICE, "usage: frucontrol <FRU-ID> <OPTION>");
Packit d14fb6
			lprintf(LOG_NOTICE, "   OPTION:");
Packit d14fb6
			lprintf(LOG_NOTICE, "      0      - Cold Reset");
Packit d14fb6
			lprintf(LOG_NOTICE, "      1      - Warm Reset");
Packit d14fb6
			lprintf(LOG_NOTICE, "      2      - Graceful Reboot");
Packit d14fb6
			lprintf(LOG_NOTICE, "      3      - Issue Diagnostic Interrupt");
Packit d14fb6
			lprintf(LOG_NOTICE, "      4      - Quiesce [AMC only]");
Packit d14fb6
			lprintf(LOG_NOTICE, "      5-255  - Reserved");
Packit d14fb6
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	/* fru activation command */
Packit d14fb6
	else if (!strncmp(argv[0], "activate", 8)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			rc = ipmi_picmg_fru_activation(intf, argc-1, &(argv[1]), PICMG_FRU_ACTIVATE);
Packit d14fb6
		}
Packit d14fb6
		else {
Packit d14fb6
			lprintf(LOG_ERR, "Specify the FRU to activate.");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	/* fru deactivation command */
Packit d14fb6
	else if (!strncmp(argv[0], "deactivate", 10)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			rc = ipmi_picmg_fru_activation(intf, argc-1, &(argv[1]), PICMG_FRU_DEACTIVATE);
Packit d14fb6
		}else {
Packit d14fb6
			lprintf(LOG_ERR, "Specify the FRU to deactivate.");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	/* activation policy command */
Packit d14fb6
	else if (!strncmp(argv[0], "policy", 6)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "get", 3)) {
Packit d14fb6
				if (argc > 2) {
Packit d14fb6
					rc = ipmi_picmg_fru_activation_policy_get(intf, argc-1, &(argv[2]));
Packit d14fb6
				} else {
Packit d14fb6
					lprintf(LOG_NOTICE, "usage: get <fruid>");
Packit d14fb6
				}
Packit d14fb6
			} else if (!strncmp(argv[1], "set", 3)) {
Packit d14fb6
				if (argc > 4) {
Packit d14fb6
					rc = ipmi_picmg_fru_activation_policy_set(intf, argc-1, &(argv[2]));
Packit d14fb6
				} else {
Packit d14fb6
					lprintf(LOG_NOTICE, "usage: set <fruid> <lockmask> <lock>");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"    lockmask:  [1] affect the deactivation locked bit");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"               [0] affect the activation locked bit");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"    lock:      [1] set/clear deactivation locked");
Packit d14fb6
					lprintf(LOG_NOTICE, "               [0] set/clear locked");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else {
Packit d14fb6
				lprintf(LOG_ERR, "Specify FRU.");
Packit d14fb6
				return -1;
Packit d14fb6
			}
Packit d14fb6
		} else {
Packit d14fb6
			lprintf(LOG_ERR, "Wrong parameters.");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	/* portstate command */
Packit d14fb6
	else if (!strncmp(argv[0], "portstate", 9)) {
Packit d14fb6
Packit d14fb6
		lprintf(LOG_DEBUG,"PICMG: portstate API");
Packit d14fb6
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "get", 3)) {
Packit d14fb6
				int32_t iface;
Packit d14fb6
				uint8_t channel = 0;
Packit d14fb6
Packit d14fb6
				lprintf(LOG_DEBUG,"PICMG: get");
Packit d14fb6
Packit d14fb6
				if(!strncmp(argv[1], "getall", 6)) {
Packit d14fb6
					for(iface=0;iface<=PICMG_EKEY_MAX_INTERFACE;iface++) {
Packit d14fb6
						for(channel=1;channel<=PICMG_EKEY_MAX_CHANNEL;channel++) {
Packit d14fb6
							if(!(( iface == FRU_PICMGEXT_DESIGN_IF_FABRIC ) &&
Packit d14fb6
							      ( channel > PICMG_EKEY_MAX_FABRIC_CHANNEL ) ))
Packit d14fb6
							{
Packit d14fb6
								rc = ipmi_picmg_portstate_get(intf,iface,channel,
Packit d14fb6
								        PICMG_EKEY_MODE_PRINT_ALL);
Packit d14fb6
							}
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if(!strncmp(argv[1], "getgranted", 10)) {
Packit d14fb6
					for(iface=0;iface<=PICMG_EKEY_MAX_INTERFACE;iface++) {
Packit d14fb6
						for(channel=1;channel<=PICMG_EKEY_MAX_CHANNEL;channel++) {
Packit d14fb6
							rc = ipmi_picmg_portstate_get(intf,iface,channel,
Packit d14fb6
							            PICMG_EKEY_MODE_PRINT_ENABLED);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if(!strncmp(argv[1], "getdenied", 9)){
Packit d14fb6
					for(iface=0;iface<=PICMG_EKEY_MAX_INTERFACE;iface++) {
Packit d14fb6
						for(channel=1;channel<=PICMG_EKEY_MAX_CHANNEL;channel++) {
Packit d14fb6
							rc = ipmi_picmg_portstate_get(intf,iface,channel,
Packit d14fb6
							           PICMG_EKEY_MODE_PRINT_DISABLED);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if (argc > 3){
Packit d14fb6
					if (is_amc_intf(argv[2], &iface) != 0
Packit d14fb6
							|| is_amc_channel(argv[3], &channel) != 0) {
Packit d14fb6
						return (-1);
Packit d14fb6
					}
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: requesting interface %d",iface);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: requesting channel %d",channel);
Packit d14fb6
Packit d14fb6
					rc = ipmi_picmg_portstate_get(intf,iface,channel,
Packit d14fb6
					            PICMG_EKEY_MODE_QUERY );
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "<intf> <chn>|getall|getgranted|getdenied");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "set", 3)) {
Packit d14fb6
					if (argc == 9) {
Packit d14fb6
						int32_t interface = 0;
Packit d14fb6
						int32_t port = 0;
Packit d14fb6
						uint8_t channel = 0;
Packit d14fb6
						uint8_t enable = 0;
Packit d14fb6
						uint8_t group = 0;
Packit d14fb6
						uint8_t type = 0;
Packit d14fb6
						uint8_t typeext = 0;
Packit d14fb6
						if (is_amc_intf(argv[2], &interface) != 0
Packit d14fb6
								|| is_amc_channel(argv[3], &channel) != 0
Packit d14fb6
								|| is_amc_port(argv[4], &port) != 0
Packit d14fb6
								|| is_link_type(argv[5], &type) != 0
Packit d14fb6
								|| is_link_type_ext(argv[6], &typeext) != 0
Packit d14fb6
								|| is_link_group(argv[7], &group) != 0
Packit d14fb6
								|| is_enable(argv[8], &enable) != 0) {
Packit d14fb6
							return (-1);
Packit d14fb6
						}
Packit d14fb6
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: interface %d",interface);
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: channel %d",channel);
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: port %d",port);
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: type %d",type);
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: typeext %d",typeext);
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: group %d",group);
Packit d14fb6
						lprintf(LOG_DEBUG,"PICMG: enable %d",enable);
Packit d14fb6
Packit d14fb6
						rc = ipmi_picmg_portstate_set(intf, interface,
Packit d14fb6
						    channel, port, type, typeext  ,group ,enable);
Packit d14fb6
					}
Packit d14fb6
					else {
Packit d14fb6
						lprintf(LOG_NOTICE,
Packit d14fb6
								"<intf> <chn> <port> <type> <ext> <group> <1|0>");
Packit d14fb6
						return -1;
Packit d14fb6
					}
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
		else {
Packit d14fb6
			lprintf(LOG_NOTICE, "<set>|<getall>|<getgranted>|<getdenied>");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	/* amc portstate command */
Packit d14fb6
	else if (!strncmp(argv[0], "amcportstate", 12)) {
Packit d14fb6
Packit d14fb6
		lprintf(LOG_DEBUG,"PICMG: amcportstate API");
Packit d14fb6
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "get", 3)){
Packit d14fb6
				int32_t device;
Packit d14fb6
				uint8_t channel;
Packit d14fb6
Packit d14fb6
				lprintf(LOG_DEBUG,"PICMG: get");
Packit d14fb6
Packit d14fb6
				if(!strncmp(argv[1], "getall", 6)){
Packit d14fb6
					int maxDevice = PICMG_EKEY_AMC_MAX_DEVICE;
Packit d14fb6
					if( PicmgCardType != PICMG_CARD_TYPE_ATCA ){
Packit d14fb6
						maxDevice = 0;
Packit d14fb6
					}
Packit d14fb6
					for(device=0;device<=maxDevice;device++){
Packit d14fb6
						for(channel=0;channel<=PICMG_EKEY_AMC_MAX_CHANNEL;channel++){
Packit d14fb6
							rc = ipmi_picmg_amc_portstate_get(intf,device,channel,
Packit d14fb6
																	PICMG_EKEY_MODE_PRINT_ALL);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if(!strncmp(argv[1], "getgranted", 10)){
Packit d14fb6
					int maxDevice = PICMG_EKEY_AMC_MAX_DEVICE;
Packit d14fb6
					if( PicmgCardType != PICMG_CARD_TYPE_ATCA ){
Packit d14fb6
						maxDevice = 0;
Packit d14fb6
					}
Packit d14fb6
					for(device=0;device<=maxDevice;device++){
Packit d14fb6
						for(channel=0;channel<=PICMG_EKEY_AMC_MAX_CHANNEL;channel++){
Packit d14fb6
							rc = ipmi_picmg_amc_portstate_get(intf,device,channel,
Packit d14fb6
																  PICMG_EKEY_MODE_PRINT_ENABLED);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if(!strncmp(argv[1], "getdenied", 9)){
Packit d14fb6
					int maxDevice = PICMG_EKEY_AMC_MAX_DEVICE;
Packit d14fb6
					if( PicmgCardType != PICMG_CARD_TYPE_ATCA ){
Packit d14fb6
						maxDevice = 0;
Packit d14fb6
					}
Packit d14fb6
					for(device=0;device<=maxDevice;device++){
Packit d14fb6
						for(channel=0;channel<=PICMG_EKEY_AMC_MAX_CHANNEL;channel++){
Packit d14fb6
							rc = ipmi_picmg_amc_portstate_get(intf,device,channel,
Packit d14fb6
                                                 PICMG_EKEY_MODE_PRINT_DISABLED);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if (argc > 2){
Packit d14fb6
					if (is_amc_channel(argv[2], &channel) != 0) {
Packit d14fb6
						return (-1);
Packit d14fb6
					}
Packit d14fb6
					if (argc > 3){
Packit d14fb6
						if (is_amc_dev(argv[3], &device) != 0) {
Packit d14fb6
							return (-1);
Packit d14fb6
						}
Packit d14fb6
					}else{
Packit d14fb6
					   device = -1;
Packit d14fb6
				    }
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: requesting device %d",device);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: requesting channel %d",channel);
Packit d14fb6
Packit d14fb6
					rc = ipmi_picmg_amc_portstate_get(intf,device,channel,
Packit d14fb6
                                             PICMG_EKEY_MODE_QUERY );
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "<chn> <device>|getall|getgranted|getdenied");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "set", 3)) {
Packit d14fb6
				if (argc > 7) {
Packit d14fb6
					int32_t device = -1;
Packit d14fb6
					int32_t port = 0;
Packit d14fb6
					uint8_t channel = 0;
Packit d14fb6
					uint8_t enable = 0;
Packit d14fb6
					uint8_t group = 0;
Packit d14fb6
					uint8_t type = 0;
Packit d14fb6
					uint8_t typeext = 0;
Packit d14fb6
					if (is_amc_channel(argv[2], &channel) != 0
Packit d14fb6
							|| is_amc_port(argv[3], &port) != 0
Packit d14fb6
							|| is_link_type(argv[4], &type) !=0
Packit d14fb6
							|| is_link_type_ext(argv[5], &typeext) != 0
Packit d14fb6
							|| is_link_group(argv[6], &group) != 0
Packit d14fb6
							|| is_enable(argv[7], &enable) != 0) {
Packit d14fb6
						return (-1);
Packit d14fb6
					}
Packit d14fb6
					if(argc > 8){
Packit d14fb6
						if (is_amc_dev(argv[8], &device) != 0) {
Packit d14fb6
							return (-1);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: channel %d",channel);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: portflags %d",port);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: type %d",type);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: typeext %d",typeext);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: group %d",group);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: enable %d",enable);
Packit d14fb6
					lprintf(LOG_DEBUG,"PICMG: device %d",device);
Packit d14fb6
Packit d14fb6
					rc = ipmi_picmg_amc_portstate_set(intf, channel, port, type,
Packit d14fb6
                                               typeext, group, enable, device);
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"<chn> <portflags> <type> <ext> <group> <1|0> [<device>]");
Packit d14fb6
					return -1;
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
		else {
Packit d14fb6
			lprintf(LOG_NOTICE, "<set>|<get>|<getall>|<getgranted>|<getdenied>");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	/* ATCA led commands */
Packit d14fb6
	else if (!strncmp(argv[0], "led", 3)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "prop", 4)) {
Packit d14fb6
				if (argc > 2) {
Packit d14fb6
					rc = ipmi_picmg_get_led_properties(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "led prop <FRU-ID>");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "cap", 3)) {
Packit d14fb6
				if (argc > 3) {
Packit d14fb6
					rc = ipmi_picmg_get_led_capabilities(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "led cap <FRU-ID> <LED-ID>");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "get", 3)) {
Packit d14fb6
				if (argc > 3) {
Packit d14fb6
					rc = ipmi_picmg_get_led_state(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "led get <FRU-ID> <LED-ID>");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "set", 3)) {
Packit d14fb6
				if (argc > 6) {
Packit d14fb6
					rc = ipmi_picmg_set_led_state(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"led set <FRU-ID> <LED-ID> <function> <duration> <color>");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <FRU-ID>");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <LED-ID>    0:         Blue LED");
Packit d14fb6
					lprintf(LOG_NOTICE, "               1:         LED 1");
Packit d14fb6
					lprintf(LOG_NOTICE, "               2:         LED 2");
Packit d14fb6
					lprintf(LOG_NOTICE, "               3:         LED 3");
Packit d14fb6
					lprintf(LOG_NOTICE, "               0x04-0xFE: OEM defined");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"               0xFF:      All LEDs under management control");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <function>  0:       LED OFF override");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"               1 - 250: LED blinking override (off duration)");
Packit d14fb6
					lprintf(LOG_NOTICE, "               251:     LED Lamp Test");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"               252:     LED restore to local control");
Packit d14fb6
					lprintf(LOG_NOTICE, "               255:     LED ON override");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <duration>  0 - 127: LED Lamp Test duration");
Packit d14fb6
					lprintf(LOG_NOTICE, "               0 - 255: LED Lamp ON duration");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <color>     0:   reserved");
Packit d14fb6
					lprintf(LOG_NOTICE, "               1:   BLUE");
Packit d14fb6
					lprintf(LOG_NOTICE, "               2:   RED");
Packit d14fb6
					lprintf(LOG_NOTICE, "               3:   GREEN");
Packit d14fb6
					lprintf(LOG_NOTICE, "               4:   AMBER");
Packit d14fb6
					lprintf(LOG_NOTICE, "               5:   ORANGE");
Packit d14fb6
					lprintf(LOG_NOTICE, "               6:   WHITE");
Packit d14fb6
					lprintf(LOG_NOTICE, "               7:   reserved");
Packit d14fb6
					lprintf(LOG_NOTICE, "               0xE: do not change");
Packit d14fb6
					lprintf(LOG_NOTICE, "               0xF: use default color");
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else {
Packit d14fb6
				lprintf(LOG_NOTICE, "prop | cap | get | set");
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
	/* power commands */
Packit d14fb6
	else if (!strncmp(argv[0], "power", 5)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "get", 3)) {
Packit d14fb6
				if (argc > 3) {
Packit d14fb6
					rc = ipmi_picmg_get_power_level(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "power get <FRU-ID> <type>");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <type>   0 : steady state power draw levels");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"            1 : desired steady state draw levels");
Packit d14fb6
					lprintf(LOG_NOTICE, "            2 : early power draw levels");
Packit d14fb6
					lprintf(LOG_NOTICE, "            3 : desired early levels");
Packit d14fb6
Packit d14fb6
					return -1;
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "set", 3)) {
Packit d14fb6
				if (argc > 4) {
Packit d14fb6
					rc = ipmi_picmg_set_power_level(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "power set <FRU-ID> <level> <present-desired>");
Packit d14fb6
					lprintf(LOG_NOTICE, "   <level>  0 :        Power Off");
Packit d14fb6
					lprintf(LOG_NOTICE, "            0x1-0x14 : Power level");
Packit d14fb6
					lprintf(LOG_NOTICE, "            0xFF :     do not change");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"\n   <present-desired> 0: do not change present levels");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"                     1: copy desired to present level");
Packit d14fb6
Packit d14fb6
					return -1;
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else {
Packit d14fb6
				lprintf(LOG_NOTICE, "<set>|<get>");
Packit d14fb6
				return -1;
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
		else {
Packit d14fb6
			lprintf(LOG_NOTICE, "<set>|<get>");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}/* clk commands*/
Packit d14fb6
	else if (!strncmp(argv[0], "clk", 3)) {
Packit d14fb6
		if (argc > 1) {
Packit d14fb6
			if (!strncmp(argv[1], "get", 3)) {
Packit d14fb6
				int8_t clk_res = -1;            
Packit d14fb6
				uint8_t clk_id;
Packit d14fb6
				uint8_t max_res = 15;
Packit d14fb6
Packit d14fb6
				if( PicmgCardType == PICMG_CARD_TYPE_AMC ) {
Packit d14fb6
					max_res = 0;
Packit d14fb6
				}
Packit d14fb6
Packit d14fb6
				if(!strncmp(argv[1], "getall", 6)) {
Packit d14fb6
					if( verbose ) { printf("Getting all clock state\n") ;}	
Packit d14fb6
					for(clk_res=0;clk_res<=max_res;clk_res++) {
Packit d14fb6
						for(clk_id=0;clk_id<=15;clk_id++) {
Packit d14fb6
								rc = ipmi_picmg_clk_get(intf,clk_id,clk_res,
Packit d14fb6
								        PICMG_EKEY_MODE_PRINT_ALL);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if(!strncmp(argv[1], "getdenied", 6)) {
Packit d14fb6
					if( verbose ) { printf("Getting disabled clocks\n") ;}	
Packit d14fb6
					for(clk_res=0;clk_res<=max_res;clk_res++) {
Packit d14fb6
						for(clk_id=0;clk_id<=15;clk_id++) {
Packit d14fb6
								rc = ipmi_picmg_clk_get(intf,clk_id,clk_res,
Packit d14fb6
								        PICMG_EKEY_MODE_PRINT_DISABLED);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if(!strncmp(argv[1], "getgranted", 6)) {
Packit d14fb6
					if( verbose ) { printf("Getting enabled clocks\n") ;}	
Packit d14fb6
					for(clk_res=0;clk_res<=max_res;clk_res++) {
Packit d14fb6
						for(clk_id=0;clk_id<=15;clk_id++) {
Packit d14fb6
								rc = ipmi_picmg_clk_get(intf,clk_id,clk_res,
Packit d14fb6
								        PICMG_EKEY_MODE_PRINT_ENABLED);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
				}
Packit d14fb6
				else if (argc > 2) {
Packit d14fb6
					if (is_clk_id(argv[2], &clk_id) != 0) {
Packit d14fb6
						return (-1);
Packit d14fb6
					}
Packit d14fb6
					if (argc > 3) {
Packit d14fb6
						if (is_clk_resid(argv[3], &clk_res) != 0) {
Packit d14fb6
							return (-1);
Packit d14fb6
						}
Packit d14fb6
					}
Packit d14fb6
Packit d14fb6
					rc = ipmi_picmg_clk_get(intf, clk_id, clk_res,
Packit d14fb6
							PICMG_EKEY_MODE_QUERY );
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE, "clk get");
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"<CLK-ID> [<DEV-ID>] |getall|getgranted|getdenied");
Packit d14fb6
					return -1;
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else if (!strncmp(argv[1], "set", 3)) {
Packit d14fb6
				if (argc > 7) {
Packit d14fb6
					rc = ipmi_picmg_clk_set(intf, argc-1, &(argv[2]));
Packit d14fb6
				}
Packit d14fb6
				else {
Packit d14fb6
					lprintf(LOG_NOTICE,
Packit d14fb6
							"clk set <CLK-ID> <index> <setting> <family> <acc-lvl> <freq> [<DEV-ID>]");
Packit d14fb6
Packit d14fb6
					return -1;
Packit d14fb6
				}
Packit d14fb6
			}
Packit d14fb6
			else {
Packit d14fb6
				lprintf(LOG_NOTICE, "<set>|<get>|<getall>|<getgranted>|<getdenied>");
Packit d14fb6
				return -1;
Packit d14fb6
			}
Packit d14fb6
		}
Packit d14fb6
		else {
Packit d14fb6
			lprintf(LOG_NOTICE, "<set>|<get>|<getall>|<getgranted>|<getdenied>");
Packit d14fb6
			return -1;
Packit d14fb6
		}
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	else if(showProperties == 0 ){
Packit d14fb6
Packit d14fb6
		ipmi_picmg_help();
Packit d14fb6
		return -1;
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return rc;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
uint8_t
Packit d14fb6
ipmi_picmg_ipmb_address(struct ipmi_intf *intf) {
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
	struct ipmi_rs *rsp;
Packit d14fb6
	uint8_t msg_data;
Packit d14fb6
Packit d14fb6
	if (!intf->picmg_avail) {
Packit d14fb6
		return 0;
Packit d14fb6
	}
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd = PICMG_GET_ADDRESS_INFO_CMD;
Packit d14fb6
	msg_data    = 0x00;
Packit d14fb6
	req.msg.data = &msg_data;
Packit d14fb6
	req.msg.data_len = 1;
Packit d14fb6
	msg_data = 0;
Packit d14fb6
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
	if (rsp && !rsp->ccode) {
Packit d14fb6
		return rsp->data[2];
Packit d14fb6
	}
Packit d14fb6
	if (rsp) {
Packit d14fb6
		lprintf(LOG_DEBUG, "Get Address Info failed: %#x %s",
Packit d14fb6
			rsp->ccode, val2str(rsp->ccode, completion_code_vals));
Packit d14fb6
	} else {
Packit d14fb6
		lprintf(LOG_DEBUG, "Get Address Info failed: No Response");
Packit d14fb6
	}
Packit d14fb6
	return 0;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
uint8_t
Packit d14fb6
picmg_discover(struct ipmi_intf *intf) {
Packit d14fb6
	/* Check if PICMG extension is available to use the function 
Packit d14fb6
	 * GetDeviceLocator to retreive i2c address PICMG hack to set 
Packit d14fb6
	 * right IPMB address, If extension is not supported, should 
Packit d14fb6
	 * not give any problems
Packit d14fb6
	 *  PICMG Extension Version 2.0 (PICMG 3.0 Revision 1.0 ATCA) to
Packit d14fb6
	 *  PICMG Extension Version 2.3 (PICMG 3.0 Revision 3.0 ATCA)
Packit d14fb6
	 *  PICMG Extension Version 4.1 (PICMG 3.0 Revision 3.0 AMC)
Packit d14fb6
	 *  PICMG Extension Version 5.0 (MTCA.0 R1.0)
Packit d14fb6
	 */
Packit d14fb6
Packit d14fb6
	/* First, check if PICMG extension is available and supported */
Packit d14fb6
	struct ipmi_rq req;
Packit d14fb6
	struct ipmi_rs *rsp;
Packit d14fb6
	uint8_t msg_data;
Packit d14fb6
	uint8_t picmg_avail = 0;
Packit d14fb6
Packit d14fb6
	memset(&req, 0, sizeof(req));
Packit d14fb6
	req.msg.netfn = IPMI_NETFN_PICMG;
Packit d14fb6
	req.msg.cmd = PICMG_GET_PICMG_PROPERTIES_CMD;
Packit d14fb6
	msg_data    = 0x00;
Packit d14fb6
	req.msg.data = &msg_data;
Packit d14fb6
	req.msg.data_len = 1;
Packit d14fb6
	msg_data = 0;
Packit d14fb6
Packit d14fb6
	lprintf(LOG_INFO, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x",
Packit d14fb6
		intf->my_addr, intf->transit_addr, intf->target_addr);
Packit d14fb6
	rsp = intf->sendrecv(intf, &req;;
Packit d14fb6
	if (rsp == NULL) {
Packit d14fb6
	    lprintf(LOG_INFO,"No response from Get PICMG Properties");
Packit d14fb6
	} else if (rsp->ccode != 0) {
Packit d14fb6
	    lprintf(LOG_INFO,"Error response %#x from Get PICMG Properities",
Packit d14fb6
		    rsp->ccode);
Packit d14fb6
	} else if (rsp->data_len < 4) {
Packit d14fb6
	    lprintf(LOG_INFO,"Invalid Get PICMG Properties response length %d",
Packit d14fb6
		    rsp->data_len);
Packit d14fb6
	} else if (rsp->data[0] != 0) {
Packit d14fb6
	    lprintf(LOG_INFO,"Invalid Get PICMG Properties group extension %#x",
Packit d14fb6
		    rsp->data[0]);
Packit d14fb6
	} else if ((rsp->data[1] & 0x0F) != PICMG_EXTENSION_ATCA_MAJOR_VERSION
Packit d14fb6
		&& (rsp->data[1] & 0x0F) != PICMG_EXTENSION_AMC0_MAJOR_VERSION
Packit d14fb6
		&& (rsp->data[1] & 0x0F) != PICMG_EXTENSION_UTCA_MAJOR_VERSION) {
Packit d14fb6
	    lprintf(LOG_INFO,"Unknown PICMG Extension Version %d.%d",
Packit d14fb6
		    (rsp->data[1] & 0x0F), (rsp->data[1] >> 4));
Packit d14fb6
	} else {
Packit d14fb6
	    picmg_avail = 1;
Packit d14fb6
	    lprintf(LOG_INFO, "Discovered PICMG Extension Version %d.%d",
Packit d14fb6
		    (rsp->data[1] & 0x0f), (rsp->data[1] >> 4));
Packit d14fb6
	}
Packit d14fb6
Packit d14fb6
	return picmg_avail;
Packit d14fb6
}