2 * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33 #include <linux/module.h>
34 #include <linux/moduleparam.h>
35 #include <rdma/ib_umem.h>
36 #include <linux/atomic.h>
37 #include <rdma/ib_user_verbs.h>
42 module_param(use_dsgl
, int, 0644);
43 MODULE_PARM_DESC(use_dsgl
, "Use DSGL for PBL/FastReg (default=1) (DEPRECATED)");
45 #define T4_ULPTX_MIN_IO 32
46 #define C4IW_MAX_INLINE_SIZE 96
47 #define T4_ULPTX_MAX_DMA 1024
48 #define C4IW_INLINE_THRESHOLD 128
50 static int inline_threshold
= C4IW_INLINE_THRESHOLD
;
51 module_param(inline_threshold
, int, 0644);
52 MODULE_PARM_DESC(inline_threshold
, "inline vs dsgl threshold (default=128)");
54 static int mr_exceeds_hw_limits(struct c4iw_dev
*dev
, u64 length
)
56 return (is_t4(dev
->rdev
.lldi
.adapter_type
) ||
57 is_t5(dev
->rdev
.lldi
.adapter_type
)) &&
58 length
>= 8*1024*1024*1024ULL;
61 static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev
*rdev
, u32 addr
,
62 u32 len
, dma_addr_t data
,
64 struct c4iw_wr_wait
*wr_waitp
)
66 struct ulp_mem_io
*req
;
67 struct ulptx_sgl
*sgl
;
74 c4iw_init_wr_wait(wr_waitp
);
75 wr_len
= roundup(sizeof(*req
) + sizeof(*sgl
), 16);
78 skb
= alloc_skb(wr_len
, GFP_KERNEL
| __GFP_NOFAIL
);
82 set_wr_txq(skb
, CPL_PRIORITY_CONTROL
, 0);
84 req
= __skb_put_zero(skb
, wr_len
);
85 INIT_ULPTX_WR(req
, wr_len
, 0, 0);
86 req
->wr
.wr_hi
= cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR
) |
87 (wr_waitp
? FW_WR_COMPL_F
: 0));
88 req
->wr
.wr_lo
= wr_waitp
? (__force __be64
)(unsigned long)wr_waitp
: 0L;
89 req
->wr
.wr_mid
= cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(wr_len
, 16)));
90 req
->cmd
= cpu_to_be32(ULPTX_CMD_V(ULP_TX_MEM_WRITE
) |
91 T5_ULP_MEMIO_ORDER_V(1) |
92 T5_ULP_MEMIO_FID_V(rdev
->lldi
.rxq_ids
[0]));
93 req
->dlen
= cpu_to_be32(ULP_MEMIO_DATA_LEN_V(len
>>5));
94 req
->len16
= cpu_to_be32(DIV_ROUND_UP(wr_len
-sizeof(req
->wr
), 16));
95 req
->lock_addr
= cpu_to_be32(ULP_MEMIO_ADDR_V(addr
));
97 sgl
= (struct ulptx_sgl
*)(req
+ 1);
98 sgl
->cmd_nsge
= cpu_to_be32(ULPTX_CMD_V(ULP_TX_SC_DSGL
) |
100 sgl
->len0
= cpu_to_be32(len
);
101 sgl
->addr0
= cpu_to_be64(data
);
104 ret
= c4iw_ref_send_wait(rdev
, skb
, wr_waitp
, 0, 0, __func__
);
106 ret
= c4iw_ofld_send(rdev
, skb
);
110 static int _c4iw_write_mem_inline(struct c4iw_rdev
*rdev
, u32 addr
, u32 len
,
111 void *data
, struct sk_buff
*skb
,
112 struct c4iw_wr_wait
*wr_waitp
)
114 struct ulp_mem_io
*req
;
115 struct ulptx_idata
*sc
;
116 u8 wr_len
, *to_dp
, *from_dp
;
117 int copy_len
, num_wqe
, i
, ret
= 0;
118 __be32 cmd
= cpu_to_be32(ULPTX_CMD_V(ULP_TX_MEM_WRITE
));
120 if (is_t4(rdev
->lldi
.adapter_type
))
121 cmd
|= cpu_to_be32(ULP_MEMIO_ORDER_F
);
123 cmd
|= cpu_to_be32(T5_ULP_MEMIO_IMM_F
);
126 pr_debug("addr 0x%x len %u\n", addr
, len
);
127 num_wqe
= DIV_ROUND_UP(len
, C4IW_MAX_INLINE_SIZE
);
128 c4iw_init_wr_wait(wr_waitp
);
129 for (i
= 0; i
< num_wqe
; i
++) {
131 copy_len
= len
> C4IW_MAX_INLINE_SIZE
? C4IW_MAX_INLINE_SIZE
:
133 wr_len
= roundup(sizeof(*req
) + sizeof(*sc
) +
134 roundup(copy_len
, T4_ULPTX_MIN_IO
),
138 skb
= alloc_skb(wr_len
, GFP_KERNEL
| __GFP_NOFAIL
);
142 set_wr_txq(skb
, CPL_PRIORITY_CONTROL
, 0);
144 req
= __skb_put_zero(skb
, wr_len
);
145 INIT_ULPTX_WR(req
, wr_len
, 0, 0);
147 if (i
== (num_wqe
-1)) {
148 req
->wr
.wr_hi
= cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR
) |
150 req
->wr
.wr_lo
= (__force __be64
)(unsigned long)wr_waitp
;
152 req
->wr
.wr_hi
= cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR
));
153 req
->wr
.wr_mid
= cpu_to_be32(
154 FW_WR_LEN16_V(DIV_ROUND_UP(wr_len
, 16)));
157 req
->dlen
= cpu_to_be32(ULP_MEMIO_DATA_LEN_V(
158 DIV_ROUND_UP(copy_len
, T4_ULPTX_MIN_IO
)));
159 req
->len16
= cpu_to_be32(DIV_ROUND_UP(wr_len
-sizeof(req
->wr
),
161 req
->lock_addr
= cpu_to_be32(ULP_MEMIO_ADDR_V(addr
+ i
* 3));
163 sc
= (struct ulptx_idata
*)(req
+ 1);
164 sc
->cmd_more
= cpu_to_be32(ULPTX_CMD_V(ULP_TX_SC_IMM
));
165 sc
->len
= cpu_to_be32(roundup(copy_len
, T4_ULPTX_MIN_IO
));
167 to_dp
= (u8
*)(sc
+ 1);
168 from_dp
= (u8
*)data
+ i
* C4IW_MAX_INLINE_SIZE
;
170 memcpy(to_dp
, from_dp
, copy_len
);
172 memset(to_dp
, 0, copy_len
);
173 if (copy_len
% T4_ULPTX_MIN_IO
)
174 memset(to_dp
+ copy_len
, 0, T4_ULPTX_MIN_IO
-
175 (copy_len
% T4_ULPTX_MIN_IO
));
176 if (i
== (num_wqe
-1))
177 ret
= c4iw_ref_send_wait(rdev
, skb
, wr_waitp
, 0, 0,
180 ret
= c4iw_ofld_send(rdev
, skb
);
184 len
-= C4IW_MAX_INLINE_SIZE
;
190 static int _c4iw_write_mem_dma(struct c4iw_rdev
*rdev
, u32 addr
, u32 len
,
191 void *data
, struct sk_buff
*skb
,
192 struct c4iw_wr_wait
*wr_waitp
)
200 daddr
= dma_map_single(&rdev
->lldi
.pdev
->dev
, data
, len
, DMA_TO_DEVICE
);
201 if (dma_mapping_error(&rdev
->lldi
.pdev
->dev
, daddr
))
205 while (remain
> inline_threshold
) {
206 if (remain
< T4_ULPTX_MAX_DMA
) {
207 if (remain
& ~T4_ULPTX_MIN_IO
)
208 dmalen
= remain
& ~(T4_ULPTX_MIN_IO
-1);
212 dmalen
= T4_ULPTX_MAX_DMA
;
214 ret
= _c4iw_write_mem_dma_aligned(rdev
, addr
, dmalen
, daddr
,
215 skb
, remain
? NULL
: wr_waitp
);
223 ret
= _c4iw_write_mem_inline(rdev
, addr
, remain
, data
, skb
,
226 dma_unmap_single(&rdev
->lldi
.pdev
->dev
, save
, len
, DMA_TO_DEVICE
);
231 * write len bytes of data into addr (32B aligned address)
232 * If data is NULL, clear len byte of memory to zero.
234 static int write_adapter_mem(struct c4iw_rdev
*rdev
, u32 addr
, u32 len
,
235 void *data
, struct sk_buff
*skb
,
236 struct c4iw_wr_wait
*wr_waitp
)
240 if (!rdev
->lldi
.ulptx_memwrite_dsgl
|| !use_dsgl
) {
241 ret
= _c4iw_write_mem_inline(rdev
, addr
, len
, data
, skb
,
246 if (len
<= inline_threshold
) {
247 ret
= _c4iw_write_mem_inline(rdev
, addr
, len
, data
, skb
,
252 ret
= _c4iw_write_mem_dma(rdev
, addr
, len
, data
, skb
, wr_waitp
);
254 pr_warn_ratelimited("%s: dma map failure (non fatal)\n",
255 pci_name(rdev
->lldi
.pdev
));
256 ret
= _c4iw_write_mem_inline(rdev
, addr
, len
, data
, skb
,
265 * Build and write a TPT entry.
266 * IN: stag key, pdid, perm, bind_enabled, zbva, to, len, page_size,
267 * pbl_size and pbl_addr
270 static int write_tpt_entry(struct c4iw_rdev
*rdev
, u32 reset_tpt_entry
,
271 u32
*stag
, u8 stag_state
, u32 pdid
,
272 enum fw_ri_stag_type type
, enum fw_ri_mem_perms perm
,
273 int bind_enabled
, u32 zbva
, u64 to
,
274 u64 len
, u8 page_size
, u32 pbl_size
, u32 pbl_addr
,
275 struct sk_buff
*skb
, struct c4iw_wr_wait
*wr_waitp
)
278 struct fw_ri_tpte
*tpt
;
282 if (c4iw_fatal_error(rdev
))
285 tpt
= kmalloc(sizeof(*tpt
), GFP_KERNEL
);
289 stag_state
= stag_state
> 0;
290 stag_idx
= (*stag
) >> 8;
292 if ((!reset_tpt_entry
) && (*stag
== T4_STAG_UNSET
)) {
293 stag_idx
= c4iw_get_resource(&rdev
->resource
.tpt_table
);
295 mutex_lock(&rdev
->stats
.lock
);
296 rdev
->stats
.stag
.fail
++;
297 mutex_unlock(&rdev
->stats
.lock
);
301 mutex_lock(&rdev
->stats
.lock
);
302 rdev
->stats
.stag
.cur
+= 32;
303 if (rdev
->stats
.stag
.cur
> rdev
->stats
.stag
.max
)
304 rdev
->stats
.stag
.max
= rdev
->stats
.stag
.cur
;
305 mutex_unlock(&rdev
->stats
.lock
);
306 *stag
= (stag_idx
<< 8) | (atomic_inc_return(&key
) & 0xff);
308 pr_debug("stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n",
309 stag_state
, type
, pdid
, stag_idx
);
311 /* write TPT entry */
313 memset(tpt
, 0, sizeof(*tpt
));
315 tpt
->valid_to_pdid
= cpu_to_be32(FW_RI_TPTE_VALID_F
|
316 FW_RI_TPTE_STAGKEY_V((*stag
& FW_RI_TPTE_STAGKEY_M
)) |
317 FW_RI_TPTE_STAGSTATE_V(stag_state
) |
318 FW_RI_TPTE_STAGTYPE_V(type
) | FW_RI_TPTE_PDID_V(pdid
));
319 tpt
->locread_to_qpid
= cpu_to_be32(FW_RI_TPTE_PERM_V(perm
) |
320 (bind_enabled
? FW_RI_TPTE_MWBINDEN_F
: 0) |
321 FW_RI_TPTE_ADDRTYPE_V((zbva
? FW_RI_ZERO_BASED_TO
:
323 FW_RI_TPTE_PS_V(page_size
));
324 tpt
->nosnoop_pbladdr
= !pbl_size
? 0 : cpu_to_be32(
325 FW_RI_TPTE_PBLADDR_V(PBL_OFF(rdev
, pbl_addr
)>>3));
326 tpt
->len_lo
= cpu_to_be32((u32
)(len
& 0xffffffffUL
));
327 tpt
->va_hi
= cpu_to_be32((u32
)(to
>> 32));
328 tpt
->va_lo_fbo
= cpu_to_be32((u32
)(to
& 0xffffffffUL
));
329 tpt
->dca_mwbcnt_pstag
= cpu_to_be32(0);
330 tpt
->len_hi
= cpu_to_be32((u32
)(len
>> 32));
332 err
= write_adapter_mem(rdev
, stag_idx
+
333 (rdev
->lldi
.vr
->stag
.start
>> 5),
334 sizeof(*tpt
), tpt
, skb
, wr_waitp
);
336 if (reset_tpt_entry
) {
337 c4iw_put_resource(&rdev
->resource
.tpt_table
, stag_idx
);
338 mutex_lock(&rdev
->stats
.lock
);
339 rdev
->stats
.stag
.cur
-= 32;
340 mutex_unlock(&rdev
->stats
.lock
);
346 static int write_pbl(struct c4iw_rdev
*rdev
, __be64
*pbl
,
347 u32 pbl_addr
, u32 pbl_size
, struct c4iw_wr_wait
*wr_waitp
)
351 pr_debug("*pdb_addr 0x%x, pbl_base 0x%x, pbl_size %d\n",
352 pbl_addr
, rdev
->lldi
.vr
->pbl
.start
,
355 err
= write_adapter_mem(rdev
, pbl_addr
>> 5, pbl_size
<< 3, pbl
, NULL
,
360 static int dereg_mem(struct c4iw_rdev
*rdev
, u32 stag
, u32 pbl_size
,
361 u32 pbl_addr
, struct sk_buff
*skb
,
362 struct c4iw_wr_wait
*wr_waitp
)
364 return write_tpt_entry(rdev
, 1, &stag
, 0, 0, 0, 0, 0, 0, 0UL, 0, 0,
365 pbl_size
, pbl_addr
, skb
, wr_waitp
);
368 static int allocate_window(struct c4iw_rdev
*rdev
, u32
*stag
, u32 pdid
,
369 struct c4iw_wr_wait
*wr_waitp
)
371 *stag
= T4_STAG_UNSET
;
372 return write_tpt_entry(rdev
, 0, stag
, 0, pdid
, FW_RI_STAG_MW
, 0, 0, 0,
373 0UL, 0, 0, 0, 0, NULL
, wr_waitp
);
376 static int deallocate_window(struct c4iw_rdev
*rdev
, u32 stag
,
378 struct c4iw_wr_wait
*wr_waitp
)
380 return write_tpt_entry(rdev
, 1, &stag
, 0, 0, 0, 0, 0, 0, 0UL, 0, 0, 0,
384 static int allocate_stag(struct c4iw_rdev
*rdev
, u32
*stag
, u32 pdid
,
385 u32 pbl_size
, u32 pbl_addr
,
386 struct c4iw_wr_wait
*wr_waitp
)
388 *stag
= T4_STAG_UNSET
;
389 return write_tpt_entry(rdev
, 0, stag
, 0, pdid
, FW_RI_STAG_NSMR
, 0, 0, 0,
390 0UL, 0, 0, pbl_size
, pbl_addr
, NULL
, wr_waitp
);
393 static int finish_mem_reg(struct c4iw_mr
*mhp
, u32 stag
)
398 mhp
->attr
.stag
= stag
;
400 mhp
->ibmr
.rkey
= mhp
->ibmr
.lkey
= stag
;
401 mhp
->ibmr
.length
= mhp
->attr
.len
;
402 mhp
->ibmr
.iova
= mhp
->attr
.va_fbo
;
403 mhp
->ibmr
.page_size
= 1U << (mhp
->attr
.page_size
+ 12);
404 pr_debug("mmid 0x%x mhp %p\n", mmid
, mhp
);
405 return xa_insert_irq(&mhp
->rhp
->mrs
, mmid
, mhp
, GFP_KERNEL
);
408 static int register_mem(struct c4iw_dev
*rhp
, struct c4iw_pd
*php
,
409 struct c4iw_mr
*mhp
, int shift
)
411 u32 stag
= T4_STAG_UNSET
;
414 ret
= write_tpt_entry(&rhp
->rdev
, 0, &stag
, 1, mhp
->attr
.pdid
,
415 FW_RI_STAG_NSMR
, mhp
->attr
.len
?
417 mhp
->attr
.mw_bind_enable
, mhp
->attr
.zbva
,
418 mhp
->attr
.va_fbo
, mhp
->attr
.len
?
419 mhp
->attr
.len
: -1, shift
- 12,
420 mhp
->attr
.pbl_size
, mhp
->attr
.pbl_addr
, NULL
,
425 ret
= finish_mem_reg(mhp
, stag
);
427 dereg_mem(&rhp
->rdev
, mhp
->attr
.stag
, mhp
->attr
.pbl_size
,
428 mhp
->attr
.pbl_addr
, mhp
->dereg_skb
, mhp
->wr_waitp
);
429 mhp
->dereg_skb
= NULL
;
434 static int alloc_pbl(struct c4iw_mr
*mhp
, int npages
)
436 mhp
->attr
.pbl_addr
= c4iw_pblpool_alloc(&mhp
->rhp
->rdev
,
439 if (!mhp
->attr
.pbl_addr
)
442 mhp
->attr
.pbl_size
= npages
;
447 struct ib_mr
*c4iw_get_dma_mr(struct ib_pd
*pd
, int acc
)
449 struct c4iw_dev
*rhp
;
453 u32 stag
= T4_STAG_UNSET
;
455 pr_debug("ib_pd %p\n", pd
);
456 php
= to_c4iw_pd(pd
);
459 mhp
= kzalloc(sizeof(*mhp
), GFP_KERNEL
);
461 return ERR_PTR(-ENOMEM
);
462 mhp
->wr_waitp
= c4iw_alloc_wr_wait(GFP_KERNEL
);
463 if (!mhp
->wr_waitp
) {
467 c4iw_init_wr_wait(mhp
->wr_waitp
);
469 mhp
->dereg_skb
= alloc_skb(SGE_MAX_WR_LEN
, GFP_KERNEL
);
470 if (!mhp
->dereg_skb
) {
472 goto err_free_wr_wait
;
476 mhp
->attr
.pdid
= php
->pdid
;
477 mhp
->attr
.perms
= c4iw_ib_to_tpt_access(acc
);
478 mhp
->attr
.mw_bind_enable
= (acc
&IB_ACCESS_MW_BIND
) == IB_ACCESS_MW_BIND
;
480 mhp
->attr
.va_fbo
= 0;
481 mhp
->attr
.page_size
= 0;
482 mhp
->attr
.len
= ~0ULL;
483 mhp
->attr
.pbl_size
= 0;
485 ret
= write_tpt_entry(&rhp
->rdev
, 0, &stag
, 1, php
->pdid
,
486 FW_RI_STAG_NSMR
, mhp
->attr
.perms
,
487 mhp
->attr
.mw_bind_enable
, 0, 0, ~0ULL, 0, 0, 0,
488 NULL
, mhp
->wr_waitp
);
492 ret
= finish_mem_reg(mhp
, stag
);
497 dereg_mem(&rhp
->rdev
, mhp
->attr
.stag
, mhp
->attr
.pbl_size
,
498 mhp
->attr
.pbl_addr
, mhp
->dereg_skb
, mhp
->wr_waitp
);
500 kfree_skb(mhp
->dereg_skb
);
502 c4iw_put_wr_wait(mhp
->wr_waitp
);
508 struct ib_mr
*c4iw_reg_user_mr(struct ib_pd
*pd
, u64 start
, u64 length
,
509 u64 virt
, int acc
, struct ib_udata
*udata
)
514 struct sg_dma_page_iter sg_iter
;
515 struct c4iw_dev
*rhp
;
519 pr_debug("ib_pd %p\n", pd
);
522 return ERR_PTR(-EINVAL
);
524 if ((length
+ start
) < start
)
525 return ERR_PTR(-EINVAL
);
527 php
= to_c4iw_pd(pd
);
530 if (mr_exceeds_hw_limits(rhp
, length
))
531 return ERR_PTR(-EINVAL
);
533 mhp
= kzalloc(sizeof(*mhp
), GFP_KERNEL
);
535 return ERR_PTR(-ENOMEM
);
536 mhp
->wr_waitp
= c4iw_alloc_wr_wait(GFP_KERNEL
);
540 mhp
->dereg_skb
= alloc_skb(SGE_MAX_WR_LEN
, GFP_KERNEL
);
542 goto err_free_wr_wait
;
546 mhp
->umem
= ib_umem_get(pd
->device
, start
, length
, acc
);
547 if (IS_ERR(mhp
->umem
))
552 n
= ib_umem_num_pages(mhp
->umem
);
553 err
= alloc_pbl(mhp
, n
);
555 goto err_umem_release
;
557 pages
= (__be64
*) __get_free_page(GFP_KERNEL
);
565 for_each_sg_dma_page(mhp
->umem
->sg_head
.sgl
, &sg_iter
, mhp
->umem
->nmap
, 0) {
566 pages
[i
++] = cpu_to_be64(sg_page_iter_dma_address(&sg_iter
));
567 if (i
== PAGE_SIZE
/ sizeof(*pages
)) {
568 err
= write_pbl(&mhp
->rhp
->rdev
, pages
,
569 mhp
->attr
.pbl_addr
+ (n
<< 3), i
,
579 err
= write_pbl(&mhp
->rhp
->rdev
, pages
,
580 mhp
->attr
.pbl_addr
+ (n
<< 3), i
,
584 free_page((unsigned long) pages
);
588 mhp
->attr
.pdid
= php
->pdid
;
590 mhp
->attr
.perms
= c4iw_ib_to_tpt_access(acc
);
591 mhp
->attr
.va_fbo
= virt
;
592 mhp
->attr
.page_size
= shift
- 12;
593 mhp
->attr
.len
= length
;
595 err
= register_mem(rhp
, php
, mhp
, shift
);
602 c4iw_pblpool_free(&mhp
->rhp
->rdev
, mhp
->attr
.pbl_addr
,
603 mhp
->attr
.pbl_size
<< 3);
605 ib_umem_release(mhp
->umem
);
607 kfree_skb(mhp
->dereg_skb
);
609 c4iw_put_wr_wait(mhp
->wr_waitp
);
615 struct ib_mw
*c4iw_alloc_mw(struct ib_pd
*pd
, enum ib_mw_type type
,
616 struct ib_udata
*udata
)
618 struct c4iw_dev
*rhp
;
625 if (type
!= IB_MW_TYPE_1
)
626 return ERR_PTR(-EINVAL
);
628 php
= to_c4iw_pd(pd
);
630 mhp
= kzalloc(sizeof(*mhp
), GFP_KERNEL
);
632 return ERR_PTR(-ENOMEM
);
634 mhp
->wr_waitp
= c4iw_alloc_wr_wait(GFP_KERNEL
);
635 if (!mhp
->wr_waitp
) {
640 mhp
->dereg_skb
= alloc_skb(SGE_MAX_WR_LEN
, GFP_KERNEL
);
641 if (!mhp
->dereg_skb
) {
646 ret
= allocate_window(&rhp
->rdev
, &stag
, php
->pdid
, mhp
->wr_waitp
);
650 mhp
->attr
.pdid
= php
->pdid
;
651 mhp
->attr
.type
= FW_RI_STAG_MW
;
652 mhp
->attr
.stag
= stag
;
654 mhp
->ibmw
.rkey
= stag
;
655 if (xa_insert_irq(&rhp
->mrs
, mmid
, mhp
, GFP_KERNEL
)) {
659 pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid
, mhp
, stag
);
663 deallocate_window(&rhp
->rdev
, mhp
->attr
.stag
, mhp
->dereg_skb
,
666 kfree_skb(mhp
->dereg_skb
);
668 c4iw_put_wr_wait(mhp
->wr_waitp
);
674 int c4iw_dealloc_mw(struct ib_mw
*mw
)
676 struct c4iw_dev
*rhp
;
680 mhp
= to_c4iw_mw(mw
);
682 mmid
= (mw
->rkey
) >> 8;
683 xa_erase_irq(&rhp
->mrs
, mmid
);
684 deallocate_window(&rhp
->rdev
, mhp
->attr
.stag
, mhp
->dereg_skb
,
686 kfree_skb(mhp
->dereg_skb
);
687 c4iw_put_wr_wait(mhp
->wr_waitp
);
688 pr_debug("ib_mw %p mmid 0x%x ptr %p\n", mw
, mmid
, mhp
);
693 struct ib_mr
*c4iw_alloc_mr(struct ib_pd
*pd
, enum ib_mr_type mr_type
,
694 u32 max_num_sg
, struct ib_udata
*udata
)
696 struct c4iw_dev
*rhp
;
702 int length
= roundup(max_num_sg
* sizeof(u64
), 32);
704 php
= to_c4iw_pd(pd
);
707 if (mr_type
!= IB_MR_TYPE_MEM_REG
||
708 max_num_sg
> t4_max_fr_depth(rhp
->rdev
.lldi
.ulptx_memwrite_dsgl
&&
710 return ERR_PTR(-EINVAL
);
712 mhp
= kzalloc(sizeof(*mhp
), GFP_KERNEL
);
718 mhp
->wr_waitp
= c4iw_alloc_wr_wait(GFP_KERNEL
);
719 if (!mhp
->wr_waitp
) {
723 c4iw_init_wr_wait(mhp
->wr_waitp
);
725 mhp
->mpl
= dma_alloc_coherent(&rhp
->rdev
.lldi
.pdev
->dev
,
726 length
, &mhp
->mpl_addr
, GFP_KERNEL
);
729 goto err_free_wr_wait
;
731 mhp
->max_mpl_len
= length
;
734 ret
= alloc_pbl(mhp
, max_num_sg
);
737 mhp
->attr
.pbl_size
= max_num_sg
;
738 ret
= allocate_stag(&rhp
->rdev
, &stag
, php
->pdid
,
739 mhp
->attr
.pbl_size
, mhp
->attr
.pbl_addr
,
743 mhp
->attr
.pdid
= php
->pdid
;
744 mhp
->attr
.type
= FW_RI_STAG_NSMR
;
745 mhp
->attr
.stag
= stag
;
748 mhp
->ibmr
.rkey
= mhp
->ibmr
.lkey
= stag
;
749 if (xa_insert_irq(&rhp
->mrs
, mmid
, mhp
, GFP_KERNEL
)) {
754 pr_debug("mmid 0x%x mhp %p stag 0x%x\n", mmid
, mhp
, stag
);
757 dereg_mem(&rhp
->rdev
, stag
, mhp
->attr
.pbl_size
,
758 mhp
->attr
.pbl_addr
, mhp
->dereg_skb
, mhp
->wr_waitp
);
760 c4iw_pblpool_free(&mhp
->rhp
->rdev
, mhp
->attr
.pbl_addr
,
761 mhp
->attr
.pbl_size
<< 3);
763 dma_free_coherent(&mhp
->rhp
->rdev
.lldi
.pdev
->dev
,
764 mhp
->max_mpl_len
, mhp
->mpl
, mhp
->mpl_addr
);
766 c4iw_put_wr_wait(mhp
->wr_waitp
);
773 static int c4iw_set_page(struct ib_mr
*ibmr
, u64 addr
)
775 struct c4iw_mr
*mhp
= to_c4iw_mr(ibmr
);
777 if (unlikely(mhp
->mpl_len
== mhp
->attr
.pbl_size
))
780 mhp
->mpl
[mhp
->mpl_len
++] = addr
;
785 int c4iw_map_mr_sg(struct ib_mr
*ibmr
, struct scatterlist
*sg
, int sg_nents
,
786 unsigned int *sg_offset
)
788 struct c4iw_mr
*mhp
= to_c4iw_mr(ibmr
);
792 return ib_sg_to_pages(ibmr
, sg
, sg_nents
, sg_offset
, c4iw_set_page
);
795 int c4iw_dereg_mr(struct ib_mr
*ib_mr
, struct ib_udata
*udata
)
797 struct c4iw_dev
*rhp
;
801 pr_debug("ib_mr %p\n", ib_mr
);
803 mhp
= to_c4iw_mr(ib_mr
);
805 mmid
= mhp
->attr
.stag
>> 8;
806 xa_erase_irq(&rhp
->mrs
, mmid
);
808 dma_free_coherent(&mhp
->rhp
->rdev
.lldi
.pdev
->dev
,
809 mhp
->max_mpl_len
, mhp
->mpl
, mhp
->mpl_addr
);
810 dereg_mem(&rhp
->rdev
, mhp
->attr
.stag
, mhp
->attr
.pbl_size
,
811 mhp
->attr
.pbl_addr
, mhp
->dereg_skb
, mhp
->wr_waitp
);
812 if (mhp
->attr
.pbl_size
)
813 c4iw_pblpool_free(&mhp
->rhp
->rdev
, mhp
->attr
.pbl_addr
,
814 mhp
->attr
.pbl_size
<< 3);
816 kfree((void *) (unsigned long) mhp
->kva
);
817 ib_umem_release(mhp
->umem
);
818 pr_debug("mmid 0x%x ptr %p\n", mmid
, mhp
);
819 c4iw_put_wr_wait(mhp
->wr_waitp
);
824 void c4iw_invalidate_mr(struct c4iw_dev
*rhp
, u32 rkey
)
829 xa_lock_irqsave(&rhp
->mrs
, flags
);
830 mhp
= xa_load(&rhp
->mrs
, rkey
>> 8);
833 xa_unlock_irqrestore(&rhp
->mrs
, flags
);