13ec648c6SKrzysztof Kozlowski /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2f48ad614SDennis Dalessandro /* 33d2a9d64SDennis Dalessandro * Copyright(c) 2020 - Cornelis Networks, Inc. 4f4cd8765SMichael J. Ruhl * Copyright(c) 2015 - 2017 Intel Corporation. 5f48ad614SDennis Dalessandro */ 6f48ad614SDennis Dalessandro 7145eba1aSCai Huoqing #ifndef _HFI1_USER_EXP_RCV_H 8145eba1aSCai Huoqing #define _HFI1_USER_EXP_RCV_H 9145eba1aSCai Huoqing 10f48ad614SDennis Dalessandro #include "hfi.h" 119c1a99c3SMike Marciniszyn #include "exp_rcv.h" 12f48ad614SDennis Dalessandro 13637f4600SHarish Chegondi struct tid_pageset { 14637f4600SHarish Chegondi u16 idx; 15637f4600SHarish Chegondi u16 count; 16637f4600SHarish Chegondi }; 17637f4600SHarish Chegondi 189dc11709SHarish Chegondi struct tid_user_buf { 19b3deec25SDean Luick struct mmu_interval_notifier notifier; 20b3deec25SDean Luick struct mutex cover_mutex; 219dc11709SHarish Chegondi unsigned long vaddr; 229dc11709SHarish Chegondi unsigned long length; 239dc11709SHarish Chegondi unsigned int npages; 249dc11709SHarish Chegondi struct page **pages; 259dc11709SHarish Chegondi struct tid_pageset *psets; 269dc11709SHarish Chegondi unsigned int n_psets; 279dc11709SHarish Chegondi }; 289dc11709SHarish Chegondi 29637f4600SHarish Chegondi struct tid_rb_node { 303889551dSJason Gunthorpe struct mmu_interval_notifier notifier; 313889551dSJason Gunthorpe struct hfi1_filedata *fdata; 321c7edde1SDean Luick struct mutex invalidate_mutex; /* covers hw removal */ 33637f4600SHarish Chegondi unsigned long phys; 34637f4600SHarish Chegondi struct tid_group *grp; 35637f4600SHarish Chegondi u32 rcventry; 36637f4600SHarish Chegondi dma_addr_t dma_addr; 37637f4600SHarish Chegondi bool freed; 38637f4600SHarish Chegondi unsigned int npages; 39*96416897SKees Cook struct page *pages[] __counted_by(npages); 40637f4600SHarish Chegondi }; 41637f4600SHarish Chegondi num_user_pages(unsigned long addr,unsigned long len)42ddd3affbSHarish Chegondistatic inline int num_user_pages(unsigned long addr, 43ddd3affbSHarish Chegondi unsigned long len) 44ddd3affbSHarish Chegondi { 45ddd3affbSHarish Chegondi const unsigned long spage = addr & PAGE_MASK; 46ddd3affbSHarish Chegondi const unsigned long epage = (addr + len - 1) & PAGE_MASK; 47ddd3affbSHarish Chegondi 48ddd3affbSHarish Chegondi return 1 + ((epage - spage) >> PAGE_SHIFT); 49ddd3affbSHarish Chegondi } 50ddd3affbSHarish Chegondi 51e87473bcSMichael J. Ruhl int hfi1_user_exp_rcv_init(struct hfi1_filedata *fd, 52e87473bcSMichael J. Ruhl struct hfi1_ctxtdata *uctxt); 539b60d2cbSMichael J. Ruhl void hfi1_user_exp_rcv_free(struct hfi1_filedata *fd); 545042cddfSMichael J. Ruhl int hfi1_user_exp_rcv_setup(struct hfi1_filedata *fd, 555042cddfSMichael J. Ruhl struct hfi1_tid_info *tinfo); 565042cddfSMichael J. Ruhl int hfi1_user_exp_rcv_clear(struct hfi1_filedata *fd, 575042cddfSMichael J. Ruhl struct hfi1_tid_info *tinfo); 585042cddfSMichael J. Ruhl int hfi1_user_exp_rcv_invalid(struct hfi1_filedata *fd, 595042cddfSMichael J. Ruhl struct hfi1_tid_info *tinfo); 60f48ad614SDennis Dalessandro mm_from_tid_node(struct tid_rb_node * node)613d2a9d64SDennis Dalessandrostatic inline struct mm_struct *mm_from_tid_node(struct tid_rb_node *node) 623d2a9d64SDennis Dalessandro { 633d2a9d64SDennis Dalessandro return node->notifier.mm; 643d2a9d64SDennis Dalessandro } 653d2a9d64SDennis Dalessandro 66f48ad614SDennis Dalessandro #endif /* _HFI1_USER_EXP_RCV_H */ 67