root/usr/src/uts/common/io/qede/579xx/hsi/hw/init_tool_hsi.h
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, v.1,  (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://opensource.org/licenses/CDDL-1.0.
* 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 2014-2017 Cavium, Inc. 
* The contents of this file are subject to the terms of the Common Development 
* and Distribution License, v.1,  (the "License").

* You may not use this file except in compliance with the License.

* You can obtain a copy of the License at available 
* at http://opensource.org/licenses/CDDL-1.0

* See the License for the specific language governing permissions and 
* limitations under the License.
*/

#ifndef __ECORE_HSI_TOOLS__
#define __ECORE_HSI_TOOLS__ 

/**********************************/
/* Tools HSI constants and macros */
/**********************************/

/* Width of GRC address in bits (addresses are specified in dwords) */
#define GRC_ADDR_BITS                   23
#define MAX_GRC_ADDR                    ((1 << GRC_ADDR_BITS) - 1)

/* indicates an init that should be applied to any phase ID */
#define ANY_PHASE_ID                    0xffff

/* init pattern size in bytes */
#define INIT_PATTERN_SIZE_BITS  4
#define MAX_INIT_PATTERN_SIZE   (1 << INIT_PATTERN_SIZE_BITS)

/* Max size in dwords of a zipped array */
#define MAX_ZIPPED_SIZE                 8192

/* Global PXP window */
#define NUM_OF_PXP_WIN                  19
#define PXP_WIN_DWORD_SIZE_BITS 10
#define PXP_WIN_DWORD_SIZE              (1 << PXP_WIN_DWORD_SIZE_BITS)
#define PXP_WIN_BYTE_SIZE_BITS  (PXP_WIN_DWORD_SIZE_BITS + 2)
#define PXP_WIN_BYTE_SIZE               (PXP_WIN_DWORD_SIZE * 4)


/*
 * Binary buffer header
 */
struct bin_buffer_hdr
{
        __le32 offset /* buffer offset in bytes from the beginning of the binary file */;
        __le32 length /* buffer length in bytes */;
};


/*
 * binary buffer types
 */
enum bin_buffer_type
{
        BIN_BUF_FW_VER_INFO /* fw_ver_info struct */,
        BIN_BUF_INIT_CMD /* init commands */,
        BIN_BUF_INIT_VAL /* init data */,
        BIN_BUF_INIT_MODE_TREE /* init modes tree */,
        BIN_BUF_IRO /* internal RAM offsets array */,
        MAX_BIN_BUFFER_TYPE
};


/*
 * init array header: raw
 */
struct init_array_raw_hdr
{
        __le32 data;
#define INIT_ARRAY_RAW_HDR_TYPE_MASK    0xF /* Init array type, from init_array_types enum */
#define INIT_ARRAY_RAW_HDR_TYPE_SHIFT   0
#define INIT_ARRAY_RAW_HDR_PARAMS_MASK  0xFFFFFFF /* init array params */
#define INIT_ARRAY_RAW_HDR_PARAMS_SHIFT 4
};


/*
 * init array header: standard
 */
struct init_array_standard_hdr
{
        __le32 data;
#define INIT_ARRAY_STANDARD_HDR_TYPE_MASK  0xF /* Init array type, from init_array_types enum */
#define INIT_ARRAY_STANDARD_HDR_TYPE_SHIFT 0
#define INIT_ARRAY_STANDARD_HDR_SIZE_MASK  0xFFFFFFF /* Init array size (in dwords) */
#define INIT_ARRAY_STANDARD_HDR_SIZE_SHIFT 4
};


/*
 * init array header: zipped
 */
struct init_array_zipped_hdr
{
        __le32 data;
#define INIT_ARRAY_ZIPPED_HDR_TYPE_MASK         0xF /* Init array type, from init_array_types enum */
#define INIT_ARRAY_ZIPPED_HDR_TYPE_SHIFT        0
#define INIT_ARRAY_ZIPPED_HDR_ZIPPED_SIZE_MASK  0xFFFFFFF /* Init array zipped size (in bytes) */
#define INIT_ARRAY_ZIPPED_HDR_ZIPPED_SIZE_SHIFT 4
};


/*
 * init array header: pattern
 */
struct init_array_pattern_hdr
{
        __le32 data;
#define INIT_ARRAY_PATTERN_HDR_TYPE_MASK          0xF /* Init array type, from init_array_types enum */
#define INIT_ARRAY_PATTERN_HDR_TYPE_SHIFT         0
#define INIT_ARRAY_PATTERN_HDR_PATTERN_SIZE_MASK  0xF /* pattern size in dword */
#define INIT_ARRAY_PATTERN_HDR_PATTERN_SIZE_SHIFT 4
#define INIT_ARRAY_PATTERN_HDR_REPETITIONS_MASK   0xFFFFFF /* pattern repetitions */
#define INIT_ARRAY_PATTERN_HDR_REPETITIONS_SHIFT  8
};


/*
 * init array header union
 */
union init_array_hdr
{
        struct init_array_raw_hdr raw /* raw init array header */;
        struct init_array_standard_hdr standard /* standard init array header */;
        struct init_array_zipped_hdr zipped /* zipped init array header */;
        struct init_array_pattern_hdr pattern /* pattern init array header */;
};


/*
 * init array types
 */
enum init_array_types
{
        INIT_ARR_STANDARD /* standard init array */,
        INIT_ARR_ZIPPED /* zipped init array */,
        INIT_ARR_PATTERN /* a repeated pattern */,
        MAX_INIT_ARRAY_TYPES
};


/*
 * init operation: callback
 */
struct init_callback_op
{
        __le32 op_data;
#define INIT_CALLBACK_OP_OP_MASK        0xF /* Init operation, from init_op_types enum */
#define INIT_CALLBACK_OP_OP_SHIFT       0
#define INIT_CALLBACK_OP_RESERVED_MASK  0xFFFFFFF
#define INIT_CALLBACK_OP_RESERVED_SHIFT 4
        __le16 callback_id /* Callback ID */;
        __le16 block_id /* Blocks ID */;
};


/*
 * init operation: delay
 */
struct init_delay_op
{
        __le32 op_data;
#define INIT_DELAY_OP_OP_MASK        0xF /* Init operation, from init_op_types enum */
#define INIT_DELAY_OP_OP_SHIFT       0
#define INIT_DELAY_OP_RESERVED_MASK  0xFFFFFFF
#define INIT_DELAY_OP_RESERVED_SHIFT 4
        __le32 delay /* delay in us */;
};


/*
 * init operation: if_mode
 */
struct init_if_mode_op
{
        __le32 op_data;
#define INIT_IF_MODE_OP_OP_MASK          0xF /* Init operation, from init_op_types enum */
#define INIT_IF_MODE_OP_OP_SHIFT         0
#define INIT_IF_MODE_OP_RESERVED1_MASK   0xFFF
#define INIT_IF_MODE_OP_RESERVED1_SHIFT  4
#define INIT_IF_MODE_OP_CMD_OFFSET_MASK  0xFFFF /* Commands to skip if the modes dont match */
#define INIT_IF_MODE_OP_CMD_OFFSET_SHIFT 16
        __le16 reserved2;
        __le16 modes_buf_offset /* offset (in bytes) in modes expression buffer */;
};


/*
 * init operation: if_phase
 */
struct init_if_phase_op
{
        __le32 op_data;
#define INIT_IF_PHASE_OP_OP_MASK           0xF /* Init operation, from init_op_types enum */
#define INIT_IF_PHASE_OP_OP_SHIFT          0
#define INIT_IF_PHASE_OP_DMAE_ENABLE_MASK  0x1 /* Indicates if DMAE is enabled in this phase */
#define INIT_IF_PHASE_OP_DMAE_ENABLE_SHIFT 4
#define INIT_IF_PHASE_OP_RESERVED1_MASK    0x7FF
#define INIT_IF_PHASE_OP_RESERVED1_SHIFT   5
#define INIT_IF_PHASE_OP_CMD_OFFSET_MASK   0xFFFF /* Commands to skip if the phases dont match */
#define INIT_IF_PHASE_OP_CMD_OFFSET_SHIFT  16
        __le32 phase_data;
#define INIT_IF_PHASE_OP_PHASE_MASK        0xFF /* Init phase */
#define INIT_IF_PHASE_OP_PHASE_SHIFT       0
#define INIT_IF_PHASE_OP_RESERVED2_MASK    0xFF
#define INIT_IF_PHASE_OP_RESERVED2_SHIFT   8
#define INIT_IF_PHASE_OP_PHASE_ID_MASK     0xFFFF /* Init phase ID */
#define INIT_IF_PHASE_OP_PHASE_ID_SHIFT    16
};


/*
 * init mode operators
 */
enum init_mode_ops
{
        INIT_MODE_OP_NOT /* init mode not operator */,
        INIT_MODE_OP_OR /* init mode or operator */,
        INIT_MODE_OP_AND /* init mode and operator */,
        MAX_INIT_MODE_OPS
};


/*
 * init operation: raw
 */
struct init_raw_op
{
        __le32 op_data;
#define INIT_RAW_OP_OP_MASK      0xF /* Init operation, from init_op_types enum */
#define INIT_RAW_OP_OP_SHIFT     0
#define INIT_RAW_OP_PARAM1_MASK  0xFFFFFFF /* init param 1 */
#define INIT_RAW_OP_PARAM1_SHIFT 4
        __le32 param2 /* Init param 2 */;
};


/*
 * init array params
 */
struct init_op_array_params
{
        __le16 size /* array size in dwords */;
        __le16 offset /* array start offset in dwords */;
};


/*
 * Write init operation arguments
 */
union init_write_args
{
        __le32 inline_val /* value to write, used when init source is INIT_SRC_INLINE */;
        __le32 zeros_count /* number of zeros to write, used when init source is INIT_SRC_ZEROS */;
        __le32 array_offset /* array offset to write, used when init source is INIT_SRC_ARRAY */;
        struct init_op_array_params runtime /* runtime array params to write, used when init source is INIT_SRC_RUNTIME */;
};


/*
 * init operation: write
 */
struct init_write_op
{
        __le32 data;
#define INIT_WRITE_OP_OP_MASK        0xF /* init operation, from init_op_types enum */
#define INIT_WRITE_OP_OP_SHIFT       0
#define INIT_WRITE_OP_SOURCE_MASK    0x7 /* init source type, taken from init_source_types enum */
#define INIT_WRITE_OP_SOURCE_SHIFT   4
#define INIT_WRITE_OP_RESERVED_MASK  0x1
#define INIT_WRITE_OP_RESERVED_SHIFT 7
#define INIT_WRITE_OP_WIDE_BUS_MASK  0x1 /* indicates if the register is wide-bus */
#define INIT_WRITE_OP_WIDE_BUS_SHIFT 8
#define INIT_WRITE_OP_ADDRESS_MASK   0x7FFFFF /* internal (absolute) GRC address, in dwords */
#define INIT_WRITE_OP_ADDRESS_SHIFT  9
        union init_write_args args /* Write init operation arguments */;
};


/*
 * init operation: read
 */
struct init_read_op
{
        __le32 op_data;
#define INIT_READ_OP_OP_MASK         0xF /* init operation, from init_op_types enum */
#define INIT_READ_OP_OP_SHIFT        0
#define INIT_READ_OP_POLL_TYPE_MASK  0xF /* polling type, from init_poll_types enum */
#define INIT_READ_OP_POLL_TYPE_SHIFT 4
#define INIT_READ_OP_RESERVED_MASK   0x1
#define INIT_READ_OP_RESERVED_SHIFT  8
#define INIT_READ_OP_ADDRESS_MASK    0x7FFFFF /* internal (absolute) GRC address, in dwords */
#define INIT_READ_OP_ADDRESS_SHIFT   9
        __le32 expected_val /* expected polling value, used only when polling is done */;
};


/*
 * Init operations union
 */
union init_op
{
        struct init_raw_op raw /* raw init operation */;
        struct init_write_op write /* write init operation */;
        struct init_read_op read /* read init operation */;
        struct init_if_mode_op if_mode /* if_mode init operation */;
        struct init_if_phase_op if_phase /* if_phase init operation */;
        struct init_callback_op callback /* callback init operation */;
        struct init_delay_op delay /* delay init operation */;
};


/*
 * Init command operation types
 */
enum init_op_types
{
        INIT_OP_READ /* GRC read init command */,
        INIT_OP_WRITE /* GRC write init command */,
        INIT_OP_IF_MODE /* Skip init commands if the init modes expression doesnt match */,
        INIT_OP_IF_PHASE /* Skip init commands if the init phase doesnt match */,
        INIT_OP_DELAY /* delay init command */,
        INIT_OP_CALLBACK /* callback init command */,
        MAX_INIT_OP_TYPES
};


/*
 * init polling types
 */
enum init_poll_types
{
        INIT_POLL_NONE /* No polling */,
        INIT_POLL_EQ /* init value is included in the init command */,
        INIT_POLL_OR /* init value is all zeros */,
        INIT_POLL_AND /* init value is an array of values */,
        MAX_INIT_POLL_TYPES
};


/*
 * init source types
 */
enum init_source_types
{
        INIT_SRC_INLINE /* init value is included in the init command */,
        INIT_SRC_ZEROS /* init value is all zeros */,
        INIT_SRC_ARRAY /* init value is an array of values */,
        INIT_SRC_RUNTIME /* init value is provided during runtime */,
        MAX_INIT_SOURCE_TYPES
};


struct fw_ver_num
{
        u8 major /* Firmware major version number */;
        u8 minor /* Firmware minor version number */;
        u8 rev /* Firmware revision version number */;
        u8 eng /* Firmware engineering version number (for bootleg verisons) */;
};


struct fw_ver_params
{
        u8 image_id /* Firmware image ID */;
        u8 storm_id /* Storm ID */;
        u8 chip_ver /* Chip version number */;
        u8 reserved;
};


struct fw_ver_info
{
        __le16 tools_ver /* Tools version number */;
        __le16 reserved;
        struct fw_ver_num num;
        struct fw_ver_params params;
        __le32 timestamp /* FW Timestamp in unix time  (sec. since 1970) */;
};


enum init_modes
{
        MODE_BB_A0,
        MODE_BB_B0,
        MODE_K2,
        MODE_ASIC,
        MODE_EMUL_REDUCED,
        MODE_EMUL_FULL,
        MODE_FPGA,
        MODE_CHIPSIM,
        MODE_SF,
        MODE_MF_SD,
        MODE_MF_SI,
        MODE_PORTS_PER_ENG_1,
        MODE_PORTS_PER_ENG_2,
        MODE_PORTS_PER_ENG_4,
        MODE_100G,
        MODE_EAGLE_ENG1_WORKAROUND,
        MAX_INIT_MODES
};


enum init_phases
{
        PHASE_ENGINE,
        PHASE_PORT,
        PHASE_PF,
        PHASE_VF,
        PHASE_QM_PF,
        MAX_INIT_PHASES
};


#endif /* __ECORE_HSI_TOOLS__ */