5 * Copyright(c) 2015 Intel Corporation.
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.
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.
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.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
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
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.
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.
52 * Structure that low level drivers will populate in order to register with the
59 * For Memory Regions. This stuff should probably be moved into rdmavt/mr.h once
60 * drivers no longer need access to the MR directly.
64 * A segment is a linear region of low physical memory.
65 * Used by the verbs layer.
72 /* The number of rvt_segs that fit in a page. */
73 #define RVT_SEGSZ (PAGE_SIZE / sizeof(struct rvt_seg))
76 struct rvt_seg segs[RVT_SEGSZ];
80 struct ib_pd *pd; /* shares refcnt of ibmr.pd */
81 u64 user_base; /* User's address for this region */
82 u64 iova; /* IB start address of this region */
85 u32 offset; /* offset (bytes) to start of region */
87 u32 max_segs; /* number of rvt_segs in all the arrays */
88 u32 mapsz; /* size of the map array */
89 u8 page_shift; /* 0 - non unform/non powerof2 sizes */
90 u8 lkey_published; /* in global table */
91 struct completion comp; /* complete when refcount goes to zero */
93 struct rvt_segarray *map[0]; /* the segments */
96 #define RVT_MAX_LKEY_TABLE_BITS 23
98 struct rvt_lkey_table {
99 spinlock_t lock; /* protect changes in this struct */
100 u32 next; /* next unused index (speeds search) */
101 u32 gen; /* generation count */
102 u32 max; /* size of the table */
103 struct rvt_mregion __rcu **table;
106 /* End Memmory Region */
109 * Things that are driver specific, module parameters in hfi1 and qib
111 struct rvt_driver_params {
113 * driver required fields:
118 * driver optional fields (rvt will provide generic value if blank):
121 * rvt fields, driver value ignored:
127 struct ib_device_attr props;
130 * Drivers will need to support a number of notifications to rvt in
131 * accordance with certain events. This structure should contain a mask
132 * of the supported events. Such events that the rvt may need to know
141 * There may also be other events that the rvt layers needs to know
142 * about this is not an exhaustive list. Some events though rvt does not
143 * need to rely on the driver for such as completion queue error.
145 int rvt_signal_supported;
148 * Anything driver specific that is not covered by props
149 * For instance special module parameters. Goes here.
153 /* Protection domain */
156 int user; /* non-zero if created from user space */
159 struct rvt_dev_info {
161 * Prior to calling for registration the driver will be responsible for
162 * allocating space for this structure.
164 * The driver will also be responsible for filling in certain members of
167 struct ib_device ibdev;
169 /* Driver specific properties */
170 struct rvt_driver_params dparms;
172 struct rvt_mregion __rcu *dma_mr;
173 struct rvt_lkey_table lkey_table;
175 /* PKey Table goes here */
178 * The work to create port files in /sys/class Infiniband is different
179 * depending on the driver. This should not be extracted away and
180 * instead drivers are responsible for setting the correct callback for
183 int (*port_callback)(struct ib_device *, u8, struct kobject *);
187 spinlock_t n_pds_lock; /* Protect pd allocated count */
190 static inline struct rvt_pd *ibpd_to_rvtpd(struct ib_pd *ibpd)
192 return container_of(ibpd, struct rvt_pd, ibpd);
195 static inline struct rvt_dev_info *ib_to_rvt(struct ib_device *ibdev)
197 return container_of(ibdev, struct rvt_dev_info, ibdev);
200 int rvt_register_device(struct rvt_dev_info *rvd);
201 void rvt_unregister_device(struct rvt_dev_info *rvd);
203 #endif /* DEF_RDMA_VT_H */