linux/drivers/infiniband/hw/hfi1/user_exp_rcv.h
<<
>>
Prefs
   1#ifndef _HFI1_USER_EXP_RCV_H
   2#define _HFI1_USER_EXP_RCV_H
   3/*
   4 * Copyright(c) 2020 - Cornelis Networks, Inc.
   5 * Copyright(c) 2015 - 2017 Intel Corporation.
   6 *
   7 * This file is provided under a dual BSD/GPLv2 license.  When using or
   8 * redistributing this file, you may do so under either license.
   9 *
  10 * GPL LICENSE SUMMARY
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of version 2 of the GNU General Public License as
  14 * published by the Free Software Foundation.
  15 *
  16 * This program is distributed in the hope that it will be useful, but
  17 * WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * BSD LICENSE
  22 *
  23 * Redistribution and use in source and binary forms, with or without
  24 * modification, are permitted provided that the following conditions
  25 * are met:
  26 *
  27 *  - Redistributions of source code must retain the above copyright
  28 *    notice, this list of conditions and the following disclaimer.
  29 *  - Redistributions in binary form must reproduce the above copyright
  30 *    notice, this list of conditions and the following disclaimer in
  31 *    the documentation and/or other materials provided with the
  32 *    distribution.
  33 *  - Neither the name of Intel Corporation nor the names of its
  34 *    contributors may be used to endorse or promote products derived
  35 *    from this software without specific prior written permission.
  36 *
  37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  38 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  39 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  40 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  41 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  44 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  45 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  46 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  47 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  48 *
  49 */
  50
  51#include "hfi.h"
  52#include "exp_rcv.h"
  53
  54struct tid_pageset {
  55        u16 idx;
  56        u16 count;
  57};
  58
  59struct tid_user_buf {
  60        unsigned long vaddr;
  61        unsigned long length;
  62        unsigned int npages;
  63        struct page **pages;
  64        struct tid_pageset *psets;
  65        unsigned int n_psets;
  66};
  67
  68struct tid_rb_node {
  69        struct mmu_interval_notifier notifier;
  70        struct hfi1_filedata *fdata;
  71        unsigned long phys;
  72        struct tid_group *grp;
  73        u32 rcventry;
  74        dma_addr_t dma_addr;
  75        bool freed;
  76        unsigned int npages;
  77        struct page *pages[];
  78};
  79
  80static inline int num_user_pages(unsigned long addr,
  81                                 unsigned long len)
  82{
  83        const unsigned long spage = addr & PAGE_MASK;
  84        const unsigned long epage = (addr + len - 1) & PAGE_MASK;
  85
  86        return 1 + ((epage - spage) >> PAGE_SHIFT);
  87}
  88
  89int hfi1_user_exp_rcv_init(struct hfi1_filedata *fd,
  90                           struct hfi1_ctxtdata *uctxt);
  91void hfi1_user_exp_rcv_free(struct hfi1_filedata *fd);
  92int hfi1_user_exp_rcv_setup(struct hfi1_filedata *fd,
  93                            struct hfi1_tid_info *tinfo);
  94int hfi1_user_exp_rcv_clear(struct hfi1_filedata *fd,
  95                            struct hfi1_tid_info *tinfo);
  96int hfi1_user_exp_rcv_invalid(struct hfi1_filedata *fd,
  97                              struct hfi1_tid_info *tinfo);
  98
  99static inline struct mm_struct *mm_from_tid_node(struct tid_rb_node *node)
 100{
 101        return node->notifier.mm;
 102}
 103
 104#endif /* _HFI1_USER_EXP_RCV_H */
 105