1 /* 2 * Copyright (c) 2007 Cisco Systems. All rights reserved. 3 * 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: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 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. 22 * 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 30 * SOFTWARE. 31 */ 32 33 #ifndef IB_UMEM_H 34 #define IB_UMEM_H 35 36 #include <linux/list.h> 37 #include <linux/scatterlist.h> 38 #include <linux/workqueue.h> 39 #include <rdma/ib_verbs.h> 40 41 struct ib_ucontext; 42 struct ib_umem_odp; 43 44 struct ib_umem { 45 struct ib_device *ibdev; 46 struct mm_struct *owning_mm; 47 size_t length; 48 unsigned long address; 49 u32 writable : 1; 50 u32 is_odp : 1; 51 struct work_struct work; 52 struct sg_table sg_head; 53 int nmap; 54 unsigned int sg_nents; 55 }; 56 57 /* Returns the offset of the umem start relative to the first page. */ 58 static inline int ib_umem_offset(struct ib_umem *umem) 59 { 60 return umem->address & ~PAGE_MASK; 61 } 62 63 static inline size_t ib_umem_num_pages(struct ib_umem *umem) 64 { 65 return (ALIGN(umem->address + umem->length, PAGE_SIZE) - 66 ALIGN_DOWN(umem->address, PAGE_SIZE)) >> 67 PAGE_SHIFT; 68 } 69 70 #ifdef CONFIG_INFINIBAND_USER_MEM 71 72 struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr, 73 size_t size, int access); 74 void ib_umem_release(struct ib_umem *umem); 75 int ib_umem_page_count(struct ib_umem *umem); 76 int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset, 77 size_t length); 78 unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, 79 unsigned long pgsz_bitmap, 80 unsigned long virt); 81 82 #else /* CONFIG_INFINIBAND_USER_MEM */ 83 84 #include <linux/err.h> 85 86 static inline struct ib_umem *ib_umem_get(struct ib_device *device, 87 unsigned long addr, size_t size, 88 int access) 89 { 90 return ERR_PTR(-EINVAL); 91 } 92 static inline void ib_umem_release(struct ib_umem *umem) { } 93 static inline int ib_umem_page_count(struct ib_umem *umem) { return 0; } 94 static inline int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset, 95 size_t length) { 96 return -EINVAL; 97 } 98 static inline int ib_umem_find_best_pgsz(struct ib_umem *umem, 99 unsigned long pgsz_bitmap, 100 unsigned long virt) { 101 return -EINVAL; 102 } 103 104 #endif /* CONFIG_INFINIBAND_USER_MEM */ 105 106 #endif /* IB_UMEM_H */ 107