root/usr/src/uts/common/io/bnxe/577xx/hsi/mcp/bdn.h
/****************************************************************************
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (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 2014 QLogic Corporation
 * The contents of this file are subject to the terms of the
 * QLogic End User License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
 * QLogic_End_User_Software_License.txt
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 *
 * Name: bdn.h
 *
 * Description: BDN definitions
 *
 * Author: Yaniv Rosner
 *
 ****************************************************************************/

#ifndef BDN_H
#define BDN_H

struct Codec_Info {
        u32_t version;  /* Version of Codec */

        enum codec_location {
                e_None          = 0,
                e_Here          = 1,
                e_FRU_EEPROM    = 2
        } loc; /* DEFAULT e-None */
        u16_t total_size;       /* total size of Codec in bytes.Max size 32K (64K?)*/
        u16_t num_msg_segments; /* number of segments = total size / max message payload size */
};

#define MAX_CODEC_SIZE          0x8000
#define CODEC_SEGMENT_SIZE      0x400
#define NUMBER_OF_SEGMENTS (MAX_CODEC_SIZE/CODEC_SEGMENT_SIZE)
struct codec_t {
        u8_t data[NUMBER_OF_SEGMENTS][CODEC_SEGMENT_SIZE];
};

typedef u32 bdn_cfg;
#define BDN_CFG_SIZE_MASK               0x0000ffff
#define BDN_CFG_SIZE_OFFSET             0
#define BDN_CFG_STATE_MASK              0x00ff0000
#define BDN_CFG_STATE_OFFSET            16
        #define BDN_CFG_STATE_ACTIVE    0x00010000
        #define BDN_CFG_STATE_PENDING   0x00020000

struct bdn_fcoe_boot_target {
        u16 wwpn;
        u16 lUNID;
};

#if 0
#define MAX_FCOE_IBOOT_PORT_ID 8  /* @@@TBD - what's this ? */
#define MAX_IBOOT_TARGETS       8
struct bdn_fcoe_boot_next_dlr {
        bdn_cfg hdr;
        u16 fcoe_boot_enable;
        u16 fcoe_cvid;
        u16 fcoe_wwnn;
        u16 n_port_id[MAX_FCOE_IBOOT_PORT_ID];  //Still Not sure how big the array is
        struct fcoe_boot_target targets[MAX_IBOOT_TARGETS];     //Still Not sure how big the array is
};

struct bdn_fcoe_boot {  // Main fcoe_iboot struct
        fcoe_iboot_next_dlr next_dlr;   // Hold substruct per each activation type
};
#endif
struct bdn_netport_now {
        bdn_cfg hdr;
        u8 enable_port;
        u8 rsrv;
        u8 num_pfs_min_bw;
        u8 num_pfs_max_bw;
        u8 min_bw[E2_FUNC_MAX]; /* 4 PFs in 2 port mode / 2 PFs in 4 port mode */
        u8 max_bw[E2_FUNC_MAX]; /* 4 PFs in 2 port mode / 2 PFs in 4 port mode */
};

struct bdn_netport_on_port_reset {
        bdn_cfg hdr;
        u32 link_config;
/* Same definitions as in PORT_HW_CFG_SPEED_CAPABILITY_D3_MASK */
#define BDN_LINK_CONFIG_ADVERTISED_SPEED_MASK   0x0000ffff
#define BDN_LINK_CONFIG_ADVERTISED_SPEED_SHIFT  0
/* Same definitions as PORT_FEATURE_FLOW_CONTROL_MASK */
#define BDN_LINK_CONFIG_FLOW_CONTROL_MASK       0x00070000
#define BDN_LINK_CONFIG_FLOW_CONTROL_SHIFT      16

#define BDN_LINK_CONFIG_PFC_ENABLED_MASK        0x00080000
#define BDN_LINK_CONFIG_PFC_ENABLED_SHIFT       19

#define BDN_LINK_CONFIG_EEE_ENABLED_MASK        0x00100000
#define BDN_LINK_CONFIG_EEE_ENABLED_SHIFT       20
};

struct bdn_netport_next_os_boot {
        bdn_cfg hdr;
        u8   num_pfs;
        u8   num_vf_per_pf[E2_FUNC_MAX];
};

struct bdn_netport {
        struct bdn_netport_now now;
        struct bdn_netport_on_port_reset on_port_reset; /* On Port Reset */
        struct bdn_netport_next_os_boot next_os_boot; /* Next OS Boot */
};

#define CONNECTION_ID_LEN 16
struct bdn_flexfunc_now {
        bdn_cfg hdr;
        u8 connection_id[CONNECTION_ID_LEN];
        u8 fnic_enabled;
        u8 rsrv[3];
};

struct bdn_flexfunc_next_os_boot {
        bdn_cfg hdr;
        u8 mac_addr[6];
        u8 func_type;
        u8 boot_mode;
};

struct bdn_flex_func {
        struct bdn_flexfunc_now now;
        struct bdn_flexfunc_next_os_boot next_os_boot; /* Next OS Boot */
};

#ifndef PF_NUM_MAX
#define PF_NUM_MAX 8
#endif

struct bdn {
        u32 size;
        u32 uuid;       // Unique identifer of the slot/chassis of the blade
        struct Codec_Info codec_info;
        struct codec_t codec;
        struct bdn_netport netport[PORT_MAX * NVM_PATH_MAX];
        struct bdn_flex_func flexfunc[PF_NUM_MAX];
        //struct bdn_pxe_boot pxe_boot;
        //struct bdn_iscsi_boot iscsi_boot;
        //struct bdn_fcoe_boot fcoe_boot;
        u32 crc;
};

union bdn_image {
        struct bdn bdn;
        u8_t rsrv[0x9000];
};

/* Expected BDN size is basically the offset of rsrv within the bdn structure */
#define BDN_SIZE (sizeof(struct bdn))

#define BDN_CODEC_INFO()                  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, codec_info))
#define BDN_CODEC_DATA()                  (ASN1_P->bdn_addr + OFFSETOF(struct bdn, codec))
#define BDN_NETPORT_NOW(papo)             (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].now))
#define BDN_NETPORT_ON_PORT_RESET(papo)   (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].on_port_reset))
#define BDN_NETPORT_NEXT_OS_BOOT(papo)    (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].next_os_boot))
#define BDN_FLEXFUNC_NOW(pf_num)          (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].now))
#define BDN_FLEXFUNC_NEXT_OS_BOOT(pf_num) (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].next_os_boot))
#define BDN_CRC()                         (ASN1_P->bdn_addr + sizeof(union bdn_image))

/*----------------------------------------------------------------------------
 * ------------------------------ Function Prototypes ------------------------
 * ---------------------------------------------------------------------------
 */

int bd_populate_os_reset_config(void);
int bd_populate_port_reset_config(int path, int port);
#endif /* BDN_H */