9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci.c
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor Channel Interface (CI) Routines
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Implements all the routines necessary to interface with the IBTF.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Pointers to all of these functions are passed to the IBTF at attach()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * time in the ibc_operations_t structure. These functions include all
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of the necessary routines to implement the required InfiniBand "verbs"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and additional IBTF-specific interfaces.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/types.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/conf.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/sunddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* HCA and port related operations */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_hca_ports(ibc_hca_hdl_t, uint8_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_hca_portinfo_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_ports(ibc_hca_hdl_t, uint8_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_port_modify_flags_t, uint8_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_system_image(ibc_hca_hdl_t, ib_guid_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Protection Domains */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_pd(ibc_hca_hdl_t, ibt_pd_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_pd(ibc_hca_hdl_t, ibc_pd_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Reliable Datagram Domains */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_rdd(ibc_hca_hdl_t, ibc_rdd_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_rdd_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_rdd(ibc_hca_hdl_t, ibc_rdd_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Address Handles */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_ah(ibc_hca_hdl_t, ibt_ah_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t, ibt_adds_vect_t *, ibc_ah_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_ah(ibc_hca_hdl_t, ibc_ah_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_ah(ibc_hca_hdl_t, ibc_ah_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t *, ibt_adds_vect_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_ah(ibc_hca_hdl_t, ibc_ah_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_adds_vect_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Queue Pairs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_qp(ibc_hca_hdl_t, ibtl_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_type_t, ibt_qp_alloc_attr_t *, ibt_chan_sizes_t *, ib_qpn_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_qp_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_special_qp(ibc_hca_hdl_t, uint8_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibtl_qp_hdl_t, ibt_sqp_type_t, ibt_qp_alloc_attr_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_chan_sizes_t *, ibc_qp_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_qp_range(ibc_hca_hdl_t, uint_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibtl_qp_hdl_t *, ibt_qp_type_t, ibt_qp_alloc_attr_t *, ibt_chan_sizes_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_cq_hdl_t *, ibc_cq_hdl_t *, ib_qpn_t *, ibc_qp_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_qp(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_free_qp_flags_t, ibc_qpn_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_release_qpn(ibc_hca_hdl_t, ibc_qpn_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_qp(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_query_attr_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_qp(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cep_modify_flags_t, ibt_qp_info_t *, ibt_queue_sizes_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Completion Queues */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_cq(ibc_hca_hdl_t, ibt_cq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cq_attr_t *, ibc_cq_hdl_t *, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_cq(ibc_hca_hdl_t, ibc_cq_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_cq(ibc_hca_hdl_t, ibc_cq_hdl_t, uint_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t *, uint_t *, ibt_cq_handler_id_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_resize_cq(ibc_hca_hdl_t, ibc_cq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_cq(ibc_hca_hdl_t, ibc_cq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t, uint_t, ibt_cq_handler_id_t);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstatic ibt_status_t tavor_ci_alloc_cq_sched(ibc_hca_hdl_t,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_cq_sched_attr_t *, ibc_sched_hdl_t *);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstatic ibt_status_t tavor_ci_free_cq_sched(ibc_hca_hdl_t, ibc_sched_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* EE Contexts */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_eec(ibc_hca_hdl_t, ibc_eec_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_eec_hdl_t, ibc_rdd_hdl_t, ibc_eec_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_eec(ibc_hca_hdl_t, ibc_eec_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_eec(ibc_hca_hdl_t, ibc_eec_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_eec_query_attr_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_eec(ibc_hca_hdl_t, ibc_eec_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cep_modify_flags_t, ibt_eec_info_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Memory Registration */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_register_mr(ibc_hca_hdl_t, ibc_pd_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_attr_t *, void *, ibc_mr_hdl_t *, ibt_mr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_register_buf(ibc_hca_hdl_t, ibc_pd_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_smr_attr_t *, struct buf *, void *, ibt_mr_hdl_t *, ibt_mr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_register_shared_mr(ibc_hca_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t, ibc_pd_hdl_t, ibt_smr_attr_t *, void *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t *, ibt_mr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_deregister_mr(ibc_hca_hdl_t, ibc_mr_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_mr(ibc_hca_hdl_t, ibc_mr_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_query_attr_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_reregister_mr(ibc_hca_hdl_t, ibc_mr_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t, ibt_mr_attr_t *, void *, ibc_mr_hdl_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_reregister_buf(ibc_hca_hdl_t, ibc_mr_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t, ibt_smr_attr_t *, struct buf *, void *, ibc_mr_hdl_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_sync_mr(ibc_hca_hdl_t, ibt_mr_sync_t *, size_t);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstatic ibt_status_t tavor_ci_register_dma_mr(ibc_hca_hdl_t, ibc_pd_hdl_t,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_dmr_attr_t *, void *, ibc_mr_hdl_t *, ibt_mr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Memory Windows */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_mw(ibc_hca_hdl_t, ibc_pd_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mw_flags_t, ibc_mw_hdl_t *, ibt_rkey_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_mw(ibc_hca_hdl_t, ibc_mw_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_mw(ibc_hca_hdl_t, ibc_mw_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mw_query_attr_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Multicast Groups */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_attach_mcg(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_gid_t, ib_lid_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_detach_mcg(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_gid_t, ib_lid_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Work Request and Completion Processing */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_post_send(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_send_wr_t *, uint_t, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_post_recv(ibc_hca_hdl_t, ibc_qp_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_recv_wr_t *, uint_t, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_poll_cq(ibc_hca_hdl_t, ibc_cq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_wc_t *, uint_t, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_notify_cq(ibc_hca_hdl_t, ibc_cq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cq_notify_flags_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* CI Object Private Data */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_ci_data_in(ibc_hca_hdl_t, ibt_ci_data_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_object_type_t, void *, void *, size_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* CI Object Private Data */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_ci_data_out(ibc_hca_hdl_t, ibt_ci_data_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_object_type_t, void *, void *, size_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Shared Receive Queues */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_srq(ibc_hca_hdl_t, ibt_srq_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srq_hdl_t, ibc_pd_hdl_t, ibt_srq_sizes_t *, ibc_srq_hdl_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srq_sizes_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_srq(ibc_hca_hdl_t, ibc_srq_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_query_srq(ibc_hca_hdl_t, ibc_srq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t *, ibt_srq_sizes_t *, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_modify_srq(ibc_hca_hdl_t, ibc_srq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srq_modify_flags_t, uint_t, uint_t, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_post_srq(ibc_hca_hdl_t, ibc_srq_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_recv_wr_t *, uint_t, uint_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Address translation */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_map_mem_area(ibc_hca_hdl_t, ibt_va_attr_t *,
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor void *, uint_t, ibt_reg_req_t *, ibc_ma_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_unmap_mem_area(ibc_hca_hdl_t, ibc_ma_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_map_mem_iov(ibc_hca_hdl_t, ibt_iov_attr_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_all_wr_t *, ibc_mi_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_unmap_mem_iov(ibc_hca_hdl_t, ibc_mi_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Allocate L_Key */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_lkey(ibc_hca_hdl_t, ibc_pd_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_lkey_flags_t, uint_t, ibc_mr_hdl_t *, ibt_pmr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Physical Register Memory Region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_register_physical_mr(ibc_hca_hdl_t, ibc_pd_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_pmr_attr_t *, void *, ibc_mr_hdl_t *, ibt_pmr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_reregister_physical_mr(ibc_hca_hdl_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t, ibc_pd_hdl_t, ibt_pmr_attr_t *, void *, ibc_mr_hdl_t *,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_pmr_desc_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Mellanox FMR */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_create_fmr_pool(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_fmr_pool_attr_t *fmr_params, ibc_fmr_pool_hdl_t *fmr_pool);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_destroy_fmr_pool(ibc_hca_hdl_t hca,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_fmr_pool_hdl_t fmr_pool);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_flush_fmr_pool(ibc_hca_hdl_t hca,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_fmr_pool_hdl_t fmr_pool);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_register_physical_fmr(ibc_hca_hdl_t hca,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *ibtl_reserved, ibc_mr_hdl_t *mr_hdl_p, ibt_pmr_desc_t *mem_desc_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_deregister_fmr(ibc_hca_hdl_t hca,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_alloc_io_mem(ibc_hca_hdl_t, size_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_flags_t, caddr_t *, ibc_mem_alloc_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t tavor_ci_free_io_mem(ibc_hca_hdl_t, ibc_mem_alloc_hdl_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic int tavor_mem_alloc(tavor_state_t *, size_t, ibt_mr_flags_t,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor caddr_t *, tavor_mem_alloc_hdl_t *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstatic ibt_status_t tavor_ci_not_supported();
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This ibc_operations_t structure includes pointers to all the entry points
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * provided by the Tavor driver. This structure is passed to the IBTF at
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * driver attach time, using the ibc_attach() call.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloribc_operations_t tavor_ibc_ops = {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* HCA and port related operations */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_hca_ports,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_ports,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_system_image,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Protection Domains */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Reliable Datagram Domains */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_rdd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_rdd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Address Handles */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_ah,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_ah,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_ah,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_ah,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Queue Pairs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_special_qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_qp_range,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_release_qpn,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Completion Queues */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_resize_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_cq_sched,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_cq_sched,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* query_cq_handler_id */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* EE Contexts */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_eec,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_eec,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_eec,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_eec,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Memory Registration */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_register_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_register_buf,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_register_shared_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_deregister_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_reregister_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_reregister_buf,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_sync_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Memory Windows */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_mw,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_mw,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_mw,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Multicast Groups */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_attach_mcg,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_detach_mcg,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Work Request and Completion Processing */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_post_send,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_post_recv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_poll_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_notify_cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* CI Object Mapping Data */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_ci_data_in,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_ci_data_out,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Shared Receive Queue */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_free_srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_query_srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_modify_srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_post_srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Address translation */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_map_mem_area,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_unmap_mem_area,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_map_mem_iov,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_unmap_mem_iov,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate L_key */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_lkey,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Physical Register Memory Region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_register_physical_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_reregister_physical_mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Mellanox FMR */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_create_fmr_pool,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_destroy_fmr_pool,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_flush_fmr_pool,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_register_physical_fmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_deregister_fmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* dmable memory */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ci_alloc_io_mem,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_free_io_mem,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* XRC not yet supported */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_alloc_xrc_domain */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_free_xrc_domain */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_alloc_xrc_srq */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_free_xrc_srq */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_query_xrc_srq */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_modify_xrc_srq */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_alloc_xrc_tgt_qp */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_free_xrc_tgt_qp */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_query_xrc_tgt_qp */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_modify_xrc_tgt_qp */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Memory Region (physical) */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_register_dma_mr,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Next enhancements */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_enhancement1 */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_enhancement2 */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_enhancement3 */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_ci_not_supported, /* ibc_enhancement4 */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor/*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Not yet implemented OPS
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor/* ARGSUSED */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstatic ibt_status_t
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylortavor_ci_not_supported()
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor{
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_NOT_SUPPORTED);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor}
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_hca_ports()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns HCA port attributes for either one or all of the HCA's ports.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_hca_ports(ibc_hca_hdl_t hca, uint8_t query_port,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_hca_portinfo_t *info_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t start, end, port;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status, indx;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_hca_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_hca_ports_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_port);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If the specified port is zero, then we are supposed to query all
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ports. Otherwise, we query only the port number specified.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Setup the start and end port numbers as appropriate for the loop
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * below. Note: The first Tavor port is port number one (1).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (query_port == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor start = 1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor end = start + (state->ts_cfg_profile->cp_num_ports - 1);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor end = start = query_port;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Query the port(s) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor for (port = start, indx = 0; port <= end; port++, indx++) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_port_query(state, port, &info_p[indx]);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_port_query_fail, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_hca_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_hca_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_modify_ports()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify HCA port attributes
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_ports(ibc_hca_hdl_t hca, uint8_t port,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_port_modify_flags_t flags, uint8_t init_type)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_modify_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_ports_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Modify the port(s) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_port_modify(state, port, flags, init_type);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_modify_ports_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ports);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_modify_system_image()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify the System Image GUID
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_system_image(ibc_hca_hdl_t hca, ib_guid_t sys_guid)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_modify_system_image);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support modification of the System
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Image GUID. Tavor is only capable of modifying this parameter
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * once (during driver initialization).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_system_image);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_pd()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Protection Domain
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_pd(ibc_hca_hdl_t hca, ibt_pd_flags_t flags, ibc_pd_hdl_t *pd_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(pd_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_pd_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the PD */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_pd_alloc(state, &pdhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_pd_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *pd_p = (ibc_pd_hdl_t)pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_pd()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a Protection Domain
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_pd(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_pd_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_pd_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Free the PD */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_pd_free(state, &pdhdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_free_pd_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_pd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_rdd()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Reliable Datagram Domain
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_rdd(ibc_hca_hdl_t hca, ibc_rdd_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_rdd_hdl_t *rdd_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_rdd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support Reliable Datagram (RD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operations. Tavor does not support RD.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_rdd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_free_rdd()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a Reliable Datagram Domain
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_rdd(ibc_hca_hdl_t hca, ibc_rdd_hdl_t rdd)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_rdd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support Reliable Datagram (RD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operations. Tavor does not support RD.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_rdd);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_ah()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate an Address Handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_ah(ibc_hca_hdl_t hca, ibt_ah_flags_t flags, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_adds_vect_t *attr_p, ibc_ah_hdl_t *ah_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ahhdl_t ahhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_ah_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_ah_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the AH */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_ah_alloc(state, pdhdl, attr_p, &ahhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_ah_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor AH handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ah_p = (ibc_ah_hdl_t)ahhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_ah()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free an Address Handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_ah(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ahhdl_t ahhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_ah_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid address handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ah == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_ah_invahhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_AH_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and AH handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ahhdl = (tavor_ahhdl_t)ah;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Free the AH */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_ah_free(state, &ahhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_free_ah_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_ah()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return the Address Vector information for a specified Address Handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_ah(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah, ibc_pd_hdl_t *pd_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_adds_vect_t *attr_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ahhdl_t ahhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_ah_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid address handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ah == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_ah_invahhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_AH_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and AH handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ahhdl = (tavor_ahhdl_t)ah;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Query the AH */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_ah_query(state, ahhdl, &pdhdl, attr_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_query_ah_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *pd_p = (ibc_pd_hdl_t)pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_modify_ah()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify the Address Vector information of a specified Address Handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_ah(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah, ibt_adds_vect_t *attr_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ahhdl_t ahhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_modify_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_ah_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid address handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ah == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_ah_invahhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_AH_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and AH handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ahhdl = (tavor_ahhdl_t)ah;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Modify the AH */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_ah_modify(state, ahhdl, attr_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_modify_ah_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_ah);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_qp()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Queue Pair
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_qp(ibc_hca_hdl_t hca, ibtl_qp_hdl_t ibt_qphdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_type_t type, ibt_qp_alloc_attr_t *attr_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_chan_sizes_t *queue_sizes_p, ib_qpn_t *qpn, ibc_qp_hdl_t *qp_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qp_info_t qpinfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qp_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*attr_p))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*queue_sizes_p))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_qp_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the QP */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_attrp = attr_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_type = type;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_ibt_qphdl = ibt_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_queueszp = queue_sizes_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_qpn = qpn;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.qpo_wq_loc = state->ts_cfg_profile->cp_qp_wq_inddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_qp_alloc(state, &qpinfo, TAVOR_NOSLEEP, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_qp_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *qp_p = (ibc_qp_hdl_t)qpinfo.qpi_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_special_qp()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Special Queue Pair
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_special_qp(ibc_hca_hdl_t hca, uint8_t port,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibtl_qp_hdl_t ibt_qphdl, ibt_sqp_type_t type,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_qp_hdl_t *qp_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qp_info_t qpinfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qp_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_special_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*attr_p))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*queue_sizes_p))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_special_qp_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_special_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the Special QP */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_attrp = attr_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_type = type;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_port = port;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_ibt_qphdl = ibt_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qpinfo.qpi_queueszp = queue_sizes_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.qpo_wq_loc = state->ts_cfg_profile->cp_qp_wq_inddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_special_qp_alloc(state, &qpinfo, TAVOR_NOSLEEP, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_special_qp_fail, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_special_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *qp_p = (ibc_qp_hdl_t)qpinfo.qpi_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_special_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_qp_range(ibc_hca_hdl_t hca, uint_t log2,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibtl_qp_hdl_t *ibtl_qp_p, ibt_qp_type_t type,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_cq_hdl_t *send_cq_p, ibc_cq_hdl_t *recv_cq_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_qpn_t *qpn_p, ibc_qp_hdl_t *qp_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_qp()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a Queue Pair
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_qp(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_free_qp_flags_t free_qp_flags, ibc_qpn_hdl_t *qpnh_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_qp_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_qp_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Free the QP */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_qp_free(state, &qphdl, free_qp_flags, qpnh_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_free_qp_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_release_qpn()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Release a Queue Pair Number (QPN)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_release_qpn(ibc_hca_hdl_t hca, ibc_qpn_hdl_t qpnh)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qpn_entry_t *entry;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_release_qpn);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_release_qpn_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_release_qpn);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qpnh == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_release_qpn_invqpnhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_release_qpn);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor entry = (tavor_qpn_entry_t *)qpnh;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Release the QP number */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qp_release_qpn(state, entry, TAVOR_QPN_RELEASE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_release_qpn);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_qp()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Query a Queue Pair
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_qp(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_qp_query_attr_t *attr_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_qp_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_qp_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Query the QP */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_qp_query(state, qphdl, attr_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_query_qp_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_modify_qp()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify a Queue Pair
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_qp(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cep_modify_flags_t flags, ibt_qp_info_t *info_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_queue_sizes_t *actual_sz)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_modify_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_qp_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_qp_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Modify the QP */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_qp_modify(state, qphdl, flags, info_p, actual_sz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_modify_qp_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_qp);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_cq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Completion Queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_cq(ibc_hca_hdl_t hca, ibt_cq_hdl_t ibt_cqhdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cq_attr_t *attr_p, ibc_cq_hdl_t *cq_p, uint_t *actual_size)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_cq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the CQ */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_cq_alloc(state, ibt_cqhdl, attr_p, actual_size,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &cqhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_cq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor CQ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *cq_p = (ibc_cq_hdl_t)cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_cq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a Completion Queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_cq(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_cq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid CQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (cq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_cq_invcqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_CQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and CQ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cqhdl = (tavor_cqhdl_t)cq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Free the CQ */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_cq_free(state, &cqhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_free_cq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_cq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return the size of a Completion Queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_cq(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, uint_t *entries_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t *count_p, uint_t *usec_p, ibt_cq_handler_id_t *hid_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_cq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid CQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (cq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_cq_invcqhdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_CQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the CQ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cqhdl = (tavor_cqhdl_t)cq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Query the current CQ size */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *entries_p = cqhdl->cq_bufsz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* interrupt moderation is not supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *count_p = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *usec_p = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *hid_p = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_resize_cq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Change the size of a Completion Queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_resize_cq(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, uint_t size,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t *actual_size)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_resize_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_resize_cq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_resize_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid CQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (cq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_resize_cq_invcqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_resize_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_CQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and CQ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cqhdl = (tavor_cqhdl_t)cq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Resize the CQ */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_cq_resize(state, cqhdl, size, actual_size,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_resize_cq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_resize_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_resize_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CQ interrupt moderation is not supported in tavor.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_cq(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t count, uint_t usec, ibt_cq_handler_id_t hid)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_cq_sched()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Reserve a CQ scheduling class resource
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylortavor_ci_alloc_cq_sched(ibc_hca_hdl_t hca, ibt_cq_sched_attr_t *attr,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibc_sched_hdl_t *sched_hdl_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor *sched_hdl_p = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * does not support CQ scheduling classes.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_cq_sched()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a CQ scheduling class resource
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylortavor_ci_free_cq_sched(ibc_hca_hdl_t hca, ibc_sched_hdl_t sched_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. Tavor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * does not support CQ scheduling classes.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_eec()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate an End-to-End context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_eec(ibc_hca_hdl_t hca, ibc_eec_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_eec_hdl_t ibt_eec, ibc_rdd_hdl_t rdd, ibc_eec_hdl_t *eec_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support Reliable Datagram (RD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operations. Tavor does not support RD.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_eec()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free an End-to-End context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_eec(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support Reliable Datagram (RD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operations. Tavor does not support RD.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_eec()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Query an End-to-End context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_eec(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_eec_query_attr_t *attr_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support Reliable Datagram (RD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operations. Tavor does not support RD.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_modify_eec()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify an End-to-End context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_eec(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cep_modify_flags_t flags, ibt_eec_info_t *info_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is an unsupported interface for the Tavor driver. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface is necessary to support Reliable Datagram (RD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operations. Tavor does not support RD.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_eec);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_register_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Prepare a virtually addressed Memory Region for use by an HCA
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_register_mr(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_attr_t *mr_attr, void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_desc_t *mr_desc)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mr_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr_desc))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_attr != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_desc != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_mr_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_mr_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Validate the access flags. Both Remote Write and Remote Atomic
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * require the Local Write flag to be set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (((mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC)) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !(mr_attr->mr_flags & IBT_MR_ENABLE_LOCAL_WRITE)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_mr_inv_accflags_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_ACCESS_REQ_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Register the memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_type = state->ts_cfg_profile->cp_iommu_bypass;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_dmahdl = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_override_addr = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_register(state, pdhdl, mr_attr, &mrhdl, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_register_mr_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mrhdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Fill in the mr_desc structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_vaddr = mrhdl->mr_bindinfo.bi_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_lkey = mrhdl->mr_lkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Only set RKey if remote access was requested */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_READ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_rkey = mrhdl->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If region is mapped for streaming (i.e. noncoherent), then set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * sync is required
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_sync_required = (mrhdl->mr_bindinfo.bi_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IBT_MR_NONCOHERENT) ? B_TRUE : B_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor MR handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mr_p = (ibc_mr_hdl_t)mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_register_buf()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Prepare a Memory Region specified by buf structure for use by an HCA
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_register_buf(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_smr_attr_t *attrp, struct buf *buf, void *ibtl_reserved,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_hdl_t *mr_p, ibt_mr_desc_t *mr_desc)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mr_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_flags_t flags = attrp->mr_flags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_register_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr_desc))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_desc != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_buf_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_buf_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Validate the access flags. Both Remote Write and Remote Atomic
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * require the Local Write flag to be set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (((flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (flags & IBT_MR_ENABLE_REMOTE_ATOMIC)) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !(flags & IBT_MR_ENABLE_LOCAL_WRITE)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_buf_accflags_inv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_ACCESS_REQ_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Register the memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_type = state->ts_cfg_profile->cp_iommu_bypass;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_dmahdl = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_override_addr = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_register_buf(state, pdhdl, attrp, buf, &mrhdl, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_register_mr_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mrhdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Fill in the mr_desc structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_vaddr = mrhdl->mr_bindinfo.bi_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_lkey = mrhdl->mr_lkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Only set RKey if remote access was requested */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((flags & IBT_MR_ENABLE_REMOTE_ATOMIC) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (flags & IBT_MR_ENABLE_REMOTE_READ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_rkey = mrhdl->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If region is mapped for streaming (i.e. noncoherent), then set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * sync is required
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_sync_required = (mrhdl->mr_bindinfo.bi_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IBT_MR_NONCOHERENT) ? B_TRUE : B_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor MR handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mr_p = (ibc_mr_hdl_t)mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_deregister_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Deregister a Memory Region from an HCA translation table
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_deregister_mr(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_deregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_deregister_mr_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_deregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid memory region handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mr == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_deregister_mr_invmrhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_deregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mrhdl = (tavor_mrhdl_t)mr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Deregister the memory region.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_deregister(state, &mrhdl, TAVOR_MR_DEREG_ALL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_deregister_mr_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_deregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_deregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Retrieve information about a specified Memory Region
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_mr(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_query_attr_t *mr_attr)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_attr != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_mr_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for MemRegion handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mr == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_mr_invmrhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and MR handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mrhdl = (tavor_mrhdl_t)mr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Query the memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_query(state, mrhdl, mr_attr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_query_mr_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_register_shared_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Create a shared memory region matching an existing Memory Region
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_register_shared_mr(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t pd, ibt_smr_attr_t *mr_attr, void *ibtl_reserved,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mr_desc)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl, mrhdl_new;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_register_shared_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr_desc))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_attr != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_desc != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_shared_mr_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_shared_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_shared_mr_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_shared_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid memory region handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mr == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_shared_mr_invmrhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_shared_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Validate the access flags. Both Remote Write and Remote Atomic
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * require the Local Write flag to be set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (((mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC)) &&
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !(mr_attr->mr_flags & IBT_MR_ENABLE_LOCAL_WRITE)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_register_shared_mr_accflags_inv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_shared_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_ACCESS_REQ_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and handles */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mrhdl = (tavor_mrhdl_t)mr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Register the shared memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_register_shared(state, mrhdl, pdhdl, mr_attr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &mrhdl_new);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_register_shared_mr_fail, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_shared_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mrhdl_new))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Fill in the mr_desc structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_vaddr = mrhdl_new->mr_bindinfo.bi_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_lkey = mrhdl_new->mr_lkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Only set RKey if remote access was requested */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_READ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_rkey = mrhdl_new->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If shared region is mapped for streaming (i.e. noncoherent), then
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * set sync is required
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_sync_required = (mrhdl_new->mr_bindinfo.bi_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IBT_MR_NONCOHERENT) ? B_TRUE : B_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor MR handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mr_p = (ibc_mr_hdl_t)mrhdl_new;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_reregister_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify the attributes of an existing Memory Region
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_reregister_mr(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_attr_t *mr_attr, void *ibtl_reserved, ibc_mr_hdl_t *mr_new,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_desc_t *mr_desc)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mr_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl, mrhdl_new;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_reregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr_desc))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_attr != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_new != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_desc != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_reregister_mr_hca_inv, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid memory region handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mr == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_reregister_mr_invmrhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer, mrhdl, and pdhdl */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mrhdl = (tavor_mrhdl_t)mr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Reregister the memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_type = state->ts_cfg_profile->cp_iommu_bypass;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_reregister(state, mrhdl, pdhdl, mr_attr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &mrhdl_new, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_reregister_mr_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mrhdl_new))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Fill in the mr_desc structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_vaddr = mrhdl_new->mr_bindinfo.bi_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_lkey = mrhdl_new->mr_lkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Only set RKey if remote access was requested */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mr_attr->mr_flags & IBT_MR_ENABLE_REMOTE_READ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_rkey = mrhdl_new->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If region is mapped for streaming (i.e. noncoherent), then set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * sync is required
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_sync_required = (mrhdl_new->mr_bindinfo.bi_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IBT_MR_NONCOHERENT) ? B_TRUE : B_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor MR handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mr_new = (ibc_mr_hdl_t)mrhdl_new;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_reregister_buf()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify the attributes of an existing Memory Region
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_reregister_buf(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_smr_attr_t *attrp, struct buf *buf, void *ibtl_reserved,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t *mr_new, ibt_mr_desc_t *mr_desc)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mr_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mrhdl_t mrhdl, mrhdl_new;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_flags_t flags = attrp->mr_flags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_reregister_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr_desc))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_new != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_desc != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_reregister_buf_hca_inv, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid memory region handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mr == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_reregister_buf_invmrhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MR_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer, mrhdl, and pdhdl */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mrhdl = (tavor_mrhdl_t)mr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Reregister the memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.mro_bind_type = state->ts_cfg_profile->cp_iommu_bypass;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_reregister_buf(state, mrhdl, pdhdl, attrp, buf,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &mrhdl_new, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_reregister_buf_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mrhdl_new))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Fill in the mr_desc structure */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_vaddr = mrhdl_new->mr_bindinfo.bi_addr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_lkey = mrhdl_new->mr_lkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Only set RKey if remote access was requested */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((flags & IBT_MR_ENABLE_REMOTE_ATOMIC) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (flags & IBT_MR_ENABLE_REMOTE_READ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_rkey = mrhdl_new->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If region is mapped for streaming (i.e. noncoherent), then set
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * sync is required
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mr_desc->md_sync_required = (mrhdl_new->mr_bindinfo.bi_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IBT_MR_NONCOHERENT) ? B_TRUE : B_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the Tavor MR handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mr_new = (ibc_mr_hdl_t)mrhdl_new;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_buf);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_sync_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Synchronize access to a Memory Region
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_sync_mr(ibc_hca_hdl_t hca, ibt_mr_sync_t *mr_segs, size_t num_segs)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_sync_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mr_segs != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_sync_mr_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_sync_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Sync the memory region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mr_sync(state, mr_segs, num_segs);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_sync_mr_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_sync_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_sync_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_mw()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Memory Window
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_mw(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd, ibt_mw_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mw_hdl_t *mw_p, ibt_rkey_t *rkey_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mwhdl_t mwhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mw_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(rkey_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_mw_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_mw_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and PD handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the memory window */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mw_alloc(state, pdhdl, flags, &mwhdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_mw_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mwhdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Return the MW handle and RKey */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mw_p = (ibc_mw_hdl_t)mwhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *rkey_p = mwhdl->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_mw()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a Memory Window
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_mw(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mwhdl_t mwhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_mw_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid MW handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mw == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_mw_invmwhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MW_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and MW handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mwhdl = (tavor_mwhdl_t)mw;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Free the memory window */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mw_free(state, &mwhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_free_mw_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_mw()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return the attributes of the specified Memory Window
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_mw(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mw_query_attr_t *mw_attr_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mwhdl_t mwhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(mw_attr_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_mw_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid MemWin handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mw == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_mw_inc_mwhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MW_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Query the memory window pointer and fill in the return values */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mwhdl = (tavor_mwhdl_t)mw;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_enter(&mwhdl->mr_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mw_attr_p->mw_pd = (ibc_pd_hdl_t)mwhdl->mr_pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mw_attr_p->mw_rkey = mwhdl->mr_rkey;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_exit(&mwhdl->mr_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_mw);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor/* ARGSUSED */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstatic ibt_status_t
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylortavor_ci_register_dma_mr(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_dmr_attr_t *mr_attr, void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_mr_desc_t *mr_desc)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor{
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_state_t *state;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_pdhdl_t pdhdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_mrhdl_t mrhdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int status;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mr_desc))
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ASSERT(mr_attr != NULL);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ASSERT(mr_p != NULL);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ASSERT(mr_desc != NULL);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Check for valid HCA handle */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (hca == NULL) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_HCA_HDL_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Check for valid PD handle pointer */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (pd == NULL) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_PD_HDL_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Validate the access flags. Both Remote Write and Remote Atomic
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * require the Local Write flag to be set
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (((mr_attr->dmr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (mr_attr->dmr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC)) &&
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor !(mr_attr->dmr_flags & IBT_MR_ENABLE_LOCAL_WRITE)) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_MR_ACCESS_REQ_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Grab the Tavor softstate pointer and PD handle */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor state = (tavor_state_t *)hca;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = tavor_dma_mr_register(state, pdhdl, mr_attr, &mrhdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (status != DDI_SUCCESS) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (status);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*mrhdl))
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Fill in the mr_desc structure */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mr_desc->md_vaddr = mr_attr->dmr_paddr;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mr_desc->md_lkey = mrhdl->mr_lkey;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Only set RKey if remote access was requested */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if ((mr_attr->dmr_flags & IBT_MR_ENABLE_REMOTE_ATOMIC) ||
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (mr_attr->dmr_flags & IBT_MR_ENABLE_REMOTE_WRITE) ||
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (mr_attr->dmr_flags & IBT_MR_ENABLE_REMOTE_READ)) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mr_desc->md_rkey = mrhdl->mr_rkey;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * If region is mapped for streaming (i.e. noncoherent), then set
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * sync is required
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mr_desc->md_sync_required = B_FALSE;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Return the Hermon MR handle */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor *mr_p = (ibc_mr_hdl_t)mrhdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_SUCCESS);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor}
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_attach_mcg()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Attach a Queue Pair to a Multicast Group
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_attach_mcg(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, ib_gid_t gid,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_lid_t lid)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_attach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_attach_mcg_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_attach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_attach_mcg_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_attach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handles */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Attach the QP to the multicast group */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mcg_attach(state, qphdl, gid, lid);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_attach_mcg_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_attach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_attach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_detach_mcg()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Detach a Queue Pair to a Multicast Group
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_detach_mcg(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, ib_gid_t gid,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ib_lid_t lid)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_attach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_detach_mcg_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_detach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_detach_mcg_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_detach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Detach the QP from the multicast group */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mcg_detach(state, qphdl, gid, lid);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_detach_mcg_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_detach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_detach_mcg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_post_send()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Post send work requests to the send queue on the specified QP
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_post_send(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, ibt_send_wr_t *wr_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t num_wr, uint_t *num_posted_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_post_send);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(wr_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(num_wr != 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_send_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_send);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_send_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_send);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Post the send WQEs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_post_send(state, qphdl, wr_p, num_wr, num_posted_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_post_send_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_send);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_send);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_post_recv()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Post receive work requests to the receive queue on the specified QP
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_post_recv(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, ibt_recv_wr_t *wr_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t num_wr, uint_t *num_posted_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_post_recv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(wr_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(num_wr != 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_recv_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_recv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid QP handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (qp == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_recv_invqphdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_recv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_QP_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and QP handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor qphdl = (tavor_qphdl_t)qp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Post the receive WQEs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_post_recv(state, qphdl, wr_p, num_wr, num_posted_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_post_recv_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_recv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_recv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_poll_cq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Poll for a work request completion
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_poll_cq(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, ibt_wc_t *wc_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t num_wc, uint_t *num_polled)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t polled;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_poll_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ASSERT(wc_p != NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_poll_cq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_poll_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid CQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (cq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_poll_cq_invcqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_poll_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_CQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid num_wc field */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (num_wc == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_poll_cq_num_wc_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_poll_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_INVALID_PARAM);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and CQ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cqhdl = (tavor_cqhdl_t)cq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Poll for work request completions */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_cq_poll(state, cqhdl, wc_p, num_wc, &polled);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* First fill in "num_polled" argument (only when valid) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (num_polled) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *num_polled = polled;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Check the status code;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If empty, we return empty.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If error, we print out an error and then return
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If success (something was polled), we return success
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != IBT_CQ_EMPTY) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_poll_cq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_poll_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_poll_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_notify_cq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Enable notification events on the specified CQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_notify_cq(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq_hdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_cq_notify_flags_t flags)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_notify_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_notify_cq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_notify_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid CQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (cq_hdl == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_notify_cq_invcqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_notify_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_CQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and CQ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cqhdl = (tavor_cqhdl_t)cq_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Enable the CQ notification */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_cq_notify(state, cqhdl, flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_notify_cq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_notify_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_notify_cq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_ci_data_in()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Exchange CI-specific data.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_ci_data_in(ibc_hca_hdl_t hca, ibt_ci_data_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_object_type_t object, void *ibc_object_handle, void *data_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t data_sz)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_ci_data_in);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_ci_data_in_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_ci_data_in);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Get the Tavor userland mapping information */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_umap_ci_data_in(state, flags, object,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_object_handle, data_p, data_sz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_ci_data_in_umap_fail, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_ci_data_in);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_ci_data_in);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_ci_data_out()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Exchange CI-specific data.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_ci_data_out(ibc_hca_hdl_t hca, ibt_ci_data_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_object_type_t object, void *ibc_object_handle, void *data_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t data_sz)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_ci_data_out);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_ci_data_out_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_ci_data_out);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Get the Tavor userland mapping information */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_umap_ci_data_out(state, flags, object,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_object_handle, data_p, data_sz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_ci_data_out_umap_fail, TAVOR_TNF_ERROR,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "", tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_ci_data_out);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_ci_data_out);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_srq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate a Shared Receive Queue (SRQ)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_srq(ibc_hca_hdl_t hca, ibt_srq_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srq_hdl_t ibt_srq, ibc_pd_hdl_t pd, ibt_srq_sizes_t *sizes,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_srq_hdl_t *ibc_srq_p, ibt_srq_sizes_t *ret_sizes_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srq_info_t srqinfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srq_options_t op;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_srq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_alloc_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check if SRQ is even supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (state->ts_cfg_profile->cp_srq_enable == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_srq_not_supported_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid PD handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pd == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_srq_invpdhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_PD_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pdhdl = (tavor_pdhdl_t)pd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqinfo.srqi_ibt_srqhdl = ibt_srq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqinfo.srqi_pd = pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqinfo.srqi_sizes = sizes;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqinfo.srqi_real_sizes = ret_sizes_p;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqinfo.srqi_srqhdl = &srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqinfo.srqi_flags = flags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor op.srqo_wq_loc = state->ts_cfg_profile->cp_srq_wq_inddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_srq_alloc(state, &srqinfo, TAVOR_NOSLEEP, &op);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ibc_srq_p = (ibc_srq_hdl_t)srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_srq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free a Shared Receive Queue (SRQ)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called only from user or kernel context
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_srq(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_srq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check if SRQ is even supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (state->ts_cfg_profile->cp_srq_enable == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_srq_not_supported_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid SRQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_srq_invsrqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SRQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqhdl = (tavor_srqhdl_t)srq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Free the SRQ */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_srq_free(state, &srqhdl, TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_free_srq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_query_srq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Query properties of a Shared Receive Queue (SRQ)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_query_srq(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq, ibc_pd_hdl_t *pd_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srq_sizes_t *sizes_p, uint_t *limit_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_query_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_srq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check if SRQ is even supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (state->ts_cfg_profile->cp_srq_enable == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_srq_not_supported_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid SRQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_srq_invsrqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SRQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqhdl = (tavor_srqhdl_t)srq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_enter(&srqhdl->srq_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srqhdl->srq_state == TAVOR_SRQ_STATE_ERROR) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_exit(&srqhdl->srq_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_query_srq_error_state,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SRQ_ERROR_STATE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *pd_p = (ibc_pd_hdl_t)srqhdl->srq_pdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizes_p->srq_wr_sz = srqhdl->srq_real_sizes.srq_wr_sz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sizes_p->srq_sgl_sz = srqhdl->srq_real_sizes.srq_sgl_sz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_exit(&srqhdl->srq_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *limit_p = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_query_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_modify_srq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Modify properties of a Shared Receive Queue (SRQ)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_modify_srq(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_srq_modify_flags_t flags, uint_t size, uint_t limit, uint_t *ret_size_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t resize_supported, cur_srq_size;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_srq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check if SRQ is even supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (state->ts_cfg_profile->cp_srq_enable == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_srq_not_supported_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid SRQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_srq_invcqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SRQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqhdl = (tavor_srqhdl_t)srq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Check Error State of SRQ.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Also, while we are holding the lock we save away the current SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * size for later use.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_enter(&srqhdl->srq_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_srq_size = srqhdl->srq_wq_bufsz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srqhdl->srq_state == TAVOR_SRQ_STATE_ERROR) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_exit(&srqhdl->srq_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_srq_error_state,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SRQ_ERROR_STATE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mutex_exit(&srqhdl->srq_lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Setting the limit watermark is not currently supported. This is a
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor hardware (firmware) limitation. We return NOT_SUPPORTED here,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and have the limit code commented out for now.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * XXX If we enable the limit watermark support, we need to do checks
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and set the 'srq->srq_wr_limit' here, instead of returning not
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * supported. The 'tavor_srq_modify' operation below is for resizing
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the SRQ only, the limit work should be done here. If this is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * changed to use the 'limit' field, the 'ARGSUSED' comment for this
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * function should also be removed at that time.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (flags & IBT_SRQ_SET_LIMIT) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_srq_limit_not_supported,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Check the SET_SIZE flag. If not set, we simply return success here.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * However if it is set, we check if resize is supported and only then
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * do we continue on with our resize processing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!(flags & IBT_SRQ_SET_SIZE)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor resize_supported = state->ts_ibtfinfo.hca_attr->hca_flags &
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IBT_HCA_RESIZE_SRQ;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((flags & IBT_SRQ_SET_SIZE) && !resize_supported) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_modify_srq_resize_not_supp_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * We do not support resizing an SRQ to be smaller than it's current
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * size. If a smaller (or equal) size is requested, then we simply
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * return success, and do nothing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (size <= cur_srq_size) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ret_size_p = cur_srq_size;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_srq_modify(state, srqhdl, size, ret_size_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_NOSLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Set return value to current SRQ size */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *ret_size_p = cur_srq_size;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_modify_srq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_modify_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_post_srq()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Post a Work Request to the specified Shared Receive Queue (SRQ)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_post_srq(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_recv_wr_t *wr, uint_t num_wr, uint_t *num_posted_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_post_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_srq_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check if SRQ is even supported */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (state->ts_cfg_profile->cp_srq_enable == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_srq_not_supported_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid SRQ handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_post_srq_invsrqhdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SRQ_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srqhdl = (tavor_srqhdl_t)srq;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_post_srq(state, srqhdl, wr, num_wr, num_posted_p);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_post_srq_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_post_srq);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Address translation */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_map_mem_area()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_map_mem_area(ibc_hca_hdl_t hca, ibt_va_attr_t *va_attrs,
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor void *ibtl_reserved, uint_t list_len, ibt_reg_req_t *reg_req,
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor ibc_ma_hdl_t *ibc_ma_hdl_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_unmap_mem_area()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Unmap the memory area
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_unmap_mem_area(ibc_hca_hdl_t hca, ibc_ma_hdl_t ma_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorstruct ibc_mi_s {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int imh_len;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_handle_t imh_dmahandle[1];
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor};
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor_NOTE(SCHEME_PROTECTS_DATA("safe sharing",
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibc_mi_s::imh_len
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibc_mi_s::imh_dmahandle))
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor/*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * tavor_ci_map_mem_iov()
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Map the memory
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Context: Can be called from interrupt or base context.
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylortavor_ci_map_mem_iov(ibc_hca_hdl_t hca, ibt_iov_attr_t *iov_attr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_all_wr_t *wr, ibc_mi_hdl_t *mi_hdl_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int status;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int i, j, nds, max_nds;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor uint_t len;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_status_t ibt_status;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_handle_t dmahdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_cookie_t dmacookie;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_attr_t dma_attr;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor uint_t cookie_cnt;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibc_mi_hdl_t mi_hdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_lkey_t rsvd_lkey;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_wr_ds_t *sgl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_state_t *state;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int kmflag;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int (*callback)(caddr_t);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*wr))
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (mi_hdl_p == NULL)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_MI_HDL_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Check for valid HCA handle */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (hca == NULL)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_HCA_HDL_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Tavor does not allow the default "use reserved lkey" */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if ((iov_attr->iov_flags & IBT_IOV_ALT_LKEY) == 0)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_INVALID_PARAM);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor rsvd_lkey = iov_attr->iov_alt_lkey;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor state = (tavor_state_t *)hca;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor tavor_dma_attr_init(&dma_attr);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor#ifdef __sparc
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (state->ts_cfg_profile->cp_iommu_bypass == TAVOR_BINDMEM_BYPASS)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor dma_attr.dma_attr_flags = DDI_DMA_FORCE_PHYSICAL;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor#endif
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor nds = 0;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor max_nds = iov_attr->iov_wr_nds;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (iov_attr->iov_lso_hdr_sz)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor max_nds -= (iov_attr->iov_lso_hdr_sz + sizeof (uint32_t) +
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor 0xf) >> 4; /* 0xf is for rounding up to a multiple of 16 */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if ((iov_attr->iov_flags & IBT_IOV_NOSLEEP) == 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor kmflag = KM_SLEEP;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor callback = DDI_DMA_SLEEP;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor } else {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor kmflag = KM_NOSLEEP;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor callback = DDI_DMA_DONTWAIT;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (iov_attr->iov_flags & IBT_IOV_BUF) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mi_hdl = kmem_alloc(sizeof (*mi_hdl), kmflag);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (mi_hdl == NULL)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_INSUFF_RESOURCE);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl = wr->send.wr_sgl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*sgl))
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = ddi_dma_alloc_handle(state->ts_dip, &dma_attr,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor callback, NULL, &dmahdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (status != DDI_SUCCESS) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor kmem_free(mi_hdl, sizeof (*mi_hdl));
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_INSUFF_RESOURCE);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = ddi_dma_buf_bind_handle(dmahdl, iov_attr->iov_buf,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor DDI_DMA_RDWR | DDI_DMA_CONSISTENT, callback, NULL,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor &dmacookie, &cookie_cnt);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (status != DDI_DMA_MAPPED) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_free_handle(&dmahdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor kmem_free(mi_hdl, sizeof (*mi_hdl));
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (ibc_get_ci_failure(0));
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor while (cookie_cnt-- > 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (nds > max_nds) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = ddi_dma_unbind_handle(dmahdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_free_handle(&dmahdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_SGL_TOO_SMALL);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl[nds].ds_va = dmacookie.dmac_laddress;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl[nds].ds_key = rsvd_lkey;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl[nds].ds_len = (ib_msglen_t)dmacookie.dmac_size;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor nds++;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (cookie_cnt != 0)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_nextcookie(dmahdl, &dmacookie);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor wr->send.wr_nds = nds;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mi_hdl->imh_len = 1;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mi_hdl->imh_dmahandle[0] = dmahdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor *mi_hdl_p = mi_hdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_SUCCESS);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (iov_attr->iov_flags & IBT_IOV_RECV)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl = wr->recv.wr_sgl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor else
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl = wr->send.wr_sgl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*sgl))
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor len = iov_attr->iov_list_len;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor for (i = 0, j = 0; j < len; j++) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (iov_attr->iov[j].iov_len == 0)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor continue;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor i++;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mi_hdl = kmem_alloc(sizeof (*mi_hdl) +
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (i - 1) * sizeof (ddi_dma_handle_t), kmflag);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (mi_hdl == NULL)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_INSUFF_RESOURCE);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mi_hdl->imh_len = i;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor for (i = 0, j = 0; j < len; j++) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (iov_attr->iov[j].iov_len == 0)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor continue;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = ddi_dma_alloc_handle(state->ts_dip, &dma_attr,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor callback, NULL, &dmahdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (status != DDI_SUCCESS) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_status = IBT_INSUFF_RESOURCE;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor goto fail2;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = ddi_dma_addr_bind_handle(dmahdl, iov_attr->iov_as,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor iov_attr->iov[j].iov_addr, iov_attr->iov[j].iov_len,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor DDI_DMA_RDWR | DDI_DMA_CONSISTENT, callback, NULL,
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor &dmacookie, &cookie_cnt);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (status != DDI_DMA_MAPPED) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_status = ibc_get_ci_failure(0);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor goto fail1;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (nds + cookie_cnt > max_nds) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ibt_status = IBT_SGL_TOO_SMALL;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor goto fail2;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor while (cookie_cnt-- > 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl[nds].ds_va = dmacookie.dmac_laddress;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl[nds].ds_key = rsvd_lkey;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor sgl[nds].ds_len = (ib_msglen_t)dmacookie.dmac_size;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor nds++;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (cookie_cnt != 0)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_nextcookie(dmahdl, &dmacookie);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor mi_hdl->imh_dmahandle[i] = dmahdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor i++;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (iov_attr->iov_flags & IBT_IOV_RECV)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor wr->recv.wr_nds = nds;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor else
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor wr->send.wr_nds = nds;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor *mi_hdl_p = mi_hdl;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_SUCCESS);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorfail1:
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_free_handle(&dmahdl);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylorfail2:
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor while (--i >= 0) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor status = ddi_dma_unbind_handle(mi_hdl->imh_dmahandle[i]);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_free_handle(&mi_hdl->imh_dmahandle[i]);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor kmem_free(mi_hdl, sizeof (*mi_hdl) +
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (len - 1) * sizeof (ddi_dma_handle_t));
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor *mi_hdl_p = NULL;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (ibt_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor/*
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * tavor_ci_unmap_mem_iov()
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Unmap the memory
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor * Context: Can be called from interrupt or base context.
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_unmap_mem_iov(ibc_hca_hdl_t hca, ibc_mi_hdl_t mi_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor int i;
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor /* Check for valid HCA handle */
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (hca == NULL)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_HCA_HDL_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor if (mi_hdl == NULL)
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_MI_HDL_INVALID);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor for (i = 0; i < mi_hdl->imh_len; i++) {
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (void) ddi_dma_unbind_handle(mi_hdl->imh_dmahandle[i]);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor ddi_dma_free_handle(&mi_hdl->imh_dmahandle[i]);
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor }
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor kmem_free(mi_hdl, sizeof (*mi_hdl) +
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor (mi_hdl->imh_len - 1) * sizeof (ddi_dma_handle_t));
17a2b317610f531d565bf4e940433aab2d9e6985Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Allocate L_Key */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_lkey()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_lkey(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_lkey_flags_t flags, uint_t phys_buf_list_sz, ibc_mr_hdl_t *mr_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_pmr_desc_t *mem_desc_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_lkey);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_lkey);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Physical Register Memory Region */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_register_physical_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_register_physical_mr(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_pmr_attr_t *mem_pattrs, void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_pmr_desc_t *mem_desc_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_register_physical_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_register_physical_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_reregister_physical_mr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_reregister_physical_mr(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattrs, void *ibtl_reserved,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mr_desc_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_reregister_physical_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_reregister_physical_mr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Mellanox FMR Support */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_create_fmr_pool()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Creates a pool of memory regions suitable for FMR registration
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from base context only
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_create_fmr_pool(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_fmr_pool_attr_t *params, ibc_fmr_pool_hdl_t *fmr_pool_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_destroy_fmr_pool()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Free all resources associated with an FMR pool.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from base context only.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_destroy_fmr_pool(ibc_hca_hdl_t hca, ibc_fmr_pool_hdl_t fmr_pool)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_flush_fmr_pool()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Force a flush of the memory tables, cleaning up used FMR resources.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_flush_fmr_pool(ibc_hca_hdl_t hca, ibc_fmr_pool_hdl_t fmr_pool)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_register_physical_fmr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * From the 'pool' of FMR regions passed in, performs register physical
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * operation.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from interrupt or base context.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_register_physical_fmr(ibc_hca_hdl_t hca,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_deregister_fmr()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Moves an FMR (specified by 'mr') to the deregistered state.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Context: Can be called from base context only.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic ibt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_deregister_fmr(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
c7facc54c4abed9e554ff80225311e6b7048d3c9Bill Taylor return (IBT_NOT_SUPPORTED);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_alloc_io_mem()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Allocate dmable memory
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloribt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_alloc_io_mem(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_hca_hdl_t hca,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t size,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_flags_t mr_flag,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor caddr_t *kaddrp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_mem_alloc_hdl_t *mem_alloc_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_alloc_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_io_mem_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid mem_alloc_hdl handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mem_alloc_hdl == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_alloc_io_mem_hdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MEM_ALLOC_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Grab the Tavor softstate pointer and mem handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state = (tavor_state_t *)hca;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate the AH */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = tavor_mem_alloc(state, size, mr_flag, kaddrp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (tavor_mem_alloc_hdl_t *)mem_alloc_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_1(tavor_ci_alloc_ah_fail, TAVOR_TNF_ERROR, "",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tnf_uint, status, status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_alloc_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_ci_free_io_mem()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * free the memory
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloribt_status_t
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_ci_free_io_mem(ibc_hca_hdl_t hca, ibc_mem_alloc_hdl_t mem_alloc_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mem_alloc_hdl_t memhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_ci_free_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid HCA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (hca == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_io_mem_invhca_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_HCA_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Check for valid mem_alloc_hdl handle pointer */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (mem_alloc_hdl == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_ci_free_io_mem_hdl_fail,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_ci_free_io_mem);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_MEM_ALLOC_HDL_INVALID);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor memhdl = (tavor_mem_alloc_hdl_t)mem_alloc_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* free the memory */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*memhdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_mem_free(&memhdl->tavor_acc_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_free_handle(&memhdl->tavor_dma_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmem_free(memhdl, sizeof (*memhdl));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_dma_free);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (IBT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_mem_alloc(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *state,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t size,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_mr_flags_t flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor caddr_t *kaddrp,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mem_alloc_hdl_t *mem_hdl)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_handle_t dma_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_attr_t dma_attr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t acc_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t real_len;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int (*ddi_cb)(caddr_t);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_ENTER(tavor_mem_alloc);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_dma_attr_init(&dma_attr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_cb = (flags & IBT_MR_NOSLEEP) ? DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate a DMA handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = ddi_dma_alloc_handle(state->ts_dip, &dma_attr, ddi_cb,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor NULL, &dma_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_dma_alloc_handle_fail, TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_mem_alloc);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DDI_FAILURE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate DMA memory */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = ddi_dma_mem_alloc(dma_hdl, size,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &state->ts_reg_accattr, DDI_DMA_CONSISTENT, ddi_cb,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor NULL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kaddrp, &real_len, &acc_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != DDI_SUCCESS) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_free_handle(&dma_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_dma_alloc_memory_fail, TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_mem_alloc);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DDI_FAILURE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Package the tavor_dma_info contents and return */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *mem_hdl = kmem_alloc(sizeof (**mem_hdl),
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor flags & IBT_MR_NOSLEEP ? KM_NOSLEEP : KM_SLEEP);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (*mem_hdl == NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_mem_free(&acc_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_free_handle(&dma_hdl);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0(tavor_dma_alloc_memory_fail, TAVOR_TNF_ERROR, "");
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_mem_alloc);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DDI_FAILURE);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(**mem_hdl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (*mem_hdl)->tavor_dma_hdl = dma_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (*mem_hdl)->tavor_acc_hdl = acc_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_TNF_EXIT(tavor_mem_alloc);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DDI_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}