root/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h
/*
 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef _T4FW_RI_API_H_
#define _T4FW_RI_API_H_

#include "t4fw_api.h"

enum fw_ri_wr_opcode {
        FW_RI_RDMA_WRITE                = 0x0,  /* IETF RDMAP v1.0 ... */
        FW_RI_READ_REQ                  = 0x1,
        FW_RI_READ_RESP                 = 0x2,
        FW_RI_SEND                      = 0x3,
        FW_RI_SEND_WITH_INV             = 0x4,
        FW_RI_SEND_WITH_SE              = 0x5,
        FW_RI_SEND_WITH_SE_INV          = 0x6,
        FW_RI_TERMINATE                 = 0x7,
        FW_RI_RDMA_INIT                 = 0x8,  /* CHELSIO RI specific ... */
        FW_RI_BIND_MW                   = 0x9,
        FW_RI_FAST_REGISTER             = 0xa,
        FW_RI_LOCAL_INV                 = 0xb,
        FW_RI_QP_MODIFY                 = 0xc,
        FW_RI_BYPASS                    = 0xd,
        FW_RI_RECEIVE                   = 0xe,

        FW_RI_SGE_EC_CR_RETURN          = 0xf,
        FW_RI_WRITE_IMMEDIATE           = FW_RI_RDMA_INIT
};

enum fw_ri_wr_flags {
        FW_RI_COMPLETION_FLAG           = 0x01,
        FW_RI_NOTIFICATION_FLAG         = 0x02,
        FW_RI_SOLICITED_EVENT_FLAG      = 0x04,
        FW_RI_READ_FENCE_FLAG           = 0x08,
        FW_RI_LOCAL_FENCE_FLAG          = 0x10,
        FW_RI_RDMA_READ_INVALIDATE      = 0x20,
        FW_RI_RDMA_WRITE_WITH_IMMEDIATE = 0x40
};

enum fw_ri_mpa_attrs {
        FW_RI_MPA_RX_MARKER_ENABLE      = 0x01,
        FW_RI_MPA_TX_MARKER_ENABLE      = 0x02,
        FW_RI_MPA_CRC_ENABLE            = 0x04,
        FW_RI_MPA_IETF_ENABLE           = 0x08
};

enum fw_ri_qp_caps {
        FW_RI_QP_RDMA_READ_ENABLE       = 0x01,
        FW_RI_QP_RDMA_WRITE_ENABLE      = 0x02,
        FW_RI_QP_BIND_ENABLE            = 0x04,
        FW_RI_QP_FAST_REGISTER_ENABLE   = 0x08,
        FW_RI_QP_STAG0_ENABLE           = 0x10
};

enum fw_ri_addr_type {
        FW_RI_ZERO_BASED_TO             = 0x00,
        FW_RI_VA_BASED_TO               = 0x01
};

enum fw_ri_mem_perms {
        FW_RI_MEM_ACCESS_REM_WRITE      = 0x01,
        FW_RI_MEM_ACCESS_REM_READ       = 0x02,
        FW_RI_MEM_ACCESS_REM            = 0x03,
        FW_RI_MEM_ACCESS_LOCAL_WRITE    = 0x04,
        FW_RI_MEM_ACCESS_LOCAL_READ     = 0x08,
        FW_RI_MEM_ACCESS_LOCAL          = 0x0C
};

enum fw_ri_stag_type {
        FW_RI_STAG_NSMR                 = 0x00,
        FW_RI_STAG_SMR                  = 0x01,
        FW_RI_STAG_MW                   = 0x02,
        FW_RI_STAG_MW_RELAXED           = 0x03
};

enum fw_ri_data_op {
        FW_RI_DATA_IMMD                 = 0x81,
        FW_RI_DATA_DSGL                 = 0x82,
        FW_RI_DATA_ISGL                 = 0x83
};

enum fw_ri_sgl_depth {
        FW_RI_SGL_DEPTH_MAX_SQ          = 16,
        FW_RI_SGL_DEPTH_MAX_RQ          = 4
};

struct fw_ri_dsge_pair {
        __be32  len[2];
        __be64  addr[2];
};

struct fw_ri_dsgl {
        __u8    op;
        __u8    r1;
        __be16  nsge;
        __be32  len0;
        __be64  addr0;
        struct fw_ri_dsge_pair sge[];
};

struct fw_ri_sge {
        __be32 stag;
        __be32 len;
        __be64 to;
};

struct fw_ri_isgl {
        __u8    op;
        __u8    r1;
        __be16  nsge;
        __be32  r2;
        struct fw_ri_sge sge[];
};

struct fw_ri_immd {
        __u8    op;
        __u8    r1;
        __be16  r2;
        __be32  immdlen;
        __u8    data[];
};

struct fw_ri_tpte {
        __be32 valid_to_pdid;
        __be32 locread_to_qpid;
        __be32 nosnoop_pbladdr;
        __be32 len_lo;
        __be32 va_hi;
        __be32 va_lo_fbo;
        __be32 dca_mwbcnt_pstag;
        __be32 len_hi;
};

#define FW_RI_TPTE_VALID_S              31
#define FW_RI_TPTE_VALID_M              0x1
#define FW_RI_TPTE_VALID_V(x)           ((x) << FW_RI_TPTE_VALID_S)
#define FW_RI_TPTE_VALID_G(x)           \
        (((x) >> FW_RI_TPTE_VALID_S) & FW_RI_TPTE_VALID_M)
#define FW_RI_TPTE_VALID_F              FW_RI_TPTE_VALID_V(1U)

#define FW_RI_TPTE_STAGKEY_S            23
#define FW_RI_TPTE_STAGKEY_M            0xff
#define FW_RI_TPTE_STAGKEY_V(x)         ((x) << FW_RI_TPTE_STAGKEY_S)
#define FW_RI_TPTE_STAGKEY_G(x)         \
        (((x) >> FW_RI_TPTE_STAGKEY_S) & FW_RI_TPTE_STAGKEY_M)

#define FW_RI_TPTE_STAGSTATE_S          22
#define FW_RI_TPTE_STAGSTATE_M          0x1
#define FW_RI_TPTE_STAGSTATE_V(x)       ((x) << FW_RI_TPTE_STAGSTATE_S)
#define FW_RI_TPTE_STAGSTATE_G(x)       \
        (((x) >> FW_RI_TPTE_STAGSTATE_S) & FW_RI_TPTE_STAGSTATE_M)
#define FW_RI_TPTE_STAGSTATE_F          FW_RI_TPTE_STAGSTATE_V(1U)

#define FW_RI_TPTE_STAGTYPE_S           20
#define FW_RI_TPTE_STAGTYPE_M           0x3
#define FW_RI_TPTE_STAGTYPE_V(x)        ((x) << FW_RI_TPTE_STAGTYPE_S)
#define FW_RI_TPTE_STAGTYPE_G(x)        \
        (((x) >> FW_RI_TPTE_STAGTYPE_S) & FW_RI_TPTE_STAGTYPE_M)

#define FW_RI_TPTE_PDID_S               0
#define FW_RI_TPTE_PDID_M               0xfffff
#define FW_RI_TPTE_PDID_V(x)            ((x) << FW_RI_TPTE_PDID_S)
#define FW_RI_TPTE_PDID_G(x)            \
        (((x) >> FW_RI_TPTE_PDID_S) & FW_RI_TPTE_PDID_M)

#define FW_RI_TPTE_PERM_S               28
#define FW_RI_TPTE_PERM_M               0xf
#define FW_RI_TPTE_PERM_V(x)            ((x) << FW_RI_TPTE_PERM_S)
#define FW_RI_TPTE_PERM_G(x)            \
        (((x) >> FW_RI_TPTE_PERM_S) & FW_RI_TPTE_PERM_M)

#define FW_RI_TPTE_REMINVDIS_S          27
#define FW_RI_TPTE_REMINVDIS_M          0x1
#define FW_RI_TPTE_REMINVDIS_V(x)       ((x) << FW_RI_TPTE_REMINVDIS_S)
#define FW_RI_TPTE_REMINVDIS_G(x)       \
        (((x) >> FW_RI_TPTE_REMINVDIS_S) & FW_RI_TPTE_REMINVDIS_M)
#define FW_RI_TPTE_REMINVDIS_F          FW_RI_TPTE_REMINVDIS_V(1U)

#define FW_RI_TPTE_ADDRTYPE_S           26
#define FW_RI_TPTE_ADDRTYPE_M           1
#define FW_RI_TPTE_ADDRTYPE_V(x)        ((x) << FW_RI_TPTE_ADDRTYPE_S)
#define FW_RI_TPTE_ADDRTYPE_G(x)        \
        (((x) >> FW_RI_TPTE_ADDRTYPE_S) & FW_RI_TPTE_ADDRTYPE_M)
#define FW_RI_TPTE_ADDRTYPE_F           FW_RI_TPTE_ADDRTYPE_V(1U)

#define FW_RI_TPTE_MWBINDEN_S           25
#define FW_RI_TPTE_MWBINDEN_M           0x1
#define FW_RI_TPTE_MWBINDEN_V(x)        ((x) << FW_RI_TPTE_MWBINDEN_S)
#define FW_RI_TPTE_MWBINDEN_G(x)        \
        (((x) >> FW_RI_TPTE_MWBINDEN_S) & FW_RI_TPTE_MWBINDEN_M)
#define FW_RI_TPTE_MWBINDEN_F           FW_RI_TPTE_MWBINDEN_V(1U)

#define FW_RI_TPTE_PS_S                 20
#define FW_RI_TPTE_PS_M                 0x1f
#define FW_RI_TPTE_PS_V(x)              ((x) << FW_RI_TPTE_PS_S)
#define FW_RI_TPTE_PS_G(x)              \
        (((x) >> FW_RI_TPTE_PS_S) & FW_RI_TPTE_PS_M)

#define FW_RI_TPTE_QPID_S               0
#define FW_RI_TPTE_QPID_M               0xfffff
#define FW_RI_TPTE_QPID_V(x)            ((x) << FW_RI_TPTE_QPID_S)
#define FW_RI_TPTE_QPID_G(x)            \
        (((x) >> FW_RI_TPTE_QPID_S) & FW_RI_TPTE_QPID_M)

#define FW_RI_TPTE_NOSNOOP_S            30
#define FW_RI_TPTE_NOSNOOP_M            0x1
#define FW_RI_TPTE_NOSNOOP_V(x)         ((x) << FW_RI_TPTE_NOSNOOP_S)
#define FW_RI_TPTE_NOSNOOP_G(x)         \
        (((x) >> FW_RI_TPTE_NOSNOOP_S) & FW_RI_TPTE_NOSNOOP_M)
#define FW_RI_TPTE_NOSNOOP_F            FW_RI_TPTE_NOSNOOP_V(1U)

#define FW_RI_TPTE_PBLADDR_S            0
#define FW_RI_TPTE_PBLADDR_M            0x1fffffff
#define FW_RI_TPTE_PBLADDR_V(x)         ((x) << FW_RI_TPTE_PBLADDR_S)
#define FW_RI_TPTE_PBLADDR_G(x)         \
        (((x) >> FW_RI_TPTE_PBLADDR_S) & FW_RI_TPTE_PBLADDR_M)

#define FW_RI_TPTE_DCA_S                24
#define FW_RI_TPTE_DCA_M                0x1f
#define FW_RI_TPTE_DCA_V(x)             ((x) << FW_RI_TPTE_DCA_S)
#define FW_RI_TPTE_DCA_G(x)             \
        (((x) >> FW_RI_TPTE_DCA_S) & FW_RI_TPTE_DCA_M)

#define FW_RI_TPTE_MWBCNT_PSTAG_S       0
#define FW_RI_TPTE_MWBCNT_PSTAG_M       0xffffff
#define FW_RI_TPTE_MWBCNT_PSTAT_V(x)    \
        ((x) << FW_RI_TPTE_MWBCNT_PSTAG_S)
#define FW_RI_TPTE_MWBCNT_PSTAG_G(x)    \
        (((x) >> FW_RI_TPTE_MWBCNT_PSTAG_S) & FW_RI_TPTE_MWBCNT_PSTAG_M)

enum fw_ri_res_type {
        FW_RI_RES_TYPE_SQ,
        FW_RI_RES_TYPE_RQ,
        FW_RI_RES_TYPE_CQ,
        FW_RI_RES_TYPE_SRQ,
};

enum fw_ri_res_op {
        FW_RI_RES_OP_WRITE,
        FW_RI_RES_OP_RESET,
};

struct fw_ri_res {
        union fw_ri_restype {
                struct fw_ri_res_sqrq {
                        __u8   restype;
                        __u8   op;
                        __be16 r3;
                        __be32 eqid;
                        __be32 r4[2];
                        __be32 fetchszm_to_iqid;
                        __be32 dcaen_to_eqsize;
                        __be64 eqaddr;
                } sqrq;
                struct fw_ri_res_cq {
                        __u8   restype;
                        __u8   op;
                        __be16 r3;
                        __be32 iqid;
                        __be32 r4[2];
                        __be32 iqandst_to_iqandstindex;
                        __be16 iqdroprss_to_iqesize;
                        __be16 iqsize;
                        __be64 iqaddr;
                        __be32 iqns_iqro;
                        __be32 r6_lo;
                        __be64 r7;
                } cq;
                struct fw_ri_res_srq {
                        __u8   restype;
                        __u8   op;
                        __be16 r3;
                        __be32 eqid;
                        __be32 r4[2];
                        __be32 fetchszm_to_iqid;
                        __be32 dcaen_to_eqsize;
                        __be64 eqaddr;
                        __be32 srqid;
                        __be32 pdid;
                        __be32 hwsrqsize;
                        __be32 hwsrqaddr;
                } srq;
        } u;
};

struct fw_ri_res_wr {
        __be32 op_nres;
        __be32 len16_pkd;
        __u64  cookie;
        struct fw_ri_res res[];
};

#define FW_RI_RES_WR_NRES_S     0
#define FW_RI_RES_WR_NRES_M     0xff
#define FW_RI_RES_WR_NRES_V(x)  ((x) << FW_RI_RES_WR_NRES_S)
#define FW_RI_RES_WR_NRES_G(x)  \
        (((x) >> FW_RI_RES_WR_NRES_S) & FW_RI_RES_WR_NRES_M)

#define FW_RI_RES_WR_FETCHSZM_S         26
#define FW_RI_RES_WR_FETCHSZM_M         0x1
#define FW_RI_RES_WR_FETCHSZM_V(x)      ((x) << FW_RI_RES_WR_FETCHSZM_S)
#define FW_RI_RES_WR_FETCHSZM_G(x)      \
        (((x) >> FW_RI_RES_WR_FETCHSZM_S) & FW_RI_RES_WR_FETCHSZM_M)
#define FW_RI_RES_WR_FETCHSZM_F FW_RI_RES_WR_FETCHSZM_V(1U)

#define FW_RI_RES_WR_STATUSPGNS_S       25
#define FW_RI_RES_WR_STATUSPGNS_M       0x1
#define FW_RI_RES_WR_STATUSPGNS_V(x)    ((x) << FW_RI_RES_WR_STATUSPGNS_S)
#define FW_RI_RES_WR_STATUSPGNS_G(x)    \
        (((x) >> FW_RI_RES_WR_STATUSPGNS_S) & FW_RI_RES_WR_STATUSPGNS_M)
#define FW_RI_RES_WR_STATUSPGNS_F       FW_RI_RES_WR_STATUSPGNS_V(1U)

#define FW_RI_RES_WR_STATUSPGRO_S       24
#define FW_RI_RES_WR_STATUSPGRO_M       0x1
#define FW_RI_RES_WR_STATUSPGRO_V(x)    ((x) << FW_RI_RES_WR_STATUSPGRO_S)
#define FW_RI_RES_WR_STATUSPGRO_G(x)    \
        (((x) >> FW_RI_RES_WR_STATUSPGRO_S) & FW_RI_RES_WR_STATUSPGRO_M)
#define FW_RI_RES_WR_STATUSPGRO_F       FW_RI_RES_WR_STATUSPGRO_V(1U)

#define FW_RI_RES_WR_FETCHNS_S          23
#define FW_RI_RES_WR_FETCHNS_M          0x1
#define FW_RI_RES_WR_FETCHNS_V(x)       ((x) << FW_RI_RES_WR_FETCHNS_S)
#define FW_RI_RES_WR_FETCHNS_G(x)       \
        (((x) >> FW_RI_RES_WR_FETCHNS_S) & FW_RI_RES_WR_FETCHNS_M)
#define FW_RI_RES_WR_FETCHNS_F  FW_RI_RES_WR_FETCHNS_V(1U)

#define FW_RI_RES_WR_FETCHRO_S          22
#define FW_RI_RES_WR_FETCHRO_M          0x1
#define FW_RI_RES_WR_FETCHRO_V(x)       ((x) << FW_RI_RES_WR_FETCHRO_S)
#define FW_RI_RES_WR_FETCHRO_G(x)       \
        (((x) >> FW_RI_RES_WR_FETCHRO_S) & FW_RI_RES_WR_FETCHRO_M)
#define FW_RI_RES_WR_FETCHRO_F  FW_RI_RES_WR_FETCHRO_V(1U)

#define FW_RI_RES_WR_HOSTFCMODE_S       20
#define FW_RI_RES_WR_HOSTFCMODE_M       0x3
#define FW_RI_RES_WR_HOSTFCMODE_V(x)    ((x) << FW_RI_RES_WR_HOSTFCMODE_S)
#define FW_RI_RES_WR_HOSTFCMODE_G(x)    \
        (((x) >> FW_RI_RES_WR_HOSTFCMODE_S) & FW_RI_RES_WR_HOSTFCMODE_M)

#define FW_RI_RES_WR_CPRIO_S    19
#define FW_RI_RES_WR_CPRIO_M    0x1
#define FW_RI_RES_WR_CPRIO_V(x) ((x) << FW_RI_RES_WR_CPRIO_S)
#define FW_RI_RES_WR_CPRIO_G(x) \
        (((x) >> FW_RI_RES_WR_CPRIO_S) & FW_RI_RES_WR_CPRIO_M)
#define FW_RI_RES_WR_CPRIO_F    FW_RI_RES_WR_CPRIO_V(1U)

#define FW_RI_RES_WR_ONCHIP_S           18
#define FW_RI_RES_WR_ONCHIP_M           0x1
#define FW_RI_RES_WR_ONCHIP_V(x)        ((x) << FW_RI_RES_WR_ONCHIP_S)
#define FW_RI_RES_WR_ONCHIP_G(x)        \
        (((x) >> FW_RI_RES_WR_ONCHIP_S) & FW_RI_RES_WR_ONCHIP_M)
#define FW_RI_RES_WR_ONCHIP_F   FW_RI_RES_WR_ONCHIP_V(1U)

#define FW_RI_RES_WR_PCIECHN_S          16
#define FW_RI_RES_WR_PCIECHN_M          0x3
#define FW_RI_RES_WR_PCIECHN_V(x)       ((x) << FW_RI_RES_WR_PCIECHN_S)
#define FW_RI_RES_WR_PCIECHN_G(x)       \
        (((x) >> FW_RI_RES_WR_PCIECHN_S) & FW_RI_RES_WR_PCIECHN_M)

#define FW_RI_RES_WR_IQID_S     0
#define FW_RI_RES_WR_IQID_M     0xffff
#define FW_RI_RES_WR_IQID_V(x)  ((x) << FW_RI_RES_WR_IQID_S)
#define FW_RI_RES_WR_IQID_G(x)  \
        (((x) >> FW_RI_RES_WR_IQID_S) & FW_RI_RES_WR_IQID_M)

#define FW_RI_RES_WR_DCAEN_S    31
#define FW_RI_RES_WR_DCAEN_M    0x1
#define FW_RI_RES_WR_DCAEN_V(x) ((x) << FW_RI_RES_WR_DCAEN_S)
#define FW_RI_RES_WR_DCAEN_G(x) \
        (((x) >> FW_RI_RES_WR_DCAEN_S) & FW_RI_RES_WR_DCAEN_M)
#define FW_RI_RES_WR_DCAEN_F    FW_RI_RES_WR_DCAEN_V(1U)

#define FW_RI_RES_WR_DCACPU_S           26
#define FW_RI_RES_WR_DCACPU_M           0x1f
#define FW_RI_RES_WR_DCACPU_V(x)        ((x) << FW_RI_RES_WR_DCACPU_S)
#define FW_RI_RES_WR_DCACPU_G(x)        \
        (((x) >> FW_RI_RES_WR_DCACPU_S) & FW_RI_RES_WR_DCACPU_M)

#define FW_RI_RES_WR_FBMIN_S    23
#define FW_RI_RES_WR_FBMIN_M    0x7
#define FW_RI_RES_WR_FBMIN_V(x) ((x) << FW_RI_RES_WR_FBMIN_S)
#define FW_RI_RES_WR_FBMIN_G(x) \
        (((x) >> FW_RI_RES_WR_FBMIN_S) & FW_RI_RES_WR_FBMIN_M)

#define FW_RI_RES_WR_FBMAX_S    20
#define FW_RI_RES_WR_FBMAX_M    0x7
#define FW_RI_RES_WR_FBMAX_V(x) ((x) << FW_RI_RES_WR_FBMAX_S)
#define FW_RI_RES_WR_FBMAX_G(x) \
        (((x) >> FW_RI_RES_WR_FBMAX_S) & FW_RI_RES_WR_FBMAX_M)

#define FW_RI_RES_WR_CIDXFTHRESHO_S     19
#define FW_RI_RES_WR_CIDXFTHRESHO_M     0x1
#define FW_RI_RES_WR_CIDXFTHRESHO_V(x)  ((x) << FW_RI_RES_WR_CIDXFTHRESHO_S)
#define FW_RI_RES_WR_CIDXFTHRESHO_G(x)  \
        (((x) >> FW_RI_RES_WR_CIDXFTHRESHO_S) & FW_RI_RES_WR_CIDXFTHRESHO_M)
#define FW_RI_RES_WR_CIDXFTHRESHO_F     FW_RI_RES_WR_CIDXFTHRESHO_V(1U)

#define FW_RI_RES_WR_CIDXFTHRESH_S      16
#define FW_RI_RES_WR_CIDXFTHRESH_M      0x7
#define FW_RI_RES_WR_CIDXFTHRESH_V(x)   ((x) << FW_RI_RES_WR_CIDXFTHRESH_S)
#define FW_RI_RES_WR_CIDXFTHRESH_G(x)   \
        (((x) >> FW_RI_RES_WR_CIDXFTHRESH_S) & FW_RI_RES_WR_CIDXFTHRESH_M)

#define FW_RI_RES_WR_EQSIZE_S           0
#define FW_RI_RES_WR_EQSIZE_M           0xffff
#define FW_RI_RES_WR_EQSIZE_V(x)        ((x) << FW_RI_RES_WR_EQSIZE_S)
#define FW_RI_RES_WR_EQSIZE_G(x)        \
        (((x) >> FW_RI_RES_WR_EQSIZE_S) & FW_RI_RES_WR_EQSIZE_M)

#define FW_RI_RES_WR_IQANDST_S          15
#define FW_RI_RES_WR_IQANDST_M          0x1
#define FW_RI_RES_WR_IQANDST_V(x)       ((x) << FW_RI_RES_WR_IQANDST_S)
#define FW_RI_RES_WR_IQANDST_G(x)       \
        (((x) >> FW_RI_RES_WR_IQANDST_S) & FW_RI_RES_WR_IQANDST_M)
#define FW_RI_RES_WR_IQANDST_F  FW_RI_RES_WR_IQANDST_V(1U)

#define FW_RI_RES_WR_IQANUS_S           14
#define FW_RI_RES_WR_IQANUS_M           0x1
#define FW_RI_RES_WR_IQANUS_V(x)        ((x) << FW_RI_RES_WR_IQANUS_S)
#define FW_RI_RES_WR_IQANUS_G(x)        \
        (((x) >> FW_RI_RES_WR_IQANUS_S) & FW_RI_RES_WR_IQANUS_M)
#define FW_RI_RES_WR_IQANUS_F   FW_RI_RES_WR_IQANUS_V(1U)

#define FW_RI_RES_WR_IQANUD_S           12
#define FW_RI_RES_WR_IQANUD_M           0x3
#define FW_RI_RES_WR_IQANUD_V(x)        ((x) << FW_RI_RES_WR_IQANUD_S)
#define FW_RI_RES_WR_IQANUD_G(x)        \
        (((x) >> FW_RI_RES_WR_IQANUD_S) & FW_RI_RES_WR_IQANUD_M)

#define FW_RI_RES_WR_IQANDSTINDEX_S     0
#define FW_RI_RES_WR_IQANDSTINDEX_M     0xfff
#define FW_RI_RES_WR_IQANDSTINDEX_V(x)  ((x) << FW_RI_RES_WR_IQANDSTINDEX_S)
#define FW_RI_RES_WR_IQANDSTINDEX_G(x)  \
        (((x) >> FW_RI_RES_WR_IQANDSTINDEX_S) & FW_RI_RES_WR_IQANDSTINDEX_M)

#define FW_RI_RES_WR_IQDROPRSS_S        15
#define FW_RI_RES_WR_IQDROPRSS_M        0x1
#define FW_RI_RES_WR_IQDROPRSS_V(x)     ((x) << FW_RI_RES_WR_IQDROPRSS_S)
#define FW_RI_RES_WR_IQDROPRSS_G(x)     \
        (((x) >> FW_RI_RES_WR_IQDROPRSS_S) & FW_RI_RES_WR_IQDROPRSS_M)
#define FW_RI_RES_WR_IQDROPRSS_F        FW_RI_RES_WR_IQDROPRSS_V(1U)

#define FW_RI_RES_WR_IQGTSMODE_S        14
#define FW_RI_RES_WR_IQGTSMODE_M        0x1
#define FW_RI_RES_WR_IQGTSMODE_V(x)     ((x) << FW_RI_RES_WR_IQGTSMODE_S)
#define FW_RI_RES_WR_IQGTSMODE_G(x)     \
        (((x) >> FW_RI_RES_WR_IQGTSMODE_S) & FW_RI_RES_WR_IQGTSMODE_M)
#define FW_RI_RES_WR_IQGTSMODE_F        FW_RI_RES_WR_IQGTSMODE_V(1U)

#define FW_RI_RES_WR_IQPCIECH_S         12
#define FW_RI_RES_WR_IQPCIECH_M         0x3
#define FW_RI_RES_WR_IQPCIECH_V(x)      ((x) << FW_RI_RES_WR_IQPCIECH_S)
#define FW_RI_RES_WR_IQPCIECH_G(x)      \
        (((x) >> FW_RI_RES_WR_IQPCIECH_S) & FW_RI_RES_WR_IQPCIECH_M)

#define FW_RI_RES_WR_IQDCAEN_S          11
#define FW_RI_RES_WR_IQDCAEN_M          0x1
#define FW_RI_RES_WR_IQDCAEN_V(x)       ((x) << FW_RI_RES_WR_IQDCAEN_S)
#define FW_RI_RES_WR_IQDCAEN_G(x)       \
        (((x) >> FW_RI_RES_WR_IQDCAEN_S) & FW_RI_RES_WR_IQDCAEN_M)
#define FW_RI_RES_WR_IQDCAEN_F  FW_RI_RES_WR_IQDCAEN_V(1U)

#define FW_RI_RES_WR_IQDCACPU_S         6
#define FW_RI_RES_WR_IQDCACPU_M         0x1f
#define FW_RI_RES_WR_IQDCACPU_V(x)      ((x) << FW_RI_RES_WR_IQDCACPU_S)
#define FW_RI_RES_WR_IQDCACPU_G(x)      \
        (((x) >> FW_RI_RES_WR_IQDCACPU_S) & FW_RI_RES_WR_IQDCACPU_M)

#define FW_RI_RES_WR_IQINTCNTTHRESH_S           4
#define FW_RI_RES_WR_IQINTCNTTHRESH_M           0x3
#define FW_RI_RES_WR_IQINTCNTTHRESH_V(x)        \
        ((x) << FW_RI_RES_WR_IQINTCNTTHRESH_S)
#define FW_RI_RES_WR_IQINTCNTTHRESH_G(x)        \
        (((x) >> FW_RI_RES_WR_IQINTCNTTHRESH_S) & FW_RI_RES_WR_IQINTCNTTHRESH_M)

#define FW_RI_RES_WR_IQO_S      3
#define FW_RI_RES_WR_IQO_M      0x1
#define FW_RI_RES_WR_IQO_V(x)   ((x) << FW_RI_RES_WR_IQO_S)
#define FW_RI_RES_WR_IQO_G(x)   \
        (((x) >> FW_RI_RES_WR_IQO_S) & FW_RI_RES_WR_IQO_M)
#define FW_RI_RES_WR_IQO_F      FW_RI_RES_WR_IQO_V(1U)

#define FW_RI_RES_WR_IQCPRIO_S          2
#define FW_RI_RES_WR_IQCPRIO_M          0x1
#define FW_RI_RES_WR_IQCPRIO_V(x)       ((x) << FW_RI_RES_WR_IQCPRIO_S)
#define FW_RI_RES_WR_IQCPRIO_G(x)       \
        (((x) >> FW_RI_RES_WR_IQCPRIO_S) & FW_RI_RES_WR_IQCPRIO_M)
#define FW_RI_RES_WR_IQCPRIO_F  FW_RI_RES_WR_IQCPRIO_V(1U)

#define FW_RI_RES_WR_IQESIZE_S          0
#define FW_RI_RES_WR_IQESIZE_M          0x3
#define FW_RI_RES_WR_IQESIZE_V(x)       ((x) << FW_RI_RES_WR_IQESIZE_S)
#define FW_RI_RES_WR_IQESIZE_G(x)       \
        (((x) >> FW_RI_RES_WR_IQESIZE_S) & FW_RI_RES_WR_IQESIZE_M)

#define FW_RI_RES_WR_IQNS_S     31
#define FW_RI_RES_WR_IQNS_M     0x1
#define FW_RI_RES_WR_IQNS_V(x)  ((x) << FW_RI_RES_WR_IQNS_S)
#define FW_RI_RES_WR_IQNS_G(x)  \
        (((x) >> FW_RI_RES_WR_IQNS_S) & FW_RI_RES_WR_IQNS_M)
#define FW_RI_RES_WR_IQNS_F     FW_RI_RES_WR_IQNS_V(1U)

#define FW_RI_RES_WR_IQRO_S     30
#define FW_RI_RES_WR_IQRO_M     0x1
#define FW_RI_RES_WR_IQRO_V(x)  ((x) << FW_RI_RES_WR_IQRO_S)
#define FW_RI_RES_WR_IQRO_G(x)  \
        (((x) >> FW_RI_RES_WR_IQRO_S) & FW_RI_RES_WR_IQRO_M)
#define FW_RI_RES_WR_IQRO_F     FW_RI_RES_WR_IQRO_V(1U)

struct fw_ri_rdma_write_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        /*
         * Use union for immediate data to be consistent with stack's 32 bit
         * data and iWARP spec's 64 bit data.
         */
        union {
                struct {
                        __be32 imm_data32;
                        u32 reserved;
                } ib_imm_data;
                __be64 imm_data64;
        } iw_imm_data;
        __be32 plen;
        __be32 stag_sink;
        __be64 to_sink;
        union {
                DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
                DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
        } u;
};

struct fw_ri_send_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __be32 sendop_pkd;
        __be32 stag_inv;
        __be32 plen;
        __be32 r3;
        __be64 r4;
        union {
                DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
                DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
        } u;
};

#define FW_RI_SEND_WR_SENDOP_S          0
#define FW_RI_SEND_WR_SENDOP_M          0xf
#define FW_RI_SEND_WR_SENDOP_V(x)       ((x) << FW_RI_SEND_WR_SENDOP_S)
#define FW_RI_SEND_WR_SENDOP_G(x)       \
        (((x) >> FW_RI_SEND_WR_SENDOP_S) & FW_RI_SEND_WR_SENDOP_M)

struct fw_ri_rdma_write_cmpl_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __u8   r2;
        __u8   flags_send;
        __u16  wrid_send;
        __be32 stag_inv;
        __be32 plen;
        __be32 stag_sink;
        __be64 to_sink;
        union fw_ri_cmpl {
                struct fw_ri_immd_cmpl {
                        __u8   op;
                        __u8   r1[6];
                        __u8   immdlen;
                        __u8   data[16];
                } immd_src;
                struct fw_ri_isgl isgl_src;
        } u_cmpl;
        __be64 r3;
        union fw_ri_write {
                DECLARE_FLEX_ARRAY(struct fw_ri_immd, immd_src);
                DECLARE_FLEX_ARRAY(struct fw_ri_isgl, isgl_src);
        } u;
};

struct fw_ri_rdma_read_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __be64 r2;
        __be32 stag_sink;
        __be32 to_sink_hi;
        __be32 to_sink_lo;
        __be32 plen;
        __be32 stag_src;
        __be32 to_src_hi;
        __be32 to_src_lo;
        __be32 r5;
};

struct fw_ri_recv_wr {
        __u8   opcode;
        __u8   r1;
        __u16  wrid;
        __u8   r2[3];
        __u8   len16;
        struct fw_ri_isgl isgl;
};

struct fw_ri_bind_mw_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __u8   qpbinde_to_dcacpu;
        __u8   pgsz_shift;
        __u8   addr_type;
        __u8   mem_perms;
        __be32 stag_mr;
        __be32 stag_mw;
        __be32 r3;
        __be64 len_mw;
        __be64 va_fbo;
        __be64 r4;
};

#define FW_RI_BIND_MW_WR_QPBINDE_S      6
#define FW_RI_BIND_MW_WR_QPBINDE_M      0x1
#define FW_RI_BIND_MW_WR_QPBINDE_V(x)   ((x) << FW_RI_BIND_MW_WR_QPBINDE_S)
#define FW_RI_BIND_MW_WR_QPBINDE_G(x)   \
        (((x) >> FW_RI_BIND_MW_WR_QPBINDE_S) & FW_RI_BIND_MW_WR_QPBINDE_M)
#define FW_RI_BIND_MW_WR_QPBINDE_F      FW_RI_BIND_MW_WR_QPBINDE_V(1U)

#define FW_RI_BIND_MW_WR_NS_S           5
#define FW_RI_BIND_MW_WR_NS_M           0x1
#define FW_RI_BIND_MW_WR_NS_V(x)        ((x) << FW_RI_BIND_MW_WR_NS_S)
#define FW_RI_BIND_MW_WR_NS_G(x)        \
        (((x) >> FW_RI_BIND_MW_WR_NS_S) & FW_RI_BIND_MW_WR_NS_M)
#define FW_RI_BIND_MW_WR_NS_F   FW_RI_BIND_MW_WR_NS_V(1U)

#define FW_RI_BIND_MW_WR_DCACPU_S       0
#define FW_RI_BIND_MW_WR_DCACPU_M       0x1f
#define FW_RI_BIND_MW_WR_DCACPU_V(x)    ((x) << FW_RI_BIND_MW_WR_DCACPU_S)
#define FW_RI_BIND_MW_WR_DCACPU_G(x)    \
        (((x) >> FW_RI_BIND_MW_WR_DCACPU_S) & FW_RI_BIND_MW_WR_DCACPU_M)

struct fw_ri_fr_nsmr_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __u8   qpbinde_to_dcacpu;
        __u8   pgsz_shift;
        __u8   addr_type;
        __u8   mem_perms;
        __be32 stag;
        __be32 len_hi;
        __be32 len_lo;
        __be32 va_hi;
        __be32 va_lo_fbo;
};

#define FW_RI_FR_NSMR_WR_QPBINDE_S      6
#define FW_RI_FR_NSMR_WR_QPBINDE_M      0x1
#define FW_RI_FR_NSMR_WR_QPBINDE_V(x)   ((x) << FW_RI_FR_NSMR_WR_QPBINDE_S)
#define FW_RI_FR_NSMR_WR_QPBINDE_G(x)   \
        (((x) >> FW_RI_FR_NSMR_WR_QPBINDE_S) & FW_RI_FR_NSMR_WR_QPBINDE_M)
#define FW_RI_FR_NSMR_WR_QPBINDE_F      FW_RI_FR_NSMR_WR_QPBINDE_V(1U)

#define FW_RI_FR_NSMR_WR_NS_S           5
#define FW_RI_FR_NSMR_WR_NS_M           0x1
#define FW_RI_FR_NSMR_WR_NS_V(x)        ((x) << FW_RI_FR_NSMR_WR_NS_S)
#define FW_RI_FR_NSMR_WR_NS_G(x)        \
        (((x) >> FW_RI_FR_NSMR_WR_NS_S) & FW_RI_FR_NSMR_WR_NS_M)
#define FW_RI_FR_NSMR_WR_NS_F   FW_RI_FR_NSMR_WR_NS_V(1U)

#define FW_RI_FR_NSMR_WR_DCACPU_S       0
#define FW_RI_FR_NSMR_WR_DCACPU_M       0x1f
#define FW_RI_FR_NSMR_WR_DCACPU_V(x)    ((x) << FW_RI_FR_NSMR_WR_DCACPU_S)
#define FW_RI_FR_NSMR_WR_DCACPU_G(x)    \
        (((x) >> FW_RI_FR_NSMR_WR_DCACPU_S) & FW_RI_FR_NSMR_WR_DCACPU_M)

struct fw_ri_fr_nsmr_tpte_wr {
        __u8    opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __be32  r2;
        __be32  stag;
        struct fw_ri_tpte tpte;
        __u64  pbl[2];
};

struct fw_ri_inv_lstag_wr {
        __u8   opcode;
        __u8   flags;
        __u16  wrid;
        __u8   r1[3];
        __u8   len16;
        __be32 r2;
        __be32 stag_inv;
};

enum fw_ri_type {
        FW_RI_TYPE_INIT,
        FW_RI_TYPE_FINI,
        FW_RI_TYPE_TERMINATE
};

enum fw_ri_init_p2ptype {
        FW_RI_INIT_P2PTYPE_RDMA_WRITE           = FW_RI_RDMA_WRITE,
        FW_RI_INIT_P2PTYPE_READ_REQ             = FW_RI_READ_REQ,
        FW_RI_INIT_P2PTYPE_SEND                 = FW_RI_SEND,
        FW_RI_INIT_P2PTYPE_SEND_WITH_INV        = FW_RI_SEND_WITH_INV,
        FW_RI_INIT_P2PTYPE_SEND_WITH_SE         = FW_RI_SEND_WITH_SE,
        FW_RI_INIT_P2PTYPE_SEND_WITH_SE_INV     = FW_RI_SEND_WITH_SE_INV,
        FW_RI_INIT_P2PTYPE_DISABLED             = 0xf,
};

enum fw_ri_init_rqeqid_srq {
        FW_RI_INIT_RQEQID_SRQ                   = 1 << 31,
};

struct fw_ri_wr {
        __be32 op_compl;
        __be32 flowid_len16;
        __u64  cookie;
        union fw_ri {
                struct fw_ri_init {
                        __u8   type;
                        __u8   mpareqbit_p2ptype;
                        __u8   r4[2];
                        __u8   mpa_attrs;
                        __u8   qp_caps;
                        __be16 nrqe;
                        __be32 pdid;
                        __be32 qpid;
                        __be32 sq_eqid;
                        __be32 rq_eqid;
                        __be32 scqid;
                        __be32 rcqid;
                        __be32 ord_max;
                        __be32 ird_max;
                        __be32 iss;
                        __be32 irs;
                        __be32 hwrqsize;
                        __be32 hwrqaddr;
                        __be64 r5;
                        union fw_ri_init_p2p {
                                struct fw_ri_rdma_write_wr write;
                                struct fw_ri_rdma_read_wr read;
                                struct fw_ri_send_wr send;
                        } u;
                } init;
                struct fw_ri_fini {
                        __u8   type;
                        __u8   r3[7];
                        __be64 r4;
                } fini;
                struct fw_ri_terminate {
                        __u8   type;
                        __u8   r3[3];
                        __be32 immdlen;
                        __u8   termmsg[40];
                } terminate;
        } u;
};

#define FW_RI_WR_MPAREQBIT_S    7
#define FW_RI_WR_MPAREQBIT_M    0x1
#define FW_RI_WR_MPAREQBIT_V(x) ((x) << FW_RI_WR_MPAREQBIT_S)
#define FW_RI_WR_MPAREQBIT_G(x) \
        (((x) >> FW_RI_WR_MPAREQBIT_S) & FW_RI_WR_MPAREQBIT_M)
#define FW_RI_WR_MPAREQBIT_F    FW_RI_WR_MPAREQBIT_V(1U)

#define FW_RI_WR_P2PTYPE_S      0
#define FW_RI_WR_P2PTYPE_M      0xf
#define FW_RI_WR_P2PTYPE_V(x)   ((x) << FW_RI_WR_P2PTYPE_S)
#define FW_RI_WR_P2PTYPE_G(x)   \
        (((x) >> FW_RI_WR_P2PTYPE_S) & FW_RI_WR_P2PTYPE_M)

#endif /* _T4FW_RI_API_H_ */