17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
503494a98SBill Taylor * Common Development and Distribution License (the "License").
603494a98SBill Taylor * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
217c478bd9Sstevel@tonic-gate /*
22f7327bbdSBill Taylor * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
237c478bd9Sstevel@tonic-gate */
247c478bd9Sstevel@tonic-gate
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate #include <sys/ib/ibtl/impl/ibtl.h>
277c478bd9Sstevel@tonic-gate
287c478bd9Sstevel@tonic-gate /*
297c478bd9Sstevel@tonic-gate * ibtl_mem.c
307c478bd9Sstevel@tonic-gate * These routines implement all of the Memory Region verbs and the alloc/
317c478bd9Sstevel@tonic-gate * query/free Memory Window verbs at the TI interface.
327c478bd9Sstevel@tonic-gate */
337c478bd9Sstevel@tonic-gate
347c478bd9Sstevel@tonic-gate static char ibtl_mem[] = "ibtl_mem";
357c478bd9Sstevel@tonic-gate
367c478bd9Sstevel@tonic-gate /*
377c478bd9Sstevel@tonic-gate * Function:
387c478bd9Sstevel@tonic-gate * ibt_register_mr()
397c478bd9Sstevel@tonic-gate * Input:
407c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
417c478bd9Sstevel@tonic-gate * pd - Protection Domain Handle.
427c478bd9Sstevel@tonic-gate * mem_attr - Requested memory region attributes.
437c478bd9Sstevel@tonic-gate * Output:
447c478bd9Sstevel@tonic-gate * mr_hdl_p - The returned IBT memory region handle.
457c478bd9Sstevel@tonic-gate * mem_desc - Returned memory descriptor.
467c478bd9Sstevel@tonic-gate * Returns:
477c478bd9Sstevel@tonic-gate * IBT_SUCCESS
487c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
497c478bd9Sstevel@tonic-gate * IBT_MR_VA_INVALID
507c478bd9Sstevel@tonic-gate * IBT_MR_LEN_INVALID
517c478bd9Sstevel@tonic-gate * IBT_MR_ACCESS_REQ_INVALID
527c478bd9Sstevel@tonic-gate * IBT_PD_HDL_INVALID
537c478bd9Sstevel@tonic-gate * IBT_INSUFF_RESOURCE
547c478bd9Sstevel@tonic-gate * Description:
557c478bd9Sstevel@tonic-gate * Prepares a virtually addressed memory region for use by a HCA. A
567c478bd9Sstevel@tonic-gate * description of the registered memory suitable for use in Work Requests
577c478bd9Sstevel@tonic-gate * (WRs) is returned in the ibt_mr_desc_t parameter.
587c478bd9Sstevel@tonic-gate */
597c478bd9Sstevel@tonic-gate ibt_status_t
ibt_register_mr(ibt_hca_hdl_t hca_hdl,ibt_pd_hdl_t pd,ibt_mr_attr_t * mem_attr,ibt_mr_hdl_t * mr_hdl_p,ibt_mr_desc_t * mem_desc)607c478bd9Sstevel@tonic-gate ibt_register_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, ibt_mr_attr_t *mem_attr,
617c478bd9Sstevel@tonic-gate ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
627c478bd9Sstevel@tonic-gate {
637c478bd9Sstevel@tonic-gate ib_vaddr_t vaddr;
647c478bd9Sstevel@tonic-gate ibt_status_t status;
657c478bd9Sstevel@tonic-gate
667c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_mr(%p, %p, %p)",
677c478bd9Sstevel@tonic-gate hca_hdl, pd, mem_attr);
687c478bd9Sstevel@tonic-gate
697c478bd9Sstevel@tonic-gate vaddr = mem_attr->mr_vaddr;
707c478bd9Sstevel@tonic-gate
717c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_mr(
727c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), pd, mem_attr, IBTL_HCA2CLNT(hca_hdl),
737c478bd9Sstevel@tonic-gate mr_hdl_p, mem_desc);
747c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS) {
757c478bd9Sstevel@tonic-gate mem_desc->md_vaddr = vaddr;
76f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_mr_cnt);
777c478bd9Sstevel@tonic-gate }
787c478bd9Sstevel@tonic-gate
797c478bd9Sstevel@tonic-gate return (status);
807c478bd9Sstevel@tonic-gate }
817c478bd9Sstevel@tonic-gate
827c478bd9Sstevel@tonic-gate
837c478bd9Sstevel@tonic-gate /*
847c478bd9Sstevel@tonic-gate * Function:
857c478bd9Sstevel@tonic-gate * ibt_register_buf()
867c478bd9Sstevel@tonic-gate * Input:
877c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle.
887c478bd9Sstevel@tonic-gate * pd Protection Domain Handle.
897c478bd9Sstevel@tonic-gate * mem_bpattr Memory Registration attributes (IOVA and flags).
907c478bd9Sstevel@tonic-gate * bp A pointer to a buf(9S) struct.
917c478bd9Sstevel@tonic-gate * Output:
927c478bd9Sstevel@tonic-gate * mr_hdl_p The returned IBT memory region handle.
937c478bd9Sstevel@tonic-gate * mem_desc Returned memory descriptor.
947c478bd9Sstevel@tonic-gate * Returns:
957c478bd9Sstevel@tonic-gate * IBT_SUCCESS
967c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
977c478bd9Sstevel@tonic-gate * IBT_MR_VA_INVALID
987c478bd9Sstevel@tonic-gate * IBT_MR_LEN_INVALID
997c478bd9Sstevel@tonic-gate * IBT_MR_ACCESS_REQ_INVALID
1007c478bd9Sstevel@tonic-gate * IBT_PD_HDL_INVALID
1017c478bd9Sstevel@tonic-gate * IBT_INSUFF_RESOURCE
1027c478bd9Sstevel@tonic-gate * Description:
1037c478bd9Sstevel@tonic-gate * Prepares a memory region described by a buf(9S) struct for use by a HCA.
1047c478bd9Sstevel@tonic-gate * A description of the registered memory suitable for use in
1057c478bd9Sstevel@tonic-gate * Work Requests (WRs) is returned in the ibt_mr_desc_t parameter.
1067c478bd9Sstevel@tonic-gate */
1077c478bd9Sstevel@tonic-gate ibt_status_t
ibt_register_buf(ibt_hca_hdl_t hca_hdl,ibt_pd_hdl_t pd,ibt_smr_attr_t * mem_bpattr,struct buf * bp,ibt_mr_hdl_t * mr_hdl_p,ibt_mr_desc_t * mem_desc)1087c478bd9Sstevel@tonic-gate ibt_register_buf(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1097c478bd9Sstevel@tonic-gate ibt_smr_attr_t *mem_bpattr, struct buf *bp, ibt_mr_hdl_t *mr_hdl_p,
1107c478bd9Sstevel@tonic-gate ibt_mr_desc_t *mem_desc)
1117c478bd9Sstevel@tonic-gate {
1127c478bd9Sstevel@tonic-gate ibt_status_t status;
1137c478bd9Sstevel@tonic-gate
1147c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_buf(%p, %p, %p, %p)",
1157c478bd9Sstevel@tonic-gate hca_hdl, pd, mem_bpattr, bp);
1167c478bd9Sstevel@tonic-gate
1177c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_buf(
1187c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), pd, mem_bpattr, bp, IBTL_HCA2CLNT(hca_hdl),
1197c478bd9Sstevel@tonic-gate mr_hdl_p, mem_desc);
1207c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS) {
121f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_mr_cnt);
1227c478bd9Sstevel@tonic-gate }
1237c478bd9Sstevel@tonic-gate
1247c478bd9Sstevel@tonic-gate return (status);
1257c478bd9Sstevel@tonic-gate }
1267c478bd9Sstevel@tonic-gate
1277c478bd9Sstevel@tonic-gate
1287c478bd9Sstevel@tonic-gate /*
1297c478bd9Sstevel@tonic-gate * Function:
1307c478bd9Sstevel@tonic-gate * ibt_query_mr()
1317c478bd9Sstevel@tonic-gate * Input:
1327c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
1337c478bd9Sstevel@tonic-gate * mr_hdl - The IBT Memory Region handle.
1347c478bd9Sstevel@tonic-gate * Output:
1357c478bd9Sstevel@tonic-gate * attr - The pointer to Memory region attributes structure.
1367c478bd9Sstevel@tonic-gate * Returns:
1377c478bd9Sstevel@tonic-gate * IBT_SUCCESS
1387c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
1397c478bd9Sstevel@tonic-gate * IBT_MR_HDL_INVALID
1407c478bd9Sstevel@tonic-gate * Description:
1417c478bd9Sstevel@tonic-gate * Retrieves information about a specified memory region.
1427c478bd9Sstevel@tonic-gate */
1437c478bd9Sstevel@tonic-gate ibt_status_t
ibt_query_mr(ibt_hca_hdl_t hca_hdl,ibt_mr_hdl_t mr_hdl,ibt_mr_query_attr_t * attr)1447c478bd9Sstevel@tonic-gate ibt_query_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1457c478bd9Sstevel@tonic-gate ibt_mr_query_attr_t *attr)
1467c478bd9Sstevel@tonic-gate {
1477c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_query_mr(%p, %p)", hca_hdl, mr_hdl);
1487c478bd9Sstevel@tonic-gate
1497c478bd9Sstevel@tonic-gate return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_query_mr(
1507c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_hdl, attr));
1517c478bd9Sstevel@tonic-gate }
1527c478bd9Sstevel@tonic-gate
1537c478bd9Sstevel@tonic-gate
1547c478bd9Sstevel@tonic-gate /*
1557c478bd9Sstevel@tonic-gate * Function:
1567c478bd9Sstevel@tonic-gate * ibt_deregister_mr()
1577c478bd9Sstevel@tonic-gate * Input:
1587c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
1597c478bd9Sstevel@tonic-gate * mr_hdl - The IBT Memory Region handle.
1607c478bd9Sstevel@tonic-gate * Output:
1617c478bd9Sstevel@tonic-gate * none.
1627c478bd9Sstevel@tonic-gate * Returns:
1637c478bd9Sstevel@tonic-gate * IBT_SUCCESS
1647c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
1657c478bd9Sstevel@tonic-gate * IBT_MR_HDL_INVALID
1667c478bd9Sstevel@tonic-gate * IBT_MR_IN_USE
1677c478bd9Sstevel@tonic-gate * Description:
1687c478bd9Sstevel@tonic-gate * De-register the registered memory region. Remove a memory region from a
1697c478bd9Sstevel@tonic-gate * HCA translation table, and free all resources associated with the
1707c478bd9Sstevel@tonic-gate * memory region.
1717c478bd9Sstevel@tonic-gate */
1727c478bd9Sstevel@tonic-gate ibt_status_t
ibt_deregister_mr(ibt_hca_hdl_t hca_hdl,ibt_mr_hdl_t mr_hdl)1737c478bd9Sstevel@tonic-gate ibt_deregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl)
1747c478bd9Sstevel@tonic-gate {
1757c478bd9Sstevel@tonic-gate ibt_status_t status;
1767c478bd9Sstevel@tonic-gate
1777c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_deregister_mr(%p, %p)", hca_hdl, mr_hdl);
1787c478bd9Sstevel@tonic-gate
1797c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_deregister_mr(
1807c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_hdl);
1817c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS) {
182f7327bbdSBill Taylor atomic_dec_32(&hca_hdl->ha_mr_cnt);
1837c478bd9Sstevel@tonic-gate }
1847c478bd9Sstevel@tonic-gate return (status);
1857c478bd9Sstevel@tonic-gate }
1867c478bd9Sstevel@tonic-gate
1877c478bd9Sstevel@tonic-gate
1887c478bd9Sstevel@tonic-gate /*
1897c478bd9Sstevel@tonic-gate * Function:
1907c478bd9Sstevel@tonic-gate * ibt_reregister_mr()
1917c478bd9Sstevel@tonic-gate * Input:
1927c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
1937c478bd9Sstevel@tonic-gate * mr_hdl - The IBT Memory Region handle.
1947c478bd9Sstevel@tonic-gate * pd - Optional Protection Domain Handle.
1957c478bd9Sstevel@tonic-gate * mem_attr - Requested memory region attributes.
1967c478bd9Sstevel@tonic-gate * Output:
1977c478bd9Sstevel@tonic-gate * mr_hdl_p - The reregistered IBT memory region handle.
1987c478bd9Sstevel@tonic-gate * mem_desc - Returned memory descriptor for the new memory region.
1997c478bd9Sstevel@tonic-gate * Returns:
2007c478bd9Sstevel@tonic-gate * IBT_SUCCESS
2017c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
2027c478bd9Sstevel@tonic-gate * IBT_MR_HDL_INVALID
2037c478bd9Sstevel@tonic-gate * IBT_MR_VA_INVALID
2047c478bd9Sstevel@tonic-gate * IBT_MR_LEN_INVALID
2057c478bd9Sstevel@tonic-gate * IBT_MR_ACCESS_REQ_INVALID
2067c478bd9Sstevel@tonic-gate * IBT_PD_HDL_INVALID
2077c478bd9Sstevel@tonic-gate * IBT_INSUFF_RESOURCE
2087c478bd9Sstevel@tonic-gate * IBT_MR_IN_USE
2097c478bd9Sstevel@tonic-gate * Description:
2107c478bd9Sstevel@tonic-gate * Modify the attributes of an existing memory region.
2117c478bd9Sstevel@tonic-gate */
2127c478bd9Sstevel@tonic-gate ibt_status_t
ibt_reregister_mr(ibt_hca_hdl_t hca_hdl,ibt_mr_hdl_t mr_hdl,ibt_pd_hdl_t pd,ibt_mr_attr_t * mem_attr,ibt_mr_hdl_t * mr_hdl_p,ibt_mr_desc_t * mem_desc)2137c478bd9Sstevel@tonic-gate ibt_reregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, ibt_pd_hdl_t pd,
2147c478bd9Sstevel@tonic-gate ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
2157c478bd9Sstevel@tonic-gate {
2167c478bd9Sstevel@tonic-gate ibt_status_t status;
2177c478bd9Sstevel@tonic-gate ib_vaddr_t vaddr = mem_attr->mr_vaddr;
2187c478bd9Sstevel@tonic-gate
2197c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_reregister_mr(%p, %p, %p, %p)",
2207c478bd9Sstevel@tonic-gate hca_hdl, mr_hdl, pd, mem_attr);
2217c478bd9Sstevel@tonic-gate
2227c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_reregister_mr(
2237c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_attr,
2247c478bd9Sstevel@tonic-gate IBTL_HCA2CLNT(hca_hdl), mr_hdl_p, mem_desc);
2257c478bd9Sstevel@tonic-gate
2267c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS)
2277c478bd9Sstevel@tonic-gate mem_desc->md_vaddr = vaddr;
2287c478bd9Sstevel@tonic-gate else if (!(status == IBT_MR_IN_USE || status == IBT_HCA_HDL_INVALID ||
2297c478bd9Sstevel@tonic-gate status == IBT_MR_HDL_INVALID)) {
2307c478bd9Sstevel@tonic-gate
2317c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L2(ibtl_mem, "ibt_reregister_mr: "
2327c478bd9Sstevel@tonic-gate "Re-registration Failed: %d", status);
2337c478bd9Sstevel@tonic-gate
2347c478bd9Sstevel@tonic-gate /* we lost one memory region resource */
235f7327bbdSBill Taylor atomic_dec_32(&hca_hdl->ha_mr_cnt);
2367c478bd9Sstevel@tonic-gate }
2377c478bd9Sstevel@tonic-gate
2387c478bd9Sstevel@tonic-gate return (status);
2397c478bd9Sstevel@tonic-gate }
2407c478bd9Sstevel@tonic-gate
2417c478bd9Sstevel@tonic-gate
2427c478bd9Sstevel@tonic-gate /*
2437c478bd9Sstevel@tonic-gate * Function:
2447c478bd9Sstevel@tonic-gate * ibt_reregister_buf()
2457c478bd9Sstevel@tonic-gate * Input:
2467c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle.
2477c478bd9Sstevel@tonic-gate * mr_hdl The IBT Memory Region handle.
2487c478bd9Sstevel@tonic-gate * pd Optional Protection Domain Handle.
2497c478bd9Sstevel@tonic-gate * mem_bpattr Memory Registration attributes (IOVA and flags).
2507c478bd9Sstevel@tonic-gate * bp A pointer to a buf(9S) struct.
2517c478bd9Sstevel@tonic-gate * Output:
2527c478bd9Sstevel@tonic-gate * mr_hdl_p The reregistered IBT memory region handle.
2537c478bd9Sstevel@tonic-gate * mem_desc Returned memory descriptor for the new memory region.
2547c478bd9Sstevel@tonic-gate * Returns:
2557c478bd9Sstevel@tonic-gate * IBT_SUCCESS
2567c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
2577c478bd9Sstevel@tonic-gate * IBT_MR_HDL_INVALID
2587c478bd9Sstevel@tonic-gate * IBT_MR_VA_INVALID
2597c478bd9Sstevel@tonic-gate * IBT_MR_LEN_INVALID
2607c478bd9Sstevel@tonic-gate * IBT_MR_ACCESS_REQ_INVALID
2617c478bd9Sstevel@tonic-gate * IBT_PD_HDL_INVALID
2627c478bd9Sstevel@tonic-gate * IBT_INSUFF_RESOURCE
2637c478bd9Sstevel@tonic-gate * IBT_MR_IN_USE
2647c478bd9Sstevel@tonic-gate * Description:
2657c478bd9Sstevel@tonic-gate * Modify the attributes of an existing memory region as described by a
2667c478bd9Sstevel@tonic-gate * buf(9S) struct for use by a HCA. A description of the registered
2677c478bd9Sstevel@tonic-gate * memory suitable for use in Work Requests (WRs) is returned in the
2687c478bd9Sstevel@tonic-gate * ibt_mr_desc_t parameter.
2697c478bd9Sstevel@tonic-gate */
2707c478bd9Sstevel@tonic-gate ibt_status_t
ibt_reregister_buf(ibt_hca_hdl_t hca_hdl,ibt_mr_hdl_t mr_hdl,ibt_pd_hdl_t pd,ibt_smr_attr_t * mem_bpattr,struct buf * bp,ibt_mr_hdl_t * mr_hdl_p,ibt_mr_desc_t * mem_desc)2717c478bd9Sstevel@tonic-gate ibt_reregister_buf(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
2727c478bd9Sstevel@tonic-gate ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_bpattr, struct buf *bp,
2737c478bd9Sstevel@tonic-gate ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
2747c478bd9Sstevel@tonic-gate {
2757c478bd9Sstevel@tonic-gate ibt_status_t status;
2767c478bd9Sstevel@tonic-gate
2777c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_reregister_buf(%p, %p, %p, %p, %p)",
2787c478bd9Sstevel@tonic-gate hca_hdl, mr_hdl, pd, mem_bpattr, bp);
2797c478bd9Sstevel@tonic-gate
2807c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_reregister_buf(
2817c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_bpattr, bp,
2827c478bd9Sstevel@tonic-gate IBTL_HCA2CLNT(hca_hdl), mr_hdl_p, mem_desc);
2837c478bd9Sstevel@tonic-gate
2847c478bd9Sstevel@tonic-gate if (!(status == IBT_SUCCESS || status == IBT_MR_IN_USE ||
2857c478bd9Sstevel@tonic-gate status == IBT_HCA_HDL_INVALID || status == IBT_MR_HDL_INVALID)) {
2867c478bd9Sstevel@tonic-gate
2877c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L2(ibtl_mem, "ibt_reregister_buf: "
2887c478bd9Sstevel@tonic-gate "Re-registration Mem Failed: %d", status);
2897c478bd9Sstevel@tonic-gate
2907c478bd9Sstevel@tonic-gate /* we lost one memory region resource */
291f7327bbdSBill Taylor atomic_dec_32(&hca_hdl->ha_mr_cnt);
2927c478bd9Sstevel@tonic-gate }
2937c478bd9Sstevel@tonic-gate return (status);
2947c478bd9Sstevel@tonic-gate }
2957c478bd9Sstevel@tonic-gate
2967c478bd9Sstevel@tonic-gate
2977c478bd9Sstevel@tonic-gate /*
2987c478bd9Sstevel@tonic-gate * Function:
2997c478bd9Sstevel@tonic-gate * ibt_register_shared_mr()
3007c478bd9Sstevel@tonic-gate * Input:
3017c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
3027c478bd9Sstevel@tonic-gate * mr_hdl - The IBT Memory Region handle.
3037c478bd9Sstevel@tonic-gate * pd - Protection Domain Handle.
3047c478bd9Sstevel@tonic-gate * mem_sattr - Requested memory region shared attributes.
3057c478bd9Sstevel@tonic-gate * Output:
3067c478bd9Sstevel@tonic-gate * mr_hdl_p - The reregistered IBT memory region handle.
3077c478bd9Sstevel@tonic-gate * mem_desc - Returned memory descriptor for the new memory region.
3087c478bd9Sstevel@tonic-gate * Returns:
3097c478bd9Sstevel@tonic-gate * IBT_SUCCESS
3107c478bd9Sstevel@tonic-gate * IBT_INSUFF_RESOURCE
3117c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
3127c478bd9Sstevel@tonic-gate * IBT_MR_HDL_INVALID
3137c478bd9Sstevel@tonic-gate * IBT_PD_HDL_INVALID
3147c478bd9Sstevel@tonic-gate * IBT_MR_ACCESS_REQ_INVALID
3157c478bd9Sstevel@tonic-gate * Description:
3167c478bd9Sstevel@tonic-gate * Given an existing memory region, a new memory region associated with
3177c478bd9Sstevel@tonic-gate * the same physical locations is created.
3187c478bd9Sstevel@tonic-gate */
3197c478bd9Sstevel@tonic-gate ibt_status_t
ibt_register_shared_mr(ibt_hca_hdl_t hca_hdl,ibt_mr_hdl_t mr_hdl,ibt_pd_hdl_t pd,ibt_smr_attr_t * mem_sattr,ibt_mr_hdl_t * mr_hdl_p,ibt_mr_desc_t * mem_desc)3207c478bd9Sstevel@tonic-gate ibt_register_shared_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
3217c478bd9Sstevel@tonic-gate ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_sattr, ibt_mr_hdl_t *mr_hdl_p,
3227c478bd9Sstevel@tonic-gate ibt_mr_desc_t *mem_desc)
3237c478bd9Sstevel@tonic-gate {
3247c478bd9Sstevel@tonic-gate ibt_status_t status;
3257c478bd9Sstevel@tonic-gate
3267c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_shared_mr(%p, %p, %p, %p)",
3277c478bd9Sstevel@tonic-gate hca_hdl, mr_hdl, pd, mem_sattr);
3287c478bd9Sstevel@tonic-gate
3297c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_shared_mr(
3307c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_sattr,
3317c478bd9Sstevel@tonic-gate IBTL_HCA2CLNT(hca_hdl), mr_hdl_p, mem_desc);
3327c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS) {
333f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_mr_cnt);
3347c478bd9Sstevel@tonic-gate }
3357c478bd9Sstevel@tonic-gate return (status);
3367c478bd9Sstevel@tonic-gate }
3377c478bd9Sstevel@tonic-gate
3387c478bd9Sstevel@tonic-gate /*
3397c478bd9Sstevel@tonic-gate * Function:
3407c478bd9Sstevel@tonic-gate * ibt_sync_mr()
3417c478bd9Sstevel@tonic-gate * Input:
3427c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
3437c478bd9Sstevel@tonic-gate * mr_segments - A pointer to an array of ibt_mr_sync_t that describes
3447c478bd9Sstevel@tonic-gate * the memory regions to sync.
3457c478bd9Sstevel@tonic-gate * num_segments - The length of the mr_segments array.
3467c478bd9Sstevel@tonic-gate * Output:
3477c478bd9Sstevel@tonic-gate * NONE
3487c478bd9Sstevel@tonic-gate * Returns:
3497c478bd9Sstevel@tonic-gate * IBT_SUCCESS
3507c478bd9Sstevel@tonic-gate * IBT_HCA_HDL_INVALID
3517c478bd9Sstevel@tonic-gate * IBT_MR_HDL_INVALID
3527c478bd9Sstevel@tonic-gate * IBT_INVALID_PARAM
3537c478bd9Sstevel@tonic-gate * IBT_MR_VA_INVALID
3547c478bd9Sstevel@tonic-gate * IBT_MR_LEN_INVALID
3557c478bd9Sstevel@tonic-gate * Description:
3567c478bd9Sstevel@tonic-gate * Make memory changes visible to incoming RDMA reads, or make the affects
3577c478bd9Sstevel@tonic-gate * of an incoming RDMA writes visible to the consumer.
3587c478bd9Sstevel@tonic-gate */
3597c478bd9Sstevel@tonic-gate ibt_status_t
ibt_sync_mr(ibt_hca_hdl_t hca_hdl,ibt_mr_sync_t * mr_segments,size_t num_segments)3607c478bd9Sstevel@tonic-gate ibt_sync_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_sync_t *mr_segments,
3617c478bd9Sstevel@tonic-gate size_t num_segments)
3627c478bd9Sstevel@tonic-gate
3637c478bd9Sstevel@tonic-gate {
3647c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_sync_mr(%p, %p, %d)", hca_hdl,
3657c478bd9Sstevel@tonic-gate mr_segments, num_segments);
3667c478bd9Sstevel@tonic-gate
3677c478bd9Sstevel@tonic-gate return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_sync_mr(
3687c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_segments, num_segments));
3697c478bd9Sstevel@tonic-gate }
3707c478bd9Sstevel@tonic-gate
3717c478bd9Sstevel@tonic-gate
3727c478bd9Sstevel@tonic-gate /*
3737c478bd9Sstevel@tonic-gate * Function:
3747c478bd9Sstevel@tonic-gate * ibt_alloc_mw()
3757c478bd9Sstevel@tonic-gate * Input:
3767c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
3777c478bd9Sstevel@tonic-gate * pd - Protection Domain Handle.
3787c478bd9Sstevel@tonic-gate * flags - Memory Window alloc flags.
3797c478bd9Sstevel@tonic-gate * Output:
3807c478bd9Sstevel@tonic-gate * mw_hdl_p - The returned IBT Memory Window handle.
3817c478bd9Sstevel@tonic-gate * rkey - The IBT R_Key handle.
3827c478bd9Sstevel@tonic-gate * Returns:
3837c478bd9Sstevel@tonic-gate * IBT_SUCCESS
3847c478bd9Sstevel@tonic-gate * IBT_INSUFF_RESOURCE
3857c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
3867c478bd9Sstevel@tonic-gate * IBT_PD_HDL_INVALID
3877c478bd9Sstevel@tonic-gate * Description:
3887c478bd9Sstevel@tonic-gate * Allocate a memory window from the HCA.
3897c478bd9Sstevel@tonic-gate */
3907c478bd9Sstevel@tonic-gate ibt_status_t
ibt_alloc_mw(ibt_hca_hdl_t hca_hdl,ibt_pd_hdl_t pd,ibt_mw_flags_t flags,ibt_mw_hdl_t * mw_hdl_p,ibt_rkey_t * rkey)3917c478bd9Sstevel@tonic-gate ibt_alloc_mw(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, ibt_mw_flags_t flags,
3927c478bd9Sstevel@tonic-gate ibt_mw_hdl_t *mw_hdl_p, ibt_rkey_t *rkey)
3937c478bd9Sstevel@tonic-gate {
3947c478bd9Sstevel@tonic-gate ibt_status_t status;
3957c478bd9Sstevel@tonic-gate
3967c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_alloc_mw(%p, %p, 0x%x)",
3977c478bd9Sstevel@tonic-gate hca_hdl, pd, flags);
3987c478bd9Sstevel@tonic-gate
3997c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_mw(
4007c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), pd, flags, mw_hdl_p, rkey);
4017c478bd9Sstevel@tonic-gate
4027c478bd9Sstevel@tonic-gate /*
4037c478bd9Sstevel@tonic-gate * XXX - We should be able to allocate state and have a IBTF Memory
4047c478bd9Sstevel@tonic-gate * Window Handle. Memory Windows are meant to be rebound on the fly
4057c478bd9Sstevel@tonic-gate * (using a post) to make them fast. It is expected that alloc memory
4067c478bd9Sstevel@tonic-gate * window will be done in a relatively static manner. But, we don't have
4077c478bd9Sstevel@tonic-gate * a good reason to have local MW state at this point, so we won't.
4087c478bd9Sstevel@tonic-gate */
4097c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS) {
410f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_mw_cnt);
4117c478bd9Sstevel@tonic-gate }
4127c478bd9Sstevel@tonic-gate return (status);
4137c478bd9Sstevel@tonic-gate }
4147c478bd9Sstevel@tonic-gate
4157c478bd9Sstevel@tonic-gate
4167c478bd9Sstevel@tonic-gate /*
4177c478bd9Sstevel@tonic-gate * Function:
4187c478bd9Sstevel@tonic-gate * ibt_query_mw()
4197c478bd9Sstevel@tonic-gate * Input:
4207c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle.
4217c478bd9Sstevel@tonic-gate * mw_hdl - The IBT Memory Window handle.
4227c478bd9Sstevel@tonic-gate * Output:
4237c478bd9Sstevel@tonic-gate * pd - Protection Domain Handle.
4247c478bd9Sstevel@tonic-gate * rkey - The IBT R_Key handle.
4257c478bd9Sstevel@tonic-gate * Returns:
4267c478bd9Sstevel@tonic-gate * IBT_SUCCESS
4277c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
4287c478bd9Sstevel@tonic-gate * IBT_MW_HDL_INVALID
4297c478bd9Sstevel@tonic-gate * Description:
4307c478bd9Sstevel@tonic-gate * Retrieves information about a specified memory region.
4317c478bd9Sstevel@tonic-gate */
4327c478bd9Sstevel@tonic-gate ibt_status_t
ibt_query_mw(ibt_hca_hdl_t hca_hdl,ibt_mw_hdl_t mw_hdl,ibt_mw_query_attr_t * mw_attr_p)4337c478bd9Sstevel@tonic-gate ibt_query_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl,
4347c478bd9Sstevel@tonic-gate ibt_mw_query_attr_t *mw_attr_p)
4357c478bd9Sstevel@tonic-gate {
4367c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_query_mw(%p, %p)", hca_hdl, mw_hdl);
4377c478bd9Sstevel@tonic-gate
4387c478bd9Sstevel@tonic-gate return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_query_mw(
4397c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mw_hdl, mw_attr_p));
4407c478bd9Sstevel@tonic-gate }
4417c478bd9Sstevel@tonic-gate
4427c478bd9Sstevel@tonic-gate
4437c478bd9Sstevel@tonic-gate /*
4447c478bd9Sstevel@tonic-gate * Function:
4457c478bd9Sstevel@tonic-gate * ibt_free_mw()
4467c478bd9Sstevel@tonic-gate * Input:
4477c478bd9Sstevel@tonic-gate * hca_hdl - HCA Handle
4487c478bd9Sstevel@tonic-gate * mw_hdl - The IBT Memory Window handle.
4497c478bd9Sstevel@tonic-gate * Output:
4507c478bd9Sstevel@tonic-gate * none.
4517c478bd9Sstevel@tonic-gate * Returns:
4527c478bd9Sstevel@tonic-gate * IBT_SUCCESS
4537c478bd9Sstevel@tonic-gate * IBT_CHAN_HDL_INVALID
4547c478bd9Sstevel@tonic-gate * IBT_MW_HDL_INVALID
4557c478bd9Sstevel@tonic-gate * Description:
4567c478bd9Sstevel@tonic-gate * De-allocate the Memory Window.
4577c478bd9Sstevel@tonic-gate */
4587c478bd9Sstevel@tonic-gate ibt_status_t
ibt_free_mw(ibt_hca_hdl_t hca_hdl,ibt_mw_hdl_t mw_hdl)4597c478bd9Sstevel@tonic-gate ibt_free_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl)
4607c478bd9Sstevel@tonic-gate {
4617c478bd9Sstevel@tonic-gate ibt_status_t status;
4627c478bd9Sstevel@tonic-gate
4637c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_free_mw(%p, %p)", hca_hdl, mw_hdl);
4647c478bd9Sstevel@tonic-gate
4657c478bd9Sstevel@tonic-gate status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_free_mw(
4667c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mw_hdl);
4677c478bd9Sstevel@tonic-gate
4687c478bd9Sstevel@tonic-gate if (status == IBT_SUCCESS) {
469f7327bbdSBill Taylor atomic_dec_32(&hca_hdl->ha_mw_cnt);
4707c478bd9Sstevel@tonic-gate }
4717c478bd9Sstevel@tonic-gate return (status);
4727c478bd9Sstevel@tonic-gate }
4737c478bd9Sstevel@tonic-gate
4747c478bd9Sstevel@tonic-gate
4757c478bd9Sstevel@tonic-gate /*
4767c478bd9Sstevel@tonic-gate * Function:
4777c478bd9Sstevel@tonic-gate * ibt_map_mem_area()
4787c478bd9Sstevel@tonic-gate * Input:
4797c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle
4807c478bd9Sstevel@tonic-gate * va_attrs A pointer to an ibt_va_attr_t that describes the
4817c478bd9Sstevel@tonic-gate * VA to be translated.
4827c478bd9Sstevel@tonic-gate * paddr_list_len The number of entries in the 'paddr_list_p' array.
4837c478bd9Sstevel@tonic-gate * Output:
4847c478bd9Sstevel@tonic-gate * paddr_list_p Array of ibt_phys_buf_t (allocated by the caller),
4857c478bd9Sstevel@tonic-gate * in which the physical buffers that map the virtual
4867c478bd9Sstevel@tonic-gate * buffer are returned.
4877c478bd9Sstevel@tonic-gate * num_paddr_p The actual number of ibt_phys_buf_t that were
4887c478bd9Sstevel@tonic-gate * returned in the 'paddr_list_p' array.
4897c478bd9Sstevel@tonic-gate * ma_hdl_p Memory Area Handle.
4907c478bd9Sstevel@tonic-gate * Returns:
4917c478bd9Sstevel@tonic-gate * IBT_SUCCESS
4927c478bd9Sstevel@tonic-gate * Description:
4937c478bd9Sstevel@tonic-gate * Translate a kernel virtual address range into HCA physical addresses.
4947c478bd9Sstevel@tonic-gate * A set of physical addresses, that can be used with "Reserved L_Key",
4957c478bd9Sstevel@tonic-gate * register physical, and "Fast Registration Work Request" operations
4967c478bd9Sstevel@tonic-gate * is returned.
4977c478bd9Sstevel@tonic-gate */
4987c478bd9Sstevel@tonic-gate ibt_status_t
ibt_map_mem_area(ibt_hca_hdl_t hca_hdl,ibt_va_attr_t * va_attrs,uint_t paddr_list_len,ibt_reg_req_t * reg_req,ibt_ma_hdl_t * ma_hdl_p)4997c478bd9Sstevel@tonic-gate ibt_map_mem_area(ibt_hca_hdl_t hca_hdl, ibt_va_attr_t *va_attrs,
500c7facc54SBill Taylor uint_t paddr_list_len, ibt_reg_req_t *reg_req, ibt_ma_hdl_t *ma_hdl_p)
5017c478bd9Sstevel@tonic-gate {
502c7facc54SBill Taylor ibt_status_t status;
50343ed929aSsrust
5047c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_map_mem_area(%p, %p, %d)",
5057c478bd9Sstevel@tonic-gate hca_hdl, va_attrs, paddr_list_len);
5067c478bd9Sstevel@tonic-gate
50743ed929aSsrust status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_map_mem_area(
5087c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), va_attrs,
5097c478bd9Sstevel@tonic-gate NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
510c7facc54SBill Taylor paddr_list_len, reg_req, ma_hdl_p);
511f7327bbdSBill Taylor /* Not doing reference counting, which adversely effects performance */
512f7327bbdSBill Taylor
51343ed929aSsrust return (status);
5147c478bd9Sstevel@tonic-gate }
5157c478bd9Sstevel@tonic-gate
5167c478bd9Sstevel@tonic-gate
5177c478bd9Sstevel@tonic-gate /*
5187c478bd9Sstevel@tonic-gate * Function:
5197c478bd9Sstevel@tonic-gate * ibt_unmap_mem_area()
5207c478bd9Sstevel@tonic-gate * Input:
5217c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle
5227c478bd9Sstevel@tonic-gate * ma_hdl Memory Area Handle.
5237c478bd9Sstevel@tonic-gate * Output:
5247c478bd9Sstevel@tonic-gate * None.
5257c478bd9Sstevel@tonic-gate * Returns:
5267c478bd9Sstevel@tonic-gate * IBT_SUCCESS
5277c478bd9Sstevel@tonic-gate * Description:
5287c478bd9Sstevel@tonic-gate * Un pin physical pages pinned during an ibt_map_mem_area() call.
5297c478bd9Sstevel@tonic-gate */
5307c478bd9Sstevel@tonic-gate ibt_status_t
ibt_unmap_mem_area(ibt_hca_hdl_t hca_hdl,ibt_ma_hdl_t ma_hdl)5317c478bd9Sstevel@tonic-gate ibt_unmap_mem_area(ibt_hca_hdl_t hca_hdl, ibt_ma_hdl_t ma_hdl)
5327c478bd9Sstevel@tonic-gate {
53343ed929aSsrust ibt_status_t status;
53443ed929aSsrust
5357c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_unmap_mem_area(%p, %p)",
5367c478bd9Sstevel@tonic-gate hca_hdl, ma_hdl);
5377c478bd9Sstevel@tonic-gate
53843ed929aSsrust status = (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_unmap_mem_area(
5397c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), ma_hdl));
540f7327bbdSBill Taylor /* Not doing reference counting, which adversely effects performance */
54143ed929aSsrust
54243ed929aSsrust return (status);
5437c478bd9Sstevel@tonic-gate }
5447c478bd9Sstevel@tonic-gate
54503494a98SBill Taylor /*
54603494a98SBill Taylor * Function:
54703494a98SBill Taylor * ibt_map_mem_iov()
54803494a98SBill Taylor * Input:
54903494a98SBill Taylor * hca_hdl HCA Handle
55003494a98SBill Taylor * iov_attr A pointer to an ibt_iov_attr_t that describes the
55103494a98SBill Taylor * virtual ranges to be translated.
55203494a98SBill Taylor * Output:
55303494a98SBill Taylor * wr A pointer to the work request where the output
55403494a98SBill Taylor * sgl (reserved_lkey, size, paddr) will be written.
55503494a98SBill Taylor * mi_hdl_p Memory IOV Handle.
55603494a98SBill Taylor * Returns:
55703494a98SBill Taylor * IBT_SUCCESS
55803494a98SBill Taylor * Description:
55903494a98SBill Taylor * Translate an array of virtual address ranges into HCA physical
56003494a98SBill Taylor * addresses, sizes, and reserved_lkey.
56103494a98SBill Taylor */
56203494a98SBill Taylor ibt_status_t
ibt_map_mem_iov(ibt_hca_hdl_t hca_hdl,ibt_iov_attr_t * iov_attr,ibt_all_wr_t * wr,ibt_mi_hdl_t * mi_hdl_p)56303494a98SBill Taylor ibt_map_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_iov_attr_t *iov_attr,
56403494a98SBill Taylor ibt_all_wr_t *wr, ibt_mi_hdl_t *mi_hdl_p)
56503494a98SBill Taylor {
56603494a98SBill Taylor ibt_status_t status;
56703494a98SBill Taylor
56803494a98SBill Taylor IBTF_DPRINTF_L3(ibtl_mem, "ibt_map_mem_iov(%p, %p, %p)",
56903494a98SBill Taylor hca_hdl, iov_attr, wr);
57003494a98SBill Taylor
57103494a98SBill Taylor status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_map_mem_iov(
57203494a98SBill Taylor IBTL_HCA2CIHCA(hca_hdl), iov_attr, wr, mi_hdl_p);
573f7327bbdSBill Taylor /* Not doing reference counting, which adversely effects performance */
57403494a98SBill Taylor
57503494a98SBill Taylor return (status);
57603494a98SBill Taylor }
57703494a98SBill Taylor
57803494a98SBill Taylor
57903494a98SBill Taylor /*
58003494a98SBill Taylor * Function:
58103494a98SBill Taylor * ibt_unmap_mem_iov()
58203494a98SBill Taylor * Input:
58303494a98SBill Taylor * hca_hdl HCA Handle
58403494a98SBill Taylor * mi_hdl Memory IOV Handle.
58503494a98SBill Taylor * Output:
58603494a98SBill Taylor * None.
58703494a98SBill Taylor * Returns:
58803494a98SBill Taylor * IBT_SUCCESS
58903494a98SBill Taylor * Description:
59003494a98SBill Taylor * Un pin physical pages pinned during an ibt_map_mem_iov() call.
59103494a98SBill Taylor */
59203494a98SBill Taylor ibt_status_t
ibt_unmap_mem_iov(ibt_hca_hdl_t hca_hdl,ibt_mi_hdl_t mi_hdl)59303494a98SBill Taylor ibt_unmap_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_mi_hdl_t mi_hdl)
59403494a98SBill Taylor {
59503494a98SBill Taylor ibt_status_t status;
59603494a98SBill Taylor
59703494a98SBill Taylor IBTF_DPRINTF_L3(ibtl_mem, "ibt_unmap_mem_iov(%p, %p)",
59803494a98SBill Taylor hca_hdl, mi_hdl);
59903494a98SBill Taylor
60003494a98SBill Taylor status = (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_unmap_mem_iov(
60103494a98SBill Taylor IBTL_HCA2CIHCA(hca_hdl), mi_hdl));
602f7327bbdSBill Taylor /* Not doing reference counting, which adversely effects performance */
60303494a98SBill Taylor
60403494a98SBill Taylor return (status);
60503494a98SBill Taylor }
60603494a98SBill Taylor
60703494a98SBill Taylor /*
60803494a98SBill Taylor * Function:
60903494a98SBill Taylor * ibt_alloc_io_mem()
61003494a98SBill Taylor * Input:
61103494a98SBill Taylor * hca_hdl HCA Handle
61203494a98SBill Taylor * size Number of bytes to allocate
61303494a98SBill Taylor * mr_flag Possible values: IBT_MR_SLEEP, IBT_MR_NONCOHERENT
61403494a98SBill Taylor * Output:
61503494a98SBill Taylor * kaddrp Contains pointer to the virtual address of the
61603494a98SBill Taylor * memory allocated by this call. (Set to NULL if
61703494a98SBill Taylor * memory allocation fails).
61803494a98SBill Taylor * mem_alloc_hdl Memory access handle returned by ibt_mem_alloc()
61903494a98SBill Taylor *
62003494a98SBill Taylor * Returns:
62103494a98SBill Taylor * IBT_SUCCESS
62203494a98SBill Taylor * IBT_INSUFF_RESOURCE
62303494a98SBill Taylor * IBT_HCA_HDL_INVALID
62403494a98SBill Taylor * IBT_MR_ACCESS_REQ_INVALID
62503494a98SBill Taylor * IBT_INVALID_PARAM
62603494a98SBill Taylor * Description:
62703494a98SBill Taylor * Wrapper for ddi_dma_mem_alloc()
62803494a98SBill Taylor */
62903494a98SBill Taylor ibt_status_t
ibt_alloc_io_mem(ibt_hca_hdl_t hca_hdl,size_t size,ibt_mr_flags_t mr_flag,caddr_t * kaddrp,ibt_mem_alloc_hdl_t * mem_alloc_hdl)63003494a98SBill Taylor ibt_alloc_io_mem(ibt_hca_hdl_t hca_hdl, size_t size, ibt_mr_flags_t mr_flag,
63103494a98SBill Taylor caddr_t *kaddrp, ibt_mem_alloc_hdl_t *mem_alloc_hdl)
63203494a98SBill Taylor {
63303494a98SBill Taylor return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_io_mem(
63403494a98SBill Taylor IBTL_HCA2CIHCA(hca_hdl), size, mr_flag, kaddrp,
63503494a98SBill Taylor (ibc_mem_alloc_hdl_t *)mem_alloc_hdl));
63603494a98SBill Taylor }
63703494a98SBill Taylor
63803494a98SBill Taylor /*
63903494a98SBill Taylor * Function:
64003494a98SBill Taylor * ibt_free_io_mem()
64103494a98SBill Taylor * Input:
64203494a98SBill Taylor * hca_hdl HCA Handle
64303494a98SBill Taylor * mem_alloc_hdl Memory access handle returned by ibt_mem_alloc()
64403494a98SBill Taylor * Output:
64503494a98SBill Taylor * None
64603494a98SBill Taylor *
64703494a98SBill Taylor * Returns:
64803494a98SBill Taylor * IBT_SUCCESS
64903494a98SBill Taylor * Description:
65003494a98SBill Taylor * Wrapper for ddi_dma_mem_free()
65103494a98SBill Taylor */
65203494a98SBill Taylor ibt_status_t
ibt_free_io_mem(ibt_hca_hdl_t hca_hdl,ibt_mem_alloc_hdl_t mem_alloc_hdl)65303494a98SBill Taylor ibt_free_io_mem(ibt_hca_hdl_t hca_hdl, ibt_mem_alloc_hdl_t mem_alloc_hdl)
65403494a98SBill Taylor {
65503494a98SBill Taylor return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_free_io_mem(
65603494a98SBill Taylor IBTL_HCA2CIHCA(hca_hdl), (ibc_mem_alloc_hdl_t)mem_alloc_hdl));
65703494a98SBill Taylor }
6587c478bd9Sstevel@tonic-gate
6597c478bd9Sstevel@tonic-gate /*
6607c478bd9Sstevel@tonic-gate * Function:
6617c478bd9Sstevel@tonic-gate * ibt_alloc_lkey()
6627c478bd9Sstevel@tonic-gate * Input:
6637c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle
6647c478bd9Sstevel@tonic-gate * pd A protection domain handle.
6657c478bd9Sstevel@tonic-gate * flags Access control.
6667c478bd9Sstevel@tonic-gate * phys_buf_list_sz Requested size of Physical Buffer List (PBL)
6677c478bd9Sstevel@tonic-gate * resources to be allocated.
6687c478bd9Sstevel@tonic-gate * Output:
6697c478bd9Sstevel@tonic-gate * mr_hdl_p The returned IBT memory region handle.
6707c478bd9Sstevel@tonic-gate * mem_desc_p Returned memory descriptor.
6717c478bd9Sstevel@tonic-gate * Returns:
6727c478bd9Sstevel@tonic-gate * IBT_SUCCESS
6737c478bd9Sstevel@tonic-gate * Description:
6747c478bd9Sstevel@tonic-gate * Allocates physical buffer list resources for use in memory
6757c478bd9Sstevel@tonic-gate * registrations.
6767c478bd9Sstevel@tonic-gate */
6777c478bd9Sstevel@tonic-gate ibt_status_t
ibt_alloc_lkey(ibt_hca_hdl_t hca_hdl,ibt_pd_hdl_t pd,ibt_lkey_flags_t flags,uint_t phys_buf_list_sz,ibt_mr_hdl_t * mr_hdl_p,ibt_pmr_desc_t * mem_desc_p)6787c478bd9Sstevel@tonic-gate ibt_alloc_lkey(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, ibt_lkey_flags_t flags,
6797c478bd9Sstevel@tonic-gate uint_t phys_buf_list_sz, ibt_mr_hdl_t *mr_hdl_p,
6807c478bd9Sstevel@tonic-gate ibt_pmr_desc_t *mem_desc_p)
6817c478bd9Sstevel@tonic-gate {
68243ed929aSsrust ibt_status_t status;
68343ed929aSsrust
6847c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_alloc_lkey(%p, %p, 0x%X, %d)",
6857c478bd9Sstevel@tonic-gate hca_hdl, pd, flags, phys_buf_list_sz);
6867c478bd9Sstevel@tonic-gate
68743ed929aSsrust status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_lkey(
6887c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), pd, flags, phys_buf_list_sz, mr_hdl_p,
68943ed929aSsrust mem_desc_p);
69043ed929aSsrust if (status == IBT_SUCCESS) {
691f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_mr_cnt);
69243ed929aSsrust }
69343ed929aSsrust
69443ed929aSsrust return (status);
6957c478bd9Sstevel@tonic-gate }
6967c478bd9Sstevel@tonic-gate
6977c478bd9Sstevel@tonic-gate
6987c478bd9Sstevel@tonic-gate /*
6997c478bd9Sstevel@tonic-gate * Function:
7007c478bd9Sstevel@tonic-gate * ibt_register_phys_mr()
7017c478bd9Sstevel@tonic-gate * Input:
7027c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle
7037c478bd9Sstevel@tonic-gate * pd A protection domain handle.
7047c478bd9Sstevel@tonic-gate * mem_pattr Requested memory region physical attributes.
7057c478bd9Sstevel@tonic-gate * Output:
7067c478bd9Sstevel@tonic-gate * mr_hdl_p The returned IBT memory region handle.
7077c478bd9Sstevel@tonic-gate * mem_desc_p Returned memory descriptor.
7087c478bd9Sstevel@tonic-gate * Returns:
7097c478bd9Sstevel@tonic-gate * IBT_SUCCESS
7107c478bd9Sstevel@tonic-gate * Description:
7117c478bd9Sstevel@tonic-gate * Prepares a physically addressed memory region for use by a HCA.
7127c478bd9Sstevel@tonic-gate */
7137c478bd9Sstevel@tonic-gate ibt_status_t
ibt_register_phys_mr(ibt_hca_hdl_t hca_hdl,ibt_pd_hdl_t pd,ibt_pmr_attr_t * mem_pattr,ibt_mr_hdl_t * mr_hdl_p,ibt_pmr_desc_t * mem_desc_p)7147c478bd9Sstevel@tonic-gate ibt_register_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
7157c478bd9Sstevel@tonic-gate ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
7167c478bd9Sstevel@tonic-gate ibt_pmr_desc_t *mem_desc_p)
7177c478bd9Sstevel@tonic-gate {
71843ed929aSsrust ibt_status_t status;
71943ed929aSsrust
7207c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_phys_mr(%p, %p, %p)",
7217c478bd9Sstevel@tonic-gate hca_hdl, pd, mem_pattr);
7227c478bd9Sstevel@tonic-gate
72343ed929aSsrust status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_physical_mr(
7247c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), pd, mem_pattr,
7257c478bd9Sstevel@tonic-gate NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
72643ed929aSsrust mr_hdl_p, mem_desc_p);
72743ed929aSsrust if (status == IBT_SUCCESS) {
728f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_mr_cnt);
72943ed929aSsrust }
73043ed929aSsrust
73143ed929aSsrust return (status);
7327c478bd9Sstevel@tonic-gate }
7337c478bd9Sstevel@tonic-gate
7347c478bd9Sstevel@tonic-gate
7357c478bd9Sstevel@tonic-gate /*
7367c478bd9Sstevel@tonic-gate * Function:
7377c478bd9Sstevel@tonic-gate * ibt_reregister_phys_mr()
7387c478bd9Sstevel@tonic-gate * Input:
7397c478bd9Sstevel@tonic-gate * hca_hdl HCA Handle
7407c478bd9Sstevel@tonic-gate * mr_hdl The IBT memory region handle.
7417c478bd9Sstevel@tonic-gate * pd A protection domain handle.
7427c478bd9Sstevel@tonic-gate * mem_pattr Requested memory region physical attributes.
7437c478bd9Sstevel@tonic-gate * Output:
7447c478bd9Sstevel@tonic-gate * mr_hdl_p The returned IBT memory region handle.
7457c478bd9Sstevel@tonic-gate * mem_desc_p Returned memory descriptor.
7467c478bd9Sstevel@tonic-gate * Returns:
7477c478bd9Sstevel@tonic-gate * IBT_SUCCESS
7487c478bd9Sstevel@tonic-gate * Description:
7497c478bd9Sstevel@tonic-gate * Prepares a physically addressed memory region for use by a HCA.
7507c478bd9Sstevel@tonic-gate */
7517c478bd9Sstevel@tonic-gate ibt_status_t
ibt_reregister_phys_mr(ibt_hca_hdl_t hca_hdl,ibt_mr_hdl_t mr_hdl,ibt_pd_hdl_t pd,ibt_pmr_attr_t * mem_pattr,ibt_mr_hdl_t * mr_hdl_p,ibt_pmr_desc_t * mem_desc_p)7527c478bd9Sstevel@tonic-gate ibt_reregister_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
7537c478bd9Sstevel@tonic-gate ibt_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
7547c478bd9Sstevel@tonic-gate ibt_pmr_desc_t *mem_desc_p)
7557c478bd9Sstevel@tonic-gate {
75643ed929aSsrust ibt_status_t status;
75743ed929aSsrust
7587c478bd9Sstevel@tonic-gate IBTF_DPRINTF_L3(ibtl_mem, "ibt_reregister_phys_mr(%p, %p, %p, %p)",
7597c478bd9Sstevel@tonic-gate hca_hdl, mr_hdl, pd, mem_pattr);
7607c478bd9Sstevel@tonic-gate
76143ed929aSsrust status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_reregister_physical_mr(
7627c478bd9Sstevel@tonic-gate IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_pattr,
7637c478bd9Sstevel@tonic-gate NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
76443ed929aSsrust mr_hdl_p, mem_desc_p);
76543ed929aSsrust
76643ed929aSsrust if (!(status == IBT_SUCCESS || status == IBT_MR_IN_USE ||
76743ed929aSsrust status == IBT_HCA_HDL_INVALID || status == IBT_MR_HDL_INVALID)) {
76843ed929aSsrust IBTF_DPRINTF_L2(ibtl_mem, "ibt_reregister_phys_mr: "
76943ed929aSsrust "Re-registration Mem Failed: %d", status);
77043ed929aSsrust
77143ed929aSsrust /* we lost one memory region resource */
772f7327bbdSBill Taylor atomic_dec_32(&hca_hdl->ha_mr_cnt);
77343ed929aSsrust
77443ed929aSsrust }
77543ed929aSsrust return (status);
77643ed929aSsrust }
77743ed929aSsrust
77843ed929aSsrust
77943ed929aSsrust /*
78043ed929aSsrust * Fast Memory Registration (FMR).
78143ed929aSsrust *
78243ed929aSsrust * ibt_create_fmr_pool
78343ed929aSsrust * Not fast-path.
78443ed929aSsrust * ibt_create_fmr_pool() verifies that the HCA supports FMR and allocates
78543ed929aSsrust * and initializes an "FMR pool". This pool contains state specific to
78643ed929aSsrust * this registration, including the watermark setting to determine when
78743ed929aSsrust * to sync, and the total number of FMR regions available within this pool.
78843ed929aSsrust *
78943ed929aSsrust */
79043ed929aSsrust ibt_status_t
ibt_create_fmr_pool(ibt_hca_hdl_t hca_hdl,ibt_pd_hdl_t pd,ibt_fmr_pool_attr_t * fmr_params,ibt_fmr_pool_hdl_t * fmr_pool_p)79143ed929aSsrust ibt_create_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
79243ed929aSsrust ibt_fmr_pool_attr_t *fmr_params, ibt_fmr_pool_hdl_t *fmr_pool_p)
79343ed929aSsrust {
79443ed929aSsrust ibt_status_t status;
79543ed929aSsrust
79643ed929aSsrust IBTF_DPRINTF_L3(ibtl_mem, "ibt_create_fmr_pool(%p, %p, %p)",
79743ed929aSsrust hca_hdl, pd, fmr_params);
79843ed929aSsrust
79943ed929aSsrust status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_create_fmr_pool(
80043ed929aSsrust IBTL_HCA2CIHCA(hca_hdl), pd, fmr_params, fmr_pool_p);
80143ed929aSsrust if (status != IBT_SUCCESS) {
80243ed929aSsrust *fmr_pool_p = NULL;
80343ed929aSsrust return (status);
80443ed929aSsrust }
80543ed929aSsrust
80643ed929aSsrust /* Update the FMR resource count */
807f7327bbdSBill Taylor atomic_inc_32(&hca_hdl->ha_fmr_pool_cnt);
80843ed929aSsrust
80943ed929aSsrust return (status);
81043ed929aSsrust }
81143ed929aSsrust
81243ed929aSsrust
81343ed929aSsrust /*
81443ed929aSsrust * ibt_destroy_fmr_pool
81543ed929aSsrust * ibt_destroy_fmr_pool() deallocates all of the FMR regions in a specific
81643ed929aSsrust * pool. All state and information regarding the pool are destroyed and
81743ed929aSsrust * returned as free space once again. No more use of FMR regions in this
81843ed929aSsrust * pool are possible without a subsequent call to ibt_create_fmr_pool().
81943ed929aSsrust */
82043ed929aSsrust ibt_status_t
ibt_destroy_fmr_pool(ibt_hca_hdl_t hca_hdl,ibt_fmr_pool_hdl_t fmr_pool)82143ed929aSsrust ibt_destroy_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_fmr_pool_hdl_t fmr_pool)
82243ed929aSsrust {
82343ed929aSsrust ibt_status_t status;
82443ed929aSsrust
82543ed929aSsrust IBTF_DPRINTF_L3(ibtl_mem, "ibt_destroy_fmr_pool(%p, %p)",
82643ed929aSsrust hca_hdl, fmr_pool);
82743ed929aSsrust
82843ed929aSsrust status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_destroy_fmr_pool(
82943ed929aSsrust IBTL_HCA2CIHCA(hca_hdl), fmr_pool);
83043ed929aSsrust if (status != IBT_SUCCESS) {
83143ed929aSsrust IBTF_DPRINTF_L2(ibtl_mem, "ibt_destroy_fmr_pool: "
83243ed929aSsrust "CI FMR Pool destroy failed (%d)", status);
83343ed929aSsrust return (status);
83443ed929aSsrust }
83543ed929aSsrust
836f7327bbdSBill Taylor atomic_dec_32(&hca_hdl->ha_fmr_pool_cnt);
83743ed929aSsrust
83843ed929aSsrust return (status);
83943ed929aSsrust }
84043ed929aSsrust
84143ed929aSsrust /*
84243ed929aSsrust * ibt_flush_fmr_pool
84343ed929aSsrust * ibt_flush_fmr_pool forces a flush to occur. At the client's request,
84443ed929aSsrust * any unmapped FMR regions (See 'ibt_deregister_mr())') are returned to
84543ed929aSsrust * a free state. This function allows for an asynchronous cleanup of
84643ed929aSsrust * formerly used FMR regions. Sync operation is also performed internally
84743ed929aSsrust * by HCA driver, when 'watermark' settings for the number of free FMR
84843ed929aSsrust * regions left in the "pool" is reached.
84943ed929aSsrust */
85043ed929aSsrust ibt_status_t
ibt_flush_fmr_pool(ibt_hca_hdl_t hca_hdl,ibt_fmr_pool_hdl_t fmr_pool)85143ed929aSsrust ibt_flush_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_fmr_pool_hdl_t fmr_pool)
85243ed929aSsrust {
85343ed929aSsrust IBTF_DPRINTF_L3(ibtl_mem, "ibt_flush_fmr_pool(%p, %p)",
85443ed929aSsrust hca_hdl, fmr_pool);
85543ed929aSsrust
85643ed929aSsrust return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_flush_fmr_pool(
85743ed929aSsrust IBTL_HCA2CIHCA(hca_hdl), fmr_pool));
85843ed929aSsrust }
85943ed929aSsrust
86043ed929aSsrust /*
86143ed929aSsrust * ibt_register_physical_fmr
86243ed929aSsrust * ibt_register_physical_fmr() assigns a "free" entry from the FMR Pool.
86343ed929aSsrust * It first consults the "FMR cache" to see if this is a duplicate memory
86443ed929aSsrust * registration to something already in use. If not, then a free entry
86543ed929aSsrust * in the "pool" is marked used.
86643ed929aSsrust */
86743ed929aSsrust ibt_status_t
ibt_register_physical_fmr(ibt_hca_hdl_t hca_hdl,ibt_fmr_pool_hdl_t fmr_pool,ibt_pmr_attr_t * mem_pattr,ibt_mr_hdl_t * mr_hdl_p,ibt_pmr_desc_t * mem_desc_p)86843ed929aSsrust ibt_register_physical_fmr(ibt_hca_hdl_t hca_hdl, ibt_fmr_pool_hdl_t fmr_pool,
86943ed929aSsrust ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
87043ed929aSsrust ibt_pmr_desc_t *mem_desc_p)
87143ed929aSsrust {
87243ed929aSsrust IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_physical_fmr(%p, %p, %p, %p)",
87343ed929aSsrust hca_hdl, fmr_pool, mem_pattr, mem_desc_p);
87443ed929aSsrust
87543ed929aSsrust return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_physical_fmr(
87643ed929aSsrust IBTL_HCA2CIHCA(hca_hdl), fmr_pool, mem_pattr,
87743ed929aSsrust NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
8787c478bd9Sstevel@tonic-gate mr_hdl_p, mem_desc_p));
8797c478bd9Sstevel@tonic-gate }
88043ed929aSsrust
88143ed929aSsrust /*
88243ed929aSsrust * ibt_deregister_fmr
88343ed929aSsrust * The ibt_deregister_fmr un-maps the resources reserved from the FMR
88443ed929aSsrust * pool by ibt_register_physical_fmr(). The ibt_deregister_fmr() will
88543ed929aSsrust * mark the region as free in the FMR Pool.
88643ed929aSsrust */
88743ed929aSsrust ibt_status_t
ibt_deregister_fmr(ibt_hca_hdl_t hca,ibt_mr_hdl_t mr_hdl)88843ed929aSsrust ibt_deregister_fmr(ibt_hca_hdl_t hca, ibt_mr_hdl_t mr_hdl)
88943ed929aSsrust {
89043ed929aSsrust IBTF_DPRINTF_L3(ibtl_mem, "ibt_deregister_fmr(%p, %p)", hca, mr_hdl);
89143ed929aSsrust
89243ed929aSsrust return (IBTL_HCA2CIHCAOPS_P(hca)->ibc_deregister_fmr(
89343ed929aSsrust IBTL_HCA2CIHCA(hca), mr_hdl));
89443ed929aSsrust }
895*17a2b317SBill Taylor
896*17a2b317SBill Taylor /*
897*17a2b317SBill Taylor * ibt_register_dma_mr
898*17a2b317SBill Taylor */
899*17a2b317SBill Taylor ibt_status_t
ibt_register_dma_mr(ibt_hca_hdl_t hca,ibt_pd_hdl_t pd,ibt_dmr_attr_t * mem_attr,ibt_mr_hdl_t * mr_hdl_p,ibt_mr_desc_t * mem_desc)900*17a2b317SBill Taylor ibt_register_dma_mr(ibt_hca_hdl_t hca, ibt_pd_hdl_t pd,
901*17a2b317SBill Taylor ibt_dmr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
902*17a2b317SBill Taylor {
903*17a2b317SBill Taylor ibt_status_t status;
904*17a2b317SBill Taylor
905*17a2b317SBill Taylor IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_dma_mr(%p, %p, %p)",
906*17a2b317SBill Taylor hca, pd, mem_attr);
907*17a2b317SBill Taylor
908*17a2b317SBill Taylor status = IBTL_HCA2CIHCAOPS_P(hca)->ibc_register_dma_mr(
909*17a2b317SBill Taylor IBTL_HCA2CIHCA(hca), pd, mem_attr, NULL, mr_hdl_p, mem_desc);
910*17a2b317SBill Taylor if (status == IBT_SUCCESS) {
911*17a2b317SBill Taylor atomic_inc_32(&hca->ha_mr_cnt);
912*17a2b317SBill Taylor }
913*17a2b317SBill Taylor return (status);
914*17a2b317SBill Taylor }
915