5255 uts shouldn't open-code ISP2

   1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*
  27  * hermon_qp.c
  28  *    Hermon Queue Pair Processing Routines
  29  *
  30  *    Implements all the routines necessary for allocating, freeing, and
  31  *    querying the Hermon queue pairs.
  32  */
  33 
  34 #include <sys/types.h>
  35 #include <sys/conf.h>
  36 #include <sys/ddi.h>
  37 #include <sys/sunddi.h>
  38 #include <sys/modctl.h>
  39 #include <sys/bitmap.h>
  40 #include <sys/sysmacros.h>
  41 
  42 #include <sys/ib/adapters/hermon/hermon.h>
  43 #include <sys/ib/ib_pkt_hdrs.h>
  44 
  45 static int hermon_qp_create_qpn(hermon_state_t *state, hermon_qphdl_t qp,
  46     hermon_rsrc_t *qpc);
  47 static int hermon_qpn_avl_compare(const void *q, const void *e);
  48 static int hermon_special_qp_rsrc_alloc(hermon_state_t *state,
  49     ibt_sqp_type_t type, uint_t port, hermon_rsrc_t **qp_rsrc);
  50 static int hermon_special_qp_rsrc_free(hermon_state_t *state,
  51     ibt_sqp_type_t type, uint_t port);
  52 static void hermon_qp_sgl_to_logwqesz(hermon_state_t *state, uint_t num_sgl,
  53     uint_t real_max_sgl, hermon_qp_wq_type_t wq_type,
  54     uint_t *logwqesz, uint_t *max_sgl);
  55 
  56 /*
  57  * hermon_qp_alloc()
  58  *    Context: Can be called only from user or kernel context.
  59  */
  60 int
  61 hermon_qp_alloc(hermon_state_t *state, hermon_qp_info_t *qpinfo,
  62     uint_t sleepflag)
  63 {
  64         hermon_rsrc_t                   *qpc, *rsrc;
  65         hermon_rsrc_type_t              rsrc_type;
  66         hermon_umap_db_entry_t          *umapdb;
  67         hermon_qphdl_t                  qp;
  68         ibt_qp_alloc_attr_t             *attr_p;
  69         ibt_qp_alloc_flags_t            alloc_flags;
  70         ibt_qp_type_t                   type;
  71         hermon_qp_wq_type_t             swq_type;
  72         ibtl_qp_hdl_t                   ibt_qphdl;
  73         ibt_chan_sizes_t                *queuesz_p;
  74         ib_qpn_t                        *qpn;
  75         hermon_qphdl_t                  *qphdl;
  76         ibt_mr_attr_t                   mr_attr;
  77         hermon_mr_options_t             mr_op;
  78         hermon_srqhdl_t                 srq;
  79         hermon_pdhdl_t                  pd;
  80         hermon_cqhdl_t                  sq_cq, rq_cq;
  81         hermon_mrhdl_t                  mr;
  82         uint64_t                        value, qp_desc_off;
  83         uint64_t                        *thewqe, thewqesz;
  84         uint32_t                        *sq_buf, *rq_buf;
  85         uint32_t                        log_qp_sq_size, log_qp_rq_size;
  86         uint32_t                        sq_size, rq_size;
  87         uint32_t                        sq_depth, rq_depth;
  88         uint32_t                        sq_wqe_size, rq_wqe_size, wqesz_shift;
  89         uint32_t                        max_sgl, max_recv_sgl, uarpg;
  90         uint_t                          qp_is_umap;
  91         uint_t                          qp_srq_en, i, j;
  92         int                             status, flag;
  93 
  94         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*attr_p, *queuesz_p))
  95 
  96         /*
  97          * Extract the necessary info from the hermon_qp_info_t structure
  98          */
  99         attr_p    = qpinfo->qpi_attrp;
 100         type      = qpinfo->qpi_type;
 101         ibt_qphdl = qpinfo->qpi_ibt_qphdl;
 102         queuesz_p = qpinfo->qpi_queueszp;
 103         qpn       = qpinfo->qpi_qpn;
 104         qphdl     = &qpinfo->qpi_qphdl;
 105         alloc_flags = attr_p->qp_alloc_flags;
 106 
 107         /*
 108          * Verify correctness of alloc_flags.
 109          *
 110          * 1. FEXCH and RSS are only allocated via qp_range.
 111          */
 112         if (alloc_flags & (IBT_QP_USES_FEXCH | IBT_QP_USES_RSS)) {
 113                 return (IBT_INVALID_PARAM);
 114         }
 115         rsrc_type = HERMON_QPC;
 116         qp_is_umap = 0;
 117 
 118         /* 2. Make sure only one of these flags is set. */
 119         switch (alloc_flags &
 120             (IBT_QP_USER_MAP | IBT_QP_USES_RFCI | IBT_QP_USES_FCMD)) {
 121         case IBT_QP_USER_MAP:
 122                 qp_is_umap = 1;
 123                 break;
 124         case IBT_QP_USES_RFCI:
 125                 if (type != IBT_UD_RQP)
 126                         return (IBT_INVALID_PARAM);
 127 
 128                 switch (attr_p->qp_fc.fc_hca_port) {
 129                 case 1:
 130                         rsrc_type = HERMON_QPC_RFCI_PORT1;
 131                         break;
 132                 case 2:
 133                         rsrc_type = HERMON_QPC_RFCI_PORT2;
 134                         break;
 135                 default:
 136                         return (IBT_INVALID_PARAM);
 137                 }
 138                 break;
 139         case IBT_QP_USES_FCMD:
 140                 if (type != IBT_UD_RQP)
 141                         return (IBT_INVALID_PARAM);
 142                 break;
 143         case 0:
 144                 break;
 145         default:
 146                 return (IBT_INVALID_PARAM);     /* conflicting flags set */
 147         }
 148 
 149         /*
 150          * Determine whether QP is being allocated for userland access or
 151          * whether it is being allocated for kernel access.  If the QP is
 152          * being allocated for userland access, then lookup the UAR
 153          * page number for the current process.  Note:  If this is not found
 154          * (e.g. if the process has not previously open()'d the Hermon driver),
 155          * then an error is returned.
 156          */
 157         if (qp_is_umap) {
 158                 status = hermon_umap_db_find(state->hs_instance, ddi_get_pid(),
 159                     MLNX_UMAP_UARPG_RSRC, &value, 0, NULL);
 160                 if (status != DDI_SUCCESS) {
 161                         return (IBT_INVALID_PARAM);
 162                 }
 163                 uarpg = ((hermon_rsrc_t *)(uintptr_t)value)->hr_indx;
 164         } else {
 165                 uarpg = state->hs_kernel_uar_index;
 166         }
 167 
 168         /*
 169          * Determine whether QP is being associated with an SRQ
 170          */
 171         qp_srq_en = (alloc_flags & IBT_QP_USES_SRQ) ? 1 : 0;
 172         if (qp_srq_en) {
 173                 /*
 174                  * Check for valid SRQ handle pointers
 175                  */
 176                 if (attr_p->qp_ibc_srq_hdl == NULL) {
 177                         status = IBT_SRQ_HDL_INVALID;
 178                         goto qpalloc_fail;
 179                 }
 180                 srq = (hermon_srqhdl_t)attr_p->qp_ibc_srq_hdl;
 181         }
 182 
 183         /*
 184          * Check for valid QP service type (only UD/RC/UC supported)
 185          */
 186         if (((type != IBT_UD_RQP) && (type != IBT_RC_RQP) &&
 187             (type != IBT_UC_RQP))) {
 188                 status = IBT_QP_SRV_TYPE_INVALID;
 189                 goto qpalloc_fail;
 190         }
 191 
 192 
 193         /*
 194          * Check for valid PD handle pointer
 195          */
 196         if (attr_p->qp_pd_hdl == NULL) {
 197                 status = IBT_PD_HDL_INVALID;
 198                 goto qpalloc_fail;
 199         }
 200         pd = (hermon_pdhdl_t)attr_p->qp_pd_hdl;
 201 
 202         /*
 203          * If on an SRQ, check to make sure the PD is the same
 204          */
 205         if (qp_srq_en && (pd->pd_pdnum != srq->srq_pdhdl->pd_pdnum)) {
 206                 status = IBT_PD_HDL_INVALID;
 207                 goto qpalloc_fail;
 208         }
 209 
 210         /* Increment the reference count on the protection domain (PD) */
 211         hermon_pd_refcnt_inc(pd);
 212 
 213         /*
 214          * Check for valid CQ handle pointers
 215          *
 216          * FCMD QPs do not require a receive cq handle.
 217          */
 218         if (attr_p->qp_ibc_scq_hdl == NULL) {
 219                 status = IBT_CQ_HDL_INVALID;
 220                 goto qpalloc_fail1;
 221         }
 222         sq_cq = (hermon_cqhdl_t)attr_p->qp_ibc_scq_hdl;
 223         if ((attr_p->qp_ibc_rcq_hdl == NULL)) {
 224                 if ((alloc_flags & IBT_QP_USES_FCMD) == 0) {
 225                         status = IBT_CQ_HDL_INVALID;
 226                         goto qpalloc_fail1;
 227                 }
 228                 rq_cq = sq_cq;  /* just use the send cq */
 229         } else
 230                 rq_cq = (hermon_cqhdl_t)attr_p->qp_ibc_rcq_hdl;
 231 
 232         /*
 233          * Increment the reference count on the CQs.  One or both of these
 234          * could return error if we determine that the given CQ is already
 235          * being used with a special (SMI/GSI) QP.
 236          */
 237         status = hermon_cq_refcnt_inc(sq_cq, HERMON_CQ_IS_NORMAL);
 238         if (status != DDI_SUCCESS) {
 239                 status = IBT_CQ_HDL_INVALID;
 240                 goto qpalloc_fail1;
 241         }
 242         status = hermon_cq_refcnt_inc(rq_cq, HERMON_CQ_IS_NORMAL);
 243         if (status != DDI_SUCCESS) {
 244                 status = IBT_CQ_HDL_INVALID;
 245                 goto qpalloc_fail2;
 246         }
 247 
 248         /*
 249          * Allocate an QP context entry.  This will be filled in with all
 250          * the necessary parameters to define the Queue Pair.  Unlike
 251          * other Hermon hardware resources, ownership is not immediately
 252          * given to hardware in the final step here.  Instead, we must
 253          * wait until the QP is later transitioned to the "Init" state before
 254          * passing the QP to hardware.  If we fail here, we must undo all
 255          * the reference count (CQ and PD).
 256          */
 257         status = hermon_rsrc_alloc(state, rsrc_type, 1, sleepflag, &qpc);
 258         if (status != DDI_SUCCESS) {
 259                 status = IBT_INSUFF_RESOURCE;
 260                 goto qpalloc_fail3;
 261         }
 262 
 263         /*
 264          * Allocate the software structure for tracking the queue pair
 265          * (i.e. the Hermon Queue Pair handle).  If we fail here, we must
 266          * undo the reference counts and the previous resource allocation.
 267          */
 268         status = hermon_rsrc_alloc(state, HERMON_QPHDL, 1, sleepflag, &rsrc);
 269         if (status != DDI_SUCCESS) {
 270                 status = IBT_INSUFF_RESOURCE;
 271                 goto qpalloc_fail4;
 272         }
 273         qp = (hermon_qphdl_t)rsrc->hr_addr;
 274         bzero(qp, sizeof (struct hermon_sw_qp_s));
 275         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
 276 
 277         qp->qp_alloc_flags = alloc_flags;
 278 
 279         /*
 280          * Calculate the QP number from QPC index.  This routine handles
 281          * all of the operations necessary to keep track of used, unused,
 282          * and released QP numbers.
 283          */
 284         if (type == IBT_UD_RQP) {
 285                 qp->qp_qpnum = qpc->hr_indx;
 286                 qp->qp_ring = qp->qp_qpnum << 8;
 287                 qp->qp_qpn_hdl = NULL;
 288         } else {
 289                 status = hermon_qp_create_qpn(state, qp, qpc);
 290                 if (status != DDI_SUCCESS) {
 291                         status = IBT_INSUFF_RESOURCE;
 292                         goto qpalloc_fail5;
 293                 }
 294         }
 295 
 296         /*
 297          * If this will be a user-mappable QP, then allocate an entry for
 298          * the "userland resources database".  This will later be added to
 299          * the database (after all further QP operations are successful).
 300          * If we fail here, we must undo the reference counts and the
 301          * previous resource allocation.
 302          */
 303         if (qp_is_umap) {
 304                 umapdb = hermon_umap_db_alloc(state->hs_instance, qp->qp_qpnum,
 305                     MLNX_UMAP_QPMEM_RSRC, (uint64_t)(uintptr_t)rsrc);
 306                 if (umapdb == NULL) {
 307                         status = IBT_INSUFF_RESOURCE;
 308                         goto qpalloc_fail6;
 309                 }
 310         }
 311 
 312         /*
 313          * Allocate the doorbell record.  Hermon just needs one for the RQ,
 314          * if the QP is not associated with an SRQ, and use uarpg (above) as
 315          * the uar index
 316          */
 317 
 318         if (!qp_srq_en) {
 319                 status = hermon_dbr_alloc(state, uarpg, &qp->qp_rq_dbr_acchdl,
 320                     &qp->qp_rq_vdbr, &qp->qp_rq_pdbr, &qp->qp_rdbr_mapoffset);
 321                 if (status != DDI_SUCCESS) {
 322                         status = IBT_INSUFF_RESOURCE;
 323                         goto qpalloc_fail6;
 324                 }
 325         }
 326 
 327         qp->qp_uses_lso = (attr_p->qp_flags & IBT_USES_LSO);
 328 
 329         /*
 330          * We verify that the requested number of SGL is valid (i.e.
 331          * consistent with the device limits and/or software-configured
 332          * limits).  If not, then obviously the same cleanup needs to be done.
 333          */
 334         if (type == IBT_UD_RQP) {
 335                 max_sgl = state->hs_ibtfinfo.hca_attr->hca_ud_send_sgl_sz;
 336                 swq_type = HERMON_QP_WQ_TYPE_SENDQ_UD;
 337         } else {
 338                 max_sgl = state->hs_ibtfinfo.hca_attr->hca_conn_send_sgl_sz;
 339                 swq_type = HERMON_QP_WQ_TYPE_SENDQ_CONN;
 340         }
 341         max_recv_sgl = state->hs_ibtfinfo.hca_attr->hca_recv_sgl_sz;
 342         if ((attr_p->qp_sizes.cs_sq_sgl > max_sgl) ||
 343             (!qp_srq_en && (attr_p->qp_sizes.cs_rq_sgl > max_recv_sgl))) {
 344                 status = IBT_HCA_SGL_EXCEEDED;
 345                 goto qpalloc_fail7;
 346         }
 347 
 348         /*
 349          * Determine this QP's WQE stride (for both the Send and Recv WQEs).
 350          * This will depend on the requested number of SGLs.  Note: this
 351          * has the side-effect of also calculating the real number of SGLs
 352          * (for the calculated WQE size).
 353          *
 354          * For QP's on an SRQ, we set these to 0.
 355          */
 356         if (qp_srq_en) {
 357                 qp->qp_rq_log_wqesz = 0;
 358                 qp->qp_rq_sgl = 0;
 359         } else {
 360                 hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_rq_sgl,
 361                     max_recv_sgl, HERMON_QP_WQ_TYPE_RECVQ,
 362                     &qp->qp_rq_log_wqesz, &qp->qp_rq_sgl);
 363         }
 364         hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_sq_sgl,
 365             max_sgl, swq_type, &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
 366 
 367         sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
 368 
 369         /* NOTE: currently policy in driver, later maybe IBTF interface */
 370         qp->qp_no_prefetch = 0;
 371 
 372         /*
 373          * for prefetching, we need to add the number of wqes in
 374          * the 2k area plus one to the number requested, but
 375          * ONLY for send queue.  If no_prefetch == 1 (prefetch off)
 376          * it's exactly TWO wqes for the headroom
 377          */
 378         if (qp->qp_no_prefetch)
 379                 qp->qp_sq_headroom = 2 * sq_wqe_size;
 380         else
 381                 qp->qp_sq_headroom = sq_wqe_size + HERMON_QP_OH_SIZE;
 382         /*
 383          * hdrm wqes must be integral since both sq_wqe_size &
 384          * HERMON_QP_OH_SIZE are power of 2
 385          */
 386         qp->qp_sq_hdrmwqes = (qp->qp_sq_headroom / sq_wqe_size);
 387 
 388 
 389         /*
 390          * Calculate the appropriate size for the work queues.
 391          * For send queue, add in the headroom wqes to the calculation.
 392          * Note:  All Hermon QP work queues must be a power-of-2 in size.  Also
 393          * they may not be any smaller than HERMON_QP_MIN_SIZE.  This step is
 394          * to round the requested size up to the next highest power-of-2
 395          */
 396         /* first, adjust to a minimum and tell the caller the change */
 397         attr_p->qp_sizes.cs_sq = max(attr_p->qp_sizes.cs_sq,
 398             HERMON_QP_MIN_SIZE);
 399         attr_p->qp_sizes.cs_rq = max(attr_p->qp_sizes.cs_rq,
 400             HERMON_QP_MIN_SIZE);
 401         /*
 402          * now, calculate the alloc size, taking into account
 403          * the headroom for the sq
 404          */
 405         log_qp_sq_size = highbit(attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes);
 406         /* if the total is a power of two, reduce it */
 407         if (((attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes)  &
 408             (attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes - 1)) == 0)      {
 409                 log_qp_sq_size = log_qp_sq_size - 1;
 410         }
 411 
 412         log_qp_rq_size = highbit(attr_p->qp_sizes.cs_rq);
 413         if ((attr_p->qp_sizes.cs_rq & (attr_p->qp_sizes.cs_rq - 1)) == 0) {
 414                 log_qp_rq_size = log_qp_rq_size - 1;
 415         }
 416 
 417         /*
 418          * Next we verify that the rounded-up size is valid (i.e. consistent
 419          * with the device limits and/or software-configured limits).  If not,
 420          * then obviously we have a lot of cleanup to do before returning.
 421          *
 422          * NOTE: the first condition deals with the (test) case of cs_sq
 423          * being just less than 2^32.  In this case, the headroom addition
 424          * to the requested cs_sq will pass the test when it should not.
 425          * This test no longer lets that case slip through the check.
 426          */
 427         if ((attr_p->qp_sizes.cs_sq >
 428             (1 << state->hs_cfg_profile->cp_log_max_qp_sz)) ||
 429             (log_qp_sq_size > state->hs_cfg_profile->cp_log_max_qp_sz) ||
 430             (!qp_srq_en && (log_qp_rq_size >
 431             state->hs_cfg_profile->cp_log_max_qp_sz))) {
 432                 status = IBT_HCA_WR_EXCEEDED;
 433                 goto qpalloc_fail7;
 434         }
 435 
 436         /*
 437          * Allocate the memory for QP work queues. Since Hermon work queues
 438          * are not allowed to cross a 32-bit (4GB) boundary, the alignment of
 439          * the work queue memory is very important.  We used to allocate
 440          * work queues (the combined receive and send queues) so that they
 441          * would be aligned on their combined size.  That alignment guaranteed
 442          * that they would never cross the 4GB boundary (Hermon work queues
 443          * are on the order of MBs at maximum).  Now we are able to relax
 444          * this alignment constraint by ensuring that the IB address assigned
 445          * to the queue memory (as a result of the hermon_mr_register() call)
 446          * is offset from zero.
 447          * Previously, we had wanted to use the ddi_dma_mem_alloc() routine to
 448          * guarantee the alignment, but when attempting to use IOMMU bypass
 449          * mode we found that we were not allowed to specify any alignment
 450          * that was more restrictive than the system page size.
 451          * So we avoided this constraint by passing two alignment values,
 452          * one for the memory allocation itself and the other for the DMA
 453          * handle (for later bind).  This used to cause more memory than
 454          * necessary to be allocated (in order to guarantee the more
 455          * restrictive alignment contraint).  But by guaranteeing the
 456          * zero-based IB virtual address for the queue, we are able to
 457          * conserve this memory.
 458          */
 459         sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
 460         sq_depth    = 1 << log_qp_sq_size;
 461         sq_size     = sq_depth * sq_wqe_size;
 462 
 463         /* QP on SRQ sets these to 0 */
 464         if (qp_srq_en) {
 465                 rq_wqe_size = 0;
 466                 rq_size     = 0;
 467         } else {
 468                 rq_wqe_size = 1 << qp->qp_rq_log_wqesz;
 469                 rq_depth    = 1 << log_qp_rq_size;
 470                 rq_size     = rq_depth * rq_wqe_size;
 471         }
 472 
 473         qp->qp_wqinfo.qa_size = sq_size + rq_size;
 474 
 475         qp->qp_wqinfo.qa_alloc_align = PAGESIZE;
 476         qp->qp_wqinfo.qa_bind_align  = PAGESIZE;
 477 
 478         if (qp_is_umap) {
 479                 qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_USERLAND;
 480         } else {
 481                 qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
 482         }
 483         status = hermon_queue_alloc(state, &qp->qp_wqinfo, sleepflag);
 484         if (status != DDI_SUCCESS) {
 485                 status = IBT_INSUFF_RESOURCE;
 486                 goto qpalloc_fail7;
 487         }
 488 
 489         /*
 490          * Sort WQs in memory according to stride (*q_wqe_size), largest first
 491          * If they are equal, still put the SQ first
 492          */
 493         qp->qp_sq_baseaddr = 0;
 494         qp->qp_rq_baseaddr = 0;
 495         if ((sq_wqe_size > rq_wqe_size) || (sq_wqe_size == rq_wqe_size)) {
 496                 sq_buf = qp->qp_wqinfo.qa_buf_aligned;
 497 
 498                 /* if this QP is on an SRQ, set the rq_buf to NULL */
 499                 if (qp_srq_en) {
 500                         rq_buf = NULL;
 501                 } else {
 502                         rq_buf = (uint32_t *)((uintptr_t)sq_buf + sq_size);
 503                         qp->qp_rq_baseaddr = sq_size;
 504                 }
 505         } else {
 506                 rq_buf = qp->qp_wqinfo.qa_buf_aligned;
 507                 sq_buf = (uint32_t *)((uintptr_t)rq_buf + rq_size);
 508                 qp->qp_sq_baseaddr = rq_size;
 509         }
 510 
 511         if (qp_is_umap == 0) {
 512                 qp->qp_sq_wqhdr = hermon_wrid_wqhdr_create(sq_depth);
 513                 if (qp->qp_sq_wqhdr == NULL) {
 514                         status = IBT_INSUFF_RESOURCE;
 515                         goto qpalloc_fail8;
 516                 }
 517                 if (qp_srq_en) {
 518                         qp->qp_rq_wqavl.wqa_wq = srq->srq_wq_wqhdr;
 519                         qp->qp_rq_wqavl.wqa_srq_en = 1;
 520                         qp->qp_rq_wqavl.wqa_srq = srq;
 521                 } else {
 522                         qp->qp_rq_wqhdr = hermon_wrid_wqhdr_create(rq_depth);
 523                         if (qp->qp_rq_wqhdr == NULL) {
 524                                 status = IBT_INSUFF_RESOURCE;
 525                                 goto qpalloc_fail8;
 526                         }
 527                         qp->qp_rq_wqavl.wqa_wq = qp->qp_rq_wqhdr;
 528                 }
 529                 qp->qp_sq_wqavl.wqa_qpn = qp->qp_qpnum;
 530                 qp->qp_sq_wqavl.wqa_type = HERMON_WR_SEND;
 531                 qp->qp_sq_wqavl.wqa_wq = qp->qp_sq_wqhdr;
 532                 qp->qp_rq_wqavl.wqa_qpn = qp->qp_qpnum;
 533                 qp->qp_rq_wqavl.wqa_type = HERMON_WR_RECV;
 534         }
 535 
 536         /*
 537          * Register the memory for the QP work queues.  The memory for the
 538          * QP must be registered in the Hermon cMPT tables.  This gives us the
 539          * LKey to specify in the QP context later.  Note: The memory for
 540          * Hermon work queues (both Send and Recv) must be contiguous and
 541          * registered as a single memory region.  Note: If the QP memory is
 542          * user-mappable, force DDI_DMA_CONSISTENT mapping. Also, in order to
 543          * meet the alignment restriction, we pass the "mro_bind_override_addr"
 544          * flag in the call to hermon_mr_register(). This guarantees that the
 545          * resulting IB vaddr will be zero-based (modulo the offset into the
 546          * first page). If we fail here, we still have the bunch of resource
 547          * and reference count cleanup to do.
 548          */
 549         flag = (sleepflag == HERMON_SLEEP) ? IBT_MR_SLEEP :
 550             IBT_MR_NOSLEEP;
 551         mr_attr.mr_vaddr    = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned;
 552         mr_attr.mr_len      = qp->qp_wqinfo.qa_size;
 553         mr_attr.mr_as       = NULL;
 554         mr_attr.mr_flags    = flag;
 555         if (qp_is_umap) {
 556                 mr_op.mro_bind_type = state->hs_cfg_profile->cp_iommu_bypass;
 557         } else {
 558                 /* HERMON_QUEUE_LOCATION_NORMAL */
 559                 mr_op.mro_bind_type =
 560                     state->hs_cfg_profile->cp_iommu_bypass;
 561         }
 562         mr_op.mro_bind_dmahdl = qp->qp_wqinfo.qa_dmahdl;
 563         mr_op.mro_bind_override_addr = 1;
 564         status = hermon_mr_register(state, pd, &mr_attr, &mr,
 565             &mr_op, HERMON_QP_CMPT);
 566         if (status != DDI_SUCCESS) {
 567                 status = IBT_INSUFF_RESOURCE;
 568                 goto qpalloc_fail9;
 569         }
 570 
 571         /*
 572          * Calculate the offset between the kernel virtual address space
 573          * and the IB virtual address space.  This will be used when
 574          * posting work requests to properly initialize each WQE.
 575          */
 576         qp_desc_off = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned -
 577             (uint64_t)mr->mr_bindinfo.bi_addr;
 578 
 579         /*
 580          * Fill in all the return arguments (if necessary).  This includes
 581          * real work queue sizes (in wqes), real SGLs, and QP number
 582          */
 583         if (queuesz_p != NULL) {
 584                 queuesz_p->cs_sq     =
 585                     (1 << log_qp_sq_size) - qp->qp_sq_hdrmwqes;
 586                 queuesz_p->cs_sq_sgl = qp->qp_sq_sgl;
 587 
 588                 /* if this QP is on an SRQ, set these to 0 */
 589                 if (qp_srq_en) {
 590                         queuesz_p->cs_rq     = 0;
 591                         queuesz_p->cs_rq_sgl = 0;
 592                 } else {
 593                         queuesz_p->cs_rq     = (1 << log_qp_rq_size);
 594                         queuesz_p->cs_rq_sgl = qp->qp_rq_sgl;
 595                 }
 596         }
 597         if (qpn != NULL) {
 598                 *qpn = (ib_qpn_t)qp->qp_qpnum;
 599         }
 600 
 601         /*
 602          * Fill in the rest of the Hermon Queue Pair handle.
 603          */
 604         qp->qp_qpcrsrcp              = qpc;
 605         qp->qp_rsrcp         = rsrc;
 606         qp->qp_state         = HERMON_QP_RESET;
 607         HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
 608         qp->qp_pdhdl         = pd;
 609         qp->qp_mrhdl         = mr;
 610         qp->qp_sq_sigtype    = (attr_p->qp_flags & IBT_WR_SIGNALED) ?
 611             HERMON_QP_SQ_WR_SIGNALED : HERMON_QP_SQ_ALL_SIGNALED;
 612         qp->qp_is_special    = 0;
 613         qp->qp_uarpg         = uarpg;
 614         qp->qp_umap_dhp              = (devmap_cookie_t)NULL;
 615         qp->qp_sq_cqhdl              = sq_cq;
 616         qp->qp_sq_bufsz              = (1 << log_qp_sq_size);
 617         qp->qp_sq_logqsz     = log_qp_sq_size;
 618         qp->qp_sq_buf                = sq_buf;
 619         qp->qp_desc_off              = qp_desc_off;
 620         qp->qp_rq_cqhdl              = rq_cq;
 621         qp->qp_rq_buf                = rq_buf;
 622         qp->qp_rlky          = (attr_p->qp_flags & IBT_FAST_REG_RES_LKEY) !=
 623             0;
 624 
 625         /* if this QP is on an SRQ, set rq_bufsz to 0 */
 626         if (qp_srq_en) {
 627                 qp->qp_rq_bufsz              = 0;
 628                 qp->qp_rq_logqsz     = 0;
 629         } else {
 630                 qp->qp_rq_bufsz              = (1 << log_qp_rq_size);
 631                 qp->qp_rq_logqsz     = log_qp_rq_size;
 632         }
 633 
 634         qp->qp_forward_sqd_event  = 0;
 635         qp->qp_sqd_still_draining = 0;
 636         qp->qp_hdlrarg               = (void *)ibt_qphdl;
 637         qp->qp_mcg_refcnt    = 0;
 638 
 639         /*
 640          * If this QP is to be associated with an SRQ, set the SRQ handle
 641          */
 642         if (qp_srq_en) {
 643                 qp->qp_srqhdl = srq;
 644                 hermon_srq_refcnt_inc(qp->qp_srqhdl);
 645         } else {
 646                 qp->qp_srqhdl = NULL;
 647         }
 648 
 649         /* Determine the QP service type */
 650         qp->qp_type = type;
 651         if (type == IBT_RC_RQP) {
 652                 qp->qp_serv_type = HERMON_QP_RC;
 653         } else if (type == IBT_UD_RQP) {
 654                 if (alloc_flags & IBT_QP_USES_RFCI)
 655                         qp->qp_serv_type = HERMON_QP_RFCI;
 656                 else if (alloc_flags & IBT_QP_USES_FCMD)
 657                         qp->qp_serv_type = HERMON_QP_FCMND;
 658                 else
 659                         qp->qp_serv_type = HERMON_QP_UD;
 660         } else {
 661                 qp->qp_serv_type = HERMON_QP_UC;
 662         }
 663 
 664         /*
 665          * Initialize the RQ WQEs - unlike Arbel, no Rcv init is needed
 666          */
 667 
 668         /*
 669          * Initialize the SQ WQEs - all that needs to be done is every 64 bytes
 670          * set the quadword to all F's - high-order bit is owner (init to one)
 671          * and the rest for the headroom definition of prefetching
 672          *
 673          */
 674         wqesz_shift = qp->qp_sq_log_wqesz;
 675         thewqesz    = 1 << wqesz_shift;
 676         thewqe = (uint64_t *)(void *)(qp->qp_sq_buf);
 677         if (qp_is_umap == 0) {
 678                 for (i = 0; i < sq_depth; i++) {
 679                         /*
 680                          * for each stride, go through and every 64 bytes
 681                          * write the init value - having set the address
 682                          * once, just keep incrementing it
 683                          */
 684                         for (j = 0; j < thewqesz; j += 64, thewqe += 8) {
 685                                 *(uint32_t *)thewqe = 0xFFFFFFFF;
 686                         }
 687                 }
 688         }
 689 
 690         /* Zero out the QP context */
 691         bzero(&qp->qpc, sizeof (hermon_hw_qpc_t));
 692 
 693         /*
 694          * Put QP handle in Hermon QPNum-to-QPHdl list.  Then fill in the
 695          * "qphdl" and return success
 696          */
 697         hermon_icm_set_num_to_hdl(state, HERMON_QPC, qpc->hr_indx, qp);
 698 
 699         /*
 700          * If this is a user-mappable QP, then we need to insert the previously
 701          * allocated entry into the "userland resources database".  This will
 702          * allow for later lookup during devmap() (i.e. mmap()) calls.
 703          */
 704         if (qp_is_umap) {
 705                 hermon_umap_db_add(umapdb);
 706         }
 707         mutex_init(&qp->qp_sq_lock, NULL, MUTEX_DRIVER,
 708             DDI_INTR_PRI(state->hs_intrmsi_pri));
 709 
 710         *qphdl = qp;
 711 
 712         return (DDI_SUCCESS);
 713 
 714 /*
 715  * The following is cleanup for all possible failure cases in this routine
 716  */
 717 qpalloc_fail9:
 718         hermon_queue_free(&qp->qp_wqinfo);
 719 qpalloc_fail8:
 720         if (qp->qp_sq_wqhdr)
 721                 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
 722         if (qp->qp_rq_wqhdr)
 723                 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
 724 qpalloc_fail7:
 725         if (qp_is_umap) {
 726                 hermon_umap_db_free(umapdb);
 727         }
 728         if (!qp_srq_en) {
 729                 hermon_dbr_free(state, uarpg, qp->qp_rq_vdbr);
 730         }
 731 
 732 qpalloc_fail6:
 733         /*
 734          * Releasing the QPN will also free up the QPC context.  Update
 735          * the QPC context pointer to indicate this.
 736          */
 737         if (qp->qp_qpn_hdl) {
 738                 hermon_qp_release_qpn(state, qp->qp_qpn_hdl,
 739                     HERMON_QPN_RELEASE);
 740         } else {
 741                 hermon_rsrc_free(state, &qpc);
 742         }
 743         qpc = NULL;
 744 qpalloc_fail5:
 745         hermon_rsrc_free(state, &rsrc);
 746 qpalloc_fail4:
 747         if (qpc) {
 748                 hermon_rsrc_free(state, &qpc);
 749         }
 750 qpalloc_fail3:
 751         hermon_cq_refcnt_dec(rq_cq);
 752 qpalloc_fail2:
 753         hermon_cq_refcnt_dec(sq_cq);
 754 qpalloc_fail1:
 755         hermon_pd_refcnt_dec(pd);
 756 qpalloc_fail:
 757         return (status);
 758 }
 759 
 760 
 761 
 762 /*
 763  * hermon_special_qp_alloc()
 764  *    Context: Can be called only from user or kernel context.
 765  */
 766 int
 767 hermon_special_qp_alloc(hermon_state_t *state, hermon_qp_info_t *qpinfo,
 768     uint_t sleepflag)
 769 {
 770         hermon_rsrc_t           *qpc, *rsrc;
 771         hermon_qphdl_t          qp;
 772         ibt_qp_alloc_attr_t     *attr_p;
 773         ibt_sqp_type_t          type;
 774         uint8_t                 port;
 775         ibtl_qp_hdl_t           ibt_qphdl;
 776         ibt_chan_sizes_t        *queuesz_p;
 777         hermon_qphdl_t          *qphdl;
 778         ibt_mr_attr_t           mr_attr;
 779         hermon_mr_options_t     mr_op;
 780         hermon_pdhdl_t          pd;
 781         hermon_cqhdl_t          sq_cq, rq_cq;
 782         hermon_mrhdl_t          mr;
 783         uint64_t                qp_desc_off;
 784         uint64_t                *thewqe, thewqesz;
 785         uint32_t                *sq_buf, *rq_buf;
 786         uint32_t                log_qp_sq_size, log_qp_rq_size;
 787         uint32_t                sq_size, rq_size, max_sgl;
 788         uint32_t                uarpg;
 789         uint32_t                sq_depth;
 790         uint32_t                sq_wqe_size, rq_wqe_size, wqesz_shift;
 791         int                     status, flag, i, j;
 792 
 793         /*
 794          * Extract the necessary info from the hermon_qp_info_t structure
 795          */
 796         attr_p    = qpinfo->qpi_attrp;
 797         type      = qpinfo->qpi_type;
 798         port      = qpinfo->qpi_port;
 799         ibt_qphdl = qpinfo->qpi_ibt_qphdl;
 800         queuesz_p = qpinfo->qpi_queueszp;
 801         qphdl     = &qpinfo->qpi_qphdl;
 802 
 803         /*
 804          * Check for valid special QP type (only SMI & GSI supported)
 805          */
 806         if ((type != IBT_SMI_SQP) && (type != IBT_GSI_SQP)) {
 807                 status = IBT_QP_SPECIAL_TYPE_INVALID;
 808                 goto spec_qpalloc_fail;
 809         }
 810 
 811         /*
 812          * Check for valid port number
 813          */
 814         if (!hermon_portnum_is_valid(state, port)) {
 815                 status = IBT_HCA_PORT_INVALID;
 816                 goto spec_qpalloc_fail;
 817         }
 818         port = port - 1;
 819 
 820         /*
 821          * Check for valid PD handle pointer
 822          */
 823         if (attr_p->qp_pd_hdl == NULL) {
 824                 status = IBT_PD_HDL_INVALID;
 825                 goto spec_qpalloc_fail;
 826         }
 827         pd = (hermon_pdhdl_t)attr_p->qp_pd_hdl;
 828 
 829         /* Increment the reference count on the PD */
 830         hermon_pd_refcnt_inc(pd);
 831 
 832         /*
 833          * Check for valid CQ handle pointers
 834          */
 835         if ((attr_p->qp_ibc_scq_hdl == NULL) ||
 836             (attr_p->qp_ibc_rcq_hdl == NULL)) {
 837                 status = IBT_CQ_HDL_INVALID;
 838                 goto spec_qpalloc_fail1;
 839         }
 840         sq_cq = (hermon_cqhdl_t)attr_p->qp_ibc_scq_hdl;
 841         rq_cq = (hermon_cqhdl_t)attr_p->qp_ibc_rcq_hdl;
 842 
 843         /*
 844          * Increment the reference count on the CQs.  One or both of these
 845          * could return error if we determine that the given CQ is already
 846          * being used with a non-special QP (i.e. a normal QP).
 847          */
 848         status = hermon_cq_refcnt_inc(sq_cq, HERMON_CQ_IS_SPECIAL);
 849         if (status != DDI_SUCCESS) {
 850                 status = IBT_CQ_HDL_INVALID;
 851                 goto spec_qpalloc_fail1;
 852         }
 853         status = hermon_cq_refcnt_inc(rq_cq, HERMON_CQ_IS_SPECIAL);
 854         if (status != DDI_SUCCESS) {
 855                 status = IBT_CQ_HDL_INVALID;
 856                 goto spec_qpalloc_fail2;
 857         }
 858 
 859         /*
 860          * Allocate the special QP resources.  Essentially, this allocation
 861          * amounts to checking if the request special QP has already been
 862          * allocated.  If successful, the QP context return is an actual
 863          * QP context that has been "aliased" to act as a special QP of the
 864          * appropriate type (and for the appropriate port).  Just as in
 865          * hermon_qp_alloc() above, ownership for this QP context is not
 866          * immediately given to hardware in the final step here.  Instead, we
 867          * wait until the QP is later transitioned to the "Init" state before
 868          * passing the QP to hardware.  If we fail here, we must undo all
 869          * the reference count (CQ and PD).
 870          */
 871         status = hermon_special_qp_rsrc_alloc(state, type, port, &qpc);
 872         if (status != DDI_SUCCESS) {
 873                 goto spec_qpalloc_fail3;
 874         }
 875 
 876         /*
 877          * Allocate the software structure for tracking the special queue
 878          * pair (i.e. the Hermon Queue Pair handle).  If we fail here, we
 879          * must undo the reference counts and the previous resource allocation.
 880          */
 881         status = hermon_rsrc_alloc(state, HERMON_QPHDL, 1, sleepflag, &rsrc);
 882         if (status != DDI_SUCCESS) {
 883                 status = IBT_INSUFF_RESOURCE;
 884                 goto spec_qpalloc_fail4;
 885         }
 886         qp = (hermon_qphdl_t)rsrc->hr_addr;
 887 
 888         bzero(qp, sizeof (struct hermon_sw_qp_s));
 889 
 890         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
 891         qp->qp_alloc_flags = attr_p->qp_alloc_flags;
 892 
 893         /*
 894          * Actual QP number is a combination of the index of the QPC and
 895          * the port number.  This is because the special QP contexts must
 896          * be allocated two-at-a-time.
 897          */
 898         qp->qp_qpnum = qpc->hr_indx + port;
 899         qp->qp_ring = qp->qp_qpnum << 8;
 900 
 901         uarpg = state->hs_kernel_uar_index; /* must be for spec qp */
 902         /*
 903          * Allocate the doorbell record.  Hermon uses only one for the RQ so
 904          * alloc a qp doorbell, using uarpg (above) as the uar index
 905          */
 906 
 907         status = hermon_dbr_alloc(state, uarpg, &qp->qp_rq_dbr_acchdl,
 908             &qp->qp_rq_vdbr, &qp->qp_rq_pdbr, &qp->qp_rdbr_mapoffset);
 909         if (status != DDI_SUCCESS) {
 910                 status = IBT_INSUFF_RESOURCE;
 911                 goto spec_qpalloc_fail5;
 912         }
 913         /*
 914          * Calculate the appropriate size for the work queues.
 915          * Note:  All Hermon QP work queues must be a power-of-2 in size.  Also
 916          * they may not be any smaller than HERMON_QP_MIN_SIZE.  This step is
 917          * to round the requested size up to the next highest power-of-2
 918          */
 919         attr_p->qp_sizes.cs_sq =
 920             max(attr_p->qp_sizes.cs_sq, HERMON_QP_MIN_SIZE);
 921         attr_p->qp_sizes.cs_rq =
 922             max(attr_p->qp_sizes.cs_rq, HERMON_QP_MIN_SIZE);
 923         log_qp_sq_size = highbit(attr_p->qp_sizes.cs_sq);
 924         if ((attr_p->qp_sizes.cs_sq & (attr_p->qp_sizes.cs_sq - 1)) == 0) {
 925                 log_qp_sq_size = log_qp_sq_size - 1;
 926         }
 927         log_qp_rq_size = highbit(attr_p->qp_sizes.cs_rq);
 928         if ((attr_p->qp_sizes.cs_rq & (attr_p->qp_sizes.cs_rq - 1)) == 0) {
 929                 log_qp_rq_size = log_qp_rq_size - 1;
 930         }
 931 
 932         /*
 933          * Next we verify that the rounded-up size is valid (i.e. consistent
 934          * with the device limits and/or software-configured limits).  If not,
 935          * then obviously we have a bit of cleanup to do before returning.
 936          */
 937         if ((log_qp_sq_size > state->hs_cfg_profile->cp_log_max_qp_sz) ||
 938             (log_qp_rq_size > state->hs_cfg_profile->cp_log_max_qp_sz)) {
 939                 status = IBT_HCA_WR_EXCEEDED;
 940                 goto spec_qpalloc_fail5a;
 941         }
 942 
 943         /*
 944          * Next we verify that the requested number of SGL is valid (i.e.
 945          * consistent with the device limits and/or software-configured
 946          * limits).  If not, then obviously the same cleanup needs to be done.
 947          */
 948         max_sgl = state->hs_cfg_profile->cp_wqe_real_max_sgl;
 949         if ((attr_p->qp_sizes.cs_sq_sgl > max_sgl) ||
 950             (attr_p->qp_sizes.cs_rq_sgl > max_sgl)) {
 951                 status = IBT_HCA_SGL_EXCEEDED;
 952                 goto spec_qpalloc_fail5a;
 953         }
 954 
 955         /*
 956          * Determine this QP's WQE stride (for both the Send and Recv WQEs).
 957          * This will depend on the requested number of SGLs.  Note: this
 958          * has the side-effect of also calculating the real number of SGLs
 959          * (for the calculated WQE size).
 960          */
 961         hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_rq_sgl,
 962             max_sgl, HERMON_QP_WQ_TYPE_RECVQ,
 963             &qp->qp_rq_log_wqesz, &qp->qp_rq_sgl);
 964         if (type == IBT_SMI_SQP) {
 965                 hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_sq_sgl,
 966                     max_sgl, HERMON_QP_WQ_TYPE_SENDMLX_QP0,
 967                     &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
 968         } else {
 969                 hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_sq_sgl,
 970                     max_sgl, HERMON_QP_WQ_TYPE_SENDMLX_QP1,
 971                     &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
 972         }
 973 
 974         /*
 975          * Allocate the memory for QP work queues. Since Hermon work queues
 976          * are not allowed to cross a 32-bit (4GB) boundary, the alignment of
 977          * the work queue memory is very important.  We used to allocate
 978          * work queues (the combined receive and send queues) so that they
 979          * would be aligned on their combined size.  That alignment guaranteed
 980          * that they would never cross the 4GB boundary (Hermon work queues
 981          * are on the order of MBs at maximum).  Now we are able to relax
 982          * this alignment constraint by ensuring that the IB address assigned
 983          * to the queue memory (as a result of the hermon_mr_register() call)
 984          * is offset from zero.
 985          * Previously, we had wanted to use the ddi_dma_mem_alloc() routine to
 986          * guarantee the alignment, but when attempting to use IOMMU bypass
 987          * mode we found that we were not allowed to specify any alignment
 988          * that was more restrictive than the system page size.
 989          * So we avoided this constraint by passing two alignment values,
 990          * one for the memory allocation itself and the other for the DMA
 991          * handle (for later bind).  This used to cause more memory than
 992          * necessary to be allocated (in order to guarantee the more
 993          * restrictive alignment contraint).  But by guaranteeing the
 994          * zero-based IB virtual address for the queue, we are able to
 995          * conserve this memory.
 996          */
 997         sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
 998         sq_depth    = 1 << log_qp_sq_size;
 999         sq_size     = (1 << log_qp_sq_size) * sq_wqe_size;
1000 
1001         rq_wqe_size = 1 << qp->qp_rq_log_wqesz;
1002         rq_size     = (1 << log_qp_rq_size) * rq_wqe_size;
1003 
1004         qp->qp_wqinfo.qa_size          = sq_size + rq_size;
1005 
1006         qp->qp_wqinfo.qa_alloc_align = PAGESIZE;
1007         qp->qp_wqinfo.qa_bind_align  = PAGESIZE;
1008         qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
1009 
1010         status = hermon_queue_alloc(state, &qp->qp_wqinfo, sleepflag);
1011         if (status != NULL) {
1012                 status = IBT_INSUFF_RESOURCE;
1013                 goto spec_qpalloc_fail5a;
1014         }
1015 
1016         /*
1017          * Sort WQs in memory according to depth, stride (*q_wqe_size),
1018          * biggest first. If equal, the Send Queue still goes first
1019          */
1020         qp->qp_sq_baseaddr = 0;
1021         qp->qp_rq_baseaddr = 0;
1022         if ((sq_wqe_size > rq_wqe_size) || (sq_wqe_size == rq_wqe_size)) {
1023                 sq_buf = qp->qp_wqinfo.qa_buf_aligned;
1024                 rq_buf = (uint32_t *)((uintptr_t)sq_buf + sq_size);
1025                 qp->qp_rq_baseaddr = sq_size;
1026         } else {
1027                 rq_buf = qp->qp_wqinfo.qa_buf_aligned;
1028                 sq_buf = (uint32_t *)((uintptr_t)rq_buf + rq_size);
1029                 qp->qp_sq_baseaddr = rq_size;
1030         }
1031 
1032         qp->qp_sq_wqhdr = hermon_wrid_wqhdr_create(sq_depth);
1033         if (qp->qp_sq_wqhdr == NULL) {
1034                 status = IBT_INSUFF_RESOURCE;
1035                 goto spec_qpalloc_fail6;
1036         }
1037         qp->qp_rq_wqhdr = hermon_wrid_wqhdr_create(1 << log_qp_rq_size);
1038         if (qp->qp_rq_wqhdr == NULL) {
1039                 status = IBT_INSUFF_RESOURCE;
1040                 goto spec_qpalloc_fail6;
1041         }
1042         qp->qp_sq_wqavl.wqa_qpn = qp->qp_qpnum;
1043         qp->qp_sq_wqavl.wqa_type = HERMON_WR_SEND;
1044         qp->qp_sq_wqavl.wqa_wq = qp->qp_sq_wqhdr;
1045         qp->qp_rq_wqavl.wqa_qpn = qp->qp_qpnum;
1046         qp->qp_rq_wqavl.wqa_type = HERMON_WR_RECV;
1047         qp->qp_rq_wqavl.wqa_wq = qp->qp_rq_wqhdr;
1048 
1049         /*
1050          * Register the memory for the special QP work queues.  The memory for
1051          * the special QP must be registered in the Hermon cMPT tables.  This
1052          * gives us the LKey to specify in the QP context later.  Note: The
1053          * memory for Hermon work queues (both Send and Recv) must be contiguous
1054          * and registered as a single memory region. Also, in order to meet the
1055          * alignment restriction, we pass the "mro_bind_override_addr" flag in
1056          * the call to hermon_mr_register(). This guarantees that the resulting
1057          * IB vaddr will be zero-based (modulo the offset into the first page).
1058          * If we fail here, we have a bunch of resource and reference count
1059          * cleanup to do.
1060          */
1061         flag = (sleepflag == HERMON_SLEEP) ? IBT_MR_SLEEP :
1062             IBT_MR_NOSLEEP;
1063         mr_attr.mr_vaddr    = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned;
1064         mr_attr.mr_len      = qp->qp_wqinfo.qa_size;
1065         mr_attr.mr_as       = NULL;
1066         mr_attr.mr_flags    = flag;
1067 
1068         mr_op.mro_bind_type = state->hs_cfg_profile->cp_iommu_bypass;
1069         mr_op.mro_bind_dmahdl = qp->qp_wqinfo.qa_dmahdl;
1070         mr_op.mro_bind_override_addr = 1;
1071 
1072         status = hermon_mr_register(state, pd, &mr_attr, &mr, &mr_op,
1073             HERMON_QP_CMPT);
1074         if (status != DDI_SUCCESS) {
1075                 status = IBT_INSUFF_RESOURCE;
1076                 goto spec_qpalloc_fail6;
1077         }
1078 
1079         /*
1080          * Calculate the offset between the kernel virtual address space
1081          * and the IB virtual address space.  This will be used when
1082          * posting work requests to properly initialize each WQE.
1083          */
1084         qp_desc_off = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned -
1085             (uint64_t)mr->mr_bindinfo.bi_addr;
1086 
1087         /* set the prefetch - initially, not prefetching */
1088         qp->qp_no_prefetch = 1;
1089 
1090         if (qp->qp_no_prefetch)
1091                 qp->qp_sq_headroom = 2 * sq_wqe_size;
1092         else
1093                 qp->qp_sq_headroom = sq_wqe_size + HERMON_QP_OH_SIZE;
1094         /*
1095          * hdrm wqes must be integral since both sq_wqe_size &
1096          * HERMON_QP_OH_SIZE are power of 2
1097          */
1098         qp->qp_sq_hdrmwqes = (qp->qp_sq_headroom / sq_wqe_size);
1099         /*
1100          * Fill in all the return arguments (if necessary).  This includes
1101          * real work queue sizes, real SGLs, and QP number (which will be
1102          * either zero or one, depending on the special QP type)
1103          */
1104         if (queuesz_p != NULL) {
1105                 queuesz_p->cs_sq     =
1106                     (1 << log_qp_sq_size) - qp->qp_sq_hdrmwqes;
1107                 queuesz_p->cs_sq_sgl = qp->qp_sq_sgl;
1108                 queuesz_p->cs_rq     = (1 << log_qp_rq_size);
1109                 queuesz_p->cs_rq_sgl = qp->qp_rq_sgl;
1110         }
1111 
1112         /*
1113          * Fill in the rest of the Hermon Queue Pair handle.  We can update
1114          * the following fields for use in further operations on the QP.
1115          */
1116         qp->qp_qpcrsrcp              = qpc;
1117         qp->qp_rsrcp         = rsrc;
1118         qp->qp_state         = HERMON_QP_RESET;
1119         HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
1120         qp->qp_pdhdl         = pd;
1121         qp->qp_mrhdl         = mr;
1122         qp->qp_sq_sigtype    = (attr_p->qp_flags & IBT_WR_SIGNALED) ?
1123             HERMON_QP_SQ_WR_SIGNALED : HERMON_QP_SQ_ALL_SIGNALED;
1124         qp->qp_is_special    = (type == IBT_SMI_SQP) ?
1125             HERMON_QP_SMI : HERMON_QP_GSI;
1126         qp->qp_uarpg         = uarpg;
1127         qp->qp_umap_dhp              = (devmap_cookie_t)NULL;
1128         qp->qp_sq_cqhdl              = sq_cq;
1129         qp->qp_sq_bufsz              = (1 << log_qp_sq_size);
1130         qp->qp_sq_buf                = sq_buf;
1131         qp->qp_sq_logqsz     = log_qp_sq_size;
1132         qp->qp_desc_off              = qp_desc_off;
1133         qp->qp_rq_cqhdl              = rq_cq;
1134         qp->qp_rq_bufsz              = (1 << log_qp_rq_size);
1135         qp->qp_rq_buf                = rq_buf;
1136         qp->qp_rq_logqsz     = log_qp_rq_size;
1137         qp->qp_portnum               = port;
1138         qp->qp_pkeyindx              = 0;
1139         qp->qp_forward_sqd_event  = 0;
1140         qp->qp_sqd_still_draining = 0;
1141         qp->qp_hdlrarg               = (void *)ibt_qphdl;
1142         qp->qp_mcg_refcnt    = 0;
1143         qp->qp_srqhdl                = NULL;
1144 
1145         /* All special QPs are UD QP service type */
1146         qp->qp_type = IBT_UD_RQP;
1147         qp->qp_serv_type = HERMON_QP_UD;
1148 
1149         /*
1150          * Initialize the RQ WQEs - unlike Arbel, no Rcv init is needed
1151          */
1152 
1153         /*
1154          * Initialize the SQ WQEs - all that needs to be done is every 64 bytes
1155          * set the quadword to all F's - high-order bit is owner (init to one)
1156          * and the rest for the headroom definition of prefetching
1157          *
1158          */
1159 
1160         wqesz_shift = qp->qp_sq_log_wqesz;
1161         thewqesz    = 1 << wqesz_shift;
1162         thewqe = (uint64_t *)(void *)(qp->qp_sq_buf);
1163         for (i = 0; i < sq_depth; i++) {
1164                 /*
1165                  * for each stride, go through and every 64 bytes write the
1166                  * init value - having set the address once, just keep
1167                  * incrementing it
1168                  */
1169                 for (j = 0; j < thewqesz; j += 64, thewqe += 8) {
1170                         *(uint32_t *)thewqe = 0xFFFFFFFF;
1171                 }
1172         }
1173 
1174 
1175         /* Zero out the QP context */
1176         bzero(&qp->qpc, sizeof (hermon_hw_qpc_t));
1177 
1178         /*
1179          * Put QP handle in Hermon QPNum-to-QPHdl list.  Then fill in the
1180          * "qphdl" and return success
1181          */
1182         hermon_icm_set_num_to_hdl(state, HERMON_QPC, qpc->hr_indx + port, qp);
1183 
1184         mutex_init(&qp->qp_sq_lock, NULL, MUTEX_DRIVER,
1185             DDI_INTR_PRI(state->hs_intrmsi_pri));
1186 
1187         *qphdl = qp;
1188 
1189         return (DDI_SUCCESS);
1190 
1191 /*
1192  * The following is cleanup for all possible failure cases in this routine
1193  */
1194 spec_qpalloc_fail6:
1195         hermon_queue_free(&qp->qp_wqinfo);
1196         if (qp->qp_sq_wqhdr)
1197                 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
1198         if (qp->qp_rq_wqhdr)
1199                 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
1200 spec_qpalloc_fail5a:
1201         hermon_dbr_free(state, uarpg, qp->qp_rq_vdbr);
1202 spec_qpalloc_fail5:
1203         hermon_rsrc_free(state, &rsrc);
1204 spec_qpalloc_fail4:
1205         if (hermon_special_qp_rsrc_free(state, type, port) != DDI_SUCCESS) {
1206                 HERMON_WARNING(state, "failed to free special QP rsrc");
1207         }
1208 spec_qpalloc_fail3:
1209         hermon_cq_refcnt_dec(rq_cq);
1210 spec_qpalloc_fail2:
1211         hermon_cq_refcnt_dec(sq_cq);
1212 spec_qpalloc_fail1:
1213         hermon_pd_refcnt_dec(pd);
1214 spec_qpalloc_fail:
1215         return (status);
1216 }
1217 
1218 
1219 /*
1220  * hermon_qp_alloc_range()
1221  *    Context: Can be called only from user or kernel context.
1222  */
1223 int
1224 hermon_qp_alloc_range(hermon_state_t *state, uint_t log2,
1225     hermon_qp_info_t *qpinfo, ibtl_qp_hdl_t *ibt_qphdl,
1226     ibc_cq_hdl_t *send_cq, ibc_cq_hdl_t *recv_cq,
1227     hermon_qphdl_t *qphdl, uint_t sleepflag)
1228 {
1229         hermon_rsrc_t                   *qpc, *rsrc;
1230         hermon_rsrc_type_t              rsrc_type;
1231         hermon_qphdl_t                  qp;
1232         hermon_qp_range_t               *qp_range_p;
1233         ibt_qp_alloc_attr_t             *attr_p;
1234         ibt_qp_type_t                   type;
1235         hermon_qp_wq_type_t             swq_type;
1236         ibt_chan_sizes_t                *queuesz_p;
1237         ibt_mr_attr_t                   mr_attr;
1238         hermon_mr_options_t             mr_op;
1239         hermon_srqhdl_t                 srq;
1240         hermon_pdhdl_t                  pd;
1241         hermon_cqhdl_t                  sq_cq, rq_cq;
1242         hermon_mrhdl_t                  mr;
1243         uint64_t                        qp_desc_off;
1244         uint64_t                        *thewqe, thewqesz;
1245         uint32_t                        *sq_buf, *rq_buf;
1246         uint32_t                        log_qp_sq_size, log_qp_rq_size;
1247         uint32_t                        sq_size, rq_size;
1248         uint32_t                        sq_depth, rq_depth;
1249         uint32_t                        sq_wqe_size, rq_wqe_size, wqesz_shift;
1250         uint32_t                        max_sgl, max_recv_sgl, uarpg;
1251         uint_t                          qp_srq_en, i, j;
1252         int                             ii;     /* loop counter for range */
1253         int                             status, flag;
1254         uint_t                          serv_type;
1255 
1256         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*attr_p, *queuesz_p))
1257 
1258         /*
1259          * Extract the necessary info from the hermon_qp_info_t structure
1260          */
1261         attr_p    = qpinfo->qpi_attrp;
1262         type      = qpinfo->qpi_type;
1263         queuesz_p = qpinfo->qpi_queueszp;
1264 
1265         if (attr_p->qp_alloc_flags & IBT_QP_USES_RSS) {
1266                 if (log2 > state->hs_ibtfinfo.hca_attr->hca_rss_max_log2_table)
1267                         return (IBT_INSUFF_RESOURCE);
1268                 rsrc_type = HERMON_QPC;
1269                 serv_type = HERMON_QP_UD;
1270         } else if (attr_p->qp_alloc_flags & IBT_QP_USES_FEXCH) {
1271                 if (log2 > state->hs_ibtfinfo.hca_attr->hca_fexch_max_log2_qp)
1272                         return (IBT_INSUFF_RESOURCE);
1273                 switch (attr_p->qp_fc.fc_hca_port) {
1274                 case 1:
1275                         rsrc_type = HERMON_QPC_FEXCH_PORT1;
1276                         break;
1277                 case 2:
1278                         rsrc_type = HERMON_QPC_FEXCH_PORT2;
1279                         break;
1280                 default:
1281                         return (IBT_INVALID_PARAM);
1282                 }
1283                 serv_type = HERMON_QP_FEXCH;
1284         } else
1285                 return (IBT_INVALID_PARAM);
1286 
1287         /*
1288          * Determine whether QP is being allocated for userland access or
1289          * whether it is being allocated for kernel access.  If the QP is
1290          * being allocated for userland access, fail (too complex for now).
1291          */
1292         if (attr_p->qp_alloc_flags & IBT_QP_USER_MAP) {
1293                 return (IBT_NOT_SUPPORTED);
1294         } else {
1295                 uarpg = state->hs_kernel_uar_index;
1296         }
1297 
1298         /*
1299          * Determine whether QP is being associated with an SRQ
1300          */
1301         qp_srq_en = (attr_p->qp_alloc_flags & IBT_QP_USES_SRQ) ? 1 : 0;
1302         if (qp_srq_en) {
1303                 /*
1304                  * Check for valid SRQ handle pointers
1305                  */
1306                 if (attr_p->qp_ibc_srq_hdl == NULL) {
1307                         return (IBT_SRQ_HDL_INVALID);
1308                 }
1309                 srq = (hermon_srqhdl_t)attr_p->qp_ibc_srq_hdl;
1310         }
1311 
1312         /*
1313          * Check for valid QP service type (only UD supported)
1314          */
1315         if (type != IBT_UD_RQP) {
1316                 return (IBT_QP_SRV_TYPE_INVALID);
1317         }
1318 
1319         /*
1320          * Check for valid PD handle pointer
1321          */
1322         if (attr_p->qp_pd_hdl == NULL) {
1323                 return (IBT_PD_HDL_INVALID);
1324         }
1325         pd = (hermon_pdhdl_t)attr_p->qp_pd_hdl;
1326 
1327         /*
1328          * If on an SRQ, check to make sure the PD is the same
1329          */
1330         if (qp_srq_en && (pd->pd_pdnum != srq->srq_pdhdl->pd_pdnum)) {
1331                 return (IBT_PD_HDL_INVALID);
1332         }
1333 
1334         /* set loop variable here, for freeing resources on error */
1335         ii = 0;
1336 
1337         /*
1338          * Allocate 2^log2 contiguous/aligned QP context entries.  This will
1339          * be filled in with all the necessary parameters to define the
1340          * Queue Pairs.  Unlike other Hermon hardware resources, ownership
1341          * is not immediately given to hardware in the final step here.
1342          * Instead, we must wait until the QP is later transitioned to the
1343          * "Init" state before passing the QP to hardware.  If we fail here,
1344          * we must undo all the reference count (CQ and PD).
1345          */
1346         status = hermon_rsrc_alloc(state, rsrc_type, 1 << log2, sleepflag,
1347             &qpc);
1348         if (status != DDI_SUCCESS) {
1349                 return (IBT_INSUFF_RESOURCE);
1350         }
1351 
1352         if (attr_p->qp_alloc_flags & IBT_QP_USES_FEXCH)
1353                 /*
1354                  * Need to init the MKEYs for the FEXCH QPs.
1355                  *
1356                  * For FEXCH QP subranges, we return the QPN base as
1357                  * "relative" to the full FEXCH QP range for the port.
1358                  */
1359                 *(qpinfo->qpi_qpn) = hermon_fcoib_fexch_relative_qpn(state,
1360                     attr_p->qp_fc.fc_hca_port, qpc->hr_indx);
1361         else
1362                 *(qpinfo->qpi_qpn) = (ib_qpn_t)qpc->hr_indx;
1363 
1364         qp_range_p = kmem_alloc(sizeof (*qp_range_p),
1365             (sleepflag == HERMON_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
1366         if (qp_range_p == NULL) {
1367                 status = IBT_INSUFF_RESOURCE;
1368                 goto qpalloc_fail0;
1369         }
1370         mutex_init(&qp_range_p->hqpr_lock, NULL, MUTEX_DRIVER,
1371             DDI_INTR_PRI(state->hs_intrmsi_pri));
1372         mutex_enter(&qp_range_p->hqpr_lock);
1373         qp_range_p->hqpr_refcnt = 1 << log2;
1374         qp_range_p->hqpr_qpcrsrc = qpc;
1375         mutex_exit(&qp_range_p->hqpr_lock);
1376 
1377 for_each_qp:
1378 
1379         /* Increment the reference count on the protection domain (PD) */
1380         hermon_pd_refcnt_inc(pd);
1381 
1382         rq_cq = (hermon_cqhdl_t)recv_cq[ii];
1383         sq_cq = (hermon_cqhdl_t)send_cq[ii];
1384         if (sq_cq == NULL) {
1385                 if (attr_p->qp_alloc_flags & IBT_QP_USES_FEXCH) {
1386                         /* if no send completions, just use rq_cq */
1387                         sq_cq = rq_cq;
1388                 } else {
1389                         status = IBT_CQ_HDL_INVALID;
1390                         goto qpalloc_fail1;
1391                 }
1392         }
1393 
1394         /*
1395          * Increment the reference count on the CQs.  One or both of these
1396          * could return error if we determine that the given CQ is already
1397          * being used with a special (SMI/GSI) QP.
1398          */
1399         status = hermon_cq_refcnt_inc(sq_cq, HERMON_CQ_IS_NORMAL);
1400         if (status != DDI_SUCCESS) {
1401                 status = IBT_CQ_HDL_INVALID;
1402                 goto qpalloc_fail1;
1403         }
1404         status = hermon_cq_refcnt_inc(rq_cq, HERMON_CQ_IS_NORMAL);
1405         if (status != DDI_SUCCESS) {
1406                 status = IBT_CQ_HDL_INVALID;
1407                 goto qpalloc_fail2;
1408         }
1409 
1410         /*
1411          * Allocate the software structure for tracking the queue pair
1412          * (i.e. the Hermon Queue Pair handle).  If we fail here, we must
1413          * undo the reference counts and the previous resource allocation.
1414          */
1415         status = hermon_rsrc_alloc(state, HERMON_QPHDL, 1, sleepflag, &rsrc);
1416         if (status != DDI_SUCCESS) {
1417                 status = IBT_INSUFF_RESOURCE;
1418                 goto qpalloc_fail4;
1419         }
1420         qp = (hermon_qphdl_t)rsrc->hr_addr;
1421         bzero(qp, sizeof (struct hermon_sw_qp_s));
1422         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
1423         qp->qp_alloc_flags = attr_p->qp_alloc_flags;
1424 
1425         /*
1426          * Calculate the QP number from QPC index.  This routine handles
1427          * all of the operations necessary to keep track of used, unused,
1428          * and released QP numbers.
1429          */
1430         qp->qp_qpnum = qpc->hr_indx + ii;
1431         qp->qp_ring = qp->qp_qpnum << 8;
1432         qp->qp_qpn_hdl = NULL;
1433 
1434         /*
1435          * Allocate the doorbell record.  Hermon just needs one for the RQ,
1436          * if the QP is not associated with an SRQ, and use uarpg (above) as
1437          * the uar index
1438          */
1439 
1440         if (!qp_srq_en) {
1441                 status = hermon_dbr_alloc(state, uarpg, &qp->qp_rq_dbr_acchdl,
1442                     &qp->qp_rq_vdbr, &qp->qp_rq_pdbr, &qp->qp_rdbr_mapoffset);
1443                 if (status != DDI_SUCCESS) {
1444                         status = IBT_INSUFF_RESOURCE;
1445                         goto qpalloc_fail6;
1446                 }
1447         }
1448 
1449         qp->qp_uses_lso = (attr_p->qp_flags & IBT_USES_LSO);
1450 
1451         /*
1452          * We verify that the requested number of SGL is valid (i.e.
1453          * consistent with the device limits and/or software-configured
1454          * limits).  If not, then obviously the same cleanup needs to be done.
1455          */
1456         max_sgl = state->hs_ibtfinfo.hca_attr->hca_ud_send_sgl_sz;
1457         swq_type = HERMON_QP_WQ_TYPE_SENDQ_UD;
1458         max_recv_sgl = state->hs_ibtfinfo.hca_attr->hca_recv_sgl_sz;
1459         if ((attr_p->qp_sizes.cs_sq_sgl > max_sgl) ||
1460             (!qp_srq_en && (attr_p->qp_sizes.cs_rq_sgl > max_recv_sgl))) {
1461                 status = IBT_HCA_SGL_EXCEEDED;
1462                 goto qpalloc_fail7;
1463         }
1464 
1465         /*
1466          * Determine this QP's WQE stride (for both the Send and Recv WQEs).
1467          * This will depend on the requested number of SGLs.  Note: this
1468          * has the side-effect of also calculating the real number of SGLs
1469          * (for the calculated WQE size).
1470          *
1471          * For QP's on an SRQ, we set these to 0.
1472          */
1473         if (qp_srq_en) {
1474                 qp->qp_rq_log_wqesz = 0;
1475                 qp->qp_rq_sgl = 0;
1476         } else {
1477                 hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_rq_sgl,
1478                     max_recv_sgl, HERMON_QP_WQ_TYPE_RECVQ,
1479                     &qp->qp_rq_log_wqesz, &qp->qp_rq_sgl);
1480         }
1481         hermon_qp_sgl_to_logwqesz(state, attr_p->qp_sizes.cs_sq_sgl,
1482             max_sgl, swq_type, &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
1483 
1484         sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
1485 
1486         /* NOTE: currently policy in driver, later maybe IBTF interface */
1487         qp->qp_no_prefetch = 0;
1488 
1489         /*
1490          * for prefetching, we need to add the number of wqes in
1491          * the 2k area plus one to the number requested, but
1492          * ONLY for send queue.  If no_prefetch == 1 (prefetch off)
1493          * it's exactly TWO wqes for the headroom
1494          */
1495         if (qp->qp_no_prefetch)
1496                 qp->qp_sq_headroom = 2 * sq_wqe_size;
1497         else
1498                 qp->qp_sq_headroom = sq_wqe_size + HERMON_QP_OH_SIZE;
1499         /*
1500          * hdrm wqes must be integral since both sq_wqe_size &
1501          * HERMON_QP_OH_SIZE are power of 2
1502          */
1503         qp->qp_sq_hdrmwqes = (qp->qp_sq_headroom / sq_wqe_size);
1504 
1505 
1506         /*
1507          * Calculate the appropriate size for the work queues.
1508          * For send queue, add in the headroom wqes to the calculation.
1509          * Note:  All Hermon QP work queues must be a power-of-2 in size.  Also
1510          * they may not be any smaller than HERMON_QP_MIN_SIZE.  This step is
1511          * to round the requested size up to the next highest power-of-2
1512          */
1513         /* first, adjust to a minimum and tell the caller the change */
1514         attr_p->qp_sizes.cs_sq = max(attr_p->qp_sizes.cs_sq,
1515             HERMON_QP_MIN_SIZE);
1516         attr_p->qp_sizes.cs_rq = max(attr_p->qp_sizes.cs_rq,
1517             HERMON_QP_MIN_SIZE);
1518         /*
1519          * now, calculate the alloc size, taking into account
1520          * the headroom for the sq
1521          */
1522         log_qp_sq_size = highbit(attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes);
1523         /* if the total is a power of two, reduce it */
1524         if (((attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes)  &
1525             (attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes - 1)) == 0)      {
1526                 log_qp_sq_size = log_qp_sq_size - 1;
1527         }
1528 
1529         log_qp_rq_size = highbit(attr_p->qp_sizes.cs_rq);
1530         if ((attr_p->qp_sizes.cs_rq & (attr_p->qp_sizes.cs_rq - 1)) == 0) {
1531                 log_qp_rq_size = log_qp_rq_size - 1;
1532         }
1533 
1534         /*
1535          * Next we verify that the rounded-up size is valid (i.e. consistent
1536          * with the device limits and/or software-configured limits).  If not,
1537          * then obviously we have a lot of cleanup to do before returning.
1538          *
1539          * NOTE: the first condition deals with the (test) case of cs_sq
1540          * being just less than 2^32.  In this case, the headroom addition
1541          * to the requested cs_sq will pass the test when it should not.
1542          * This test no longer lets that case slip through the check.
1543          */
1544         if ((attr_p->qp_sizes.cs_sq >
1545             (1 << state->hs_cfg_profile->cp_log_max_qp_sz)) ||
1546             (log_qp_sq_size > state->hs_cfg_profile->cp_log_max_qp_sz) ||
1547             (!qp_srq_en && (log_qp_rq_size >
1548             state->hs_cfg_profile->cp_log_max_qp_sz))) {
1549                 status = IBT_HCA_WR_EXCEEDED;
1550                 goto qpalloc_fail7;
1551         }
1552 
1553         /*
1554          * Allocate the memory for QP work queues. Since Hermon work queues
1555          * are not allowed to cross a 32-bit (4GB) boundary, the alignment of
1556          * the work queue memory is very important.  We used to allocate
1557          * work queues (the combined receive and send queues) so that they
1558          * would be aligned on their combined size.  That alignment guaranteed
1559          * that they would never cross the 4GB boundary (Hermon work queues
1560          * are on the order of MBs at maximum).  Now we are able to relax
1561          * this alignment constraint by ensuring that the IB address assigned
1562          * to the queue memory (as a result of the hermon_mr_register() call)
1563          * is offset from zero.
1564          * Previously, we had wanted to use the ddi_dma_mem_alloc() routine to
1565          * guarantee the alignment, but when attempting to use IOMMU bypass
1566          * mode we found that we were not allowed to specify any alignment
1567          * that was more restrictive than the system page size.
1568          * So we avoided this constraint by passing two alignment values,
1569          * one for the memory allocation itself and the other for the DMA
1570          * handle (for later bind).  This used to cause more memory than
1571          * necessary to be allocated (in order to guarantee the more
1572          * restrictive alignment contraint).  But by guaranteeing the
1573          * zero-based IB virtual address for the queue, we are able to
1574          * conserve this memory.
1575          */
1576         sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
1577         sq_depth    = 1 << log_qp_sq_size;
1578         sq_size     = sq_depth * sq_wqe_size;
1579 
1580         /* QP on SRQ sets these to 0 */
1581         if (qp_srq_en) {
1582                 rq_wqe_size = 0;
1583                 rq_size     = 0;
1584         } else {
1585                 rq_wqe_size = 1 << qp->qp_rq_log_wqesz;
1586                 rq_depth    = 1 << log_qp_rq_size;
1587                 rq_size     = rq_depth * rq_wqe_size;
1588         }
1589 
1590         qp->qp_wqinfo.qa_size = sq_size + rq_size;
1591         qp->qp_wqinfo.qa_alloc_align = PAGESIZE;
1592         qp->qp_wqinfo.qa_bind_align  = PAGESIZE;
1593         qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
1594         status = hermon_queue_alloc(state, &qp->qp_wqinfo, sleepflag);
1595         if (status != DDI_SUCCESS) {
1596                 status = IBT_INSUFF_RESOURCE;
1597                 goto qpalloc_fail7;
1598         }
1599 
1600         /*
1601          * Sort WQs in memory according to stride (*q_wqe_size), largest first
1602          * If they are equal, still put the SQ first
1603          */
1604         qp->qp_sq_baseaddr = 0;
1605         qp->qp_rq_baseaddr = 0;
1606         if ((sq_wqe_size > rq_wqe_size) || (sq_wqe_size == rq_wqe_size)) {
1607                 sq_buf = qp->qp_wqinfo.qa_buf_aligned;
1608 
1609                 /* if this QP is on an SRQ, set the rq_buf to NULL */
1610                 if (qp_srq_en) {
1611                         rq_buf = NULL;
1612                 } else {
1613                         rq_buf = (uint32_t *)((uintptr_t)sq_buf + sq_size);
1614                         qp->qp_rq_baseaddr = sq_size;
1615                 }
1616         } else {
1617                 rq_buf = qp->qp_wqinfo.qa_buf_aligned;
1618                 sq_buf = (uint32_t *)((uintptr_t)rq_buf + rq_size);
1619                 qp->qp_sq_baseaddr = rq_size;
1620         }
1621 
1622         qp->qp_sq_wqhdr = hermon_wrid_wqhdr_create(sq_depth);
1623         if (qp->qp_sq_wqhdr == NULL) {
1624                 status = IBT_INSUFF_RESOURCE;
1625                 goto qpalloc_fail8;
1626         }
1627         if (qp_srq_en) {
1628                 qp->qp_rq_wqavl.wqa_wq = srq->srq_wq_wqhdr;
1629                 qp->qp_rq_wqavl.wqa_srq_en = 1;
1630                 qp->qp_rq_wqavl.wqa_srq = srq;
1631         } else {
1632                 qp->qp_rq_wqhdr = hermon_wrid_wqhdr_create(rq_depth);
1633                 if (qp->qp_rq_wqhdr == NULL) {
1634                         status = IBT_INSUFF_RESOURCE;
1635                         goto qpalloc_fail8;
1636                 }
1637                 qp->qp_rq_wqavl.wqa_wq = qp->qp_rq_wqhdr;
1638         }
1639         qp->qp_sq_wqavl.wqa_qpn = qp->qp_qpnum;
1640         qp->qp_sq_wqavl.wqa_type = HERMON_WR_SEND;
1641         qp->qp_sq_wqavl.wqa_wq = qp->qp_sq_wqhdr;
1642         qp->qp_rq_wqavl.wqa_qpn = qp->qp_qpnum;
1643         qp->qp_rq_wqavl.wqa_type = HERMON_WR_RECV;
1644 
1645         /*
1646          * Register the memory for the QP work queues.  The memory for the
1647          * QP must be registered in the Hermon cMPT tables.  This gives us the
1648          * LKey to specify in the QP context later.  Note: The memory for
1649          * Hermon work queues (both Send and Recv) must be contiguous and
1650          * registered as a single memory region.  Note: If the QP memory is
1651          * user-mappable, force DDI_DMA_CONSISTENT mapping. Also, in order to
1652          * meet the alignment restriction, we pass the "mro_bind_override_addr"
1653          * flag in the call to hermon_mr_register(). This guarantees that the
1654          * resulting IB vaddr will be zero-based (modulo the offset into the
1655          * first page). If we fail here, we still have the bunch of resource
1656          * and reference count cleanup to do.
1657          */
1658         flag = (sleepflag == HERMON_SLEEP) ? IBT_MR_SLEEP :
1659             IBT_MR_NOSLEEP;
1660         mr_attr.mr_vaddr    = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned;
1661         mr_attr.mr_len      = qp->qp_wqinfo.qa_size;
1662         mr_attr.mr_as       = NULL;
1663         mr_attr.mr_flags    = flag;
1664         /* HERMON_QUEUE_LOCATION_NORMAL */
1665         mr_op.mro_bind_type =
1666             state->hs_cfg_profile->cp_iommu_bypass;
1667         mr_op.mro_bind_dmahdl = qp->qp_wqinfo.qa_dmahdl;
1668         mr_op.mro_bind_override_addr = 1;
1669         status = hermon_mr_register(state, pd, &mr_attr, &mr,
1670             &mr_op, HERMON_QP_CMPT);
1671         if (status != DDI_SUCCESS) {
1672                 status = IBT_INSUFF_RESOURCE;
1673                 goto qpalloc_fail9;
1674         }
1675 
1676         /*
1677          * Calculate the offset between the kernel virtual address space
1678          * and the IB virtual address space.  This will be used when
1679          * posting work requests to properly initialize each WQE.
1680          */
1681         qp_desc_off = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned -
1682             (uint64_t)mr->mr_bindinfo.bi_addr;
1683 
1684         /*
1685          * Fill in all the return arguments (if necessary).  This includes
1686          * real work queue sizes (in wqes), real SGLs, and QP number
1687          */
1688         if (queuesz_p != NULL) {
1689                 queuesz_p->cs_sq     =
1690                     (1 << log_qp_sq_size) - qp->qp_sq_hdrmwqes;
1691                 queuesz_p->cs_sq_sgl = qp->qp_sq_sgl;
1692 
1693                 /* if this QP is on an SRQ, set these to 0 */
1694                 if (qp_srq_en) {
1695                         queuesz_p->cs_rq     = 0;
1696                         queuesz_p->cs_rq_sgl = 0;
1697                 } else {
1698                         queuesz_p->cs_rq     = (1 << log_qp_rq_size);
1699                         queuesz_p->cs_rq_sgl = qp->qp_rq_sgl;
1700                 }
1701         }
1702 
1703         /*
1704          * Fill in the rest of the Hermon Queue Pair handle.
1705          */
1706         qp->qp_qpcrsrcp              = NULL;
1707         qp->qp_rsrcp         = rsrc;
1708         qp->qp_state         = HERMON_QP_RESET;
1709         HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
1710         qp->qp_pdhdl         = pd;
1711         qp->qp_mrhdl         = mr;
1712         qp->qp_sq_sigtype    = (attr_p->qp_flags & IBT_WR_SIGNALED) ?
1713             HERMON_QP_SQ_WR_SIGNALED : HERMON_QP_SQ_ALL_SIGNALED;
1714         qp->qp_is_special    = 0;
1715         qp->qp_uarpg         = uarpg;
1716         qp->qp_umap_dhp              = (devmap_cookie_t)NULL;
1717         qp->qp_sq_cqhdl              = sq_cq;
1718         qp->qp_sq_bufsz              = (1 << log_qp_sq_size);
1719         qp->qp_sq_logqsz     = log_qp_sq_size;
1720         qp->qp_sq_buf                = sq_buf;
1721         qp->qp_desc_off              = qp_desc_off;
1722         qp->qp_rq_cqhdl              = rq_cq;
1723         qp->qp_rq_buf                = rq_buf;
1724         qp->qp_rlky          = (attr_p->qp_flags & IBT_FAST_REG_RES_LKEY) !=
1725             0;
1726 
1727         /* if this QP is on an SRQ, set rq_bufsz to 0 */
1728         if (qp_srq_en) {
1729                 qp->qp_rq_bufsz              = 0;
1730                 qp->qp_rq_logqsz     = 0;
1731         } else {
1732                 qp->qp_rq_bufsz              = (1 << log_qp_rq_size);
1733                 qp->qp_rq_logqsz     = log_qp_rq_size;
1734         }
1735 
1736         qp->qp_forward_sqd_event  = 0;
1737         qp->qp_sqd_still_draining = 0;
1738         qp->qp_hdlrarg               = (void *)ibt_qphdl[ii];
1739         qp->qp_mcg_refcnt    = 0;
1740 
1741         /*
1742          * If this QP is to be associated with an SRQ, set the SRQ handle
1743          */
1744         if (qp_srq_en) {
1745                 qp->qp_srqhdl = srq;
1746                 hermon_srq_refcnt_inc(qp->qp_srqhdl);
1747         } else {
1748                 qp->qp_srqhdl = NULL;
1749         }
1750 
1751         qp->qp_type = IBT_UD_RQP;
1752         qp->qp_serv_type = serv_type;
1753 
1754         /*
1755          * Initialize the RQ WQEs - unlike Arbel, no Rcv init is needed
1756          */
1757 
1758         /*
1759          * Initialize the SQ WQEs - all that needs to be done is every 64 bytes
1760          * set the quadword to all F's - high-order bit is owner (init to one)
1761          * and the rest for the headroom definition of prefetching.
1762          */
1763         if ((attr_p->qp_alloc_flags & IBT_QP_USES_FEXCH) == 0) {
1764                 wqesz_shift = qp->qp_sq_log_wqesz;
1765                 thewqesz    = 1 << wqesz_shift;
1766                 thewqe = (uint64_t *)(void *)(qp->qp_sq_buf);
1767                 for (i = 0; i < sq_depth; i++) {
1768                         /*
1769                          * for each stride, go through and every 64 bytes
1770                          * write the init value - having set the address
1771                          * once, just keep incrementing it
1772                          */
1773                         for (j = 0; j < thewqesz; j += 64, thewqe += 8) {
1774                                 *(uint32_t *)thewqe = 0xFFFFFFFF;
1775                         }
1776                 }
1777         }
1778 
1779         /* Zero out the QP context */
1780         bzero(&qp->qpc, sizeof (hermon_hw_qpc_t));
1781 
1782         /*
1783          * Put QP handle in Hermon QPNum-to-QPHdl list.  Then fill in the
1784          * "qphdl" and return success
1785          */
1786         hermon_icm_set_num_to_hdl(state, HERMON_QPC, qpc->hr_indx + ii, qp);
1787 
1788         mutex_init(&qp->qp_sq_lock, NULL, MUTEX_DRIVER,
1789             DDI_INTR_PRI(state->hs_intrmsi_pri));
1790 
1791         qp->qp_rangep = qp_range_p;
1792 
1793         qphdl[ii] = qp;
1794 
1795         if (++ii < (1 << log2))
1796                 goto for_each_qp;
1797 
1798         return (DDI_SUCCESS);
1799 
1800 /*
1801  * The following is cleanup for all possible failure cases in this routine
1802  */
1803 qpalloc_fail9:
1804         hermon_queue_free(&qp->qp_wqinfo);
1805 qpalloc_fail8:
1806         if (qp->qp_sq_wqhdr)
1807                 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
1808         if (qp->qp_rq_wqhdr)
1809                 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
1810 qpalloc_fail7:
1811         if (!qp_srq_en) {
1812                 hermon_dbr_free(state, uarpg, qp->qp_rq_vdbr);
1813         }
1814 
1815 qpalloc_fail6:
1816         hermon_rsrc_free(state, &rsrc);
1817 qpalloc_fail4:
1818         hermon_cq_refcnt_dec(rq_cq);
1819 qpalloc_fail2:
1820         hermon_cq_refcnt_dec(sq_cq);
1821 qpalloc_fail1:
1822         hermon_pd_refcnt_dec(pd);
1823 qpalloc_fail0:
1824         if (ii == 0) {
1825                 if (qp_range_p)
1826                         kmem_free(qp_range_p, sizeof (*qp_range_p));
1827                 hermon_rsrc_free(state, &qpc);
1828         } else {
1829                 /* qp_range_p and qpc rsrc will be freed in hermon_qp_free */
1830 
1831                 mutex_enter(&qp->qp_rangep->hqpr_lock);
1832                 qp_range_p->hqpr_refcnt = ii;
1833                 mutex_exit(&qp->qp_rangep->hqpr_lock);
1834                 while (--ii >= 0) {
1835                         ibc_qpn_hdl_t qpn_hdl;
1836                         int free_status;
1837 
1838                         free_status = hermon_qp_free(state, &qphdl[ii],
1839                             IBC_FREE_QP_AND_QPN, &qpn_hdl, sleepflag);
1840                         if (free_status != DDI_SUCCESS)
1841                                 cmn_err(CE_CONT, "!qp_range: status 0x%x: "
1842                                     "error status %x during free",
1843                                     status, free_status);
1844                 }
1845         }
1846 
1847         return (status);
1848 }
1849 
1850 
1851 /*
1852  * hermon_qp_free()
1853  *    This function frees up the QP resources.  Depending on the value
1854  *    of the "free_qp_flags", the QP number may not be released until
1855  *    a subsequent call to hermon_qp_release_qpn().
1856  *
1857  *    Context: Can be called only from user or kernel context.
1858  */
1859 /* ARGSUSED */
1860 int
1861 hermon_qp_free(hermon_state_t *state, hermon_qphdl_t *qphdl,
1862     ibc_free_qp_flags_t free_qp_flags, ibc_qpn_hdl_t *qpnh,
1863     uint_t sleepflag)
1864 {
1865         hermon_rsrc_t           *qpc, *rsrc;
1866         hermon_umap_db_entry_t  *umapdb;
1867         hermon_qpn_entry_t      *entry;
1868         hermon_pdhdl_t          pd;
1869         hermon_mrhdl_t          mr;
1870         hermon_cqhdl_t          sq_cq, rq_cq;
1871         hermon_srqhdl_t         srq;
1872         hermon_qphdl_t          qp;
1873         uint64_t                value;
1874         uint_t                  type, port;
1875         uint_t                  maxprot;
1876         uint_t                  qp_srq_en;
1877         int                     status;
1878 
1879         /*
1880          * Pull all the necessary information from the Hermon Queue Pair
1881          * handle.  This is necessary here because the resource for the
1882          * QP handle is going to be freed up as part of this operation.
1883          */
1884         qp      = *qphdl;
1885         mutex_enter(&qp->qp_lock);
1886         qpc     = qp->qp_qpcrsrcp;   /* NULL if part of a "range" */
1887         rsrc    = qp->qp_rsrcp;
1888         pd      = qp->qp_pdhdl;
1889         srq     = qp->qp_srqhdl;
1890         mr      = qp->qp_mrhdl;
1891         rq_cq   = qp->qp_rq_cqhdl;
1892         sq_cq   = qp->qp_sq_cqhdl;
1893         port    = qp->qp_portnum;
1894         qp_srq_en = qp->qp_alloc_flags & IBT_QP_USES_SRQ;
1895 
1896         /*
1897          * If the QP is part of an MCG, then we fail the qp_free
1898          */
1899         if (qp->qp_mcg_refcnt != 0) {
1900                 mutex_exit(&qp->qp_lock);
1901                 status = ibc_get_ci_failure(0);
1902                 goto qpfree_fail;
1903         }
1904 
1905         /*
1906          * If the QP is not already in "Reset" state, then transition to
1907          * "Reset".  This is necessary because software does not reclaim
1908          * ownership of the QP context until the QP is in the "Reset" state.
1909          * If the ownership transfer fails for any reason, then it is an
1910          * indication that something (either in HW or SW) has gone seriously
1911          * wrong.  So we print a warning message and return.
1912          */
1913         if (qp->qp_state != HERMON_QP_RESET) {
1914                 if (hermon_qp_to_reset(state, qp) != DDI_SUCCESS) {
1915                         mutex_exit(&qp->qp_lock);
1916                         HERMON_WARNING(state, "failed to reset QP context");
1917                         status = ibc_get_ci_failure(0);
1918                         goto qpfree_fail;
1919                 }
1920                 qp->qp_state = HERMON_QP_RESET;
1921                 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
1922 
1923                 /*
1924                  * Do any additional handling necessary for the transition
1925                  * to the "Reset" state (e.g. update the WRID lists)
1926                  */
1927                 if (hermon_wrid_to_reset_handling(state, qp) != DDI_SUCCESS) {
1928                         mutex_exit(&qp->qp_lock);
1929                         HERMON_WARNING(state, "failed to reset QP WRID list");
1930                         status = ibc_get_ci_failure(0);
1931                         goto qpfree_fail;
1932                 }
1933         }
1934 
1935         /*
1936          * If this was a user-mappable QP, then we need to remove its entry
1937          * from the "userland resources database".  If it is also currently
1938          * mmap()'d out to a user process, then we need to call
1939          * devmap_devmem_remap() to remap the QP memory to an invalid mapping.
1940          * We also need to invalidate the QP tracking information for the
1941          * user mapping.
1942          */
1943         if (qp->qp_alloc_flags & IBT_QP_USER_MAP) {
1944                 status = hermon_umap_db_find(state->hs_instance, qp->qp_qpnum,
1945                     MLNX_UMAP_QPMEM_RSRC, &value, HERMON_UMAP_DB_REMOVE,
1946                     &umapdb);
1947                 if (status != DDI_SUCCESS) {
1948                         mutex_exit(&qp->qp_lock);
1949                         HERMON_WARNING(state, "failed to find in database");
1950                         return (ibc_get_ci_failure(0));
1951                 }
1952                 hermon_umap_db_free(umapdb);
1953                 if (qp->qp_umap_dhp != NULL) {
1954                         maxprot = (PROT_READ | PROT_WRITE | PROT_USER);
1955                         status = devmap_devmem_remap(qp->qp_umap_dhp,
1956                             state->hs_dip, 0, 0, qp->qp_wqinfo.qa_size,
1957                             maxprot, DEVMAP_MAPPING_INVALID, NULL);
1958                         if (status != DDI_SUCCESS) {
1959                                 mutex_exit(&qp->qp_lock);
1960                                 HERMON_WARNING(state, "failed in QP memory "
1961                                     "devmap_devmem_remap()");
1962                                 return (ibc_get_ci_failure(0));
1963                         }
1964                         qp->qp_umap_dhp = (devmap_cookie_t)NULL;
1965                 }
1966         }
1967 
1968 
1969         /*
1970          * Put NULL into the Hermon QPNum-to-QPHdl list.  This will allow any
1971          * in-progress events to detect that the QP corresponding to this
1972          * number has been freed.  Note: it does depend in whether we are
1973          * freeing a special QP or not.
1974          */
1975         if (qpc == NULL) {
1976                 hermon_icm_set_num_to_hdl(state, HERMON_QPC,
1977                     qp->qp_qpnum, NULL);
1978         } else if (qp->qp_is_special) {
1979                 hermon_icm_set_num_to_hdl(state, HERMON_QPC,
1980                     qpc->hr_indx + port, NULL);
1981         } else {
1982                 hermon_icm_set_num_to_hdl(state, HERMON_QPC,
1983                     qpc->hr_indx, NULL);
1984         }
1985 
1986         /*
1987          * Drop the QP lock
1988          *    At this point the lock is no longer necessary.  We cannot
1989          *    protect from multiple simultaneous calls to free the same QP.
1990          *    In addition, since the QP lock is contained in the QP "software
1991          *    handle" resource, which we will free (see below), it is
1992          *    important that we have no further references to that memory.
1993          */
1994         mutex_exit(&qp->qp_lock);
1995         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
1996 
1997         /*
1998          * Free the QP resources
1999          *    Start by deregistering and freeing the memory for work queues.
2000          *    Next free any previously allocated context information
2001          *    (depending on QP type)
2002          *    Finally, decrement the necessary reference counts.
2003          * If this fails for any reason, then it is an indication that
2004          * something (either in HW or SW) has gone seriously wrong.  So we
2005          * print a warning message and return.
2006          */
2007         status = hermon_mr_deregister(state, &mr, HERMON_MR_DEREG_ALL,
2008             sleepflag);
2009         if (status != DDI_SUCCESS) {
2010                 HERMON_WARNING(state, "failed to deregister QP memory");
2011                 status = ibc_get_ci_failure(0);
2012                 goto qpfree_fail;
2013         }
2014 
2015         /* Free the memory for the QP */
2016         hermon_queue_free(&qp->qp_wqinfo);
2017 
2018         if (qp->qp_sq_wqhdr)
2019                 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
2020         if (qp->qp_rq_wqhdr)
2021                 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
2022 
2023         /* Free the dbr */
2024         if (!qp_srq_en) {
2025                 hermon_dbr_free(state, qp->qp_uarpg, qp->qp_rq_vdbr);
2026         }
2027 
2028         /*
2029          * Free up the remainder of the QP resources.  Note: we have a few
2030          * different resources to free up depending on whether the QP is a
2031          * special QP or not.  As described above, if any of these fail for
2032          * any reason it is an indication that something (either in HW or SW)
2033          * has gone seriously wrong.  So we print a warning message and
2034          * return.
2035          */
2036         if (qp->qp_is_special) {
2037                 type = (qp->qp_is_special == HERMON_QP_SMI) ?
2038                     IBT_SMI_SQP : IBT_GSI_SQP;
2039 
2040                 /* Free up resources for the special QP */
2041                 status = hermon_special_qp_rsrc_free(state, type, port);
2042                 if (status != DDI_SUCCESS) {
2043                         HERMON_WARNING(state, "failed to free special QP rsrc");
2044                         status = ibc_get_ci_failure(0);
2045                         goto qpfree_fail;
2046                 }
2047 
2048         } else if (qp->qp_rangep) {
2049                 int refcnt;
2050                 mutex_enter(&qp->qp_rangep->hqpr_lock);
2051                 refcnt = --qp->qp_rangep->hqpr_refcnt;
2052                 mutex_exit(&qp->qp_rangep->hqpr_lock);
2053                 if (refcnt == 0) {
2054                         mutex_destroy(&qp->qp_rangep->hqpr_lock);
2055                         hermon_rsrc_free(state, &qp->qp_rangep->hqpr_qpcrsrc);
2056                         kmem_free(qp->qp_rangep, sizeof (*qp->qp_rangep));
2057                 }
2058                 qp->qp_rangep = NULL;
2059         } else if (qp->qp_qpn_hdl == NULL) {
2060                 hermon_rsrc_free(state, &qpc);
2061         } else {
2062                 /*
2063                  * Check the flags and determine whether to release the
2064                  * QPN or not, based on their value.
2065                  */
2066                 if (free_qp_flags == IBC_FREE_QP_ONLY) {
2067                         entry = qp->qp_qpn_hdl;
2068                         hermon_qp_release_qpn(state, qp->qp_qpn_hdl,
2069                             HERMON_QPN_FREE_ONLY);
2070                         *qpnh = (ibc_qpn_hdl_t)entry;
2071                 } else {
2072                         hermon_qp_release_qpn(state, qp->qp_qpn_hdl,
2073                             HERMON_QPN_RELEASE);
2074                 }
2075         }
2076 
2077         mutex_destroy(&qp->qp_sq_lock);
2078 
2079         /* Free the Hermon Queue Pair handle */
2080         hermon_rsrc_free(state, &rsrc);
2081 
2082         /* Decrement the reference counts on CQs, PD and SRQ (if needed) */
2083         hermon_cq_refcnt_dec(rq_cq);
2084         hermon_cq_refcnt_dec(sq_cq);
2085         hermon_pd_refcnt_dec(pd);
2086         if (qp_srq_en == HERMON_QP_SRQ_ENABLED) {
2087                 hermon_srq_refcnt_dec(srq);
2088         }
2089 
2090         /* Set the qphdl pointer to NULL and return success */
2091         *qphdl = NULL;
2092 
2093         return (DDI_SUCCESS);
2094 
2095 qpfree_fail:
2096         return (status);
2097 }
2098 
2099 
2100 /*
2101  * hermon_qp_query()
2102  *    Context: Can be called from interrupt or base context.
2103  */
2104 int
2105 hermon_qp_query(hermon_state_t *state, hermon_qphdl_t qp,
2106     ibt_qp_query_attr_t *attr_p)
2107 {
2108         ibt_cep_state_t         qp_state;
2109         ibt_qp_ud_attr_t        *ud;
2110         ibt_qp_rc_attr_t        *rc;
2111         ibt_qp_uc_attr_t        *uc;
2112         ibt_cep_flags_t         enable_flags;
2113         hermon_hw_addr_path_t   *qpc_path, *qpc_alt_path;
2114         ibt_cep_path_t          *path_ptr, *alt_path_ptr;
2115         hermon_hw_qpc_t         *qpc;
2116         int                     status;
2117         uint_t                  tmp_sched_q, tmp_alt_sched_q;
2118 
2119         mutex_enter(&qp->qp_lock);
2120 
2121         /*
2122          * Grab the temporary QPC entry from QP software state
2123          */
2124         qpc = &qp->qpc;
2125 
2126         /* Convert the current Hermon QP state to IBTF QP state */
2127         switch (qp->qp_state) {
2128         case HERMON_QP_RESET:
2129                 qp_state = IBT_STATE_RESET;             /* "Reset" */
2130                 break;
2131         case HERMON_QP_INIT:
2132                 qp_state = IBT_STATE_INIT;              /* Initialized */
2133                 break;
2134         case HERMON_QP_RTR:
2135                 qp_state = IBT_STATE_RTR;               /* Ready to Receive */
2136                 break;
2137         case HERMON_QP_RTS:
2138                 qp_state = IBT_STATE_RTS;               /* Ready to Send */
2139                 break;
2140         case HERMON_QP_SQERR:
2141                 qp_state = IBT_STATE_SQE;               /* Send Queue Error */
2142                 break;
2143         case HERMON_QP_SQD:
2144                 if (qp->qp_sqd_still_draining) {
2145                         qp_state = IBT_STATE_SQDRAIN;   /* SQ Draining */
2146                 } else {
2147                         qp_state = IBT_STATE_SQD;       /* SQ Drained */
2148                 }
2149                 break;
2150         case HERMON_QP_ERR:
2151                 qp_state = IBT_STATE_ERROR;             /* Error */
2152                 break;
2153         default:
2154                 mutex_exit(&qp->qp_lock);
2155                 return (ibc_get_ci_failure(0));
2156         }
2157         attr_p->qp_info.qp_state = qp_state;
2158 
2159         /* SRQ Hook. */
2160         attr_p->qp_srq = NULL;
2161 
2162         /*
2163          * The following QP information is always returned, regardless of
2164          * the current QP state.  Note: Some special handling is necessary
2165          * for calculating the QP number on special QP (QP0 and QP1).
2166          */
2167         attr_p->qp_sq_cq    =
2168             (qp->qp_sq_cqhdl == NULL) ? NULL : qp->qp_sq_cqhdl->cq_hdlrarg;
2169         attr_p->qp_rq_cq    =
2170             (qp->qp_rq_cqhdl == NULL) ? NULL : qp->qp_rq_cqhdl->cq_hdlrarg;
2171         if (qp->qp_is_special) {
2172                 attr_p->qp_qpn = (qp->qp_is_special == HERMON_QP_SMI) ? 0 : 1;
2173         } else {
2174                 attr_p->qp_qpn = (ib_qpn_t)qp->qp_qpnum;
2175         }
2176         attr_p->qp_sq_sgl   = qp->qp_sq_sgl;
2177         attr_p->qp_rq_sgl   = qp->qp_rq_sgl;
2178         attr_p->qp_info.qp_sq_sz = qp->qp_sq_bufsz - qp->qp_sq_hdrmwqes;
2179         attr_p->qp_info.qp_rq_sz = qp->qp_rq_bufsz;
2180 
2181         /*
2182          * If QP is currently in the "Reset" state, then only the above are
2183          * returned
2184          */
2185         if (qp_state == IBT_STATE_RESET) {
2186                 mutex_exit(&qp->qp_lock);
2187                 return (DDI_SUCCESS);
2188         }
2189 
2190         /*
2191          * Post QUERY_QP command to firmware
2192          *
2193          * We do a HERMON_NOSLEEP here because we are holding the "qp_lock".
2194          * Since we may be in the interrupt context (or subsequently raised
2195          * to interrupt level by priority inversion), we do not want to block
2196          * in this routine waiting for success.
2197          */
2198         tmp_sched_q = qpc->pri_addr_path.sched_q;
2199         tmp_alt_sched_q = qpc->alt_addr_path.sched_q;
2200         status = hermon_cmn_query_cmd_post(state, QUERY_QP, 0, qp->qp_qpnum,
2201             qpc, sizeof (hermon_hw_qpc_t), HERMON_CMD_NOSLEEP_SPIN);
2202         if (status != HERMON_CMD_SUCCESS) {
2203                 mutex_exit(&qp->qp_lock);
2204                 cmn_err(CE_WARN, "hermon%d: hermon_qp_query: QUERY_QP "
2205                     "command failed: %08x\n", state->hs_instance, status);
2206                 if (status == HERMON_CMD_INVALID_STATUS) {
2207                         hermon_fm_ereport(state, HCA_SYS_ERR, HCA_ERR_SRV_LOST);
2208                 }
2209                 return (ibc_get_ci_failure(0));
2210         }
2211         qpc->pri_addr_path.sched_q = tmp_sched_q;
2212         qpc->alt_addr_path.sched_q = tmp_alt_sched_q;
2213 
2214         /*
2215          * Fill in the additional QP info based on the QP's transport type.
2216          */
2217         if (qp->qp_type == IBT_UD_RQP) {
2218 
2219                 /* Fill in the UD-specific info */
2220                 ud = &attr_p->qp_info.qp_transport.ud;
2221                 ud->ud_qkey  = (ib_qkey_t)qpc->qkey;
2222                 ud->ud_sq_psn        = qpc->next_snd_psn;
2223                 ud->ud_pkey_ix       = qpc->pri_addr_path.pkey_indx;
2224                 /* port+1 for port 1/2 */
2225                 ud->ud_port  =
2226                     (uint8_t)(((qpc->pri_addr_path.sched_q >> 6) & 0x01) + 1);
2227 
2228                 attr_p->qp_info.qp_trans = IBT_UD_SRV;
2229 
2230                 if (qp->qp_serv_type == HERMON_QP_FEXCH) {
2231                         ibt_pmr_desc_t *pmr;
2232                         uint64_t heart_beat;
2233 
2234                         _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*pmr))
2235                         pmr = &attr_p->qp_query_fexch.fq_uni_mem_desc;
2236                         pmr->pmd_iova = 0;
2237                         pmr->pmd_lkey = pmr->pmd_rkey =
2238                             hermon_fcoib_qpn_to_mkey(state, qp->qp_qpnum);
2239                         pmr->pmd_phys_buf_list_sz =
2240                             state->hs_fcoib.hfc_mtts_per_mpt;
2241                         pmr->pmd_sync_required = 0;
2242 
2243                         pmr = &attr_p->qp_query_fexch.fq_bi_mem_desc;
2244                         pmr->pmd_iova = 0;
2245                         pmr->pmd_lkey = 0;
2246                         pmr->pmd_rkey = 0;
2247                         pmr->pmd_phys_buf_list_sz = 0;
2248                         pmr->pmd_sync_required = 0;
2249 
2250                         attr_p->qp_query_fexch.fq_flags =
2251                             ((hermon_get_heart_beat_rq_cmd_post(state,
2252                             qp->qp_qpnum, &heart_beat) == HERMON_CMD_SUCCESS) &&
2253                             (heart_beat == 0)) ? IBT_FEXCH_HEART_BEAT_OK :
2254                             IBT_FEXCH_NO_FLAGS;
2255 
2256                         ud->ud_fc = qp->qp_fc_attr;
2257                 } else if (qp->qp_serv_type == HERMON_QP_FCMND ||
2258                     qp->qp_serv_type == HERMON_QP_RFCI) {
2259                         ud->ud_fc = qp->qp_fc_attr;
2260                 }
2261 
2262         } else if (qp->qp_serv_type == HERMON_QP_RC) {
2263 
2264                 /* Fill in the RC-specific info */
2265                 rc = &attr_p->qp_info.qp_transport.rc;
2266                 rc->rc_sq_psn        = qpc->next_snd_psn;
2267                 rc->rc_rq_psn        = qpc->next_rcv_psn;
2268                 rc->rc_dst_qpn       = qpc->rem_qpn;
2269 
2270                 /* Grab the path migration state information */
2271                 if (qpc->pm_state == HERMON_QP_PMSTATE_MIGRATED) {
2272                         rc->rc_mig_state = IBT_STATE_MIGRATED;
2273                 } else if (qpc->pm_state == HERMON_QP_PMSTATE_REARM) {
2274                         rc->rc_mig_state = IBT_STATE_REARMED;
2275                 } else {
2276                         rc->rc_mig_state = IBT_STATE_ARMED;
2277                 }
2278                 rc->rc_rdma_ra_out = (1 << qpc->sra_max);
2279                 rc->rc_rdma_ra_in  = (1 << qpc->rra_max);
2280                 rc->rc_min_rnr_nak = qpc->min_rnr_nak;
2281                 rc->rc_path_mtu         = qpc->mtu;
2282                 rc->rc_retry_cnt   = qpc->retry_cnt;
2283 
2284                 /* Get the common primary address path fields */
2285                 qpc_path = &qpc->pri_addr_path;
2286                 path_ptr = &rc->rc_path;
2287                 hermon_get_addr_path(state, qpc_path, &path_ptr->cep_adds_vect,
2288                     HERMON_ADDRPATH_QP);
2289 
2290                 /* Fill in the additional primary address path fields */
2291                 path_ptr->cep_pkey_ix           = qpc_path->pkey_indx;
2292                 path_ptr->cep_hca_port_num =
2293                     path_ptr->cep_adds_vect.av_port_num =
2294                     (uint8_t)(((qpc_path->sched_q >> 6) & 0x01) + 1);
2295                 path_ptr->cep_timeout           = qpc_path->ack_timeout;
2296 
2297                 /* Get the common alternate address path fields */
2298                 qpc_alt_path = &qpc->alt_addr_path;
2299                 alt_path_ptr = &rc->rc_alt_path;
2300                 hermon_get_addr_path(state, qpc_alt_path,
2301                     &alt_path_ptr->cep_adds_vect, HERMON_ADDRPATH_QP);
2302 
2303                 /* Fill in the additional alternate address path fields */
2304                 alt_path_ptr->cep_pkey_ix    = qpc_alt_path->pkey_indx;
2305                 alt_path_ptr->cep_hca_port_num       =
2306                     alt_path_ptr->cep_adds_vect.av_port_num =
2307                     (uint8_t)(((qpc_alt_path->sched_q >> 6) & 0x01) + 1);
2308                 alt_path_ptr->cep_timeout    = qpc_alt_path->ack_timeout;
2309 
2310                 /* Get the RNR retry time from primary path */
2311                 rc->rc_rnr_retry_cnt = qpc->rnr_retry;
2312 
2313                 /* Set the enable flags based on RDMA/Atomic enable bits */
2314                 enable_flags = IBT_CEP_NO_FLAGS;
2315                 enable_flags |= ((qpc->rre == 0) ? 0 : IBT_CEP_RDMA_RD);
2316                 enable_flags |= ((qpc->rwe == 0) ? 0 : IBT_CEP_RDMA_WR);
2317                 enable_flags |= ((qpc->rae == 0) ? 0 : IBT_CEP_ATOMIC);
2318                 attr_p->qp_info.qp_flags = enable_flags;
2319 
2320                 attr_p->qp_info.qp_trans = IBT_RC_SRV;
2321 
2322         } else if (qp->qp_serv_type == HERMON_QP_UC) {
2323 
2324                 /* Fill in the UC-specific info */
2325                 uc = &attr_p->qp_info.qp_transport.uc;
2326                 uc->uc_sq_psn        = qpc->next_snd_psn;
2327                 uc->uc_rq_psn        = qpc->next_rcv_psn;
2328                 uc->uc_dst_qpn       = qpc->rem_qpn;
2329 
2330                 /* Grab the path migration state information */
2331                 if (qpc->pm_state == HERMON_QP_PMSTATE_MIGRATED) {
2332                         uc->uc_mig_state = IBT_STATE_MIGRATED;
2333                 } else if (qpc->pm_state == HERMON_QP_PMSTATE_REARM) {
2334                         uc->uc_mig_state = IBT_STATE_REARMED;
2335                 } else {
2336                         uc->uc_mig_state = IBT_STATE_ARMED;
2337                 }
2338                 uc->uc_path_mtu = qpc->mtu;
2339 
2340                 /* Get the common primary address path fields */
2341                 qpc_path = &qpc->pri_addr_path;
2342                 path_ptr = &uc->uc_path;
2343                 hermon_get_addr_path(state, qpc_path, &path_ptr->cep_adds_vect,
2344                     HERMON_ADDRPATH_QP);
2345 
2346                 /* Fill in the additional primary address path fields */
2347                 path_ptr->cep_pkey_ix           = qpc_path->pkey_indx;
2348                 path_ptr->cep_hca_port_num =
2349                     path_ptr->cep_adds_vect.av_port_num =
2350                     (uint8_t)(((qpc_path->sched_q >> 6) & 0x01) + 1);
2351 
2352                 /* Get the common alternate address path fields */
2353                 qpc_alt_path = &qpc->alt_addr_path;
2354                 alt_path_ptr = &uc->uc_alt_path;
2355                 hermon_get_addr_path(state, qpc_alt_path,
2356                     &alt_path_ptr->cep_adds_vect, HERMON_ADDRPATH_QP);
2357 
2358                 /* Fill in the additional alternate address path fields */
2359                 alt_path_ptr->cep_pkey_ix    = qpc_alt_path->pkey_indx;
2360                 alt_path_ptr->cep_hca_port_num       =
2361                     alt_path_ptr->cep_adds_vect.av_port_num =
2362                     (uint8_t)(((qpc_alt_path->sched_q >> 6) & 0x01) + 1);
2363 
2364                 /*
2365                  * Set the enable flags based on RDMA enable bits (by
2366                  * definition UC doesn't support Atomic or RDMA Read)
2367                  */
2368                 enable_flags = ((qpc->rwe == 0) ? 0 : IBT_CEP_RDMA_WR);
2369                 attr_p->qp_info.qp_flags = enable_flags;
2370 
2371                 attr_p->qp_info.qp_trans = IBT_UC_SRV;
2372 
2373         } else {
2374                 HERMON_WARNING(state, "unexpected QP transport type");
2375                 mutex_exit(&qp->qp_lock);
2376                 return (ibc_get_ci_failure(0));
2377         }
2378 
2379         /*
2380          * Under certain circumstances it is possible for the Hermon hardware
2381          * to transition to one of the error states without software directly
2382          * knowing about it.  The QueryQP() call is the one place where we
2383          * have an opportunity to sample and update our view of the QP state.
2384          */
2385         if (qpc->state == HERMON_QP_SQERR) {
2386                 attr_p->qp_info.qp_state = IBT_STATE_SQE;
2387                 qp->qp_state = HERMON_QP_SQERR;
2388                 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_SQERR);
2389         }
2390         if (qpc->state == HERMON_QP_ERR) {
2391                 attr_p->qp_info.qp_state = IBT_STATE_ERROR;
2392                 qp->qp_state = HERMON_QP_ERR;
2393                 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_ERR);
2394         }
2395         mutex_exit(&qp->qp_lock);
2396 
2397         return (DDI_SUCCESS);
2398 }
2399 
2400 
2401 /*
2402  * hermon_qp_create_qpn()
2403  *    Context: Can be called from interrupt or base context.
2404  */
2405 static int
2406 hermon_qp_create_qpn(hermon_state_t *state, hermon_qphdl_t qp,
2407     hermon_rsrc_t *qpc)
2408 {
2409         hermon_qpn_entry_t      query;
2410         hermon_qpn_entry_t      *entry;
2411         avl_index_t             where;
2412 
2413         /*
2414          * Build a query (for the AVL tree lookup) and attempt to find
2415          * a previously added entry that has a matching QPC index.  If
2416          * no matching entry is found, then allocate, initialize, and
2417          * add an entry to the AVL tree.
2418          * If a matching entry is found, then increment its QPN counter
2419          * and reference counter.
2420          */
2421         query.qpn_indx = qpc->hr_indx;
2422         mutex_enter(&state->hs_qpn_avl_lock);
2423         entry = (hermon_qpn_entry_t *)avl_find(&state->hs_qpn_avl,
2424             &query, &where);
2425         if (entry == NULL) {
2426                 /*
2427                  * Allocate and initialize a QPN entry, then insert
2428                  * it into the AVL tree.
2429                  */
2430                 entry = (hermon_qpn_entry_t *)kmem_zalloc(
2431                     sizeof (hermon_qpn_entry_t), KM_NOSLEEP);
2432                 if (entry == NULL) {
2433                         mutex_exit(&state->hs_qpn_avl_lock);
2434                         return (DDI_FAILURE);
2435                 }
2436                 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*entry))
2437 
2438                 entry->qpn_indx         = qpc->hr_indx;
2439                 entry->qpn_refcnt  = 0;
2440                 entry->qpn_counter = 0;
2441 
2442                 avl_insert(&state->hs_qpn_avl, entry, where);
2443         }
2444 
2445         /*
2446          * Make the AVL tree entry point to the QP context resource that
2447          * it will be responsible for tracking
2448          */
2449         entry->qpn_qpc = qpc;
2450 
2451         /*
2452          * Setup the QP handle to point to the AVL tree entry.  Then
2453          * generate the new QP number from the entry's QPN counter value
2454          * and the hardware's QP context table index.
2455          */
2456         qp->qp_qpn_hdl       = entry;
2457         qp->qp_qpnum = ((entry->qpn_counter <<
2458             state->hs_cfg_profile->cp_log_num_qp) | qpc->hr_indx) &
2459             HERMON_QP_MAXNUMBER_MSK;
2460         qp->qp_ring = qp->qp_qpnum << 8;
2461 
2462         /*
2463          * Increment the reference counter and QPN counter.  The QPN
2464          * counter always indicates the next available number for use.
2465          */
2466         entry->qpn_counter++;
2467         entry->qpn_refcnt++;
2468 
2469         mutex_exit(&state->hs_qpn_avl_lock);
2470 
2471         return (DDI_SUCCESS);
2472 }
2473 
2474 
2475 /*
2476  * hermon_qp_release_qpn()
2477  *    Context: Can be called only from user or kernel context.
2478  */
2479 void
2480 hermon_qp_release_qpn(hermon_state_t *state, hermon_qpn_entry_t *entry,
2481     int flags)
2482 {
2483         ASSERT(entry != NULL);
2484 
2485         mutex_enter(&state->hs_qpn_avl_lock);
2486 
2487         /*
2488          * If we are releasing the QP number here, then we decrement the
2489          * reference count and check for zero references.  If there are
2490          * zero references, then we free the QPC context (if it hadn't
2491          * already been freed during a HERMON_QPN_FREE_ONLY free, i.e. for
2492          * reuse with another similar QP number) and remove the tracking
2493          * structure from the QP number AVL tree and free the structure.
2494          * If we are not releasing the QP number here, then, as long as we
2495          * have not exhausted the usefulness of the QPC context (that is,
2496          * re-used it too many times without the reference count having
2497          * gone to zero), we free up the QPC context for use by another
2498          * thread (which will use it to construct a different QP number
2499          * from the same QPC table index).
2500          */
2501         if (flags == HERMON_QPN_RELEASE) {
2502                 entry->qpn_refcnt--;
2503 
2504                 /*
2505                  * If the reference count is zero, then we free the QPC
2506                  * context (if it hadn't already been freed in an early
2507                  * step, e.g. HERMON_QPN_FREE_ONLY) and remove/free the
2508                  * tracking structure from the QP number AVL tree.
2509                  */
2510                 if (entry->qpn_refcnt == 0) {
2511                         if (entry->qpn_qpc != NULL) {
2512                                 hermon_rsrc_free(state, &entry->qpn_qpc);
2513                         }
2514 
2515                         /*
2516                          * If the current entry has served it's useful
2517                          * purpose (i.e. been reused the maximum allowable
2518                          * number of times), then remove it from QP number
2519                          * AVL tree and free it up.
2520                          */
2521                         if (entry->qpn_counter >= (1 <<
2522                             (24 - state->hs_cfg_profile->cp_log_num_qp))) {
2523                                 avl_remove(&state->hs_qpn_avl, entry);
2524                                 kmem_free(entry, sizeof (hermon_qpn_entry_t));
2525                         }
2526                 }
2527 
2528         } else if (flags == HERMON_QPN_FREE_ONLY) {
2529                 /*
2530                  * Even if we are not freeing the QP number, that will not
2531                  * always prevent us from releasing the QPC context.  In fact,
2532                  * since the QPC context only forms part of the whole QPN,
2533                  * we want to free it up for use by other consumers.  But
2534                  * if the reference count is non-zero (which it will always
2535                  * be when we are doing HERMON_QPN_FREE_ONLY) and the counter
2536                  * has reached its maximum value, then we cannot reuse the
2537                  * QPC context until the reference count eventually reaches
2538                  * zero (in HERMON_QPN_RELEASE, above).
2539                  */
2540                 if (entry->qpn_counter < (1 <<
2541                     (24 - state->hs_cfg_profile->cp_log_num_qp))) {
2542                         hermon_rsrc_free(state, &entry->qpn_qpc);
2543                 }
2544         }
2545         mutex_exit(&state->hs_qpn_avl_lock);
2546 }
2547 
2548 
2549 /*
2550  * hermon_qpn_avl_compare()
2551  *    Context: Can be called from user or kernel context.
2552  */
2553 static int
2554 hermon_qpn_avl_compare(const void *q, const void *e)
2555 {
2556         hermon_qpn_entry_t      *entry, *query;
2557 
2558         entry = (hermon_qpn_entry_t *)e;
2559         query = (hermon_qpn_entry_t *)q;
2560 
2561         if (query->qpn_indx < entry->qpn_indx) {
2562                 return (-1);
2563         } else if (query->qpn_indx > entry->qpn_indx) {
2564                 return (+1);
2565         } else {
2566                 return (0);
2567         }
2568 }
2569 
2570 
2571 /*
2572  * hermon_qpn_avl_init()
2573  *    Context: Only called from attach() path context
2574  */
2575 void
2576 hermon_qpn_avl_init(hermon_state_t *state)
2577 {
2578         /* Initialize the lock used for QP number (QPN) AVL tree access */
2579         mutex_init(&state->hs_qpn_avl_lock, NULL, MUTEX_DRIVER,
2580             DDI_INTR_PRI(state->hs_intrmsi_pri));
2581 
2582         /* Initialize the AVL tree for the QP number (QPN) storage */
2583         avl_create(&state->hs_qpn_avl, hermon_qpn_avl_compare,
2584             sizeof (hermon_qpn_entry_t),
2585             offsetof(hermon_qpn_entry_t, qpn_avlnode));
2586 }
2587 
2588 
2589 /*
2590  * hermon_qpn_avl_fini()
2591  *    Context: Only called from attach() and/or detach() path contexts
2592  */
2593 void
2594 hermon_qpn_avl_fini(hermon_state_t *state)
2595 {
2596         hermon_qpn_entry_t      *entry;
2597         void                    *cookie;
2598 
2599         /*
2600          * Empty all entries (if necessary) and destroy the AVL tree
2601          * that was used for QP number (QPN) tracking.
2602          */
2603         cookie = NULL;
2604         while ((entry = (hermon_qpn_entry_t *)avl_destroy_nodes(
2605             &state->hs_qpn_avl, &cookie)) != NULL) {
2606                 kmem_free(entry, sizeof (hermon_qpn_entry_t));
2607         }
2608         avl_destroy(&state->hs_qpn_avl);
2609 
2610         /* Destroy the lock used for QP number (QPN) AVL tree access */
2611         mutex_destroy(&state->hs_qpn_avl_lock);
2612 }
2613 
2614 
2615 /*
2616  * hermon_qphdl_from_qpnum()
2617  *    Context: Can be called from interrupt or base context.
2618  *
2619  *    This routine is important because changing the unconstrained
2620  *    portion of the QP number is critical to the detection of a
2621  *    potential race condition in the QP event handler code (i.e. the case
2622  *    where a QP is freed and alloc'd again before an event for the
2623  *    "old" QP can be handled).
2624  *
2625  *    While this is not a perfect solution (not sure that one exists)
2626  *    it does help to mitigate the chance that this race condition will
2627  *    cause us to deliver a "stale" event to the new QP owner.  Note:
2628  *    this solution does not scale well because the number of constrained
2629  *    bits increases (and, hence, the number of unconstrained bits
2630  *    decreases) as the number of supported QPs grows.  For small and
2631  *    intermediate values, it should hopefully provide sufficient
2632  *    protection.
2633  */
2634 hermon_qphdl_t
2635 hermon_qphdl_from_qpnum(hermon_state_t *state, uint_t qpnum)
2636 {
2637         uint_t  qpindx, qpmask;
2638 
2639         /* Calculate the QP table index from the qpnum */
2640         qpmask = (1 << state->hs_cfg_profile->cp_log_num_qp) - 1;
2641         qpindx = qpnum & qpmask;
2642         return (hermon_icm_num_to_hdl(state, HERMON_QPC, qpindx));
2643 }
2644 
2645 
2646 /*
2647  * hermon_special_qp_rsrc_alloc
2648  *    Context: Can be called from interrupt or base context.
2649  */
2650 static int
2651 hermon_special_qp_rsrc_alloc(hermon_state_t *state, ibt_sqp_type_t type,
2652     uint_t port, hermon_rsrc_t **qp_rsrc)
2653 {
2654         uint_t          mask, flags;
2655         int             status;
2656 
2657         mutex_enter(&state->hs_spec_qplock);
2658         flags = state->hs_spec_qpflags;
2659         if (type == IBT_SMI_SQP) {
2660                 /*
2661                  * Check here to see if the driver has been configured
2662                  * to instruct the Hermon firmware to handle all incoming
2663                  * SMP messages (i.e. messages sent to SMA).  If so,
2664                  * then we will treat QP0 as if it has already been
2665                  * allocated (for internal use).  Otherwise, if we allow
2666                  * the allocation to happen, it will cause unexpected
2667                  * behaviors (e.g. Hermon SMA becomes unresponsive).
2668                  */
2669                 if (state->hs_cfg_profile->cp_qp0_agents_in_fw != 0) {
2670                         mutex_exit(&state->hs_spec_qplock);
2671                         return (IBT_QP_IN_USE);
2672                 }
2673 
2674                 /*
2675                  * If this is the first QP0 allocation, then post
2676                  * a CONF_SPECIAL_QP firmware command
2677                  */
2678                 if ((flags & HERMON_SPECIAL_QP0_RSRC_MASK) == 0) {
2679                         status = hermon_conf_special_qp_cmd_post(state,
2680                             state->hs_spec_qp0->hr_indx, HERMON_CMD_QP_SMI,
2681                             HERMON_CMD_NOSLEEP_SPIN,
2682                             HERMON_CMD_SPEC_QP_OPMOD(
2683                             state->hs_cfg_profile->cp_qp0_agents_in_fw,
2684                             state->hs_cfg_profile->cp_qp1_agents_in_fw));
2685                         if (status != HERMON_CMD_SUCCESS) {
2686                                 mutex_exit(&state->hs_spec_qplock);
2687                                 cmn_err(CE_NOTE, "hermon%d: CONF_SPECIAL_QP "
2688                                     "command failed: %08x\n",
2689                                     state->hs_instance, status);
2690                                 return (IBT_INSUFF_RESOURCE);
2691                         }
2692                 }
2693 
2694                 /*
2695                  * Now check (and, if necessary, modify) the flags to indicate
2696                  * whether the allocation was successful
2697                  */
2698                 mask = (1 << (HERMON_SPECIAL_QP0_RSRC + port));
2699                 if (flags & mask) {
2700                         mutex_exit(&state->hs_spec_qplock);
2701                         return (IBT_QP_IN_USE);
2702                 }
2703                 state->hs_spec_qpflags |= mask;
2704                 *qp_rsrc = state->hs_spec_qp0;
2705 
2706         } else {
2707                 /*
2708                  * If this is the first QP1 allocation, then post
2709                  * a CONF_SPECIAL_QP firmware command
2710                  */
2711                 if ((flags & HERMON_SPECIAL_QP1_RSRC_MASK) == 0) {
2712                         status = hermon_conf_special_qp_cmd_post(state,
2713                             state->hs_spec_qp1->hr_indx, HERMON_CMD_QP_GSI,
2714                             HERMON_CMD_NOSLEEP_SPIN,
2715                             HERMON_CMD_SPEC_QP_OPMOD(
2716                             state->hs_cfg_profile->cp_qp0_agents_in_fw,
2717                             state->hs_cfg_profile->cp_qp1_agents_in_fw));
2718                         if (status != HERMON_CMD_SUCCESS) {
2719                                 mutex_exit(&state->hs_spec_qplock);
2720                                 cmn_err(CE_NOTE, "hermon%d: CONF_SPECIAL_QP "
2721                                     "command failed: %08x\n",
2722                                     state->hs_instance, status);
2723                                 return (IBT_INSUFF_RESOURCE);
2724                         }
2725                 }
2726 
2727                 /*
2728                  * Now check (and, if necessary, modify) the flags to indicate
2729                  * whether the allocation was successful
2730                  */
2731                 mask = (1 << (HERMON_SPECIAL_QP1_RSRC + port));
2732                 if (flags & mask) {
2733                         mutex_exit(&state->hs_spec_qplock);
2734                         return (IBT_QP_IN_USE);
2735                 }
2736                 state->hs_spec_qpflags |= mask;
2737                 *qp_rsrc = state->hs_spec_qp1;
2738         }
2739 
2740         mutex_exit(&state->hs_spec_qplock);
2741         return (DDI_SUCCESS);
2742 }
2743 
2744 
2745 /*
2746  * hermon_special_qp_rsrc_free
2747  *    Context: Can be called from interrupt or base context.
2748  */
2749 static int
2750 hermon_special_qp_rsrc_free(hermon_state_t *state, ibt_sqp_type_t type,
2751     uint_t port)
2752 {
2753         uint_t          mask, flags;
2754         int             status;
2755 
2756         mutex_enter(&state->hs_spec_qplock);
2757         if (type == IBT_SMI_SQP) {
2758                 mask = (1 << (HERMON_SPECIAL_QP0_RSRC + port));
2759                 state->hs_spec_qpflags &= ~mask;
2760                 flags = state->hs_spec_qpflags;
2761 
2762                 /*
2763                  * If this is the last QP0 free, then post a CONF_SPECIAL_QP
2764                  * NOW, If this is the last Special QP free, then post a
2765                  * CONF_SPECIAL_QP firmware command - it'll stop them all
2766                  */
2767                 if (flags) {
2768                         status = hermon_conf_special_qp_cmd_post(state, 0,
2769                             HERMON_CMD_QP_SMI, HERMON_CMD_NOSLEEP_SPIN, 0);
2770                         if (status != HERMON_CMD_SUCCESS) {
2771                                 mutex_exit(&state->hs_spec_qplock);
2772                                 cmn_err(CE_NOTE, "hermon%d: CONF_SPECIAL_QP "
2773                                     "command failed: %08x\n",
2774                                     state->hs_instance, status);
2775                                 if (status == HERMON_CMD_INVALID_STATUS) {
2776                                         hermon_fm_ereport(state, HCA_SYS_ERR,
2777                                             HCA_ERR_SRV_LOST);
2778                                 }
2779                                 return (ibc_get_ci_failure(0));
2780                         }
2781                 }
2782         } else {
2783                 mask = (1 << (HERMON_SPECIAL_QP1_RSRC + port));
2784                 state->hs_spec_qpflags &= ~mask;
2785                 flags = state->hs_spec_qpflags;
2786 
2787                 /*
2788                  * If this is the last QP1 free, then post a CONF_SPECIAL_QP
2789                  * NOW, if this is the last special QP free, then post a
2790                  * CONF_SPECIAL_QP firmware command - it'll stop them all
2791                  */
2792                 if (flags) {
2793                         status = hermon_conf_special_qp_cmd_post(state, 0,
2794                             HERMON_CMD_QP_GSI, HERMON_CMD_NOSLEEP_SPIN, 0);
2795                         if (status != HERMON_CMD_SUCCESS) {
2796                                 mutex_exit(&state->hs_spec_qplock);
2797                                 cmn_err(CE_NOTE, "hermon%d: CONF_SPECIAL_QP "
2798                                     "command failed: %08x\n",
2799                                     state->hs_instance, status);
2800                                 if (status == HERMON_CMD_INVALID_STATUS) {
2801                                         hermon_fm_ereport(state, HCA_SYS_ERR,
2802                                             HCA_ERR_SRV_LOST);
2803                                 }
2804                                 return (ibc_get_ci_failure(0));
2805                         }
2806                 }
2807         }
2808 
2809         mutex_exit(&state->hs_spec_qplock);
2810         return (DDI_SUCCESS);
2811 }
2812 
2813 
2814 /*
2815  * hermon_qp_sgl_to_logwqesz()
2816  *    Context: Can be called from interrupt or base context.
2817  */
2818 static void
2819 hermon_qp_sgl_to_logwqesz(hermon_state_t *state, uint_t num_sgl,
2820     uint_t real_max_sgl, hermon_qp_wq_type_t wq_type,
2821     uint_t *logwqesz, uint_t *max_sgl)
2822 {
2823         uint_t  max_size, log2, actual_sgl;
2824 
2825         switch (wq_type) {
2826         case HERMON_QP_WQ_TYPE_SENDQ_UD:
2827                 /*
2828                  * Use requested maximum SGL to calculate max descriptor size
2829                  * (while guaranteeing that the descriptor size is a
2830                  * power-of-2 cachelines).
2831                  */
2832                 max_size = (HERMON_QP_WQE_MLX_SND_HDRS + (num_sgl << 4));
2833                 log2 = highbit(max_size);
2834                 if ((max_size & (max_size - 1)) == 0) {
2835                         log2 = log2 - 1;
2836                 }
2837 
2838                 /* Make sure descriptor is at least the minimum size */
2839                 log2 = max(log2, HERMON_QP_WQE_LOG_MINIMUM);
2840 
2841                 /* Calculate actual number of SGL (given WQE size) */
2842                 actual_sgl = ((1 << log2) -
2843                     sizeof (hermon_hw_snd_wqe_ctrl_t)) >> 4;
2844                 break;
2845 
2846         case HERMON_QP_WQ_TYPE_SENDQ_CONN:
2847                 /*
2848                  * Use requested maximum SGL to calculate max descriptor size
2849                  * (while guaranteeing that the descriptor size is a
2850                  * power-of-2 cachelines).
2851                  */
2852                 max_size = (HERMON_QP_WQE_MLX_SND_HDRS + (num_sgl << 4));
2853                 log2 = highbit(max_size);
2854                 if ((max_size & (max_size - 1)) == 0) {
2855                         log2 = log2 - 1;
2856                 }
2857 
2858                 /* Make sure descriptor is at least the minimum size */
2859                 log2 = max(log2, HERMON_QP_WQE_LOG_MINIMUM);
2860 
2861                 /* Calculate actual number of SGL (given WQE size) */
2862                 actual_sgl = ((1 << log2) - HERMON_QP_WQE_MLX_SND_HDRS) >> 4;
2863                 break;
2864 
2865         case HERMON_QP_WQ_TYPE_RECVQ:
2866                 /*
2867                  * Same as above (except for Recv WQEs)
2868                  */
2869                 max_size = (HERMON_QP_WQE_MLX_RCV_HDRS + (num_sgl << 4));
2870                 log2 = highbit(max_size);
2871                 if ((max_size & (max_size - 1)) == 0) {
2872                         log2 = log2 - 1;
2873                 }
2874 
2875                 /* Make sure descriptor is at least the minimum size */
2876                 log2 = max(log2, HERMON_QP_WQE_LOG_MINIMUM);
2877 
2878                 /* Calculate actual number of SGL (given WQE size) */
2879                 actual_sgl = ((1 << log2) - HERMON_QP_WQE_MLX_RCV_HDRS) >> 4;
2880                 break;
2881 
2882         case HERMON_QP_WQ_TYPE_SENDMLX_QP0:
2883                 /*
2884                  * Same as above (except for MLX transport WQEs).  For these
2885                  * WQEs we have to account for the space consumed by the
2886                  * "inline" packet headers.  (This is smaller than for QP1
2887                  * below because QP0 is not allowed to send packets with a GRH.
2888                  */
2889                 max_size = (HERMON_QP_WQE_MLX_QP0_HDRS + (num_sgl << 4));
2890                 log2 = highbit(max_size);
2891                 if ((max_size & (max_size - 1)) == 0) {
2892                         log2 = log2 - 1;
2893                 }
2894 
2895                 /* Make sure descriptor is at least the minimum size */
2896                 log2 = max(log2, HERMON_QP_WQE_LOG_MINIMUM);
2897 
2898                 /* Calculate actual number of SGL (given WQE size) */
2899                 actual_sgl = ((1 << log2) - HERMON_QP_WQE_MLX_QP0_HDRS) >> 4;
2900                 break;
2901 
2902         case HERMON_QP_WQ_TYPE_SENDMLX_QP1:
2903                 /*
2904                  * Same as above.  For these WQEs we again have to account for
2905                  * the space consumed by the "inline" packet headers.  (This
2906                  * is larger than for QP0 above because we have to account for
2907                  * the possibility of a GRH in each packet - and this
2908                  * introduces an alignment issue that causes us to consume
2909                  * an additional 8 bytes).
2910                  */
2911                 max_size = (HERMON_QP_WQE_MLX_QP1_HDRS + (num_sgl << 4));
2912                 log2 = highbit(max_size);
2913                 if ((max_size & (max_size - 1)) == 0) {
2914                         log2 = log2 - 1;
2915                 }
2916 
2917                 /* Make sure descriptor is at least the minimum size */
2918                 log2 = max(log2, HERMON_QP_WQE_LOG_MINIMUM);
2919 
2920                 /* Calculate actual number of SGL (given WQE size) */
2921                 actual_sgl = ((1 << log2) - HERMON_QP_WQE_MLX_QP1_HDRS) >> 4;
2922                 break;
2923 
2924         default:
2925                 HERMON_WARNING(state, "unexpected work queue type");
2926                 break;
2927         }
2928 
2929         /* Fill in the return values */
2930         *logwqesz = log2;
2931         *max_sgl  = min(real_max_sgl, actual_sgl);
2932 }
--- EOF ---