xref: /illumos-gate/usr/src/uts/common/io/ib/ibtl/ibtl_mem.c (revision 03494a98)
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
5*03494a98SBill Taylor  * Common Development and Distribution License (the "License").
6*03494a98SBill 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 /*
22*03494a98SBill Taylor  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #include <sys/ib/ibtl/impl/ibtl.h>
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate /*
307c478bd9Sstevel@tonic-gate  * ibtl_mem.c
317c478bd9Sstevel@tonic-gate  *    These routines implement all of the Memory Region verbs and the alloc/
327c478bd9Sstevel@tonic-gate  *    query/free Memory Window verbs at the TI interface.
337c478bd9Sstevel@tonic-gate  */
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate static char ibtl_mem[] = "ibtl_mem";
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate /*
387c478bd9Sstevel@tonic-gate  * Function:
397c478bd9Sstevel@tonic-gate  *	ibt_register_mr()
407c478bd9Sstevel@tonic-gate  * Input:
417c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
427c478bd9Sstevel@tonic-gate  *	pd        - Protection Domain Handle.
437c478bd9Sstevel@tonic-gate  *	mem_attr  - Requested memory region attributes.
447c478bd9Sstevel@tonic-gate  * Output:
457c478bd9Sstevel@tonic-gate  *	mr_hdl_p  - The returned IBT memory region handle.
467c478bd9Sstevel@tonic-gate  *	mem_desc  - Returned memory descriptor.
477c478bd9Sstevel@tonic-gate  * Returns:
487c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
497c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
507c478bd9Sstevel@tonic-gate  *	IBT_MR_VA_INVALID
517c478bd9Sstevel@tonic-gate  *	IBT_MR_LEN_INVALID
527c478bd9Sstevel@tonic-gate  *	IBT_MR_ACCESS_REQ_INVALID
537c478bd9Sstevel@tonic-gate  *	IBT_PD_HDL_INVALID
547c478bd9Sstevel@tonic-gate  *	IBT_INSUFF_RESOURCE
557c478bd9Sstevel@tonic-gate  * Description:
567c478bd9Sstevel@tonic-gate  *    Prepares a virtually addressed memory region for use by a HCA. A
577c478bd9Sstevel@tonic-gate  *    description of the registered memory suitable for use in Work Requests
587c478bd9Sstevel@tonic-gate  *    (WRs) is returned in the ibt_mr_desc_t parameter.
597c478bd9Sstevel@tonic-gate  */
607c478bd9Sstevel@tonic-gate ibt_status_t
617c478bd9Sstevel@tonic-gate ibt_register_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, ibt_mr_attr_t *mem_attr,
627c478bd9Sstevel@tonic-gate     ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
637c478bd9Sstevel@tonic-gate {
647c478bd9Sstevel@tonic-gate 	ib_vaddr_t 	vaddr;
657c478bd9Sstevel@tonic-gate 	ibt_status_t 	status;
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_mr(%p, %p, %p)",
687c478bd9Sstevel@tonic-gate 	    hca_hdl, pd, mem_attr);
697c478bd9Sstevel@tonic-gate 
707c478bd9Sstevel@tonic-gate 	vaddr = mem_attr->mr_vaddr;
717c478bd9Sstevel@tonic-gate 
727c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_mr(
737c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), pd, mem_attr, IBTL_HCA2CLNT(hca_hdl),
747c478bd9Sstevel@tonic-gate 	    mr_hdl_p, mem_desc);
757c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS) {
767c478bd9Sstevel@tonic-gate 		mem_desc->md_vaddr = vaddr;
777c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
787c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mr_cnt++;
797c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
807c478bd9Sstevel@tonic-gate 	}
817c478bd9Sstevel@tonic-gate 
827c478bd9Sstevel@tonic-gate 	return (status);
837c478bd9Sstevel@tonic-gate }
847c478bd9Sstevel@tonic-gate 
857c478bd9Sstevel@tonic-gate 
867c478bd9Sstevel@tonic-gate /*
877c478bd9Sstevel@tonic-gate  * Function:
887c478bd9Sstevel@tonic-gate  *	ibt_register_buf()
897c478bd9Sstevel@tonic-gate  * Input:
907c478bd9Sstevel@tonic-gate  *	hca_hdl		HCA Handle.
917c478bd9Sstevel@tonic-gate  *	pd		Protection Domain Handle.
927c478bd9Sstevel@tonic-gate  *	mem_bpattr	Memory Registration attributes (IOVA and flags).
937c478bd9Sstevel@tonic-gate  *	bp		A pointer to a buf(9S) struct.
947c478bd9Sstevel@tonic-gate  * Output:
957c478bd9Sstevel@tonic-gate  *	mr_hdl_p	The returned IBT memory region handle.
967c478bd9Sstevel@tonic-gate  *	mem_desc	Returned memory descriptor.
977c478bd9Sstevel@tonic-gate  * Returns:
987c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
997c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
1007c478bd9Sstevel@tonic-gate  *	IBT_MR_VA_INVALID
1017c478bd9Sstevel@tonic-gate  *	IBT_MR_LEN_INVALID
1027c478bd9Sstevel@tonic-gate  *	IBT_MR_ACCESS_REQ_INVALID
1037c478bd9Sstevel@tonic-gate  *	IBT_PD_HDL_INVALID
1047c478bd9Sstevel@tonic-gate  *	IBT_INSUFF_RESOURCE
1057c478bd9Sstevel@tonic-gate  * Description:
1067c478bd9Sstevel@tonic-gate  *	Prepares a memory region described by a buf(9S) struct for use by a HCA.
1077c478bd9Sstevel@tonic-gate  *	A description of the registered memory suitable for use in
1087c478bd9Sstevel@tonic-gate  *	Work Requests (WRs) is returned in the ibt_mr_desc_t parameter.
1097c478bd9Sstevel@tonic-gate  */
1107c478bd9Sstevel@tonic-gate ibt_status_t
1117c478bd9Sstevel@tonic-gate ibt_register_buf(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1127c478bd9Sstevel@tonic-gate     ibt_smr_attr_t *mem_bpattr, struct buf *bp, ibt_mr_hdl_t *mr_hdl_p,
1137c478bd9Sstevel@tonic-gate     ibt_mr_desc_t *mem_desc)
1147c478bd9Sstevel@tonic-gate {
1157c478bd9Sstevel@tonic-gate 	ibt_status_t 	status;
1167c478bd9Sstevel@tonic-gate 
1177c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_buf(%p, %p, %p, %p)",
1187c478bd9Sstevel@tonic-gate 	    hca_hdl, pd, mem_bpattr, bp);
1197c478bd9Sstevel@tonic-gate 
1207c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_buf(
1217c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), pd, mem_bpattr, bp, IBTL_HCA2CLNT(hca_hdl),
1227c478bd9Sstevel@tonic-gate 	    mr_hdl_p, mem_desc);
1237c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS) {
1247c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
1257c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mr_cnt++;
1267c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
1277c478bd9Sstevel@tonic-gate 	}
1287c478bd9Sstevel@tonic-gate 
1297c478bd9Sstevel@tonic-gate 	return (status);
1307c478bd9Sstevel@tonic-gate }
1317c478bd9Sstevel@tonic-gate 
1327c478bd9Sstevel@tonic-gate 
1337c478bd9Sstevel@tonic-gate /*
1347c478bd9Sstevel@tonic-gate  * Function:
1357c478bd9Sstevel@tonic-gate  *	ibt_query_mr()
1367c478bd9Sstevel@tonic-gate  * Input:
1377c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
1387c478bd9Sstevel@tonic-gate  *	mr_hdl    - The IBT Memory Region handle.
1397c478bd9Sstevel@tonic-gate  * Output:
1407c478bd9Sstevel@tonic-gate  *      attr      - The pointer to Memory region attributes structure.
1417c478bd9Sstevel@tonic-gate  * Returns:
1427c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
1437c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
1447c478bd9Sstevel@tonic-gate  *	IBT_MR_HDL_INVALID
1457c478bd9Sstevel@tonic-gate  * Description:
1467c478bd9Sstevel@tonic-gate  *    Retrieves information about a specified memory region.
1477c478bd9Sstevel@tonic-gate  */
1487c478bd9Sstevel@tonic-gate ibt_status_t
1497c478bd9Sstevel@tonic-gate ibt_query_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1507c478bd9Sstevel@tonic-gate     ibt_mr_query_attr_t *attr)
1517c478bd9Sstevel@tonic-gate {
1527c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_query_mr(%p, %p)", hca_hdl, mr_hdl);
1537c478bd9Sstevel@tonic-gate 
1547c478bd9Sstevel@tonic-gate 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_query_mr(
1557c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_hdl, attr));
1567c478bd9Sstevel@tonic-gate }
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate 
1597c478bd9Sstevel@tonic-gate /*
1607c478bd9Sstevel@tonic-gate  * Function:
1617c478bd9Sstevel@tonic-gate  *	ibt_deregister_mr()
1627c478bd9Sstevel@tonic-gate  * Input:
1637c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
1647c478bd9Sstevel@tonic-gate  *	mr_hdl    - The IBT Memory Region handle.
1657c478bd9Sstevel@tonic-gate  * Output:
1667c478bd9Sstevel@tonic-gate  *      none.
1677c478bd9Sstevel@tonic-gate  * Returns:
1687c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
1697c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
1707c478bd9Sstevel@tonic-gate  *	IBT_MR_HDL_INVALID
1717c478bd9Sstevel@tonic-gate  *	IBT_MR_IN_USE
1727c478bd9Sstevel@tonic-gate  * Description:
1737c478bd9Sstevel@tonic-gate  *    De-register the registered memory region. Remove a memory region from a
1747c478bd9Sstevel@tonic-gate  *    HCA translation table, and free all resources associated with the
1757c478bd9Sstevel@tonic-gate  *    memory region.
1767c478bd9Sstevel@tonic-gate  */
1777c478bd9Sstevel@tonic-gate ibt_status_t
1787c478bd9Sstevel@tonic-gate ibt_deregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl)
1797c478bd9Sstevel@tonic-gate {
1807c478bd9Sstevel@tonic-gate 	ibt_status_t 	status;
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_deregister_mr(%p, %p)", hca_hdl, mr_hdl);
1837c478bd9Sstevel@tonic-gate 
1847c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_deregister_mr(
1857c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_hdl);
1867c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS) {
1877c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
1887c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mr_cnt--;
1897c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
1907c478bd9Sstevel@tonic-gate 	}
1917c478bd9Sstevel@tonic-gate 	return (status);
1927c478bd9Sstevel@tonic-gate }
1937c478bd9Sstevel@tonic-gate 
1947c478bd9Sstevel@tonic-gate 
1957c478bd9Sstevel@tonic-gate /*
1967c478bd9Sstevel@tonic-gate  * Function:
1977c478bd9Sstevel@tonic-gate  *	ibt_reregister_mr()
1987c478bd9Sstevel@tonic-gate  * Input:
1997c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
2007c478bd9Sstevel@tonic-gate  *	mr_hdl    - The IBT Memory Region handle.
2017c478bd9Sstevel@tonic-gate  *	pd        - Optional Protection Domain Handle.
2027c478bd9Sstevel@tonic-gate  *	mem_attr  - Requested memory region attributes.
2037c478bd9Sstevel@tonic-gate  * Output:
2047c478bd9Sstevel@tonic-gate  *	mr_hdl_p  - The reregistered IBT memory region handle.
2057c478bd9Sstevel@tonic-gate  *	mem_desc  - Returned memory descriptor for the new memory region.
2067c478bd9Sstevel@tonic-gate  * Returns:
2077c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
2087c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
2097c478bd9Sstevel@tonic-gate  *	IBT_MR_HDL_INVALID
2107c478bd9Sstevel@tonic-gate  *	IBT_MR_VA_INVALID
2117c478bd9Sstevel@tonic-gate  *	IBT_MR_LEN_INVALID
2127c478bd9Sstevel@tonic-gate  *	IBT_MR_ACCESS_REQ_INVALID
2137c478bd9Sstevel@tonic-gate  *	IBT_PD_HDL_INVALID
2147c478bd9Sstevel@tonic-gate  *	IBT_INSUFF_RESOURCE
2157c478bd9Sstevel@tonic-gate  *	IBT_MR_IN_USE
2167c478bd9Sstevel@tonic-gate  * Description:
2177c478bd9Sstevel@tonic-gate  *    Modify the attributes of an existing memory region.
2187c478bd9Sstevel@tonic-gate  */
2197c478bd9Sstevel@tonic-gate ibt_status_t
2207c478bd9Sstevel@tonic-gate ibt_reregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, ibt_pd_hdl_t pd,
2217c478bd9Sstevel@tonic-gate     ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
2227c478bd9Sstevel@tonic-gate {
2237c478bd9Sstevel@tonic-gate 	ibt_status_t 	status;
2247c478bd9Sstevel@tonic-gate 	ib_vaddr_t 	vaddr = mem_attr->mr_vaddr;
2257c478bd9Sstevel@tonic-gate 
2267c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_reregister_mr(%p, %p, %p, %p)",
2277c478bd9Sstevel@tonic-gate 	    hca_hdl, mr_hdl, pd, mem_attr);
2287c478bd9Sstevel@tonic-gate 
2297c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_reregister_mr(
2307c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_attr,
2317c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CLNT(hca_hdl), mr_hdl_p, mem_desc);
2327c478bd9Sstevel@tonic-gate 
2337c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS)
2347c478bd9Sstevel@tonic-gate 		mem_desc->md_vaddr = vaddr;
2357c478bd9Sstevel@tonic-gate 	else if (!(status == IBT_MR_IN_USE || status == IBT_HCA_HDL_INVALID ||
2367c478bd9Sstevel@tonic-gate 	    status == IBT_MR_HDL_INVALID)) {
2377c478bd9Sstevel@tonic-gate 
2387c478bd9Sstevel@tonic-gate 		IBTF_DPRINTF_L2(ibtl_mem, "ibt_reregister_mr: "
2397c478bd9Sstevel@tonic-gate 		    "Re-registration Failed: %d", status);
2407c478bd9Sstevel@tonic-gate 
2417c478bd9Sstevel@tonic-gate 		/* we lost one memory region resource */
2427c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
2437c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mr_cnt--;
2447c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
2457c478bd9Sstevel@tonic-gate 	}
2467c478bd9Sstevel@tonic-gate 
2477c478bd9Sstevel@tonic-gate 	return (status);
2487c478bd9Sstevel@tonic-gate }
2497c478bd9Sstevel@tonic-gate 
2507c478bd9Sstevel@tonic-gate 
2517c478bd9Sstevel@tonic-gate /*
2527c478bd9Sstevel@tonic-gate  * Function:
2537c478bd9Sstevel@tonic-gate  *	ibt_reregister_buf()
2547c478bd9Sstevel@tonic-gate  * Input:
2557c478bd9Sstevel@tonic-gate  *	hca_hdl		HCA Handle.
2567c478bd9Sstevel@tonic-gate  *	mr_hdl		The IBT Memory Region handle.
2577c478bd9Sstevel@tonic-gate  *	pd		Optional Protection Domain Handle.
2587c478bd9Sstevel@tonic-gate  *	mem_bpattr	Memory Registration attributes (IOVA and flags).
2597c478bd9Sstevel@tonic-gate  *	bp		A pointer to a buf(9S) struct.
2607c478bd9Sstevel@tonic-gate  * Output:
2617c478bd9Sstevel@tonic-gate  *	mr_hdl_p	The reregistered IBT memory region handle.
2627c478bd9Sstevel@tonic-gate  *	mem_desc	Returned memory descriptor for the new memory region.
2637c478bd9Sstevel@tonic-gate  * Returns:
2647c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
2657c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
2667c478bd9Sstevel@tonic-gate  *	IBT_MR_HDL_INVALID
2677c478bd9Sstevel@tonic-gate  *	IBT_MR_VA_INVALID
2687c478bd9Sstevel@tonic-gate  *	IBT_MR_LEN_INVALID
2697c478bd9Sstevel@tonic-gate  *	IBT_MR_ACCESS_REQ_INVALID
2707c478bd9Sstevel@tonic-gate  *	IBT_PD_HDL_INVALID
2717c478bd9Sstevel@tonic-gate  *	IBT_INSUFF_RESOURCE
2727c478bd9Sstevel@tonic-gate  *	IBT_MR_IN_USE
2737c478bd9Sstevel@tonic-gate  * Description:
2747c478bd9Sstevel@tonic-gate  *	Modify the attributes of an existing memory region as described by a
2757c478bd9Sstevel@tonic-gate  *	buf(9S) struct for use by a HCA.  A description of the registered
2767c478bd9Sstevel@tonic-gate  *	memory suitable for use in Work Requests (WRs) is returned in the
2777c478bd9Sstevel@tonic-gate  *	ibt_mr_desc_t parameter.
2787c478bd9Sstevel@tonic-gate  */
2797c478bd9Sstevel@tonic-gate ibt_status_t
2807c478bd9Sstevel@tonic-gate ibt_reregister_buf(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
2817c478bd9Sstevel@tonic-gate     ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_bpattr, struct buf *bp,
2827c478bd9Sstevel@tonic-gate     ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc)
2837c478bd9Sstevel@tonic-gate {
2847c478bd9Sstevel@tonic-gate 	ibt_status_t 		status;
2857c478bd9Sstevel@tonic-gate 
2867c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_reregister_buf(%p, %p, %p, %p, %p)",
2877c478bd9Sstevel@tonic-gate 	    hca_hdl, mr_hdl, pd, mem_bpattr, bp);
2887c478bd9Sstevel@tonic-gate 
2897c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_reregister_buf(
2907c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_bpattr, bp,
2917c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CLNT(hca_hdl), mr_hdl_p, mem_desc);
2927c478bd9Sstevel@tonic-gate 
2937c478bd9Sstevel@tonic-gate 	if (!(status == IBT_SUCCESS || status == IBT_MR_IN_USE ||
2947c478bd9Sstevel@tonic-gate 	    status == IBT_HCA_HDL_INVALID || status == IBT_MR_HDL_INVALID)) {
2957c478bd9Sstevel@tonic-gate 
2967c478bd9Sstevel@tonic-gate 		IBTF_DPRINTF_L2(ibtl_mem, "ibt_reregister_buf: "
2977c478bd9Sstevel@tonic-gate 		    "Re-registration Mem Failed: %d", status);
2987c478bd9Sstevel@tonic-gate 
2997c478bd9Sstevel@tonic-gate 		/* we lost one memory region resource */
3007c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
3017c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mr_cnt--;
3027c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
3037c478bd9Sstevel@tonic-gate 	}
3047c478bd9Sstevel@tonic-gate 	return (status);
3057c478bd9Sstevel@tonic-gate }
3067c478bd9Sstevel@tonic-gate 
3077c478bd9Sstevel@tonic-gate 
3087c478bd9Sstevel@tonic-gate /*
3097c478bd9Sstevel@tonic-gate  * Function:
3107c478bd9Sstevel@tonic-gate  *	ibt_register_shared_mr()
3117c478bd9Sstevel@tonic-gate  * Input:
3127c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
3137c478bd9Sstevel@tonic-gate  *	mr_hdl    - The IBT Memory Region handle.
3147c478bd9Sstevel@tonic-gate  *	pd        - Protection Domain Handle.
3157c478bd9Sstevel@tonic-gate  *	mem_sattr - Requested memory region shared attributes.
3167c478bd9Sstevel@tonic-gate  * Output:
3177c478bd9Sstevel@tonic-gate  *	mr_hdl_p  - The reregistered IBT memory region handle.
3187c478bd9Sstevel@tonic-gate  *	mem_desc  - Returned memory descriptor for the new memory region.
3197c478bd9Sstevel@tonic-gate  * Returns:
3207c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
3217c478bd9Sstevel@tonic-gate  *	IBT_INSUFF_RESOURCE
3227c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
3237c478bd9Sstevel@tonic-gate  *	IBT_MR_HDL_INVALID
3247c478bd9Sstevel@tonic-gate  *	IBT_PD_HDL_INVALID
3257c478bd9Sstevel@tonic-gate  *	IBT_MR_ACCESS_REQ_INVALID
3267c478bd9Sstevel@tonic-gate  * Description:
3277c478bd9Sstevel@tonic-gate  *    Given an existing memory region, a new memory region associated with
3287c478bd9Sstevel@tonic-gate  *    the same physical locations is created.
3297c478bd9Sstevel@tonic-gate  */
3307c478bd9Sstevel@tonic-gate ibt_status_t
3317c478bd9Sstevel@tonic-gate ibt_register_shared_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
3327c478bd9Sstevel@tonic-gate     ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_sattr, ibt_mr_hdl_t *mr_hdl_p,
3337c478bd9Sstevel@tonic-gate     ibt_mr_desc_t *mem_desc)
3347c478bd9Sstevel@tonic-gate {
3357c478bd9Sstevel@tonic-gate 	ibt_status_t		status;
3367c478bd9Sstevel@tonic-gate 
3377c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_shared_mr(%p, %p, %p, %p)",
3387c478bd9Sstevel@tonic-gate 	    hca_hdl, mr_hdl, pd, mem_sattr);
3397c478bd9Sstevel@tonic-gate 
3407c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_shared_mr(
3417c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_sattr,
3427c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CLNT(hca_hdl), mr_hdl_p, mem_desc);
3437c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS) {
3447c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
3457c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mr_cnt++;
3467c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
3477c478bd9Sstevel@tonic-gate 	}
3487c478bd9Sstevel@tonic-gate 	return (status);
3497c478bd9Sstevel@tonic-gate }
3507c478bd9Sstevel@tonic-gate 
3517c478bd9Sstevel@tonic-gate /*
3527c478bd9Sstevel@tonic-gate  * Function:
3537c478bd9Sstevel@tonic-gate  *	ibt_sync_mr()
3547c478bd9Sstevel@tonic-gate  * Input:
3557c478bd9Sstevel@tonic-gate  *	hca_hdl		- HCA Handle.
3567c478bd9Sstevel@tonic-gate  *	mr_segments	- A pointer to an array of ibt_mr_sync_t that describes
3577c478bd9Sstevel@tonic-gate  *			  the memory regions to sync.
3587c478bd9Sstevel@tonic-gate  *	num_segments	- The length of the mr_segments array.
3597c478bd9Sstevel@tonic-gate  * Output:
3607c478bd9Sstevel@tonic-gate  *	NONE
3617c478bd9Sstevel@tonic-gate  * Returns:
3627c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
3637c478bd9Sstevel@tonic-gate  *	IBT_HCA_HDL_INVALID
3647c478bd9Sstevel@tonic-gate  *	IBT_MR_HDL_INVALID
3657c478bd9Sstevel@tonic-gate  *	IBT_INVALID_PARAM
3667c478bd9Sstevel@tonic-gate  *	IBT_MR_VA_INVALID
3677c478bd9Sstevel@tonic-gate  *	IBT_MR_LEN_INVALID
3687c478bd9Sstevel@tonic-gate  * Description:
3697c478bd9Sstevel@tonic-gate  *	Make memory changes visible to incoming RDMA reads, or make the affects
3707c478bd9Sstevel@tonic-gate  *	of an incoming RDMA writes visible to the consumer.
3717c478bd9Sstevel@tonic-gate  */
3727c478bd9Sstevel@tonic-gate ibt_status_t
3737c478bd9Sstevel@tonic-gate ibt_sync_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_sync_t *mr_segments,
3747c478bd9Sstevel@tonic-gate     size_t num_segments)
3757c478bd9Sstevel@tonic-gate 
3767c478bd9Sstevel@tonic-gate {
3777c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_sync_mr(%p, %p, %d)", hca_hdl,
3787c478bd9Sstevel@tonic-gate 	    mr_segments, num_segments);
3797c478bd9Sstevel@tonic-gate 
3807c478bd9Sstevel@tonic-gate 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_sync_mr(
3817c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_segments, num_segments));
3827c478bd9Sstevel@tonic-gate }
3837c478bd9Sstevel@tonic-gate 
3847c478bd9Sstevel@tonic-gate 
3857c478bd9Sstevel@tonic-gate /*
3867c478bd9Sstevel@tonic-gate  * Function:
3877c478bd9Sstevel@tonic-gate  *	ibt_alloc_mw()
3887c478bd9Sstevel@tonic-gate  * Input:
3897c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
3907c478bd9Sstevel@tonic-gate  *	pd        - Protection Domain Handle.
3917c478bd9Sstevel@tonic-gate  *	flags     - Memory Window alloc flags.
3927c478bd9Sstevel@tonic-gate  * Output:
3937c478bd9Sstevel@tonic-gate  *	mw_hdl_p  - The returned IBT Memory Window handle.
3947c478bd9Sstevel@tonic-gate  *	rkey      - The IBT R_Key handle.
3957c478bd9Sstevel@tonic-gate  * Returns:
3967c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
3977c478bd9Sstevel@tonic-gate  *	IBT_INSUFF_RESOURCE
3987c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
3997c478bd9Sstevel@tonic-gate  *	IBT_PD_HDL_INVALID
4007c478bd9Sstevel@tonic-gate  * Description:
4017c478bd9Sstevel@tonic-gate  *    Allocate a memory window from the HCA.
4027c478bd9Sstevel@tonic-gate  */
4037c478bd9Sstevel@tonic-gate ibt_status_t
4047c478bd9Sstevel@tonic-gate ibt_alloc_mw(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, ibt_mw_flags_t flags,
4057c478bd9Sstevel@tonic-gate     ibt_mw_hdl_t *mw_hdl_p, ibt_rkey_t *rkey)
4067c478bd9Sstevel@tonic-gate {
4077c478bd9Sstevel@tonic-gate 	ibt_status_t		status;
4087c478bd9Sstevel@tonic-gate 
4097c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_alloc_mw(%p, %p, 0x%x)",
4107c478bd9Sstevel@tonic-gate 	    hca_hdl, pd, flags);
4117c478bd9Sstevel@tonic-gate 
4127c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_mw(
4137c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), pd, flags, mw_hdl_p, rkey);
4147c478bd9Sstevel@tonic-gate 
4157c478bd9Sstevel@tonic-gate 	/*
4167c478bd9Sstevel@tonic-gate 	 * XXX - We should be able to allocate state and have a IBTF Memory
4177c478bd9Sstevel@tonic-gate 	 * Window Handle. Memory Windows are meant to be rebound on the fly
4187c478bd9Sstevel@tonic-gate 	 * (using a post) to make them fast. It is expected that alloc memory
4197c478bd9Sstevel@tonic-gate 	 * window will be done in a relatively static manner. But, we don't have
4207c478bd9Sstevel@tonic-gate 	 * a good reason to have local MW state at this point, so we won't.
4217c478bd9Sstevel@tonic-gate 	 */
4227c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS) {
4237c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
4247c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mw_cnt++;
4257c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
4267c478bd9Sstevel@tonic-gate 	}
4277c478bd9Sstevel@tonic-gate 	return (status);
4287c478bd9Sstevel@tonic-gate }
4297c478bd9Sstevel@tonic-gate 
4307c478bd9Sstevel@tonic-gate 
4317c478bd9Sstevel@tonic-gate /*
4327c478bd9Sstevel@tonic-gate  * Function:
4337c478bd9Sstevel@tonic-gate  *	ibt_query_mw()
4347c478bd9Sstevel@tonic-gate  * Input:
4357c478bd9Sstevel@tonic-gate  *	hca_hdl   - HCA Handle.
4367c478bd9Sstevel@tonic-gate  *	mw_hdl    - The IBT Memory Window handle.
4377c478bd9Sstevel@tonic-gate  * Output:
4387c478bd9Sstevel@tonic-gate  *	pd        - Protection Domain Handle.
4397c478bd9Sstevel@tonic-gate  *	rkey      - The IBT R_Key handle.
4407c478bd9Sstevel@tonic-gate  * Returns:
4417c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
4427c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
4437c478bd9Sstevel@tonic-gate  *	IBT_MW_HDL_INVALID
4447c478bd9Sstevel@tonic-gate  * Description:
4457c478bd9Sstevel@tonic-gate  *    Retrieves information about a specified memory region.
4467c478bd9Sstevel@tonic-gate  */
4477c478bd9Sstevel@tonic-gate ibt_status_t
4487c478bd9Sstevel@tonic-gate ibt_query_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl,
4497c478bd9Sstevel@tonic-gate     ibt_mw_query_attr_t *mw_attr_p)
4507c478bd9Sstevel@tonic-gate {
4517c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_query_mw(%p, %p)", hca_hdl, mw_hdl);
4527c478bd9Sstevel@tonic-gate 
4537c478bd9Sstevel@tonic-gate 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_query_mw(
4547c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mw_hdl, mw_attr_p));
4557c478bd9Sstevel@tonic-gate }
4567c478bd9Sstevel@tonic-gate 
4577c478bd9Sstevel@tonic-gate 
4587c478bd9Sstevel@tonic-gate /*
4597c478bd9Sstevel@tonic-gate  * Function:
4607c478bd9Sstevel@tonic-gate  *	ibt_free_mw()
4617c478bd9Sstevel@tonic-gate  * Input:
4627c478bd9Sstevel@tonic-gate  *      hca_hdl   - HCA Handle
4637c478bd9Sstevel@tonic-gate  *	mw_hdl    - The IBT Memory Window handle.
4647c478bd9Sstevel@tonic-gate  * Output:
4657c478bd9Sstevel@tonic-gate  *	none.
4667c478bd9Sstevel@tonic-gate  * Returns:
4677c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
4687c478bd9Sstevel@tonic-gate  *	IBT_CHAN_HDL_INVALID
4697c478bd9Sstevel@tonic-gate  *	IBT_MW_HDL_INVALID
4707c478bd9Sstevel@tonic-gate  * Description:
4717c478bd9Sstevel@tonic-gate  *    De-allocate the Memory Window.
4727c478bd9Sstevel@tonic-gate  */
4737c478bd9Sstevel@tonic-gate ibt_status_t
4747c478bd9Sstevel@tonic-gate ibt_free_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl)
4757c478bd9Sstevel@tonic-gate {
4767c478bd9Sstevel@tonic-gate 	ibt_status_t		status;
4777c478bd9Sstevel@tonic-gate 
4787c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_free_mw(%p, %p)", hca_hdl, mw_hdl);
4797c478bd9Sstevel@tonic-gate 
4807c478bd9Sstevel@tonic-gate 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_free_mw(
4817c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mw_hdl);
4827c478bd9Sstevel@tonic-gate 
4837c478bd9Sstevel@tonic-gate 	if (status == IBT_SUCCESS) {
4847c478bd9Sstevel@tonic-gate 		mutex_enter(&hca_hdl->ha_mutex);
4857c478bd9Sstevel@tonic-gate 		hca_hdl->ha_mw_cnt--;
4867c478bd9Sstevel@tonic-gate 		mutex_exit(&hca_hdl->ha_mutex);
4877c478bd9Sstevel@tonic-gate 	}
4887c478bd9Sstevel@tonic-gate 	return (status);
4897c478bd9Sstevel@tonic-gate }
4907c478bd9Sstevel@tonic-gate 
4917c478bd9Sstevel@tonic-gate 
4927c478bd9Sstevel@tonic-gate /*
4937c478bd9Sstevel@tonic-gate  * Function:
4947c478bd9Sstevel@tonic-gate  *	ibt_map_mem_area()
4957c478bd9Sstevel@tonic-gate  * Input:
4967c478bd9Sstevel@tonic-gate  *      hca_hdl		HCA Handle
4977c478bd9Sstevel@tonic-gate  *	va_attrs	A pointer to an ibt_va_attr_t that describes the
4987c478bd9Sstevel@tonic-gate  *			VA to be translated.
4997c478bd9Sstevel@tonic-gate  *	paddr_list_len	The number of entries in the 'paddr_list_p' array.
5007c478bd9Sstevel@tonic-gate  * Output:
5017c478bd9Sstevel@tonic-gate  *	paddr_list_p	Array of ibt_phys_buf_t (allocated by the caller),
5027c478bd9Sstevel@tonic-gate  *			in which the physical buffers that map the virtual
5037c478bd9Sstevel@tonic-gate  *			buffer are returned.
5047c478bd9Sstevel@tonic-gate  *	num_paddr_p	The actual number of ibt_phys_buf_t that were
5057c478bd9Sstevel@tonic-gate  *			returned in the 'paddr_list_p' array.
5067c478bd9Sstevel@tonic-gate  *	ma_hdl_p	Memory Area Handle.
5077c478bd9Sstevel@tonic-gate  * Returns:
5087c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
5097c478bd9Sstevel@tonic-gate  * Description:
5107c478bd9Sstevel@tonic-gate  * 	Translate a kernel virtual address range into HCA physical addresses.
5117c478bd9Sstevel@tonic-gate  *	A set of physical addresses, that can be used with "Reserved L_Key",
5127c478bd9Sstevel@tonic-gate  *	register physical,  and "Fast Registration Work Request" operations
5137c478bd9Sstevel@tonic-gate  *	is returned.
5147c478bd9Sstevel@tonic-gate  */
5157c478bd9Sstevel@tonic-gate ibt_status_t
5167c478bd9Sstevel@tonic-gate ibt_map_mem_area(ibt_hca_hdl_t hca_hdl, ibt_va_attr_t *va_attrs,
5177c478bd9Sstevel@tonic-gate     uint_t paddr_list_len, ibt_phys_buf_t *paddr_list_p, uint_t *num_paddr_p,
51843ed929aSsrust     size_t *paddr_bufsz_p, ib_memlen_t *paddr_offset_p, ibt_ma_hdl_t *ma_hdl_p)
5197c478bd9Sstevel@tonic-gate {
52043ed929aSsrust 	ibt_status_t 	status;
52143ed929aSsrust 
5227c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_map_mem_area(%p, %p, %d)",
5237c478bd9Sstevel@tonic-gate 	    hca_hdl, va_attrs, paddr_list_len);
5247c478bd9Sstevel@tonic-gate 
52543ed929aSsrust 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_map_mem_area(
5267c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), va_attrs,
5277c478bd9Sstevel@tonic-gate 	    NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
52843ed929aSsrust 	    paddr_list_len, paddr_list_p, num_paddr_p,  paddr_bufsz_p,
52943ed929aSsrust 	    paddr_offset_p, ma_hdl_p);
53043ed929aSsrust 	if (status == IBT_SUCCESS) {
53143ed929aSsrust 		mutex_enter(&hca_hdl->ha_mutex);
53243ed929aSsrust 		hca_hdl->ha_ma_cnt++;
53343ed929aSsrust 		mutex_exit(&hca_hdl->ha_mutex);
53443ed929aSsrust 	}
53543ed929aSsrust 
53643ed929aSsrust 	return (status);
5377c478bd9Sstevel@tonic-gate }
5387c478bd9Sstevel@tonic-gate 
5397c478bd9Sstevel@tonic-gate 
5407c478bd9Sstevel@tonic-gate /*
5417c478bd9Sstevel@tonic-gate  * Function:
5427c478bd9Sstevel@tonic-gate  *	ibt_unmap_mem_area()
5437c478bd9Sstevel@tonic-gate  * Input:
5447c478bd9Sstevel@tonic-gate  *      hca_hdl		HCA Handle
5457c478bd9Sstevel@tonic-gate  *	ma_hdl		Memory Area Handle.
5467c478bd9Sstevel@tonic-gate  * Output:
5477c478bd9Sstevel@tonic-gate  *	None.
5487c478bd9Sstevel@tonic-gate  * Returns:
5497c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
5507c478bd9Sstevel@tonic-gate  * Description:
5517c478bd9Sstevel@tonic-gate  * 	Un pin physical pages pinned during an ibt_map_mem_area() call.
5527c478bd9Sstevel@tonic-gate  */
5537c478bd9Sstevel@tonic-gate ibt_status_t
5547c478bd9Sstevel@tonic-gate ibt_unmap_mem_area(ibt_hca_hdl_t hca_hdl, ibt_ma_hdl_t ma_hdl)
5557c478bd9Sstevel@tonic-gate {
55643ed929aSsrust 	ibt_status_t 	status;
55743ed929aSsrust 
5587c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_unmap_mem_area(%p, %p)",
5597c478bd9Sstevel@tonic-gate 	    hca_hdl, ma_hdl);
5607c478bd9Sstevel@tonic-gate 
56143ed929aSsrust 	status = (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_unmap_mem_area(
5627c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), ma_hdl));
56343ed929aSsrust 	if (status == IBT_SUCCESS) {
56443ed929aSsrust 		mutex_enter(&hca_hdl->ha_mutex);
56543ed929aSsrust 		hca_hdl->ha_ma_cnt--;
56643ed929aSsrust 		mutex_exit(&hca_hdl->ha_mutex);
56743ed929aSsrust 	}
56843ed929aSsrust 
56943ed929aSsrust 	return (status);
5707c478bd9Sstevel@tonic-gate }
5717c478bd9Sstevel@tonic-gate 
572*03494a98SBill Taylor /*
573*03494a98SBill Taylor  * Function:
574*03494a98SBill Taylor  *	ibt_map_mem_iov()
575*03494a98SBill Taylor  * Input:
576*03494a98SBill Taylor  *      hca_hdl		HCA Handle
577*03494a98SBill Taylor  *	iov_attr	A pointer to an ibt_iov_attr_t that describes the
578*03494a98SBill Taylor  *			virtual ranges to be translated.
579*03494a98SBill Taylor  * Output:
580*03494a98SBill Taylor  *	wr		A pointer to the work request where the output
581*03494a98SBill Taylor  *			sgl (reserved_lkey, size, paddr) will be written.
582*03494a98SBill Taylor  *	mi_hdl_p	Memory IOV Handle.
583*03494a98SBill Taylor  * Returns:
584*03494a98SBill Taylor  *      IBT_SUCCESS
585*03494a98SBill Taylor  * Description:
586*03494a98SBill Taylor  * 	Translate an array of virtual address ranges into HCA physical
587*03494a98SBill Taylor  *	addresses, sizes, and reserved_lkey.
588*03494a98SBill Taylor  */
589*03494a98SBill Taylor ibt_status_t
590*03494a98SBill Taylor ibt_map_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_iov_attr_t *iov_attr,
591*03494a98SBill Taylor     ibt_all_wr_t *wr, ibt_mi_hdl_t *mi_hdl_p)
592*03494a98SBill Taylor {
593*03494a98SBill Taylor 	ibt_status_t 	status;
594*03494a98SBill Taylor 
595*03494a98SBill Taylor 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_map_mem_iov(%p, %p, %p)",
596*03494a98SBill Taylor 	    hca_hdl, iov_attr, wr);
597*03494a98SBill Taylor 
598*03494a98SBill Taylor 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_map_mem_iov(
599*03494a98SBill Taylor 	    IBTL_HCA2CIHCA(hca_hdl), iov_attr, wr, mi_hdl_p);
600*03494a98SBill Taylor 	if (status == IBT_SUCCESS) {
601*03494a98SBill Taylor 		mutex_enter(&hca_hdl->ha_mutex);
602*03494a98SBill Taylor 		hca_hdl->ha_ma_cnt++;
603*03494a98SBill Taylor 		mutex_exit(&hca_hdl->ha_mutex);
604*03494a98SBill Taylor 	}
605*03494a98SBill Taylor 
606*03494a98SBill Taylor 	return (status);
607*03494a98SBill Taylor }
608*03494a98SBill Taylor 
609*03494a98SBill Taylor 
610*03494a98SBill Taylor /*
611*03494a98SBill Taylor  * Function:
612*03494a98SBill Taylor  *	ibt_unmap_mem_iov()
613*03494a98SBill Taylor  * Input:
614*03494a98SBill Taylor  *      hca_hdl		HCA Handle
615*03494a98SBill Taylor  *	mi_hdl		Memory IOV Handle.
616*03494a98SBill Taylor  * Output:
617*03494a98SBill Taylor  *	None.
618*03494a98SBill Taylor  * Returns:
619*03494a98SBill Taylor  *      IBT_SUCCESS
620*03494a98SBill Taylor  * Description:
621*03494a98SBill Taylor  * 	Un pin physical pages pinned during an ibt_map_mem_iov() call.
622*03494a98SBill Taylor  */
623*03494a98SBill Taylor ibt_status_t
624*03494a98SBill Taylor ibt_unmap_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_mi_hdl_t mi_hdl)
625*03494a98SBill Taylor {
626*03494a98SBill Taylor 	ibt_status_t 	status;
627*03494a98SBill Taylor 
628*03494a98SBill Taylor 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_unmap_mem_iov(%p, %p)",
629*03494a98SBill Taylor 	    hca_hdl, mi_hdl);
630*03494a98SBill Taylor 
631*03494a98SBill Taylor 	status = (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_unmap_mem_iov(
632*03494a98SBill Taylor 	    IBTL_HCA2CIHCA(hca_hdl), mi_hdl));
633*03494a98SBill Taylor 	if (status == IBT_SUCCESS) {
634*03494a98SBill Taylor 		mutex_enter(&hca_hdl->ha_mutex);
635*03494a98SBill Taylor 		hca_hdl->ha_ma_cnt--;
636*03494a98SBill Taylor 		mutex_exit(&hca_hdl->ha_mutex);
637*03494a98SBill Taylor 	}
638*03494a98SBill Taylor 
639*03494a98SBill Taylor 	return (status);
640*03494a98SBill Taylor }
641*03494a98SBill Taylor 
642*03494a98SBill Taylor /*
643*03494a98SBill Taylor  * Function:
644*03494a98SBill Taylor  *	ibt_alloc_io_mem()
645*03494a98SBill Taylor  * Input:
646*03494a98SBill Taylor  *      hca_hdl		HCA Handle
647*03494a98SBill Taylor  *	size		Number of bytes to allocate
648*03494a98SBill Taylor  *	mr_flag		Possible values: IBT_MR_SLEEP, IBT_MR_NONCOHERENT
649*03494a98SBill Taylor  * Output:
650*03494a98SBill Taylor  *     	kaddrp 		Contains pointer to the virtual address of the
651*03494a98SBill Taylor  *			memory allocated by this call.  (Set to NULL if
652*03494a98SBill Taylor  *			memory allocation fails).
653*03494a98SBill Taylor  *	mem_alloc_hdl	Memory access handle returned by ibt_mem_alloc()
654*03494a98SBill Taylor  *
655*03494a98SBill Taylor  * Returns:
656*03494a98SBill Taylor  *      IBT_SUCCESS
657*03494a98SBill Taylor  *	IBT_INSUFF_RESOURCE
658*03494a98SBill Taylor  * 	IBT_HCA_HDL_INVALID
659*03494a98SBill Taylor  *	IBT_MR_ACCESS_REQ_INVALID
660*03494a98SBill Taylor  *	IBT_INVALID_PARAM
661*03494a98SBill Taylor  * Description:
662*03494a98SBill Taylor  *	Wrapper for ddi_dma_mem_alloc()
663*03494a98SBill Taylor  */
664*03494a98SBill Taylor ibt_status_t
665*03494a98SBill Taylor ibt_alloc_io_mem(ibt_hca_hdl_t hca_hdl, size_t size, ibt_mr_flags_t mr_flag,
666*03494a98SBill Taylor     caddr_t *kaddrp, ibt_mem_alloc_hdl_t *mem_alloc_hdl)
667*03494a98SBill Taylor {
668*03494a98SBill Taylor 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_io_mem(
669*03494a98SBill Taylor 	    IBTL_HCA2CIHCA(hca_hdl), size, mr_flag, kaddrp,
670*03494a98SBill Taylor 	    (ibc_mem_alloc_hdl_t *)mem_alloc_hdl));
671*03494a98SBill Taylor }
672*03494a98SBill Taylor 
673*03494a98SBill Taylor /*
674*03494a98SBill Taylor  * Function:
675*03494a98SBill Taylor  *	ibt_free_io_mem()
676*03494a98SBill Taylor  * Input:
677*03494a98SBill Taylor  *      hca_hdl		HCA Handle
678*03494a98SBill Taylor  *	mem_alloc_hdl	Memory access handle returned by ibt_mem_alloc()
679*03494a98SBill Taylor  * Output:
680*03494a98SBill Taylor  *	None
681*03494a98SBill Taylor  *
682*03494a98SBill Taylor  * Returns:
683*03494a98SBill Taylor  *      IBT_SUCCESS
684*03494a98SBill Taylor  * Description:
685*03494a98SBill Taylor  *	Wrapper for ddi_dma_mem_free()
686*03494a98SBill Taylor  */
687*03494a98SBill Taylor ibt_status_t
688*03494a98SBill Taylor ibt_free_io_mem(ibt_hca_hdl_t hca_hdl, ibt_mem_alloc_hdl_t mem_alloc_hdl)
689*03494a98SBill Taylor {
690*03494a98SBill Taylor 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_free_io_mem(
691*03494a98SBill Taylor 	    IBTL_HCA2CIHCA(hca_hdl), (ibc_mem_alloc_hdl_t)mem_alloc_hdl));
692*03494a98SBill Taylor }
6937c478bd9Sstevel@tonic-gate 
6947c478bd9Sstevel@tonic-gate /*
6957c478bd9Sstevel@tonic-gate  * Function:
6967c478bd9Sstevel@tonic-gate  *	ibt_alloc_lkey()
6977c478bd9Sstevel@tonic-gate  * Input:
6987c478bd9Sstevel@tonic-gate  *      hca_hdl			HCA Handle
6997c478bd9Sstevel@tonic-gate  *	pd			A protection domain handle.
7007c478bd9Sstevel@tonic-gate  *	flags			Access control.
7017c478bd9Sstevel@tonic-gate  *	phys_buf_list_sz	Requested size of Physical Buffer List (PBL)
7027c478bd9Sstevel@tonic-gate  *				resources to be allocated.
7037c478bd9Sstevel@tonic-gate  * Output:
7047c478bd9Sstevel@tonic-gate  *	mr_hdl_p		The returned IBT memory region handle.
7057c478bd9Sstevel@tonic-gate  *	mem_desc_p		Returned memory descriptor.
7067c478bd9Sstevel@tonic-gate  * Returns:
7077c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
7087c478bd9Sstevel@tonic-gate  * Description:
7097c478bd9Sstevel@tonic-gate  * 	Allocates physical buffer list resources for use in memory
7107c478bd9Sstevel@tonic-gate  *	registrations.
7117c478bd9Sstevel@tonic-gate  */
7127c478bd9Sstevel@tonic-gate ibt_status_t
7137c478bd9Sstevel@tonic-gate ibt_alloc_lkey(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, ibt_lkey_flags_t flags,
7147c478bd9Sstevel@tonic-gate     uint_t phys_buf_list_sz, ibt_mr_hdl_t *mr_hdl_p,
7157c478bd9Sstevel@tonic-gate     ibt_pmr_desc_t *mem_desc_p)
7167c478bd9Sstevel@tonic-gate {
71743ed929aSsrust 	ibt_status_t 	status;
71843ed929aSsrust 
7197c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_alloc_lkey(%p, %p, 0x%X, %d)",
7207c478bd9Sstevel@tonic-gate 	    hca_hdl, pd, flags, phys_buf_list_sz);
7217c478bd9Sstevel@tonic-gate 
72243ed929aSsrust 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_alloc_lkey(
7237c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), pd, flags, phys_buf_list_sz, mr_hdl_p,
72443ed929aSsrust 	    mem_desc_p);
72543ed929aSsrust 	if (status == IBT_SUCCESS) {
72643ed929aSsrust 		mutex_enter(&hca_hdl->ha_mutex);
72743ed929aSsrust 		hca_hdl->ha_mr_cnt++;
72843ed929aSsrust 		mutex_exit(&hca_hdl->ha_mutex);
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_register_phys_mr()
7387c478bd9Sstevel@tonic-gate  * Input:
7397c478bd9Sstevel@tonic-gate  *      hca_hdl		HCA Handle
7407c478bd9Sstevel@tonic-gate  *	pd		A protection domain handle.
7417c478bd9Sstevel@tonic-gate  *	mem_pattr	Requested memory region physical attributes.
7427c478bd9Sstevel@tonic-gate  * Output:
7437c478bd9Sstevel@tonic-gate  *	mr_hdl_p	The returned IBT memory region handle.
7447c478bd9Sstevel@tonic-gate  *	mem_desc_p	Returned memory descriptor.
7457c478bd9Sstevel@tonic-gate  * Returns:
7467c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
7477c478bd9Sstevel@tonic-gate  * Description:
7487c478bd9Sstevel@tonic-gate  * 	Prepares a physically addressed memory region for use by a HCA.
7497c478bd9Sstevel@tonic-gate  */
7507c478bd9Sstevel@tonic-gate ibt_status_t
7517c478bd9Sstevel@tonic-gate ibt_register_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
7527c478bd9Sstevel@tonic-gate     ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
7537c478bd9Sstevel@tonic-gate     ibt_pmr_desc_t *mem_desc_p)
7547c478bd9Sstevel@tonic-gate {
75543ed929aSsrust 	ibt_status_t 	status;
75643ed929aSsrust 
7577c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_phys_mr(%p, %p, %p)",
7587c478bd9Sstevel@tonic-gate 	    hca_hdl, pd, mem_pattr);
7597c478bd9Sstevel@tonic-gate 
76043ed929aSsrust 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_physical_mr(
7617c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), pd, mem_pattr,
7627c478bd9Sstevel@tonic-gate 	    NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
76343ed929aSsrust 	    mr_hdl_p, mem_desc_p);
76443ed929aSsrust 	if (status == IBT_SUCCESS) {
76543ed929aSsrust 		mutex_enter(&hca_hdl->ha_mutex);
76643ed929aSsrust 		hca_hdl->ha_mr_cnt++;
76743ed929aSsrust 		mutex_exit(&hca_hdl->ha_mutex);
76843ed929aSsrust 	}
76943ed929aSsrust 
77043ed929aSsrust 	return (status);
7717c478bd9Sstevel@tonic-gate }
7727c478bd9Sstevel@tonic-gate 
7737c478bd9Sstevel@tonic-gate 
7747c478bd9Sstevel@tonic-gate /*
7757c478bd9Sstevel@tonic-gate  * Function:
7767c478bd9Sstevel@tonic-gate  *	ibt_reregister_phys_mr()
7777c478bd9Sstevel@tonic-gate  * Input:
7787c478bd9Sstevel@tonic-gate  *      hca_hdl		HCA Handle
7797c478bd9Sstevel@tonic-gate  *	mr_hdl		The IBT memory region handle.
7807c478bd9Sstevel@tonic-gate  *	pd		A protection domain handle.
7817c478bd9Sstevel@tonic-gate  *	mem_pattr	Requested memory region physical attributes.
7827c478bd9Sstevel@tonic-gate  * Output:
7837c478bd9Sstevel@tonic-gate  *	mr_hdl_p	The returned IBT memory region handle.
7847c478bd9Sstevel@tonic-gate  *	mem_desc_p	Returned memory descriptor.
7857c478bd9Sstevel@tonic-gate  * Returns:
7867c478bd9Sstevel@tonic-gate  *      IBT_SUCCESS
7877c478bd9Sstevel@tonic-gate  * Description:
7887c478bd9Sstevel@tonic-gate  * 	Prepares a physically addressed memory region for use by a HCA.
7897c478bd9Sstevel@tonic-gate  */
7907c478bd9Sstevel@tonic-gate ibt_status_t
7917c478bd9Sstevel@tonic-gate ibt_reregister_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
7927c478bd9Sstevel@tonic-gate     ibt_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
7937c478bd9Sstevel@tonic-gate     ibt_pmr_desc_t *mem_desc_p)
7947c478bd9Sstevel@tonic-gate {
79543ed929aSsrust 	ibt_status_t 	status;
79643ed929aSsrust 
7977c478bd9Sstevel@tonic-gate 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_reregister_phys_mr(%p, %p, %p, %p)",
7987c478bd9Sstevel@tonic-gate 	    hca_hdl, mr_hdl, pd, mem_pattr);
7997c478bd9Sstevel@tonic-gate 
80043ed929aSsrust 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_reregister_physical_mr(
8017c478bd9Sstevel@tonic-gate 	    IBTL_HCA2CIHCA(hca_hdl), mr_hdl, pd, mem_pattr,
8027c478bd9Sstevel@tonic-gate 	    NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
80343ed929aSsrust 	    mr_hdl_p, mem_desc_p);
80443ed929aSsrust 
80543ed929aSsrust 	if (!(status == IBT_SUCCESS || status == IBT_MR_IN_USE ||
80643ed929aSsrust 	    status == IBT_HCA_HDL_INVALID || status == IBT_MR_HDL_INVALID)) {
80743ed929aSsrust 		IBTF_DPRINTF_L2(ibtl_mem, "ibt_reregister_phys_mr: "
80843ed929aSsrust 		    "Re-registration Mem Failed: %d", status);
80943ed929aSsrust 
81043ed929aSsrust 		/* we lost one memory region resource */
81143ed929aSsrust 		mutex_enter(&hca_hdl->ha_mutex);
81243ed929aSsrust 		hca_hdl->ha_mr_cnt--;
81343ed929aSsrust 		mutex_exit(&hca_hdl->ha_mutex);
81443ed929aSsrust 
81543ed929aSsrust 	}
81643ed929aSsrust 	return (status);
81743ed929aSsrust }
81843ed929aSsrust 
81943ed929aSsrust 
82043ed929aSsrust /*
82143ed929aSsrust  * Fast Memory Registration (FMR).
82243ed929aSsrust  *
82343ed929aSsrust  * ibt_create_fmr_pool
82443ed929aSsrust  *      Not fast-path.
82543ed929aSsrust  *      ibt_create_fmr_pool() verifies that the HCA supports FMR and allocates
82643ed929aSsrust  *      and initializes an "FMR pool".  This pool contains state specific to
82743ed929aSsrust  *      this registration, including the watermark setting to determine when
82843ed929aSsrust  *      to sync, and the total number of FMR regions available within this pool.
82943ed929aSsrust  *
83043ed929aSsrust  */
83143ed929aSsrust ibt_status_t
83243ed929aSsrust ibt_create_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
83343ed929aSsrust     ibt_fmr_pool_attr_t *fmr_params, ibt_fmr_pool_hdl_t *fmr_pool_p)
83443ed929aSsrust {
83543ed929aSsrust 	ibt_status_t 		status;
83643ed929aSsrust 
83743ed929aSsrust 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_create_fmr_pool(%p, %p, %p)",
83843ed929aSsrust 	    hca_hdl, pd, fmr_params);
83943ed929aSsrust 
84043ed929aSsrust 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_create_fmr_pool(
84143ed929aSsrust 	    IBTL_HCA2CIHCA(hca_hdl), pd, fmr_params, fmr_pool_p);
84243ed929aSsrust 	if (status != IBT_SUCCESS) {
84343ed929aSsrust 		*fmr_pool_p = NULL;
84443ed929aSsrust 		return (status);
84543ed929aSsrust 	}
84643ed929aSsrust 
84743ed929aSsrust 	/* Update the FMR resource count */
84843ed929aSsrust 	mutex_enter(&hca_hdl->ha_mutex);
84943ed929aSsrust 	hca_hdl->ha_fmr_pool_cnt++;
85043ed929aSsrust 	mutex_exit(&hca_hdl->ha_mutex);
85143ed929aSsrust 
85243ed929aSsrust 	return (status);
85343ed929aSsrust }
85443ed929aSsrust 
85543ed929aSsrust 
85643ed929aSsrust /*
85743ed929aSsrust  * ibt_destroy_fmr_pool
85843ed929aSsrust  *      ibt_destroy_fmr_pool() deallocates all of the FMR regions in a specific
85943ed929aSsrust  *      pool.  All state and information regarding the pool are destroyed and
86043ed929aSsrust  *      returned as free space once again.  No more use of FMR regions in this
86143ed929aSsrust  *      pool are possible without a subsequent call to ibt_create_fmr_pool().
86243ed929aSsrust  */
86343ed929aSsrust ibt_status_t
86443ed929aSsrust ibt_destroy_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_fmr_pool_hdl_t fmr_pool)
86543ed929aSsrust {
86643ed929aSsrust 	ibt_status_t 	status;
86743ed929aSsrust 
86843ed929aSsrust 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_destroy_fmr_pool(%p, %p)",
86943ed929aSsrust 	    hca_hdl, fmr_pool);
87043ed929aSsrust 
87143ed929aSsrust 	status = IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_destroy_fmr_pool(
87243ed929aSsrust 	    IBTL_HCA2CIHCA(hca_hdl), fmr_pool);
87343ed929aSsrust 	if (status != IBT_SUCCESS) {
87443ed929aSsrust 		IBTF_DPRINTF_L2(ibtl_mem, "ibt_destroy_fmr_pool: "
87543ed929aSsrust 		    "CI FMR Pool destroy failed (%d)", status);
87643ed929aSsrust 		return (status);
87743ed929aSsrust 	}
87843ed929aSsrust 
87943ed929aSsrust 	mutex_enter(&hca_hdl->ha_mutex);
88043ed929aSsrust 	hca_hdl->ha_fmr_pool_cnt--;
88143ed929aSsrust 	mutex_exit(&hca_hdl->ha_mutex);
88243ed929aSsrust 
88343ed929aSsrust 	return (status);
88443ed929aSsrust }
88543ed929aSsrust 
88643ed929aSsrust /*
88743ed929aSsrust  * ibt_flush_fmr_pool
88843ed929aSsrust  *      ibt_flush_fmr_pool forces a flush to occur.  At the client's request,
88943ed929aSsrust  *      any unmapped FMR regions (See 'ibt_deregister_mr())') are returned to
89043ed929aSsrust  *      a free state.  This function allows for an asynchronous cleanup of
89143ed929aSsrust  *      formerly used FMR regions.  Sync operation is also performed internally
89243ed929aSsrust  *      by HCA driver, when 'watermark' settings for the number of free FMR
89343ed929aSsrust  *      regions left in the "pool" is reached.
89443ed929aSsrust  */
89543ed929aSsrust ibt_status_t
89643ed929aSsrust ibt_flush_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_fmr_pool_hdl_t fmr_pool)
89743ed929aSsrust {
89843ed929aSsrust 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_flush_fmr_pool(%p, %p)",
89943ed929aSsrust 	    hca_hdl, fmr_pool);
90043ed929aSsrust 
90143ed929aSsrust 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_flush_fmr_pool(
90243ed929aSsrust 	    IBTL_HCA2CIHCA(hca_hdl), fmr_pool));
90343ed929aSsrust }
90443ed929aSsrust 
90543ed929aSsrust /*
90643ed929aSsrust  * ibt_register_physical_fmr
90743ed929aSsrust  *      ibt_register_physical_fmr() assigns a "free" entry from the FMR Pool.
90843ed929aSsrust  *      It first consults the "FMR cache" to see if this is a duplicate memory
90943ed929aSsrust  *      registration to something already in use.  If not, then a free entry
91043ed929aSsrust  *      in the "pool" is marked used.
91143ed929aSsrust  */
91243ed929aSsrust ibt_status_t
91343ed929aSsrust ibt_register_physical_fmr(ibt_hca_hdl_t hca_hdl, ibt_fmr_pool_hdl_t fmr_pool,
91443ed929aSsrust     ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
91543ed929aSsrust     ibt_pmr_desc_t *mem_desc_p)
91643ed929aSsrust {
91743ed929aSsrust 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_register_physical_fmr(%p, %p, %p, %p)",
91843ed929aSsrust 	    hca_hdl, fmr_pool, mem_pattr, mem_desc_p);
91943ed929aSsrust 
92043ed929aSsrust 	return (IBTL_HCA2CIHCAOPS_P(hca_hdl)->ibc_register_physical_fmr(
92143ed929aSsrust 	    IBTL_HCA2CIHCA(hca_hdl), fmr_pool, mem_pattr,
92243ed929aSsrust 	    NULL, /* IBTL_HCA2MODI_P(hca_hdl)->mi_reserved */
9237c478bd9Sstevel@tonic-gate 	    mr_hdl_p, mem_desc_p));
9247c478bd9Sstevel@tonic-gate }
92543ed929aSsrust 
92643ed929aSsrust /*
92743ed929aSsrust  * ibt_deregister_fmr
92843ed929aSsrust  *	The ibt_deregister_fmr un-maps the resources reserved from the FMR
92943ed929aSsrust  *	pool by ibt_register_physical_fmr().   The ibt_deregister_fmr() will
93043ed929aSsrust  *	mark the region as free in the FMR Pool.
93143ed929aSsrust  */
93243ed929aSsrust ibt_status_t
93343ed929aSsrust ibt_deregister_fmr(ibt_hca_hdl_t hca, ibt_mr_hdl_t mr_hdl)
93443ed929aSsrust {
93543ed929aSsrust 	IBTF_DPRINTF_L3(ibtl_mem, "ibt_deregister_fmr(%p, %p)", hca, mr_hdl);
93643ed929aSsrust 
93743ed929aSsrust 	return (IBTL_HCA2CIHCAOPS_P(hca)->ibc_deregister_fmr(
93843ed929aSsrust 	    IBTL_HCA2CIHCA(hca), mr_hdl));
93943ed929aSsrust }
940