/*-1* SPDX-License-Identifier: BSD-2-Clause OR GPL-2.02*3* Copyright (c) 2007 Cisco Systems. All rights reserved.4*5* This software is available to you under a choice of one of two6* licenses. You may choose to be licensed under the terms of the GNU7* General Public License (GPL) Version 2, available from the file8* COPYING in the main directory of this source tree, or the9* OpenIB.org BSD license below:10*11* Redistribution and use in source and binary forms, with or12* without modification, are permitted provided that the following13* conditions are met:14*15* - Redistributions of source code must retain the above16* copyright notice, this list of conditions and the following17* disclaimer.18*19* - Redistributions in binary form must reproduce the above20* copyright notice, this list of conditions and the following21* disclaimer in the documentation and/or other materials22* 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 OF26* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND27* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS28* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN29* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN30* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE31* SOFTWARE.32*/3334#ifndef IB_UMEM_H35#define IB_UMEM_H3637#include <linux/list.h>38#include <linux/scatterlist.h>39#include <linux/workqueue.h>4041struct ib_ucontext;42struct ib_umem_odp;4344struct ib_umem {45struct ib_ucontext *context;46size_t length;47unsigned long address;48int page_size;49int writable;50struct work_struct work;51pid_t pid;52struct mm_struct *mm;53unsigned long diff;54struct ib_umem_odp *odp_data;55struct sg_table sg_head;56int nmap;57int npages;58};5960/* Returns the offset of the umem start relative to the first page. */61static inline int ib_umem_offset(struct ib_umem *umem)62{63return umem->address & ((unsigned long)umem->page_size - 1);64}6566/* Returns the first page of an ODP umem. */67static inline unsigned long ib_umem_start(struct ib_umem *umem)68{69return umem->address - ib_umem_offset(umem);70}7172/* Returns the address of the page after the last one of an ODP umem. */73static inline unsigned long ib_umem_end(struct ib_umem *umem)74{75return PAGE_ALIGN(umem->address + umem->length);76}7778static inline size_t ib_umem_num_pages(struct ib_umem *umem)79{80return (ib_umem_end(umem) - ib_umem_start(umem)) >> PAGE_SHIFT;81}8283#ifdef CONFIG_INFINIBAND_USER_MEM8485struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,86size_t size, int access, int dmasync);87void ib_umem_release(struct ib_umem *umem);88int ib_umem_page_count(struct ib_umem *umem);89int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,90size_t length);9192#else /* CONFIG_INFINIBAND_USER_MEM */9394#include <linux/err.h>9596static inline struct ib_umem *ib_umem_get(struct ib_ucontext *context,97unsigned long addr, size_t size,98int access, int dmasync) {99return ERR_PTR(-EINVAL);100}101static inline void ib_umem_release(struct ib_umem *umem) { }102static inline int ib_umem_page_count(struct ib_umem *umem) { return 0; }103static inline int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,104size_t length) {105return -EINVAL;106}107#endif /* CONFIG_INFINIBAND_USER_MEM */108109#endif /* IB_UMEM_H */110111112