9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _SYS_IB_ADAPTERS_TAVOR_QP_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define _SYS_IB_ADAPTERS_TAVOR_QP_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_qp.h
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Contains all of the prototypes, #defines, and structures necessary
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for all of the Queue Pair Processing routines.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Specifically it contains the various flags, structures used for managing
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor queue pairs, and prototypes for many of the functions consumed by
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * other parts of the Tavor driver (including those routines directly
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * exposed through the IBTF CI interface).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/types.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/conf.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/sunddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern "C" {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines specify the default number of Queue Pairs (QP) and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * their maximum size. Settings exist for the supported DDR DIMM sizes of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 128MB and 256MB. If a DIMM greater than 256 is found, then the 256MB
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * profile is used. See tavor_cfg.c for more discussion on config profiles.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * For manual configuration (not using config profiles), these values are
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * controllable through the "tavor_log_max_qp_sz" and "tavor_log_num_qp"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * configuration variables, respectively. To override config profile settings
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the 'tavor_alt_config_enable' configuration variable must first be set.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Note: We also have a define for the minimum size of a QP. QPs allocated
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * with size 0, 1, 2, or 3 will always get back a QP of size 4. This is the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * smallest size that Tavor hardware and software can correctly handle.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_QP_SHIFT_128 0x10
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_QP_SHIFT_256 0x11
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_SZ_SHIFT 0x10
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_SZ (1 << TAVOR_QP_SZ_SHIFT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_MIN_SIZE 0x4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Minimal configuration values.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_QP_SHIFT_MIN 0xD
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_SZ_SHIFT_MIN 0x9
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following macro determines whether the contents of QP memory (WQEs)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * need to be sync'd (with ddi_dma_sync()). This decision is based on whether
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the QP memory is in DDR memory (no sync) or system memory (sync required).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * And it also supports the possibility that if a CQ in system memory is mapped
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DDI_DMA_CONSISTENT, it can be configured to not be sync'd because of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "sync override" parameter in the config profile.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_IS_SYNC_REQ(state, wqinfo) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((((((state)->ts_cfg_profile->cp_streaming_consistent) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((state)->ts_cfg_profile->cp_consistent_syncoverride))) || \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((wqinfo).qa_location == TAVOR_QUEUE_LOCATION_INDDR)) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ? 0 : 1)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines specify the size of the individual Queue Pair
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context (QPC) entries. Below we also specify the size of the "Extended
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * QPC entries as well.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QPC_SIZE_SHIFT 0x8
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QPC_SIZE (1 << TAVOR_QPC_SIZE_SHIFT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_EQPC_SIZE_SHIFT 0x5
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_EQPC_SIZE (1 << TAVOR_EQPC_SIZE_SHIFT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines specify the default number of Tavor RDMA Backing
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * entries (RDB). Settings exist for the supported DDR DIMM sizes of 128MB and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 256MB. If a DIMM greater than 256 is found, then the 256MB profile is used.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See tavor_cfg.c for more discussion on config profiles.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * For manual configuration (not using config profiles), this value is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * controllable through the "tavor_log_num_rdb" configuration variable. To
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * override config profile settings the 'tavor_alt_config_enable' configuration
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * variable must first be set.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Below we also include the defines that are used to specify four (4)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * outstanding RDMA Reads/Atomics per QP.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_RDB_SHIFT_128 0x12
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_RDB_SHIFT_256 0x13
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_HCA_MAX_RDMA_IN_QP 0x4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_HCA_MAX_RDMA_OUT_QP 0x4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Minimal configuration value.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_RDB_SHIFT_MIN 0xC
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines specify the size of the individual RDMA Backing
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * entries (RDB).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_RDB_SIZE_SHIFT 0x5
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_RDB_SIZE (1 << TAVOR_RDB_SIZE_SHIFT)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This defines the maximum number of SGLs per WQE. This value is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * controllable through the "tavor_wqe_max_sgl" configuration variable (but
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * should not be set larger than this value).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_NUM_WQE_SGL 0x10
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Define for maximum QP number mask (QP number is 24 bits) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_MAXNUMBER_MSK 0xFFFFFF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This define and the following macro are used to find a schedule queue for
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * a new QP based on its queue pair number. Note: This is a rather simple
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * method that we use today. We simply choose from the schedule queue based
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * on the 4 least significant bits of the QP number.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_TO_SCHEDQ_MASK 0xF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_SCHEDQ_GET(qpnum) ((qpnum) & TAVOR_QP_TO_SCHEDQ_MASK)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This define determines the frequency with which the AckReq bit will be
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * set in outgoing RC packets. By default it is set to five (5) or 2^5 = 32.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * So AckReq will be set once every 32 packets sent. This value is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * controllable through the "tavor_qp_ackreq_freq" configuration variable.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_ACKREQ_FREQ 0x5
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Define the maximum message size (log 2). Note: This value corresponds
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to the maximum allowable message sized as defined by the IBA spec.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_LOG_MAX_MSGSZ 0x1F
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This macro is used to determine the appropriate alignment for a Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * work queue (see tavor_qp_alloc() and tavor_special_qp_alloc()). Note:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor work queues are aligned on their combined size (i.e. combined size
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of send queue and receive queue) because of certain hardware limitations
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (i.e. work queue memory cannot cross a 32-bit boundary).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQ_ALIGN(qp_size) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (1 << ((((qp_size) & ((qp_size) - 1)) == 0) ? \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor highbit((qp_size)) - 1 : highbit((qp_size))))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This macro is used to determine if the tavor known QP type (qp_serv) is the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * same as the caller passed in IBT type (qp_trans). This is used in QP modify
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to ensure the types match.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_TYPE_VALID(qp_trans, qp_serv) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((qp_trans == IBT_UD_SRV && qp_serv == TAVOR_QP_UD) || \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (qp_trans == IBT_RC_SRV && qp_serv == TAVOR_QP_RC) || \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (qp_trans == IBT_UC_SRV && qp_serv == TAVOR_QP_UC))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following enumerated type is used to capture all the various types
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of Tavor work queue types. Note: It is specifically used as an argument
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to the tavor_qp_sgl_to_logwqesz() routine.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The defines below are also used by the tavor_qp_sgl_to_logwqesz() routine
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * they indicate the amount of overhead (in WQE header size) consumed by
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * each of the following types of WQEs. This information is used to round
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the WQE size to the next largest power-of-2 (and to determine the number
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of SGLs that are supported for the given WQE type). There is also a define
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * below used to specify the minimum size for a WQE. The minimum size is set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to 64 bytes (a single cacheline).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef enum {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_QP_WQ_TYPE_SENDQ,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_QP_WQ_TYPE_RECVQ,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_QP_WQ_TYPE_SENDMLX_QP0,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_QP_WQ_TYPE_SENDMLX_QP1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_qp_wq_type_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQE_MAX_SIZE 0x3F0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQE_MLX_SND_HDRS 0x40
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQE_MLX_RCV_HDRS 0x10
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQE_MLX_QP0_HDRS 0x40
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQE_MLX_QP1_HDRS 0x70
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_WQE_LOG_MINIMUM 0x6
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_qp_info_t structure is used internally by the Tavor driver to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * pass information to and from the tavor_qp_alloc() and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_special_qp_alloc() routines. It contains placeholders for all of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * potential inputs and outputs that either routine can take.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_qp_info_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_alloc_attr_t *qpi_attrp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qpi_type;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qpi_port;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibtl_qp_hdl_t qpi_ibt_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_chan_sizes_t *qpi_queueszp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_qpn_t *qpi_qpn;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qpi_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_qp_info_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The QPN entry which is stored in the AVL tree
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_qpn_entry_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor avl_node_t qpn_avlnode;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qpn_refcnt;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qpn_counter;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qpn_indx;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *qpn_qpc;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_qpn_entry_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QPN_NOFLAG 0x0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QPN_RELEASE 0x1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QPN_FREE_ONLY 0x2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_sw_qp_s structure is also referred to using the "tavor_qphdl_t"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * typedef (see tavor_typedef.h). It encodes all the information necessary
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to track the various resources needed to allocate, query, modify, and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (later) free both normal QP and special QP.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Specifically, it has a lock to ensure single threaded access to the QP.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * It has QP state, type, and number, pointers to the PD, MR, and CQ handles
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * associated with the QP, and pointers to the buffer where the work queues
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * come from.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * It has two pointers (one per work queue) to the workQ headers for the WRID
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * list, as well as pointers to the last WQE on each chain (used when
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * connecting a new chain of WQEs to a previously executing chain - see
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_wr.c). It's also got the real WQE size, real number of SGL per WQE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and the size of each of the work queues (in number of WQEs).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Additionally, it has pointers to the resources associated with the QP
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (including the obligatory backpointer to the resource for the QP handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * itself. But it also has some flags, like "qp_forward_sqd_event" and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "qp_sqd_still_draining" (which are used to indicate whether a Send Queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Drained Event should be forwarded to the IBTF) or "qp_is_special",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "qp_portnum", and "qp_pkeyindx" (which are used by special QP to store
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * necessary information about the type of the QP, which port it's connected
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to, and what its current PKey index is set to).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct tavor_sw_qp_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t qp_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_qpnum;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t qp_pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_serv_type;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_sync;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t qp_mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_sq_sigtype;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_is_special;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_is_umap;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_uarpg;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor devmap_cookie_t qp_umap_dhp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_portnum;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_pkeyindx;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Send Work Queue */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t qp_sq_cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *qp_sq_lastwqeaddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_workq_hdr_t *qp_sq_wqhdr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t *qp_sq_buf;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_sq_bufsz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_sq_log_wqesz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_sq_sgl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Receive Work Queue */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t qp_rq_cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *qp_rq_lastwqeaddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_workq_hdr_t *qp_rq_wqhdr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t *qp_rq_buf;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_rq_bufsz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_rq_log_wqesz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t qp_rq_sgl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t qp_desc_off;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *qp_qpcrsrcp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *qp_rsrcp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *qp_hdlrarg;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *qp_rdbrsrcp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t qp_rdb_ddraddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_forward_sqd_event;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_sqd_still_draining;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Shared Receive Queue */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t qp_srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_srq_en;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Refcnt of QP belongs to an MCG */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_mcg_refcnt;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* save the mtu & srate from init2rtr for future use */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qp_save_mtu;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srate_t qp_save_srate;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qpn_entry_t *qp_qpn_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_qalloc_info_s qp_wqinfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_hw_qpc_s qpc;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(READ_ONLY_DATA(tavor_sw_qp_s::qp_qpnum
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sync
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_buf
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_log_wqesz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_bufsz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_sgl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_buf
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_log_wqesz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_bufsz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_sgl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_desc_off
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_mrhdl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_wqinfo
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_qpcrsrcp
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rsrcp
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_hdlrarg
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_pdhdl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_cqhdl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_cqhdl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_sigtype
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_serv_type
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_is_special
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_is_umap
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_uarpg
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_portnum
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_qpn_hdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_sw_qp_s::qp_lock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_wqhdr
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sq_lastwqeaddr
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_wqhdr
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rq_lastwqeaddr
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rdbrsrcp
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_rdb_ddraddr
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qpc
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_forward_sqd_event
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_sqd_still_draining
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_mcg_refcnt
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_save_mtu
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_sw_qp_s::qp_umap_dhp))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines are used to indicate whether a QP is special or
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * not (and what type it is). They are used in the "qp_is_special" field
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * above.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_SMI 0x1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QP_GSI 0x2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_qp_options_t structure is used in the Tavor QP allocation
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * routines to provide additional option functionality. When a NULL pointer
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * is passed in place of a pointer to this struct, it is a way of specifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the "default" behavior. Using this structure, however, is a way of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * controlling any extended behavior.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Currently, the only defined "extended" behavior is for specifying whether
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * a given QP's work queues should be allocated from kernel system memory
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (TAVOR_QUEUE_LOCATION_NORMAL) or should be allocated from local DDR memory
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (TAVOR_QUEUE_LOCATION_INDDR). This defaults today to always allocating
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * from kernel system memory but can be changed by using the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "tavor_qp_wq_inddr" configuration variable.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_qp_options_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t qpo_wq_loc;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_qp_options_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Defined in tavor_qp.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_qp_alloc(tavor_state_t *state, tavor_qp_info_t *qpinfo,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t sleepflag, tavor_qp_options_t *op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_special_qp_alloc(tavor_state_t *state, tavor_qp_info_t *qpinfo,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t sleepflag, tavor_qp_options_t *op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_qp_free(tavor_state_t *state, tavor_qphdl_t *qphdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_free_qp_flags_t free_qp_flags, ibc_qpn_hdl_t *qpnh, uint_t sleepflag);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_qp_query(tavor_state_t *state, tavor_qphdl_t qphdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_query_attr_t *attr_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_qphdl_t tavor_qphdl_from_qpnum(tavor_state_t *state, uint_t qpnum);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_qp_release_qpn(tavor_state_t *state, tavor_qpn_entry_t *entry,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_qpn_avl_init(tavor_state_t *state);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_qpn_avl_fini(tavor_state_t *state);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Defined in tavor_qpmod.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_qp_modify(tavor_state_t *state, tavor_qphdl_t qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cep_modify_flags_t flags, ibt_qp_info_t *info_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_queue_sizes_t *actual_sz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_qp_to_reset(tavor_state_t *state, tavor_qphdl_t qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* _SYS_IB_ADAPTERS_TAVOR_QP_H */