1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
3 * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
4 * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
11 * lfsr (linear feedback shift register) with period 255
13 static u8 rxe_get_key(void)
19 key |= (0 != (key & 0x100)) ^ (0 != (key & 0x10))
20 ^ (0 != (key & 0x80)) ^ (0 != (key & 0x40));
27 int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length)
30 case RXE_MEM_TYPE_DMA:
34 case RXE_MEM_TYPE_FMR:
35 if (iova < mem->iova ||
36 length > mem->length ||
37 iova > mem->iova + mem->length - length)
46 #define IB_ACCESS_REMOTE (IB_ACCESS_REMOTE_READ \
47 | IB_ACCESS_REMOTE_WRITE \
48 | IB_ACCESS_REMOTE_ATOMIC)
50 static void rxe_mem_init(int access, struct rxe_mem *mem)
52 u32 lkey = mem->pelem.index << 8 | rxe_get_key();
53 u32 rkey = (access & IB_ACCESS_REMOTE) ? lkey : 0;
55 mem->ibmr.lkey = lkey;
56 mem->ibmr.rkey = rkey;
57 mem->state = RXE_MEM_STATE_INVALID;
58 mem->type = RXE_MEM_TYPE_NONE;
59 mem->map_shift = ilog2(RXE_BUF_PER_MAP);
62 void rxe_mem_cleanup(struct rxe_pool_entry *arg)
64 struct rxe_mem *mem = container_of(arg, typeof(*mem), pelem);
67 ib_umem_release(mem->umem);
70 for (i = 0; i < mem->num_map; i++)
77 static int rxe_mem_alloc(struct rxe_mem *mem, int num_buf)
81 struct rxe_map **map = mem->map;
83 num_map = (num_buf + RXE_BUF_PER_MAP - 1) / RXE_BUF_PER_MAP;
85 mem->map = kmalloc_array(num_map, sizeof(*map), GFP_KERNEL);
89 for (i = 0; i < num_map; i++) {
90 mem->map[i] = kmalloc(sizeof(**map), GFP_KERNEL);
95 BUILD_BUG_ON(!is_power_of_2(RXE_BUF_PER_MAP));
97 mem->map_shift = ilog2(RXE_BUF_PER_MAP);
98 mem->map_mask = RXE_BUF_PER_MAP - 1;
100 mem->num_buf = num_buf;
101 mem->num_map = num_map;
102 mem->max_buf = num_map * RXE_BUF_PER_MAP;
107 for (i--; i >= 0; i--)
115 void rxe_mem_init_dma(struct rxe_pd *pd,
116 int access, struct rxe_mem *mem)
118 rxe_mem_init(access, mem);
120 mem->ibmr.pd = &pd->ibpd;
121 mem->access = access;
122 mem->state = RXE_MEM_STATE_VALID;
123 mem->type = RXE_MEM_TYPE_DMA;
126 int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
127 u64 length, u64 iova, int access, struct ib_udata *udata,
130 struct rxe_map **map;
131 struct rxe_phys_buf *buf = NULL;
132 struct ib_umem *umem;
133 struct sg_page_iter sg_iter;
138 umem = ib_umem_get(pd->ibpd.device, start, length, access);
140 pr_warn("err %d from rxe_umem_get\n",
147 num_buf = ib_umem_num_pages(umem);
149 rxe_mem_init(access, mem);
151 err = rxe_mem_alloc(mem, num_buf);
153 pr_warn("err %d from rxe_mem_alloc\n", err);
154 ib_umem_release(umem);
158 mem->page_shift = PAGE_SHIFT;
159 mem->page_mask = PAGE_SIZE - 1;
166 for_each_sg_page(umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
167 if (num_buf >= RXE_BUF_PER_MAP) {
173 vaddr = page_address(sg_page_iter_page(&sg_iter));
175 pr_warn("null vaddr\n");
176 ib_umem_release(umem);
181 buf->addr = (uintptr_t)vaddr;
182 buf->size = PAGE_SIZE;
189 mem->ibmr.pd = &pd->ibpd;
191 mem->access = access;
192 mem->length = length;
195 mem->offset = ib_umem_offset(umem);
196 mem->state = RXE_MEM_STATE_VALID;
197 mem->type = RXE_MEM_TYPE_MR;
205 int rxe_mem_init_fast(struct rxe_pd *pd,
206 int max_pages, struct rxe_mem *mem)
210 rxe_mem_init(0, mem);
212 /* In fastreg, we also set the rkey */
213 mem->ibmr.rkey = mem->ibmr.lkey;
215 err = rxe_mem_alloc(mem, max_pages);
219 mem->ibmr.pd = &pd->ibpd;
220 mem->max_buf = max_pages;
221 mem->state = RXE_MEM_STATE_FREE;
222 mem->type = RXE_MEM_TYPE_MR;
230 static void lookup_iova(
237 size_t offset = iova - mem->iova + mem->offset;
242 if (likely(mem->page_shift)) {
243 *offset_out = offset & mem->page_mask;
244 offset >>= mem->page_shift;
245 *n_out = offset & mem->map_mask;
246 *m_out = offset >> mem->map_shift;
251 length = mem->map[map_index]->buf[buf_index].size;
253 while (offset >= length) {
257 if (buf_index == RXE_BUF_PER_MAP) {
261 length = mem->map[map_index]->buf[buf_index].size;
266 *offset_out = offset;
270 void *iova_to_vaddr(struct rxe_mem *mem, u64 iova, int length)
276 if (mem->state != RXE_MEM_STATE_VALID) {
277 pr_warn("mem not in valid state\n");
283 addr = (void *)(uintptr_t)iova;
287 if (mem_check_range(mem, iova, length)) {
288 pr_warn("range violation\n");
293 lookup_iova(mem, iova, &m, &n, &offset);
295 if (offset + length > mem->map[m]->buf[n].size) {
296 pr_warn("crosses page boundary\n");
301 addr = (void *)(uintptr_t)mem->map[m]->buf[n].addr + offset;
307 /* copy data from a range (vaddr, vaddr+length-1) to or from
308 * a mem object starting at iova. Compute incremental value of
309 * crc32 if crcp is not zero. caller must hold a reference to mem
311 int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, int length,
312 enum copy_direction dir, u32 *crcp)
317 struct rxe_map **map;
318 struct rxe_phys_buf *buf;
322 u32 crc = crcp ? (*crcp) : 0;
327 if (mem->type == RXE_MEM_TYPE_DMA) {
330 src = (dir == to_mem_obj) ?
331 addr : ((void *)(uintptr_t)iova);
333 dest = (dir == to_mem_obj) ?
334 ((void *)(uintptr_t)iova) : addr;
336 memcpy(dest, src, length);
339 *crcp = rxe_crc32(to_rdev(mem->ibmr.device),
340 *crcp, dest, length);
345 WARN_ON_ONCE(!mem->map);
347 err = mem_check_range(mem, iova, length);
353 lookup_iova(mem, iova, &m, &i, &offset);
356 buf = map[0]->buf + i;
361 va = (u8 *)(uintptr_t)buf->addr + offset;
362 src = (dir == to_mem_obj) ? addr : va;
363 dest = (dir == to_mem_obj) ? va : addr;
365 bytes = buf->size - offset;
370 memcpy(dest, src, bytes);
373 crc = rxe_crc32(to_rdev(mem->ibmr.device),
383 if (i == RXE_BUF_PER_MAP) {
399 /* copy data in or out of a wqe, i.e. sg list
400 * under the control of a dma descriptor
405 struct rxe_dma_info *dma,
408 enum copy_direction dir,
412 struct rxe_sge *sge = &dma->sge[dma->cur_sge];
413 int offset = dma->sge_offset;
414 int resid = dma->resid;
415 struct rxe_mem *mem = NULL;
422 if (length > resid) {
427 if (sge->length && (offset < sge->length)) {
428 mem = lookup_mem(pd, access, sge->lkey, lookup_local);
438 if (offset >= sge->length) {
447 if (dma->cur_sge >= dma->num_sge) {
453 mem = lookup_mem(pd, access, sge->lkey,
464 if (bytes > sge->length - offset)
465 bytes = sge->length - offset;
468 iova = sge->addr + offset;
470 err = rxe_mem_copy(mem, iova, addr, bytes, dir, crcp);
481 dma->sge_offset = offset;
496 int advance_dma_data(struct rxe_dma_info *dma, unsigned int length)
498 struct rxe_sge *sge = &dma->sge[dma->cur_sge];
499 int offset = dma->sge_offset;
500 int resid = dma->resid;
505 if (offset >= sge->length) {
509 if (dma->cur_sge >= dma->num_sge)
515 if (bytes > sge->length - offset)
516 bytes = sge->length - offset;
523 dma->sge_offset = offset;
529 /* (1) find the mem (mr or mw) corresponding to lkey/rkey
530 * depending on lookup_type
531 * (2) verify that the (qp) pd matches the mem pd
532 * (3) verify that the mem can support the requested access
533 * (4) verify that mem state is valid
535 struct rxe_mem *lookup_mem(struct rxe_pd *pd, int access, u32 key,
536 enum lookup_type type)
539 struct rxe_dev *rxe = to_rdev(pd->ibpd.device);
540 int index = key >> 8;
542 mem = rxe_pool_get_index(&rxe->mr_pool, index);
546 if (unlikely((type == lookup_local && mr_lkey(mem) != key) ||
547 (type == lookup_remote && mr_rkey(mem) != key) ||
549 (access && !(access & mem->access)) ||
550 mem->state != RXE_MEM_STATE_VALID)) {