xref: /illumos-gate/usr/src/uts/common/io/ib/ibtl/ibtl_mem.c (revision 6a634c9d)
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