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