IB/rdmavt: Move MR datastructures into rvt
[linux-2.6-block.git] / include / rdma / rdma_vt.h
1 #ifndef DEF_RDMA_VT_H
2 #define DEF_RDMA_VT_H
3
4 /*
5  * Copyright(c) 2015 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 /*
52  * Structure that low level drivers will populate in order to register with the
53  * rdmavt layer.
54  */
55
56 #include "ib_verbs.h"
57
58 /*
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.
61  */
62
63 /*
64  * A segment is a linear region of low physical memory.
65  * Used by the verbs layer.
66  */
67 struct rvt_seg {
68         void *vaddr;
69         size_t length;
70 };
71
72 /* The number of rvt_segs that fit in a page. */
73 #define RVT_SEGSZ     (PAGE_SIZE / sizeof(struct rvt_seg))
74
75 struct rvt_segarray {
76         struct rvt_seg segs[RVT_SEGSZ];
77 };
78
79 struct rvt_mregion {
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 */
83         size_t length;
84         u32 lkey;
85         u32 offset;             /* offset (bytes) to start of region */
86         int access_flags;
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 */
92         atomic_t refcount;
93         struct rvt_segarray *map[0];    /* the segments */
94 };
95
96 #define RVT_MAX_LKEY_TABLE_BITS 23
97
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;
104 };
105
106 /* End Memmory Region */
107
108 /*
109  * Things that are driver specific, module parameters in hfi1 and qib
110  */
111 struct rvt_driver_params {
112         /*
113          * driver required fields:
114          *      node_guid
115          *      phys_port_cnt
116          *      dma_device
117          *      owner
118          * driver optional fields (rvt will provide generic value if blank):
119          *      name
120          *      node_desc
121          * rvt fields, driver value ignored:
122          *      uverbs_abi_ver
123          *      node_type
124          *      num_comp_vectors
125          *      uverbs_cmd_mask
126          */
127         struct ib_device_attr props;
128
129         /*
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
133          * about include:
134          * port errors
135          * port active
136          * lid change
137          * sm change
138          * client reregister
139          * pkey change
140          *
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.
144          */
145          int rvt_signal_supported;
146
147         /*
148          * Anything driver specific that is not covered by props
149          * For instance special module parameters. Goes here.
150          */
151 };
152
153 /* Protection domain */
154 struct rvt_pd {
155         struct ib_pd ibpd;
156         int user;               /* non-zero if created from user space */
157 };
158
159 struct rvt_dev_info {
160         /*
161          * Prior to calling for registration the driver will be responsible for
162          * allocating space for this structure.
163          *
164          * The driver will also be responsible for filling in certain members of
165          * dparms.props
166          */
167         struct ib_device ibdev;
168
169         /* Driver specific properties */
170         struct rvt_driver_params dparms;
171
172         struct rvt_mregion __rcu *dma_mr;
173         struct rvt_lkey_table lkey_table;
174
175         /* PKey Table goes here */
176
177         /*
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
181          * this.
182          */
183         int (*port_callback)(struct ib_device *, u8, struct kobject *);
184
185         /* Internal use */
186         int n_pds_allocated;
187         spinlock_t n_pds_lock; /* Protect pd allocated count */
188 };
189
190 static inline struct rvt_pd *ibpd_to_rvtpd(struct ib_pd *ibpd)
191 {
192         return container_of(ibpd, struct rvt_pd, ibpd);
193 }
194
195 static inline struct rvt_dev_info *ib_to_rvt(struct ib_device *ibdev)
196 {
197         return  container_of(ibdev, struct rvt_dev_info, ibdev);
198 }
199
200 int rvt_register_device(struct rvt_dev_info *rvd);
201 void rvt_unregister_device(struct rvt_dev_info *rvd);
202
203 #endif          /* DEF_RDMA_VT_H */