GNU Linux-libre 4.9.317-gnu1
[releases.git] / drivers / infiniband / sw / rxe / rxe_mr.c
1 /*
2  * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
3  * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
4  *
5  * This software is available to you under a choice of one of two
6  * licenses.  You may choose to be licensed under the terms of the GNU
7  * General Public License (GPL) Version 2, available from the file
8  * COPYING in the main directory of this source tree, or the
9  * OpenIB.org BSD license below:
10  *
11  *     Redistribution and use in source and binary forms, with or
12  *     without modification, are permitted provided that the following
13  *     conditions are met:
14  *
15  *      - Redistributions of source code must retain the above
16  *        copyright notice, this list of conditions and the following
17  *        disclaimer.
18  *
19  *      - Redistributions in binary form must reproduce the above
20  *        copyright notice, this list of conditions and the following
21  *        disclaimer in the documentation and/or other materials
22  *        provided with the distribution.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31  * SOFTWARE.
32  */
33
34 #include "rxe.h"
35 #include "rxe_loc.h"
36
37 /*
38  * lfsr (linear feedback shift register) with period 255
39  */
40 static u8 rxe_get_key(void)
41 {
42         static u32 key = 1;
43
44         key = key << 1;
45
46         key |= (0 != (key & 0x100)) ^ (0 != (key & 0x10))
47                 ^ (0 != (key & 0x80)) ^ (0 != (key & 0x40));
48
49         key &= 0xff;
50
51         return key;
52 }
53
54 int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length)
55 {
56         switch (mem->type) {
57         case RXE_MEM_TYPE_DMA:
58                 return 0;
59
60         case RXE_MEM_TYPE_MR:
61         case RXE_MEM_TYPE_FMR:
62                 if (iova < mem->iova ||
63                     length > mem->length ||
64                     iova > mem->iova + mem->length - length)
65                         return -EFAULT;
66                 return 0;
67
68         default:
69                 return -EFAULT;
70         }
71 }
72
73 #define IB_ACCESS_REMOTE        (IB_ACCESS_REMOTE_READ          \
74                                 | IB_ACCESS_REMOTE_WRITE        \
75                                 | IB_ACCESS_REMOTE_ATOMIC)
76
77 static void rxe_mem_init(int access, struct rxe_mem *mem)
78 {
79         u32 lkey = mem->pelem.index << 8 | rxe_get_key();
80         u32 rkey = (access & IB_ACCESS_REMOTE) ? lkey : 0;
81
82         if (mem->pelem.pool->type == RXE_TYPE_MR) {
83                 mem->ibmr.lkey          = lkey;
84                 mem->ibmr.rkey          = rkey;
85         }
86
87         mem->lkey               = lkey;
88         mem->rkey               = rkey;
89         mem->state              = RXE_MEM_STATE_INVALID;
90         mem->type               = RXE_MEM_TYPE_NONE;
91         mem->map_shift          = ilog2(RXE_BUF_PER_MAP);
92 }
93
94 void rxe_mem_cleanup(void *arg)
95 {
96         struct rxe_mem *mem = arg;
97         int i;
98
99         if (mem->umem)
100                 ib_umem_release(mem->umem);
101
102         if (mem->map) {
103                 for (i = 0; i < mem->num_map; i++)
104                         kfree(mem->map[i]);
105
106                 kfree(mem->map);
107         }
108 }
109
110 static int rxe_mem_alloc(struct rxe_dev *rxe, struct rxe_mem *mem, int num_buf)
111 {
112         int i;
113         int num_map;
114         struct rxe_map **map = mem->map;
115
116         num_map = (num_buf + RXE_BUF_PER_MAP - 1) / RXE_BUF_PER_MAP;
117
118         mem->map = kmalloc_array(num_map, sizeof(*map), GFP_KERNEL);
119         if (!mem->map)
120                 goto err1;
121
122         for (i = 0; i < num_map; i++) {
123                 mem->map[i] = kmalloc(sizeof(**map), GFP_KERNEL);
124                 if (!mem->map[i])
125                         goto err2;
126         }
127
128         WARN_ON(!is_power_of_2(RXE_BUF_PER_MAP));
129
130         mem->map_shift  = ilog2(RXE_BUF_PER_MAP);
131         mem->map_mask   = RXE_BUF_PER_MAP - 1;
132
133         mem->num_buf = num_buf;
134         mem->num_map = num_map;
135         mem->max_buf = num_map * RXE_BUF_PER_MAP;
136
137         return 0;
138
139 err2:
140         for (i--; i >= 0; i--)
141                 kfree(mem->map[i]);
142
143         kfree(mem->map);
144 err1:
145         return -ENOMEM;
146 }
147
148 int rxe_mem_init_dma(struct rxe_dev *rxe, struct rxe_pd *pd,
149                      int access, struct rxe_mem *mem)
150 {
151         rxe_mem_init(access, mem);
152
153         mem->pd                 = pd;
154         mem->access             = access;
155         mem->state              = RXE_MEM_STATE_VALID;
156         mem->type               = RXE_MEM_TYPE_DMA;
157
158         return 0;
159 }
160
161 int rxe_mem_init_user(struct rxe_dev *rxe, struct rxe_pd *pd, u64 start,
162                       u64 length, u64 iova, int access, struct ib_udata *udata,
163                       struct rxe_mem *mem)
164 {
165         int                     entry;
166         struct rxe_map          **map;
167         struct rxe_phys_buf     *buf = NULL;
168         struct ib_umem          *umem;
169         struct scatterlist      *sg;
170         int                     num_buf;
171         void                    *vaddr;
172         int err;
173
174         umem = ib_umem_get(pd->ibpd.uobject->context, start, length, access, 0);
175         if (IS_ERR(umem)) {
176                 pr_warn("err %d from rxe_umem_get\n",
177                         (int)PTR_ERR(umem));
178                 err = PTR_ERR(umem);
179                 goto err1;
180         }
181
182         mem->umem = umem;
183         num_buf = umem->nmap;
184
185         rxe_mem_init(access, mem);
186
187         err = rxe_mem_alloc(rxe, mem, num_buf);
188         if (err) {
189                 pr_warn("err %d from rxe_mem_alloc\n", err);
190                 ib_umem_release(umem);
191                 goto err1;
192         }
193
194         WARN_ON(!is_power_of_2(umem->page_size));
195
196         mem->page_shift         = ilog2(umem->page_size);
197         mem->page_mask          = umem->page_size - 1;
198
199         num_buf                 = 0;
200         map                     = mem->map;
201         if (length > 0) {
202                 buf = map[0]->buf;
203
204                 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
205                         vaddr = page_address(sg_page(sg));
206                         if (!vaddr) {
207                                 pr_warn("null vaddr\n");
208                                 ib_umem_release(umem);
209                                 err = -ENOMEM;
210                                 goto err1;
211                         }
212
213                         buf->addr = (uintptr_t)vaddr;
214                         buf->size = umem->page_size;
215                         num_buf++;
216                         buf++;
217
218                         if (num_buf >= RXE_BUF_PER_MAP) {
219                                 map++;
220                                 buf = map[0]->buf;
221                                 num_buf = 0;
222                         }
223                 }
224         }
225
226         mem->pd                 = pd;
227         mem->umem               = umem;
228         mem->access             = access;
229         mem->length             = length;
230         mem->iova               = iova;
231         mem->va                 = start;
232         mem->offset             = ib_umem_offset(umem);
233         mem->state              = RXE_MEM_STATE_VALID;
234         mem->type               = RXE_MEM_TYPE_MR;
235
236         return 0;
237
238 err1:
239         return err;
240 }
241
242 int rxe_mem_init_fast(struct rxe_dev *rxe, struct rxe_pd *pd,
243                       int max_pages, struct rxe_mem *mem)
244 {
245         int err;
246
247         rxe_mem_init(0, mem);
248
249         /* In fastreg, we also set the rkey */
250         mem->ibmr.rkey = mem->ibmr.lkey;
251
252         err = rxe_mem_alloc(rxe, mem, max_pages);
253         if (err)
254                 goto err1;
255
256         mem->pd                 = pd;
257         mem->max_buf            = max_pages;
258         mem->state              = RXE_MEM_STATE_FREE;
259         mem->type               = RXE_MEM_TYPE_MR;
260
261         return 0;
262
263 err1:
264         return err;
265 }
266
267 static void lookup_iova(
268         struct rxe_mem  *mem,
269         u64                     iova,
270         int                     *m_out,
271         int                     *n_out,
272         size_t                  *offset_out)
273 {
274         size_t                  offset = iova - mem->iova + mem->offset;
275         int                     map_index;
276         int                     buf_index;
277         u64                     length;
278
279         if (likely(mem->page_shift)) {
280                 *offset_out = offset & mem->page_mask;
281                 offset >>= mem->page_shift;
282                 *n_out = offset & mem->map_mask;
283                 *m_out = offset >> mem->map_shift;
284         } else {
285                 map_index = 0;
286                 buf_index = 0;
287
288                 length = mem->map[map_index]->buf[buf_index].size;
289
290                 while (offset >= length) {
291                         offset -= length;
292                         buf_index++;
293
294                         if (buf_index == RXE_BUF_PER_MAP) {
295                                 map_index++;
296                                 buf_index = 0;
297                         }
298                         length = mem->map[map_index]->buf[buf_index].size;
299                 }
300
301                 *m_out = map_index;
302                 *n_out = buf_index;
303                 *offset_out = offset;
304         }
305 }
306
307 void *iova_to_vaddr(struct rxe_mem *mem, u64 iova, int length)
308 {
309         size_t offset;
310         int m, n;
311         void *addr;
312
313         if (mem->state != RXE_MEM_STATE_VALID) {
314                 pr_warn("mem not in valid state\n");
315                 addr = NULL;
316                 goto out;
317         }
318
319         if (!mem->map) {
320                 addr = (void *)(uintptr_t)iova;
321                 goto out;
322         }
323
324         if (mem_check_range(mem, iova, length)) {
325                 pr_warn("range violation\n");
326                 addr = NULL;
327                 goto out;
328         }
329
330         lookup_iova(mem, iova, &m, &n, &offset);
331
332         if (offset + length > mem->map[m]->buf[n].size) {
333                 pr_warn("crosses page boundary\n");
334                 addr = NULL;
335                 goto out;
336         }
337
338         addr = (void *)(uintptr_t)mem->map[m]->buf[n].addr + offset;
339
340 out:
341         return addr;
342 }
343
344 /* copy data from a range (vaddr, vaddr+length-1) to or from
345  * a mem object starting at iova. Compute incremental value of
346  * crc32 if crcp is not zero. caller must hold a reference to mem
347  */
348 int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, int length,
349                  enum copy_direction dir, u32 *crcp)
350 {
351         int                     err;
352         int                     bytes;
353         u8                      *va;
354         struct rxe_map          **map;
355         struct rxe_phys_buf     *buf;
356         int                     m;
357         int                     i;
358         size_t                  offset;
359         u32                     crc = crcp ? (*crcp) : 0;
360
361         if (mem->type == RXE_MEM_TYPE_DMA) {
362                 u8 *src, *dest;
363
364                 src  = (dir == to_mem_obj) ?
365                         addr : ((void *)(uintptr_t)iova);
366
367                 dest = (dir == to_mem_obj) ?
368                         ((void *)(uintptr_t)iova) : addr;
369
370                 if (crcp)
371                         *crcp = crc32_le(*crcp, src, length);
372
373                 memcpy(dest, src, length);
374
375                 return 0;
376         }
377
378         WARN_ON(!mem->map);
379
380         err = mem_check_range(mem, iova, length);
381         if (err) {
382                 err = -EFAULT;
383                 goto err1;
384         }
385
386         lookup_iova(mem, iova, &m, &i, &offset);
387
388         map     = mem->map + m;
389         buf     = map[0]->buf + i;
390
391         while (length > 0) {
392                 u8 *src, *dest;
393
394                 va      = (u8 *)(uintptr_t)buf->addr + offset;
395                 src  = (dir == to_mem_obj) ? addr : va;
396                 dest = (dir == to_mem_obj) ? va : addr;
397
398                 bytes   = buf->size - offset;
399
400                 if (bytes > length)
401                         bytes = length;
402
403                 if (crcp)
404                         crc = crc32_le(crc, src, bytes);
405
406                 memcpy(dest, src, bytes);
407
408                 length  -= bytes;
409                 addr    += bytes;
410
411                 offset  = 0;
412                 buf++;
413                 i++;
414
415                 if (i == RXE_BUF_PER_MAP) {
416                         i = 0;
417                         map++;
418                         buf = map[0]->buf;
419                 }
420         }
421
422         if (crcp)
423                 *crcp = crc;
424
425         return 0;
426
427 err1:
428         return err;
429 }
430
431 /* copy data in or out of a wqe, i.e. sg list
432  * under the control of a dma descriptor
433  */
434 int copy_data(
435         struct rxe_dev          *rxe,
436         struct rxe_pd           *pd,
437         int                     access,
438         struct rxe_dma_info     *dma,
439         void                    *addr,
440         int                     length,
441         enum copy_direction     dir,
442         u32                     *crcp)
443 {
444         int                     bytes;
445         struct rxe_sge          *sge    = &dma->sge[dma->cur_sge];
446         int                     offset  = dma->sge_offset;
447         int                     resid   = dma->resid;
448         struct rxe_mem          *mem    = NULL;
449         u64                     iova;
450         int                     err;
451
452         if (length == 0)
453                 return 0;
454
455         if (length > resid) {
456                 err = -EINVAL;
457                 goto err2;
458         }
459
460         if (sge->length && (offset < sge->length)) {
461                 mem = lookup_mem(pd, access, sge->lkey, lookup_local);
462                 if (!mem) {
463                         err = -EINVAL;
464                         goto err1;
465                 }
466         }
467
468         while (length > 0) {
469                 bytes = length;
470
471                 if (offset >= sge->length) {
472                         if (mem) {
473                                 rxe_drop_ref(mem);
474                                 mem = NULL;
475                         }
476                         sge++;
477                         dma->cur_sge++;
478                         offset = 0;
479
480                         if (dma->cur_sge >= dma->num_sge) {
481                                 err = -ENOSPC;
482                                 goto err2;
483                         }
484
485                         if (sge->length) {
486                                 mem = lookup_mem(pd, access, sge->lkey,
487                                                  lookup_local);
488                                 if (!mem) {
489                                         err = -EINVAL;
490                                         goto err1;
491                                 }
492                         } else {
493                                 continue;
494                         }
495                 }
496
497                 if (bytes > sge->length - offset)
498                         bytes = sge->length - offset;
499
500                 if (bytes > 0) {
501                         iova = sge->addr + offset;
502
503                         err = rxe_mem_copy(mem, iova, addr, bytes, dir, crcp);
504                         if (err)
505                                 goto err2;
506
507                         offset  += bytes;
508                         resid   -= bytes;
509                         length  -= bytes;
510                         addr    += bytes;
511                 }
512         }
513
514         dma->sge_offset = offset;
515         dma->resid      = resid;
516
517         if (mem)
518                 rxe_drop_ref(mem);
519
520         return 0;
521
522 err2:
523         if (mem)
524                 rxe_drop_ref(mem);
525 err1:
526         return err;
527 }
528
529 int advance_dma_data(struct rxe_dma_info *dma, unsigned int length)
530 {
531         struct rxe_sge          *sge    = &dma->sge[dma->cur_sge];
532         int                     offset  = dma->sge_offset;
533         int                     resid   = dma->resid;
534
535         while (length) {
536                 unsigned int bytes;
537
538                 if (offset >= sge->length) {
539                         sge++;
540                         dma->cur_sge++;
541                         offset = 0;
542                         if (dma->cur_sge >= dma->num_sge)
543                                 return -ENOSPC;
544                 }
545
546                 bytes = length;
547
548                 if (bytes > sge->length - offset)
549                         bytes = sge->length - offset;
550
551                 offset  += bytes;
552                 resid   -= bytes;
553                 length  -= bytes;
554         }
555
556         dma->sge_offset = offset;
557         dma->resid      = resid;
558
559         return 0;
560 }
561
562 /* (1) find the mem (mr or mw) corresponding to lkey/rkey
563  *     depending on lookup_type
564  * (2) verify that the (qp) pd matches the mem pd
565  * (3) verify that the mem can support the requested access
566  * (4) verify that mem state is valid
567  */
568 struct rxe_mem *lookup_mem(struct rxe_pd *pd, int access, u32 key,
569                            enum lookup_type type)
570 {
571         struct rxe_mem *mem;
572         struct rxe_dev *rxe = to_rdev(pd->ibpd.device);
573         int index = key >> 8;
574
575         if (index >= RXE_MIN_MR_INDEX && index <= RXE_MAX_MR_INDEX) {
576                 mem = rxe_pool_get_index(&rxe->mr_pool, index);
577                 if (!mem)
578                         goto err1;
579         } else {
580                 goto err1;
581         }
582
583         if ((type == lookup_local && mem->lkey != key) ||
584             (type == lookup_remote && mem->rkey != key))
585                 goto err2;
586
587         if (mem->pd != pd)
588                 goto err2;
589
590         if (access && !(access & mem->access))
591                 goto err2;
592
593         if (mem->state != RXE_MEM_STATE_VALID)
594                 goto err2;
595
596         return mem;
597
598 err2:
599         rxe_drop_ref(mem);
600 err1:
601         return NULL;
602 }
603
604 int rxe_mem_map_pages(struct rxe_dev *rxe, struct rxe_mem *mem,
605                       u64 *page, int num_pages, u64 iova)
606 {
607         int i;
608         int num_buf;
609         int err;
610         struct rxe_map **map;
611         struct rxe_phys_buf *buf;
612         int page_size;
613
614         if (num_pages > mem->max_buf) {
615                 err = -EINVAL;
616                 goto err1;
617         }
618
619         num_buf         = 0;
620         page_size       = 1 << mem->page_shift;
621         map             = mem->map;
622         buf             = map[0]->buf;
623
624         for (i = 0; i < num_pages; i++) {
625                 buf->addr = *page++;
626                 buf->size = page_size;
627                 buf++;
628                 num_buf++;
629
630                 if (num_buf == RXE_BUF_PER_MAP) {
631                         map++;
632                         buf = map[0]->buf;
633                         num_buf = 0;
634                 }
635         }
636
637         mem->iova       = iova;
638         mem->va         = iova;
639         mem->length     = num_pages << mem->page_shift;
640         mem->state      = RXE_MEM_STATE_VALID;
641
642         return 0;
643
644 err1:
645         return err;
646 }