xref: /onnv-gate/usr/src/uts/common/sys/ib/clients/rdsv3/rdma.h (revision 12863:5783b6fe7ed5)
112198SEiji.Ota@Sun.COM /*
212763SGiri.Adari@Sun.COM  * This file contains definitions imported from the OFED rds header rdma.h.
312763SGiri.Adari@Sun.COM  * Oracle elects to have and use the contents of rdma.h under and
412763SGiri.Adari@Sun.COM  * governed by the OpenIB.org BSD license.
512198SEiji.Ota@Sun.COM  */
612763SGiri.Adari@Sun.COM 
712198SEiji.Ota@Sun.COM /*
812198SEiji.Ota@Sun.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
912198SEiji.Ota@Sun.COM  */
1012198SEiji.Ota@Sun.COM 
1112198SEiji.Ota@Sun.COM #ifndef _RDSV3_RDMA_H
1212198SEiji.Ota@Sun.COM #define	_RDSV3_RDMA_H
1312198SEiji.Ota@Sun.COM 
1412198SEiji.Ota@Sun.COM #include <sys/rds.h>
1512198SEiji.Ota@Sun.COM #include <sys/uio.h>
1612198SEiji.Ota@Sun.COM 
1712198SEiji.Ota@Sun.COM #include <sys/ib/clients/rdsv3/rdsv3.h>
1812198SEiji.Ota@Sun.COM 
1912198SEiji.Ota@Sun.COM struct rdsv3_mr {
2012198SEiji.Ota@Sun.COM 	/* for AVL tree */
2112198SEiji.Ota@Sun.COM 	avl_node_t		r_rb_node;
2212198SEiji.Ota@Sun.COM 	atomic_t		r_refcount;
2312198SEiji.Ota@Sun.COM 	uint32_t		r_key;
2412198SEiji.Ota@Sun.COM 
2512198SEiji.Ota@Sun.COM 	/* A copy of the creation flags */
2612198SEiji.Ota@Sun.COM 	unsigned int		r_use_once:1;
2712198SEiji.Ota@Sun.COM 	unsigned int		r_invalidate:1;
2812198SEiji.Ota@Sun.COM 	unsigned int		r_write:1;
2912198SEiji.Ota@Sun.COM 
3012198SEiji.Ota@Sun.COM 	/*
3112198SEiji.Ota@Sun.COM 	 * This is for RDS_MR_DEAD.
3212198SEiji.Ota@Sun.COM 	 * It would be nice & consistent to make this part of the above
3312198SEiji.Ota@Sun.COM 	 * bit field here, but we need to use test_and_set_bit.
3412198SEiji.Ota@Sun.COM 	 */
3512198SEiji.Ota@Sun.COM 	unsigned long		r_state;
3612198SEiji.Ota@Sun.COM 	/* back pointer to the socket that owns us */
3712198SEiji.Ota@Sun.COM 	struct rdsv3_sock	*r_sock;
3812198SEiji.Ota@Sun.COM 	struct rdsv3_transport	*r_trans;
3912198SEiji.Ota@Sun.COM 	void			*r_trans_private;
4012198SEiji.Ota@Sun.COM };
4112198SEiji.Ota@Sun.COM 
4212198SEiji.Ota@Sun.COM /* Flags for mr->r_state */
4312198SEiji.Ota@Sun.COM #define	RDSV3_MR_DEAD		0
4412198SEiji.Ota@Sun.COM 
4512198SEiji.Ota@Sun.COM struct rdsv3_rdma_sg {
4612198SEiji.Ota@Sun.COM 	ddi_umem_cookie_t umem_cookie;
47*12863SEiji.Ota@Sun.COM 	struct rds_iovec iovec;
4812198SEiji.Ota@Sun.COM 	ibt_send_wr_t	swr;
4912198SEiji.Ota@Sun.COM 	ibt_mi_hdl_t	mihdl;
5012198SEiji.Ota@Sun.COM 	ibt_hca_hdl_t	hca_hdl;
5112198SEiji.Ota@Sun.COM };
5212198SEiji.Ota@Sun.COM 
5312198SEiji.Ota@Sun.COM struct rdsv3_rdma_op {
5412198SEiji.Ota@Sun.COM 	uint32_t		r_key;
5512198SEiji.Ota@Sun.COM 	uint64_t		r_remote_addr;
5612198SEiji.Ota@Sun.COM 	unsigned int		r_write:1;
5712198SEiji.Ota@Sun.COM 	unsigned int		r_fence:1;
5812198SEiji.Ota@Sun.COM 	unsigned int		r_notify:1;
5912198SEiji.Ota@Sun.COM 	unsigned int		r_recverr:1;
6012198SEiji.Ota@Sun.COM 	unsigned int		r_mapped:1;
6112198SEiji.Ota@Sun.COM 	struct rdsv3_notifier	*r_notifier;
6212198SEiji.Ota@Sun.COM 	unsigned int		r_bytes;
6312198SEiji.Ota@Sun.COM 	unsigned int		r_nents;
6412198SEiji.Ota@Sun.COM 	unsigned int		r_count;
6512198SEiji.Ota@Sun.COM 	struct rdsv3_scatterlist  *r_sg;
6612198SEiji.Ota@Sun.COM 	struct rdsv3_rdma_sg	r_rdma_sg[1];
6712198SEiji.Ota@Sun.COM };
6812198SEiji.Ota@Sun.COM 
69*12863SEiji.Ota@Sun.COM static inline rds_rdma_cookie_t
rdsv3_rdma_make_cookie(uint32_t r_key,uint32_t offset)7012198SEiji.Ota@Sun.COM rdsv3_rdma_make_cookie(uint32_t r_key, uint32_t offset)
7112198SEiji.Ota@Sun.COM {
7212198SEiji.Ota@Sun.COM 	return (r_key | (((uint64_t)offset) << 32));
7312198SEiji.Ota@Sun.COM }
7412198SEiji.Ota@Sun.COM 
7512228SEiji.Ota@Sun.COM static inline uint32_t
rdsv3_rdma_cookie_key(rds_rdma_cookie_t cookie)76*12863SEiji.Ota@Sun.COM rdsv3_rdma_cookie_key(rds_rdma_cookie_t cookie)
7712198SEiji.Ota@Sun.COM {
7812198SEiji.Ota@Sun.COM 	return ((uint32_t)cookie);
7912198SEiji.Ota@Sun.COM }
8012198SEiji.Ota@Sun.COM 
8112228SEiji.Ota@Sun.COM static inline uint32_t
rdsv3_rdma_cookie_offset(rds_rdma_cookie_t cookie)82*12863SEiji.Ota@Sun.COM rdsv3_rdma_cookie_offset(rds_rdma_cookie_t cookie)
8312198SEiji.Ota@Sun.COM {
8412198SEiji.Ota@Sun.COM 	return (cookie >> 32);
8512198SEiji.Ota@Sun.COM }
8612198SEiji.Ota@Sun.COM 
8712198SEiji.Ota@Sun.COM int rdsv3_get_mr(struct rdsv3_sock *rs, const void *optval, int optlen);
8812414SEiji.Ota@Sun.COM int rdsv3_get_mr_for_dest(struct rdsv3_sock *rs, const void *optval,
8912414SEiji.Ota@Sun.COM     int optlen);
9012198SEiji.Ota@Sun.COM int rdsv3_free_mr(struct rdsv3_sock *rs, const void *optval, int optlen);
9112198SEiji.Ota@Sun.COM void rdsv3_rdma_drop_keys(struct rdsv3_sock *rs);
9212198SEiji.Ota@Sun.COM int rdsv3_cmsg_rdma_args(struct rdsv3_sock *rs, struct rdsv3_message *rm,
9312198SEiji.Ota@Sun.COM     struct cmsghdr *cmsg);
9412198SEiji.Ota@Sun.COM int rdsv3_cmsg_rdma_dest(struct rdsv3_sock *rs, struct rdsv3_message *rm,
9512198SEiji.Ota@Sun.COM     struct cmsghdr *cmsg);
9612198SEiji.Ota@Sun.COM int rdsv3_cmsg_rdma_map(struct rdsv3_sock *rs, struct rdsv3_message *rm,
9712198SEiji.Ota@Sun.COM     struct cmsghdr *cmsg);
9812198SEiji.Ota@Sun.COM void rdsv3_rdma_free_op(struct rdsv3_rdma_op *ro);
9912198SEiji.Ota@Sun.COM void rdsv3_rdma_send_complete(struct rdsv3_message *rm, int);
10012198SEiji.Ota@Sun.COM 
10112198SEiji.Ota@Sun.COM extern void __rdsv3_put_mr_final(struct rdsv3_mr *mr);
rdsv3_mr_put(struct rdsv3_mr * mr)10212198SEiji.Ota@Sun.COM static inline void rdsv3_mr_put(struct rdsv3_mr *mr)
10312198SEiji.Ota@Sun.COM {
10412198SEiji.Ota@Sun.COM 	if (atomic_dec_and_test(&mr->r_refcount))
10512198SEiji.Ota@Sun.COM 		__rdsv3_put_mr_final(mr);
10612198SEiji.Ota@Sun.COM }
10712198SEiji.Ota@Sun.COM 
10812198SEiji.Ota@Sun.COM #endif /* _RDSV3_RDMA_H */
109