1 /*
2  * Copyright (c) 2016-2018 Intel Corporation, Inc.  All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  */
32 
33 #ifndef FI_DIRECT_ATOMIC_H
34 #define FI_DIRECT_ATOMIC_H
35 
36 #define FABRIC_DIRECT_ATOMIC
37 
38 ssize_t psmx2_atomic_write(
39 		struct fid_ep *ep,
40 		const void *buf, size_t count, void *desc,
41 		fi_addr_t dest_addr,
42 		uint64_t addr, uint64_t key,
43 		enum fi_datatype datatype, enum fi_op op, void *context);
44 
45 ssize_t psmx2_atomic_writev(
46 		struct fid_ep *ep,
47 		const struct fi_ioc *iov, void **desc, size_t count,
48 		fi_addr_t dest_addr,
49 		uint64_t addr, uint64_t key,
50 		enum fi_datatype datatype, enum fi_op op, void *context);
51 
52 ssize_t psmx2_atomic_writemsg(
53 		struct fid_ep *ep,
54 		const struct fi_msg_atomic *msg, uint64_t flags);
55 
56 ssize_t psmx2_atomic_inject(
57 		struct fid_ep *ep, const void *buf, size_t count,
58 		fi_addr_t dest_addr, uint64_t addr, uint64_t key,
59 		enum fi_datatype datatype, enum fi_op op);
60 
61 ssize_t psmx2_atomic_readwrite(
62 		struct fid_ep *ep,
63 		const void *buf, size_t count, void *desc,
64 		void *result, void *result_desc,
65 		fi_addr_t dest_addr,
66 		uint64_t addr, uint64_t key,
67 		enum fi_datatype datatype, enum fi_op op, void *context);
68 
69 ssize_t psmx2_atomic_readwritev(
70 		struct fid_ep *ep,
71 		const struct fi_ioc *iov, void **desc, size_t count,
72 		struct fi_ioc *resultv, void **result_desc, size_t result_count,
73 		fi_addr_t dest_addr,
74 		uint64_t addr, uint64_t key,
75 		enum fi_datatype datatype, enum fi_op op, void *context);
76 
77 ssize_t psmx2_atomic_readwritemsg(
78 		struct fid_ep *ep,
79 		const struct fi_msg_atomic *msg,
80 		struct fi_ioc *resultv, void **result_desc, size_t result_count,
81 		uint64_t flags);
82 
83 ssize_t psmx2_atomic_comparewrite(
84 		struct fid_ep *ep,
85 		const void *buf, size_t count, void *desc,
86 		const void *compare, void *compare_desc,
87 		void *result, void *result_desc,
88 		fi_addr_t dest_addr,
89 		uint64_t addr, uint64_t key,
90 		enum fi_datatype datatype, enum fi_op op, void *context);
91 
92 ssize_t psmx2_atomic_compareweitev(
93 		struct fid_ep *ep,
94 		const struct fi_ioc *iov, void **desc, size_t count,
95 		const struct fi_ioc *comparev, void **compare_desc, size_t compare_count,
96 		struct fi_ioc *resultv, void **result_desc, size_t result_count,
97 		fi_addr_t dest_addr,
98 		uint64_t addr, uint64_t key,
99 		enum fi_datatype datatype, enum fi_op op, void *context);
100 
101 ssize_t psmx2_atomic_comparewritemsg(
102 		struct fid_ep *ep,
103 		const struct fi_msg_atomic *msg,
104 		const struct fi_ioc *comparev, void **compare_desc, size_t compare_count,
105 		struct fi_ioc *resultv, void **result_desc, size_t result_count,
106 		uint64_t flags);
107 
108 int psmx2_atomic_writevalid(
109 		struct fid_ep *ep,
110 		enum fi_datatype datatype, enum fi_op op, size_t *count);
111 
112 int psmx2_atomic_readwritevalid(
113 		struct fid_ep *ep,
114 		enum fi_datatype datatype, enum fi_op op, size_t *count);
115 
116 int psmx2_atomic_comparewritevalid(
117 		struct fid_ep *ep,
118 		enum fi_datatype datatype, enum fi_op op, size_t *count);
119 
120 int psmx2_query_atomic(
121 		struct fid_domain *domain,
122 		enum fi_datatype datatype, enum fi_op op,
123 		struct fi_atomic_attr *attr, uint64_t flags);
124 
125 
126 static inline ssize_t
fi_atomic(struct fid_ep * ep,const void * buf,size_t count,void * desc,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op,void * context)127 fi_atomic(struct fid_ep *ep,
128 	  const void *buf, size_t count, void *desc,
129 	  fi_addr_t dest_addr,
130 	  uint64_t addr, uint64_t key,
131 	  enum fi_datatype datatype, enum fi_op op, void *context)
132 {
133 	return psmx2_atomic_write(ep, buf, count, desc, dest_addr, addr, key,
134 			datatype, op, context);
135 }
136 
137 static inline ssize_t
fi_atomicv(struct fid_ep * ep,const struct fi_ioc * iov,void ** desc,size_t count,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op,void * context)138 fi_atomicv(struct fid_ep *ep,
139 	   const struct fi_ioc *iov, void **desc, size_t count,
140 	   fi_addr_t dest_addr,
141 	   uint64_t addr, uint64_t key,
142 	   enum fi_datatype datatype, enum fi_op op, void *context)
143 {
144 	return psmx2_atomic_writev(ep, iov, desc, count, dest_addr, addr, key,
145 			datatype, op, context);
146 }
147 
148 static inline ssize_t
fi_atomicmsg(struct fid_ep * ep,const struct fi_msg_atomic * msg,uint64_t flags)149 fi_atomicmsg(struct fid_ep *ep,
150 	     const struct fi_msg_atomic *msg, uint64_t flags)
151 {
152 	return psmx2_atomic_writemsg(ep, msg, flags);
153 }
154 
155 static inline ssize_t
fi_inject_atomic(struct fid_ep * ep,const void * buf,size_t count,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op)156 fi_inject_atomic(struct fid_ep *ep, const void *buf, size_t count,
157 		 fi_addr_t dest_addr, uint64_t addr, uint64_t key,
158 		 enum fi_datatype datatype, enum fi_op op)
159 {
160 	return psmx2_atomic_inject(ep, buf, count, dest_addr, addr,
161 			key, datatype, op);
162 }
163 
164 static inline ssize_t
fi_fetch_atomic(struct fid_ep * ep,const void * buf,size_t count,void * desc,void * result,void * result_desc,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op,void * context)165 fi_fetch_atomic(struct fid_ep *ep,
166 		const void *buf, size_t count, void *desc,
167 		void *result, void *result_desc,
168 		fi_addr_t dest_addr,
169 		uint64_t addr, uint64_t key,
170 		enum fi_datatype datatype, enum fi_op op, void *context)
171 {
172 	return psmx2_atomic_readwrite(ep, buf, count, desc, result, result_desc,
173 			dest_addr, addr, key, datatype, op, context);
174 }
175 
176 static inline ssize_t
fi_fetch_atomicv(struct fid_ep * ep,const struct fi_ioc * iov,void ** desc,size_t count,struct fi_ioc * resultv,void ** result_desc,size_t result_count,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op,void * context)177 fi_fetch_atomicv(struct fid_ep *ep,
178 		 const struct fi_ioc *iov, void **desc, size_t count,
179 		 struct fi_ioc *resultv, void **result_desc, size_t result_count,
180 		 fi_addr_t dest_addr,
181 		 uint64_t addr, uint64_t key,
182 		 enum fi_datatype datatype, enum fi_op op, void *context)
183 {
184 	return psmx2_atomic_readwritev(ep, iov, desc, count,
185 			resultv, result_desc, result_count,
186 			dest_addr, addr, key, datatype, op, context);
187 }
188 
189 static inline ssize_t
fi_fetch_atomicmsg(struct fid_ep * ep,const struct fi_msg_atomic * msg,struct fi_ioc * resultv,void ** result_desc,size_t result_count,uint64_t flags)190 fi_fetch_atomicmsg(struct fid_ep *ep,
191 		   const struct fi_msg_atomic *msg,
192 		   struct fi_ioc *resultv, void **result_desc, size_t result_count,
193 		   uint64_t flags)
194 {
195 	return psmx2_atomic_readwritemsg(ep, msg, resultv, result_desc,
196 			result_count, flags);
197 }
198 
199 static inline ssize_t
fi_compare_atomic(struct fid_ep * ep,const void * buf,size_t count,void * desc,const void * compare,void * compare_desc,void * result,void * result_desc,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op,void * context)200 fi_compare_atomic(struct fid_ep *ep,
201 		  const void *buf, size_t count, void *desc,
202 		  const void *compare, void *compare_desc,
203 		  void *result, void *result_desc,
204 		  fi_addr_t dest_addr,
205 		  uint64_t addr, uint64_t key,
206 		  enum fi_datatype datatype, enum fi_op op, void *context)
207 {
208 	return psmx2_atomic_compwrite(ep, buf, count, desc,
209 			compare, compare_desc, result, result_desc,
210 			dest_addr, addr, key, datatype, op, context);
211 }
212 
213 static inline ssize_t
fi_compare_atomicv(struct fid_ep * ep,const struct fi_ioc * iov,void ** desc,size_t count,const struct fi_ioc * comparev,void ** compare_desc,size_t compare_count,struct fi_ioc * resultv,void ** result_desc,size_t result_count,fi_addr_t dest_addr,uint64_t addr,uint64_t key,enum fi_datatype datatype,enum fi_op op,void * context)214 fi_compare_atomicv(struct fid_ep *ep,
215 		   const struct fi_ioc *iov, void **desc, size_t count,
216 		   const struct fi_ioc *comparev, void **compare_desc, size_t compare_count,
217 		   struct fi_ioc *resultv, void **result_desc, size_t result_count,
218 		   fi_addr_t dest_addr,
219 		   uint64_t addr, uint64_t key,
220 		   enum fi_datatype datatype, enum fi_op op, void *context)
221 {
222 	return psmx2_atomic_compwritev(ep, iov, desc, count,
223 			comparev, compare_desc, compare_count,
224 			resultv, result_desc, result_count,
225 			dest_addr, addr, key, datatype, op, context);
226 }
227 
228 static inline ssize_t
fi_compare_atomicmsg(struct fid_ep * ep,const struct fi_msg_atomic * msg,const struct fi_ioc * comparev,void ** compare_desc,size_t compare_count,struct fi_ioc * resultv,void ** result_desc,size_t result_count,uint64_t flags)229 fi_compare_atomicmsg(struct fid_ep *ep,
230 		     const struct fi_msg_atomic *msg,
231 		     const struct fi_ioc *comparev, void **compare_desc, size_t compare_count,
232 		     struct fi_ioc *resultv, void **result_desc, size_t result_count,
233 		     uint64_t flags)
234 {
235 	return psmx2_atomic_compwritemsg(ep, msg,
236 			comparev, compare_desc, compare_count,
237 			resultv, result_desc, result_count, flags);
238 }
239 
240 static inline int
fi_atomicvalid(struct fid_ep * ep,enum fi_datatype datatype,enum fi_op op,size_t * count)241 fi_atomicvalid(struct fid_ep *ep,
242 	       enum fi_datatype datatype, enum fi_op op, size_t *count)
243 {
244 	return psmx2_atomic_writevalid(ep, datatype, op, count);
245 }
246 
247 static inline int
fi_fetch_atomicvalid(struct fid_ep * ep,enum fi_datatype datatype,enum fi_op op,size_t * count)248 fi_fetch_atomicvalid(struct fid_ep *ep,
249 		     enum fi_datatype datatype, enum fi_op op, size_t *count)
250 {
251 	return psmx2_atomic_readwritevalid(ep, datatype, op, count);
252 }
253 
254 static inline int
fi_compare_atomicvalid(struct fid_ep * ep,enum fi_datatype datatype,enum fi_op op,size_t * count)255 fi_compare_atomicvalid(struct fid_ep *ep,
256 		       enum fi_datatype datatype, enum fi_op op, size_t *count)
257 {
258 	return psmx2_atomic_compwritevalid(ep, datatype, op, count);
259 }
260 
261 static inline int
fi_query_atomic(struct fid_domain * domain,enum fi_datatype datatype,enum fi_op op,struct fi_atomic_attr * attr,uint64_t flags)262 fi_query_atomic(struct fid_domain *domain,
263 		enum fi_datatype datatype, enum fi_op op,
264 		struct fi_atomic_attr *attr, uint64_t flags)
265 {
266 	return psmx2_query_atomic(domain, datatype, op, attr, flags);
267 }
268 
269 #endif /* FI_DIRECT_ATOMIC_H */
270