IB/rdmavt: Move MR datastructures into rvt
[linux-2.6-block.git] / include / rdma / rdma_vt.h
CommitLineData
0194621b
DD
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"
8afd32eb 57
b92a7568
DD
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 */
67struct 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
75struct rvt_segarray {
76 struct rvt_seg segs[RVT_SEGSZ];
77};
78
79struct 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
98struct 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
8afd32eb
DD
108/*
109 * Things that are driver specific, module parameters in hfi1 and qib
110 */
111struct rvt_driver_params {
b1070a7a
DD
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 */
8afd32eb
DD
151};
152
153/* Protection domain */
154struct rvt_pd {
155 struct ib_pd ibpd;
156 int user; /* non-zero if created from user space */
157};
158
0194621b 159struct rvt_dev_info {
b1070a7a
DD
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 */
0194621b 167 struct ib_device ibdev;
8afd32eb 168
b1070a7a 169 /* Driver specific properties */
8afd32eb 170 struct rvt_driver_params dparms;
b1070a7a 171
b92a7568
DD
172 struct rvt_mregion __rcu *dma_mr;
173 struct rvt_lkey_table lkey_table;
174
30588643
DD
175 /* PKey Table goes here */
176
b1070a7a
DD
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 */
0194621b
DD
183 int (*port_callback)(struct ib_device *, u8, struct kobject *);
184
8afd32eb
DD
185 /* Internal use */
186 int n_pds_allocated;
187 spinlock_t n_pds_lock; /* Protect pd allocated count */
0194621b
DD
188};
189
8afd32eb
DD
190static inline struct rvt_pd *ibpd_to_rvtpd(struct ib_pd *ibpd)
191{
192 return container_of(ibpd, struct rvt_pd, ibpd);
193}
194
195static 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
0194621b
DD
200int rvt_register_device(struct rvt_dev_info *rvd);
201void rvt_unregister_device(struct rvt_dev_info *rvd);
202
203#endif /* DEF_RDMA_VT_H */