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