/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_SMC_COMMANDS_H
#define	_SYS_SMC_COMMANDS_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

/* Address of BMC on IPMB */
#define	BMC_IPMB_ADDR	0x20
#define	SMC_CPCI_SLOT0_ADDR	0xB0
#define	SMC_CPCI_SLOT_ADDR(X)	(SMC_CPCI_SLOT0_ADDR + \
		2 * ((X) - 1))

typedef struct ctsmc_code_ent {
	uint8_t code;
	char	*name;
} ctsmc_code_ent_t;

/*
 * Definition of Network Function Codes
 */
typedef enum {
	SMC_NETFN_CHASSIS_REQ = 0x0,
	SMC_NETFN_CHASSIS_RSP = 0x1,
	SMC_NETFN_BRIDGE_REQ = 0x2,
	SMC_NETFN_BRIDGE_RSP = 0x3,
	SMC_NETFN_SENSOR_REQ = 0x4,
	SMC_NETFN_SENSOR_RSP = 0x5,
	SMC_NETFN_APP_REQ = 0x6,
	SMC_NETFN_APP_RSP = 0x7,
	SMC_NETFN_FIRMWARE_REQ = 0x8,
	SMC_NETFN_FIRMWARE_RSP = 0x9,
	SMC_NETFN_STORAGE_REQ = 0xA,
	SMC_NETFN_STORAGE_RSP = 0xB
} smc_netfn_t;

/*
 * Definition of Completion codes
 */
typedef enum {
	SMC_CC_SUCCESS	 = 0x00,
	SMC_CC_NODE_BUSY = 0xC0,
	SMC_CC_INVALID_COMMAND = 0xC1,
	SMC_CC_INVALID_COMMAND_ON_LUN = 0xC2,
	SMC_CC_TIMEOUT = 0xC3,
	SMC_CC_RESOURCE_NOTAVAIL = 0xC4,
	SMC_CC_RESERVATION = 0xC5,
	SMC_CC_REQ_TRUNC = 0xC6,
	SMC_CC_REQLEN_NOTVALID = 0xC7,
	SMC_CC_REQLEN_EXCEED = 0xC8,
	SMC_CC_PARAM_OUT_OF_RANGE = 0xC9,
	SMC_CC_REQUEST_BYTES_FAILED = 0xCA,
	SMC_CC_NOT_PRESENT = 0xCB,
	SMC_CC_INVALID_FIELD = 0xCC,
	SMC_CC_ILLEGAL_COMMAND = 0xCD,
	SMC_CC_RESPONSE_FAILED = 0xCE,
	SMC_CC_DUPLICATE_REQUEST = 0xCF,
	SMC_CC_SDR_UPDATE_MODE = 0xD0,
	SMC_CC_FIRMWARE_UPDATE_MODE = 0xD1,
	SMC_CC_INIT_IN_PROGRESS = 0xD2,
	SMC_CC_UNSPECIFIED_ERROR = 0xFF
} smc_cc_t;

typedef enum {
	SMC_BMC_LUN,
	SMC_OEM1_LUN,
	SMC_SMS_LUN,
	SMC_OEM2_LUN
} smc_lun_t;

/*
 * App command codes for commands/event notifications etc.
 */
typedef enum {
	SMC_GET_DEVICE_ID = 0x01,
	SMC_COLD_RESET = 0x02,
	SMC_WARM_RESET = 0x03,
	SMC_GET_SELFTEST_RESULTS = 0x04,
	SMC_MANUFACTURING_TEST_ON = 0x05,
	SMC_SET_ACPI_POWER_STATE = 0x06,
	SMC_GET_ACPI_POWER_STATE = 0x07,
	SMC_GET_DEVICE_GUID = 0x08,
	SMC_RESET_WATCHDOG_TIMER = 0x22,
	SMC_EXPIRED_WATCHDOG_NOTIF = 0x23,	/* Sent by driver */
	SMC_SET_WATCHDOG_TIMER = 0x24,
	SMC_GET_WATCHDOG_TIMER = 0x25,
	SMC_SET_GLOBAL_ENABLES = 0x2E,
	SMC_GET_GLOBAL_ENABLES = 0x2F,
	SMC_CLEAR_MESSAGE_FLAGS = 0x30,
	SMC_GET_MESSAGE_FLAGS = 0x31,
	SMC_ENABLE_MESSAGE_CHANNEL_RECEIVE = 0x32,
	SMC_GET_MESSAGE = 0x33,
	SMC_SEND_MESSAGE = 0x34,
	SMC_READ_EVENT_MSG_BUFFER = 0x35,
	SMC_SEND_TO_EVENT_MSG_BUFFER = 0x36,	/* Changed from IPMI */
	SMC_MASTER_WR_RD_I2C = 0x52,
	SMC_GET_GEOGRAPHICAL_ADDRESS = 0x55,
	SMC_GET_BACKPLANE_TYPE = 0x57,
	SMC_SELECT_MEMORY_DEVICE = 0x60,
	SMC_READ_SELECTED_MEMORY_DEVICE = 0x61,
	SMC_READ_MEMORY_DEVICE = 0x62,
	SMC_WRITE_SELECTED_MEMORY_DEVICE = 0x63,
	SMC_WRITE_MEMORY_DEVICE = 0x64,
	SMC_ERASE_SELECTED_MEMORY_DEVICE = 0x65,
	SMC_LOCK_UNLOCK_SELECTED_MEMORY = 0x66,
	SMC_COMPUTE_CRC16_OF_SELECTED_MEMORY_DEVICE = 0x67,
	SMC_COMPUTE_CRC16_OF_MEMORY_DEVICE = 0x68,
	SMC_FILL_MEMORY_DEVICE = 0x6a,
	SMC_QUERY_FIRMWARE_VERSION = 0x6f,
	SMC_RESET_DEVICE = 0x70,
	SMC_GET_ROLE_INFO = 0x71,
	SMC_GET_FLASH_AND_BOOT_VERSION = 0x72,
	SMC_GET_LOCAL_HA_SIGNAL_STATUS = 0x73,
	SMC_SELECT_HA_HOTSWAP_MODE = 0x80,
	SMC_GET_HA_HOTSWAP_SIGNAL_STATE = 0x81,
	SMC_SET_HA_HOTSWAP_SIGNAL_STATE = 0x82,
	SMC_NOTIFY_SMC_OF_HOST_HEALTH = 0x83,
	SMC_TURN_ON_OFF_BLUE_LED = 0x84,
	SMC_GET_EXECUTION_STATE = 0x85,
	SMC_GET_SMC_UPTIME = 0x86,
	SMC_ENUM_NOTIF = 0x87,
	SMC_IPMI_RESPONSE_NOTIF = 0x88,
	SMC_SET_INTERFACE_TIMEOUT = 0x89,
	SMC_GET_INTERFACE_TIMEOUT = 0x8A,
	SMC_SMC_LOCAL_EVENT_NOTIF = 0x8B,
	SMC_GET_DEVICE_TABLE_DATA = 0x8C,
	SMC_IPMI_MASTER_WR_RD_I2C = 0x90,
	SMC_GET_SMC_SELF_TEST_RESULT = 0xA0,
	SMC_READ_SMC_PLD_REGISTER = 0xA1,
	SMC_WRITE_SMC_PLD_REGISTER = 0xA2,
	SMC_SET_ROLE = 0xC0,
	SMC_SET_CPCI_INTMASK = 0xC1,
	SMC_GET_CPCI_INTMASK = 0xC2,
	SMC_EEPROM_WRITE = 0xC3,
	SMC_EEPROM_READ = 0xC4,
	SMC_SET_STATE = 0xDE,
	SMC_GET_STATE = 0xDF,
	SMC_SET_DHCP_CLIENT_ID = 0xE1,
	SMC_GET_DHCP_CLIENT_ID = 0xE2,
	SMC_DEV_SDR_REPOSITORY_RESERVE = 0xE3,
	SMC_FRU_INVENTORY_AREA_INFO_GET = 0xE4,
	SMC_SET_BANNER = 0xE5,
	SMC_GET_BANNER = 0xE6,
	SMC_SEND_ASYNC_SEL_CMD_TO_HOST = 0xE7,
	SMC_MASTER_WR_RD_I2C_2 = 0xE9,
	SMC_GET_BUFFER_BLOCK_ALLOC_TABLE = 0xEA,
	SMC_GET_BUFFER_ALLOC_TABLE = 0xEB,
	SMC_GET_SFRS = 0xEC,
	SMC_GET_PORT_VALUE = 0xED,
	SMC_GET_BUFFER_DATA = 0xEE,
	SMC_GET_PCB_DATA = 0xEF,
	SMC_GET_PCB_BLOCK_ALLOC_TABLE = 0xF0,
	SMC_GET_PCB_TABLE = 0xF1,
	SMC_DEVICE_SDR_INFO_GET = 0xF2,
	SMC_DEVICE_SDR_GET = 0xF3,
	SMC_SENSOR_EVENT_ENABLE_GET = 0xF4,
	SMC_SENSOR_EVENT_ENABLE_SET = 0xF5,
	SMC_GET_CONFIG_BLOCK = 0xF8,
	SMC_SET_CONFIG_BLOCK = 0xF9,
	SMC_SET_VOLTAGE = 0xFB,
	SMC_SENSOR_READING_GET = 0xFC,
	SMC_SENSOR_THRESHOLD_GET = 0xFD,
	SMC_SENSOR_THRESHOLD_SET = 0xFE,
	SMC_CND_OF_CMD_MARKER = 0xFF
} smc_app_command_t;

typedef enum {
	SMC_GET_CHASSIS_STATUS = 0x01,
	SMC_CHASSIS_CONTROL = 0x02,
	SMC_GET_POH_COUNTER = 0x0F
} smc_chassis_command_t;

typedef enum {
	SMC_SET_EVENT_RECEIVER = 0x00,
	SMC_GET_EVENT_RECEIVER = 0x01,
	SMC_PLATFORM_EVENT_MESSAGE = 0x02
} smc_event_command_t;

typedef enum {
	SMC_GET_SEL_INFO = 0x40,
	SMC_GET_SEL_ALLOCATION_INFO = 0x41,
	SMC_RESERVE_SEL = 0x42,
	SMC_GET_SEL_ENTRY = 0x43,
	SMC_ADD_SEL_ENTRY = 0x44,
	SMC_PARTIAL_ADD_SEL_ENTRY = 0x45,
	SMC_DELETE_SEL_ENTRY = 0x46,
	SMC_CLEAR_SEL = 0x47,
	SMC_GET_SEL_TIME = 0x48,
	SMC_SET_SEL_TIME = 0x49
} smc_sel_command_t;

typedef enum {
	SMC_GET_SDR_REPOSITORY_INFO = 0x20,
	SMC_GET_SDR_REPOSITORY_ALLOCATION_INFO = 0x21,
	SMC_RESERVE_SDR_REPOSITORY = 0x22,
	SMC_GET_SDR = 0x23,
	SMC_ADD_SDR = 0x24,
	SMC_PARTIAL_ADD_SDR = 0x25,
	SMC_DELETE_SDR = 0x26,
	SMC_CLEAR_SDR_REPOSITORY = 0x27,
	SMC_GET_SDR_REPOSITORY_TIME = 0x28,
	SMC_SET_SDR_REPOSITORY_TIME = 0x29,
	SMC_ENTER_SDR_REPOSITORY_UPDATE_MODE = 0x2A,
	SMC_EXIT_SDR_REPOSITORY_UPDATE_MODE = 0x2B,
	SMC_RUN_INITIALIZATION_AGENT = 0x2C
} smc_sdr_repository_command_t;

typedef enum {
	SMC_GET_FRU_INVENTORY_AREA_INFO = 0x10,
	SMC_READ_FRU_INVENTORY_DATA = 0x11,
	SMC_WRITE_FRU_INVENTORY_DATA = 0x12
} smc_fru_inventory_device_command_t;

typedef enum {
	SMC_GET_DEVICE_SDR_INFO = 0x20,
	SMC_GET_DEVICE_SDR = 0x21,
	SMC_RESERVE_DEVICE_SDR_REPOSITORY = 0x22,
	SMC_GET_SENSOR_READING_FACTORS = 0x23,
	SMC_SET_SENSOR_HYSTERESIS = 0x24,
	SMC_GET_SENSOR_HYSTERESIS = 0x25,
	SMC_SET_SENSOR_THRESHOLD = 0x26,
	SMC_GET_SENSOR_THRESHOLD = 0x27,
	SMC_SET_SENSOR_EVENT_ENABLE = 0x28,
	SMC_GET_SENSOR_EVENT_ENABLE = 0x29,
	SMC_REARM_SENSOR_EVENTS = 0x2A,
	SMC_GET_SENSOR_EVENT_STATUS = 0x2B,
	/* RESERVED */
	SMC_GET_SENSOR_READING = 0x2D,
	SMC_SET_SENSOR_TYPE = 0x2E,
	SMC_GET_SENSOR_TYPE = 0x2F
} smc_sensor_device_command_t;

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_SMC_COMMANDS_H */