[IBAL, HW] Remove pointers from ci_umv_buf_t.
[mirror/winof/.git] / hw / mlx4 / kernel / hca / pd.c
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. \r
4  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
5  *\r
6  * This software is available to you under the OpenIB.org BSD license\r
7  * below:\r
8  *\r
9  *     Redistribution and use in source and binary forms, with or\r
10  *     without modification, are permitted provided that the following\r
11  *     conditions are met:\r
12  *\r
13  *      - Redistributions of source code must retain the above\r
14  *        copyright notice, this list of conditions and the following\r
15  *        disclaimer.\r
16  *\r
17  *      - Redistributions in binary form must reproduce the above\r
18  *        copyright notice, this list of conditions and the following\r
19  *        disclaimer in the documentation and/or other materials\r
20  *        provided with the distribution.\r
21  *\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
29  * SOFTWARE.\r
30  *\r
31  * $Id: al.c 1611 2006-08-20 14:48:55Z sleybo $\r
32  */\r
33 \r
34 #include "precomp.h"\r
35 #if defined(EVENT_TRACING)\r
36 #ifdef offsetof\r
37 #undef offsetof\r
38 #endif\r
39 #include "pd.tmh"\r
40 #endif\r
41 \r
42 \r
43 /* Protection domains */\r
44 \r
45 ib_api_status_t\r
46 mlnx_allocate_pd (\r
47         IN              const   ib_ca_handle_t                          h_ca,\r
48         IN              const   ib_pd_type_t                            type,\r
49                 OUT                     ib_pd_handle_t                          *ph_pd,\r
50         IN      OUT                     ci_umv_buf_t                            *p_umv_buf )\r
51 {\r
52         ib_api_status_t         status;\r
53         struct ib_device *p_ibdev;\r
54         struct ib_ucontext *p_uctx;\r
55         struct ib_pd *p_ib_pd;\r
56         struct ib_udata udata;\r
57         struct ibv_alloc_pd_resp *p_resp = NULL;\r
58         int err;\r
59 \r
60         //TODO: how are we to use it ?\r
61         UNREFERENCED_PARAMETER(type);\r
62         \r
63         HCA_ENTER(HCA_DBG_PD);\r
64 \r
65         if( p_umv_buf ) {\r
66                 p_uctx = (struct ib_ucontext *)h_ca;\r
67                 p_ibdev = p_uctx->device;\r
68 \r
69                 if( p_umv_buf->command ) {\r
70                         // sanity checks \r
71                         if (p_umv_buf->output_size < sizeof(struct ibv_alloc_pd_resp) ||\r
72                                 !p_umv_buf->p_inout_buf) {\r
73                                 status = IB_INVALID_PARAMETER;\r
74                                 goto err_alloc_pd;\r
75                         }\r
76 \r
77                         // prepare user parameters\r
78                         p_resp = (struct ibv_alloc_pd_resp*)(ULONG_PTR)p_umv_buf->p_inout_buf;\r
79                         INIT_UDATA(&udata, NULL, &p_resp->pdn, \r
80                                 0, sizeof(p_resp->pdn));\r
81                 }\r
82                 else {\r
83                         u32 pdn;\r
84                         INIT_UDATA(&udata, NULL, &pdn, \r
85                                 0, sizeof(pdn));\r
86                 }\r
87         }\r
88         else {\r
89                 mlnx_hca_t *p_hca = (mlnx_hca_t *)h_ca;\r
90                 p_ibdev = hca2ibdev(p_hca);\r
91                 p_uctx = NULL;\r
92         }\r
93         \r
94         // create PD\r
95         p_ib_pd = p_ibdev->alloc_pd(p_ibdev, p_uctx, &udata);\r
96 \r
97         if (IS_ERR(p_ib_pd)){\r
98                 err = PTR_ERR(p_ib_pd);\r
99                 status = errno_to_iberr(err);\r
100                 HCA_PRINT(TRACE_LEVEL_ERROR,HCA_DBG_PD,\r
101                         ("ibv_alloc_pd failed (%#x)\n", status));\r
102                 goto err_alloc_pd;\r
103         }\r
104         else {\r
105                 p_ib_pd->device  = p_ibdev;\r
106                 p_ib_pd->p_uctx = p_uctx;\r
107                 atomic_set(&p_ib_pd->usecnt, 0);\r
108                 HCA_PRINT(TRACE_LEVEL_INFORMATION ,HCA_DBG_PD ,("pdn %d, usecnt %d, pd_handle %p, ctx %p \n", \r
109                         ((struct mlx4_ib_pd*)p_ib_pd)->pdn, p_ib_pd->usecnt, p_ib_pd, p_ib_pd->p_uctx));\r
110         }\r
111 \r
112         // complete user response\r
113         if (p_umv_buf && p_umv_buf->command) {\r
114                 p_resp->pd_handle = (u64)(ULONG_PTR)p_ib_pd;\r
115         }\r
116         \r
117         // return the result\r
118         if (ph_pd) *ph_pd = (ib_pd_handle_t)p_ib_pd;\r
119 \r
120         status = IB_SUCCESS;\r
121         \r
122 err_alloc_pd:   \r
123         if (p_umv_buf && p_umv_buf->command) \r
124                 p_umv_buf->status = status;\r
125         HCA_EXIT(HCA_DBG_PD);\r
126         return status;\r
127 }\r
128 \r
129 ib_api_status_t\r
130 mlnx_deallocate_pd (\r
131         IN                              ib_pd_handle_t                          h_pd)\r
132 {\r
133         ib_api_status_t         status;\r
134         int err;\r
135         struct ib_pd *p_ib_pd = (struct ib_pd *)h_pd;\r
136 \r
137         HCA_ENTER( HCA_DBG_PD);\r
138 \r
139         HCA_PRINT(TRACE_LEVEL_INFORMATION,HCA_DBG_PD,\r
140                 ("pcs %p\n", PsGetCurrentProcess()));\r
141         \r
142         if (!hca_is_livefish(p_ib_pd->device->x.p_fdo)) {\r
143                 if (atomic_read(&p_ib_pd->usecnt)) {\r
144                         HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_PD,\r
145                                 ("resources are not released (pdn %d, cnt %d)\n", \r
146                                 ((struct mlx4_ib_pd*)p_ib_pd)->pdn, p_ib_pd->usecnt));\r
147                         status = IB_RESOURCE_BUSY;\r
148                         goto err_dealloc_pd;\r
149                 }               \r
150         }\r
151 \r
152         err = p_ib_pd->device->dealloc_pd(p_ib_pd);\r
153         if (err) {\r
154                 status = errno_to_iberr(err);\r
155                 HCA_PRINT(TRACE_LEVEL_ERROR,HCA_DBG_PD\r
156                         ,("ibv_dealloc_pd failed (%#x)\n", status));\r
157                 goto err_dealloc_pd;\r
158         }\r
159         status = IB_SUCCESS;\r
160 \r
161 err_dealloc_pd:\r
162         HCA_EXIT(HCA_DBG_PD);\r
163         return status;\r
164 }\r
165 \r
166 \r
167 void\r
168 mlnx_pd_if(\r
169         IN      OUT                     ci_interface_t                          *p_interface )\r
170 {\r
171         p_interface->allocate_pd = mlnx_allocate_pd;\r
172         p_interface->deallocate_pd = mlnx_deallocate_pd;\r
173 }\r
174 \r