1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2/* 3 * Copyright(c) 2020 - Cornelis Networks, Inc. 4 * Copyright(c) 2015 - 2017 Intel Corporation. 5 */ 6 7#ifndef _HFI1_USER_EXP_RCV_H 8#define _HFI1_USER_EXP_RCV_H 9 10#include "hfi.h" 11#include "exp_rcv.h" 12 13struct tid_pageset { 14 u16 idx; 15 u16 count; 16}; 17 18struct tid_user_buf { 19 struct mmu_interval_notifier notifier; 20 struct mutex cover_mutex; 21 unsigned long vaddr; 22 unsigned long length; 23 unsigned int npages; 24 struct page **pages; 25 struct tid_pageset *psets; 26 unsigned int n_psets; 27}; 28 29struct tid_rb_node { 30 struct mmu_interval_notifier notifier; 31 struct hfi1_filedata *fdata; 32 struct mutex invalidate_mutex; /* covers hw removal */ 33 unsigned long phys; 34 struct tid_group *grp; 35 u32 rcventry; 36 dma_addr_t dma_addr; 37 bool freed; 38 unsigned int npages; 39 struct page *pages[] __counted_by(npages); 40}; 41 42static inline int num_user_pages(unsigned long addr, 43 unsigned long len) 44{ 45 const unsigned long spage = addr & PAGE_MASK; 46 const unsigned long epage = (addr + len - 1) & PAGE_MASK; 47 48 return 1 + ((epage - spage) >> PAGE_SHIFT); 49} 50 51int hfi1_user_exp_rcv_init(struct hfi1_filedata *fd, 52 struct hfi1_ctxtdata *uctxt); 53void hfi1_user_exp_rcv_free(struct hfi1_filedata *fd); 54int hfi1_user_exp_rcv_setup(struct hfi1_filedata *fd, 55 struct hfi1_tid_info *tinfo); 56int hfi1_user_exp_rcv_clear(struct hfi1_filedata *fd, 57 struct hfi1_tid_info *tinfo); 58int hfi1_user_exp_rcv_invalid(struct hfi1_filedata *fd, 59 struct hfi1_tid_info *tinfo); 60 61static inline struct mm_struct *mm_from_tid_node(struct tid_rb_node *node) 62{ 63 return node->notifier.mm; 64} 65 66#endif /* _HFI1_USER_EXP_RCV_H */ 67