162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef RXE_VERBS_H 862306a36Sopenharmony_ci#define RXE_VERBS_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/interrupt.h> 1162306a36Sopenharmony_ci#include <linux/workqueue.h> 1262306a36Sopenharmony_ci#include "rxe_pool.h" 1362306a36Sopenharmony_ci#include "rxe_task.h" 1462306a36Sopenharmony_ci#include "rxe_hw_counters.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic inline int pkey_match(u16 key1, u16 key2) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci return (((key1 & 0x7fff) != 0) && 1962306a36Sopenharmony_ci ((key1 & 0x7fff) == (key2 & 0x7fff)) && 2062306a36Sopenharmony_ci ((key1 & 0x8000) || (key2 & 0x8000))) ? 1 : 0; 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* Return >0 if psn_a > psn_b 2462306a36Sopenharmony_ci * 0 if psn_a == psn_b 2562306a36Sopenharmony_ci * <0 if psn_a < psn_b 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_cistatic inline int psn_compare(u32 psn_a, u32 psn_b) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci s32 diff; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci diff = (psn_a - psn_b) << 8; 3262306a36Sopenharmony_ci return diff; 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct rxe_ucontext { 3662306a36Sopenharmony_ci struct ib_ucontext ibuc; 3762306a36Sopenharmony_ci struct rxe_pool_elem elem; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct rxe_pd { 4162306a36Sopenharmony_ci struct ib_pd ibpd; 4262306a36Sopenharmony_ci struct rxe_pool_elem elem; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct rxe_ah { 4662306a36Sopenharmony_ci struct ib_ah ibah; 4762306a36Sopenharmony_ci struct rxe_pool_elem elem; 4862306a36Sopenharmony_ci struct rxe_av av; 4962306a36Sopenharmony_ci bool is_user; 5062306a36Sopenharmony_ci int ah_num; 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct rxe_cqe { 5462306a36Sopenharmony_ci union { 5562306a36Sopenharmony_ci struct ib_wc ibwc; 5662306a36Sopenharmony_ci struct ib_uverbs_wc uibwc; 5762306a36Sopenharmony_ci }; 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistruct rxe_cq { 6162306a36Sopenharmony_ci struct ib_cq ibcq; 6262306a36Sopenharmony_ci struct rxe_pool_elem elem; 6362306a36Sopenharmony_ci struct rxe_queue *queue; 6462306a36Sopenharmony_ci spinlock_t cq_lock; 6562306a36Sopenharmony_ci u8 notify; 6662306a36Sopenharmony_ci bool is_user; 6762306a36Sopenharmony_ci atomic_t num_wq; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cienum wqe_state { 7162306a36Sopenharmony_ci wqe_state_posted, 7262306a36Sopenharmony_ci wqe_state_processing, 7362306a36Sopenharmony_ci wqe_state_pending, 7462306a36Sopenharmony_ci wqe_state_done, 7562306a36Sopenharmony_ci wqe_state_error, 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistruct rxe_sq { 7962306a36Sopenharmony_ci int max_wr; 8062306a36Sopenharmony_ci int max_sge; 8162306a36Sopenharmony_ci int max_inline; 8262306a36Sopenharmony_ci spinlock_t sq_lock; /* guard queue */ 8362306a36Sopenharmony_ci struct rxe_queue *queue; 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistruct rxe_rq { 8762306a36Sopenharmony_ci int max_wr; 8862306a36Sopenharmony_ci int max_sge; 8962306a36Sopenharmony_ci spinlock_t producer_lock; /* guard queue producer */ 9062306a36Sopenharmony_ci spinlock_t consumer_lock; /* guard queue consumer */ 9162306a36Sopenharmony_ci struct rxe_queue *queue; 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistruct rxe_srq { 9562306a36Sopenharmony_ci struct ib_srq ibsrq; 9662306a36Sopenharmony_ci struct rxe_pool_elem elem; 9762306a36Sopenharmony_ci struct rxe_pd *pd; 9862306a36Sopenharmony_ci struct rxe_rq rq; 9962306a36Sopenharmony_ci u32 srq_num; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci int limit; 10262306a36Sopenharmony_ci int error; 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistruct rxe_req_info { 10662306a36Sopenharmony_ci int wqe_index; 10762306a36Sopenharmony_ci u32 psn; 10862306a36Sopenharmony_ci int opcode; 10962306a36Sopenharmony_ci atomic_t rd_atomic; 11062306a36Sopenharmony_ci int wait_fence; 11162306a36Sopenharmony_ci int need_rd_atomic; 11262306a36Sopenharmony_ci int wait_psn; 11362306a36Sopenharmony_ci int need_retry; 11462306a36Sopenharmony_ci int wait_for_rnr_timer; 11562306a36Sopenharmony_ci int noack_pkts; 11662306a36Sopenharmony_ci struct rxe_task task; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct rxe_comp_info { 12062306a36Sopenharmony_ci u32 psn; 12162306a36Sopenharmony_ci int opcode; 12262306a36Sopenharmony_ci int timeout; 12362306a36Sopenharmony_ci int timeout_retry; 12462306a36Sopenharmony_ci int started_retry; 12562306a36Sopenharmony_ci u32 retry_cnt; 12662306a36Sopenharmony_ci u32 rnr_retry; 12762306a36Sopenharmony_ci struct rxe_task task; 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cienum rdatm_res_state { 13162306a36Sopenharmony_ci rdatm_res_state_next, 13262306a36Sopenharmony_ci rdatm_res_state_new, 13362306a36Sopenharmony_ci rdatm_res_state_replay, 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct resp_res { 13762306a36Sopenharmony_ci int type; 13862306a36Sopenharmony_ci int replay; 13962306a36Sopenharmony_ci u32 first_psn; 14062306a36Sopenharmony_ci u32 last_psn; 14162306a36Sopenharmony_ci u32 cur_psn; 14262306a36Sopenharmony_ci enum rdatm_res_state state; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci union { 14562306a36Sopenharmony_ci struct { 14662306a36Sopenharmony_ci u64 orig_val; 14762306a36Sopenharmony_ci } atomic; 14862306a36Sopenharmony_ci struct { 14962306a36Sopenharmony_ci u64 va_org; 15062306a36Sopenharmony_ci u32 rkey; 15162306a36Sopenharmony_ci u32 length; 15262306a36Sopenharmony_ci u64 va; 15362306a36Sopenharmony_ci u32 resid; 15462306a36Sopenharmony_ci } read; 15562306a36Sopenharmony_ci struct { 15662306a36Sopenharmony_ci u32 length; 15762306a36Sopenharmony_ci u64 va; 15862306a36Sopenharmony_ci u8 type; 15962306a36Sopenharmony_ci u8 level; 16062306a36Sopenharmony_ci } flush; 16162306a36Sopenharmony_ci }; 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct rxe_resp_info { 16562306a36Sopenharmony_ci u32 msn; 16662306a36Sopenharmony_ci u32 psn; 16762306a36Sopenharmony_ci u32 ack_psn; 16862306a36Sopenharmony_ci int opcode; 16962306a36Sopenharmony_ci int drop_msg; 17062306a36Sopenharmony_ci int goto_error; 17162306a36Sopenharmony_ci int sent_psn_nak; 17262306a36Sopenharmony_ci enum ib_wc_status status; 17362306a36Sopenharmony_ci u8 aeth_syndrome; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci /* Receive only */ 17662306a36Sopenharmony_ci struct rxe_recv_wqe *wqe; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci /* RDMA read / atomic only */ 17962306a36Sopenharmony_ci u64 va; 18062306a36Sopenharmony_ci u64 offset; 18162306a36Sopenharmony_ci struct rxe_mr *mr; 18262306a36Sopenharmony_ci u32 resid; 18362306a36Sopenharmony_ci u32 rkey; 18462306a36Sopenharmony_ci u32 length; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci /* SRQ only */ 18762306a36Sopenharmony_ci struct { 18862306a36Sopenharmony_ci struct rxe_recv_wqe wqe; 18962306a36Sopenharmony_ci struct ib_sge sge[RXE_MAX_SGE]; 19062306a36Sopenharmony_ci } srq_wqe; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci /* Responder resources. It's a circular list where the oldest 19362306a36Sopenharmony_ci * resource is dropped first. 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_ci struct resp_res *resources; 19662306a36Sopenharmony_ci unsigned int res_head; 19762306a36Sopenharmony_ci unsigned int res_tail; 19862306a36Sopenharmony_ci struct resp_res *res; 19962306a36Sopenharmony_ci struct rxe_task task; 20062306a36Sopenharmony_ci}; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cistruct rxe_qp { 20362306a36Sopenharmony_ci struct ib_qp ibqp; 20462306a36Sopenharmony_ci struct rxe_pool_elem elem; 20562306a36Sopenharmony_ci struct ib_qp_attr attr; 20662306a36Sopenharmony_ci unsigned int valid; 20762306a36Sopenharmony_ci unsigned int mtu; 20862306a36Sopenharmony_ci bool is_user; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci struct rxe_pd *pd; 21162306a36Sopenharmony_ci struct rxe_srq *srq; 21262306a36Sopenharmony_ci struct rxe_cq *scq; 21362306a36Sopenharmony_ci struct rxe_cq *rcq; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci enum ib_sig_type sq_sig_type; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci struct rxe_sq sq; 21862306a36Sopenharmony_ci struct rxe_rq rq; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci struct socket *sk; 22162306a36Sopenharmony_ci u32 dst_cookie; 22262306a36Sopenharmony_ci u16 src_port; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci struct rxe_av pri_av; 22562306a36Sopenharmony_ci struct rxe_av alt_av; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci atomic_t mcg_num; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci struct sk_buff_head req_pkts; 23062306a36Sopenharmony_ci struct sk_buff_head resp_pkts; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci struct rxe_req_info req; 23362306a36Sopenharmony_ci struct rxe_comp_info comp; 23462306a36Sopenharmony_ci struct rxe_resp_info resp; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci atomic_t ssn; 23762306a36Sopenharmony_ci atomic_t skb_out; 23862306a36Sopenharmony_ci int need_req_skb; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci /* Timer for retranmitting packet when ACKs have been lost. RC 24162306a36Sopenharmony_ci * only. The requester sets it when it is not already 24262306a36Sopenharmony_ci * started. The responder resets it whenever an ack is 24362306a36Sopenharmony_ci * received. 24462306a36Sopenharmony_ci */ 24562306a36Sopenharmony_ci struct timer_list retrans_timer; 24662306a36Sopenharmony_ci u64 qp_timeout_jiffies; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci /* Timer for handling RNR NAKS. */ 24962306a36Sopenharmony_ci struct timer_list rnr_nak_timer; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci spinlock_t state_lock; /* guard requester and completer */ 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci struct execute_work cleanup_work; 25462306a36Sopenharmony_ci}; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_cienum { 25762306a36Sopenharmony_ci RXE_ACCESS_REMOTE = IB_ACCESS_REMOTE_READ 25862306a36Sopenharmony_ci | IB_ACCESS_REMOTE_WRITE 25962306a36Sopenharmony_ci | IB_ACCESS_REMOTE_ATOMIC, 26062306a36Sopenharmony_ci RXE_ACCESS_SUPPORTED_MR = RXE_ACCESS_REMOTE 26162306a36Sopenharmony_ci | IB_ACCESS_LOCAL_WRITE 26262306a36Sopenharmony_ci | IB_ACCESS_MW_BIND 26362306a36Sopenharmony_ci | IB_ACCESS_ON_DEMAND 26462306a36Sopenharmony_ci | IB_ACCESS_FLUSH_GLOBAL 26562306a36Sopenharmony_ci | IB_ACCESS_FLUSH_PERSISTENT 26662306a36Sopenharmony_ci | IB_ACCESS_OPTIONAL, 26762306a36Sopenharmony_ci RXE_ACCESS_SUPPORTED_QP = RXE_ACCESS_SUPPORTED_MR, 26862306a36Sopenharmony_ci RXE_ACCESS_SUPPORTED_MW = RXE_ACCESS_SUPPORTED_MR 26962306a36Sopenharmony_ci | IB_ZERO_BASED, 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cienum rxe_mr_state { 27362306a36Sopenharmony_ci RXE_MR_STATE_INVALID, 27462306a36Sopenharmony_ci RXE_MR_STATE_FREE, 27562306a36Sopenharmony_ci RXE_MR_STATE_VALID, 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cienum rxe_mr_copy_dir { 27962306a36Sopenharmony_ci RXE_TO_MR_OBJ, 28062306a36Sopenharmony_ci RXE_FROM_MR_OBJ, 28162306a36Sopenharmony_ci}; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cienum rxe_mr_lookup_type { 28462306a36Sopenharmony_ci RXE_LOOKUP_LOCAL, 28562306a36Sopenharmony_ci RXE_LOOKUP_REMOTE, 28662306a36Sopenharmony_ci}; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cienum rxe_rereg { 28962306a36Sopenharmony_ci RXE_MR_REREG_SUPPORTED = IB_MR_REREG_PD 29062306a36Sopenharmony_ci | IB_MR_REREG_ACCESS, 29162306a36Sopenharmony_ci}; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistatic inline int rkey_is_mw(u32 rkey) 29462306a36Sopenharmony_ci{ 29562306a36Sopenharmony_ci u32 index = rkey >> 8; 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci return (index >= RXE_MIN_MW_INDEX) && (index <= RXE_MAX_MW_INDEX); 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistruct rxe_mr { 30162306a36Sopenharmony_ci struct rxe_pool_elem elem; 30262306a36Sopenharmony_ci struct ib_mr ibmr; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci struct ib_umem *umem; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci u32 lkey; 30762306a36Sopenharmony_ci u32 rkey; 30862306a36Sopenharmony_ci enum rxe_mr_state state; 30962306a36Sopenharmony_ci int access; 31062306a36Sopenharmony_ci atomic_t num_mw; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci unsigned int page_offset; 31362306a36Sopenharmony_ci unsigned int page_shift; 31462306a36Sopenharmony_ci u64 page_mask; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci u32 num_buf; 31762306a36Sopenharmony_ci u32 nbuf; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci struct xarray page_list; 32062306a36Sopenharmony_ci}; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistatic inline unsigned int mr_page_size(struct rxe_mr *mr) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci return mr ? mr->ibmr.page_size : PAGE_SIZE; 32562306a36Sopenharmony_ci} 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cienum rxe_mw_state { 32862306a36Sopenharmony_ci RXE_MW_STATE_INVALID = RXE_MR_STATE_INVALID, 32962306a36Sopenharmony_ci RXE_MW_STATE_FREE = RXE_MR_STATE_FREE, 33062306a36Sopenharmony_ci RXE_MW_STATE_VALID = RXE_MR_STATE_VALID, 33162306a36Sopenharmony_ci}; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistruct rxe_mw { 33462306a36Sopenharmony_ci struct ib_mw ibmw; 33562306a36Sopenharmony_ci struct rxe_pool_elem elem; 33662306a36Sopenharmony_ci spinlock_t lock; 33762306a36Sopenharmony_ci enum rxe_mw_state state; 33862306a36Sopenharmony_ci struct rxe_qp *qp; /* Type 2 only */ 33962306a36Sopenharmony_ci struct rxe_mr *mr; 34062306a36Sopenharmony_ci u32 rkey; 34162306a36Sopenharmony_ci int access; 34262306a36Sopenharmony_ci u64 addr; 34362306a36Sopenharmony_ci u64 length; 34462306a36Sopenharmony_ci}; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistruct rxe_mcg { 34762306a36Sopenharmony_ci struct rb_node node; 34862306a36Sopenharmony_ci struct kref ref_cnt; 34962306a36Sopenharmony_ci struct rxe_dev *rxe; 35062306a36Sopenharmony_ci struct list_head qp_list; 35162306a36Sopenharmony_ci union ib_gid mgid; 35262306a36Sopenharmony_ci atomic_t qp_num; 35362306a36Sopenharmony_ci u32 qkey; 35462306a36Sopenharmony_ci u16 pkey; 35562306a36Sopenharmony_ci}; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistruct rxe_mca { 35862306a36Sopenharmony_ci struct list_head qp_list; 35962306a36Sopenharmony_ci struct rxe_qp *qp; 36062306a36Sopenharmony_ci}; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistruct rxe_port { 36362306a36Sopenharmony_ci struct ib_port_attr attr; 36462306a36Sopenharmony_ci __be64 port_guid; 36562306a36Sopenharmony_ci __be64 subnet_prefix; 36662306a36Sopenharmony_ci spinlock_t port_lock; /* guard port */ 36762306a36Sopenharmony_ci unsigned int mtu_cap; 36862306a36Sopenharmony_ci /* special QPs */ 36962306a36Sopenharmony_ci u32 qp_gsi_index; 37062306a36Sopenharmony_ci}; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cistruct rxe_dev { 37362306a36Sopenharmony_ci struct ib_device ib_dev; 37462306a36Sopenharmony_ci struct ib_device_attr attr; 37562306a36Sopenharmony_ci int max_ucontext; 37662306a36Sopenharmony_ci int max_inline_data; 37762306a36Sopenharmony_ci struct mutex usdev_lock; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci struct net_device *ndev; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci struct rxe_pool uc_pool; 38262306a36Sopenharmony_ci struct rxe_pool pd_pool; 38362306a36Sopenharmony_ci struct rxe_pool ah_pool; 38462306a36Sopenharmony_ci struct rxe_pool srq_pool; 38562306a36Sopenharmony_ci struct rxe_pool qp_pool; 38662306a36Sopenharmony_ci struct rxe_pool cq_pool; 38762306a36Sopenharmony_ci struct rxe_pool mr_pool; 38862306a36Sopenharmony_ci struct rxe_pool mw_pool; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci /* multicast support */ 39162306a36Sopenharmony_ci spinlock_t mcg_lock; 39262306a36Sopenharmony_ci struct rb_root mcg_tree; 39362306a36Sopenharmony_ci atomic_t mcg_num; 39462306a36Sopenharmony_ci atomic_t mcg_attach; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci spinlock_t pending_lock; /* guard pending_mmaps */ 39762306a36Sopenharmony_ci struct list_head pending_mmaps; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci spinlock_t mmap_offset_lock; /* guard mmap_offset */ 40062306a36Sopenharmony_ci u64 mmap_offset; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci atomic64_t stats_counters[RXE_NUM_OF_COUNTERS]; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci struct rxe_port port; 40562306a36Sopenharmony_ci struct crypto_shash *tfm; 40662306a36Sopenharmony_ci}; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci atomic64_inc(&rxe->stats_counters[index]); 41162306a36Sopenharmony_ci} 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_cistatic inline struct rxe_dev *to_rdev(struct ib_device *dev) 41462306a36Sopenharmony_ci{ 41562306a36Sopenharmony_ci return dev ? container_of(dev, struct rxe_dev, ib_dev) : NULL; 41662306a36Sopenharmony_ci} 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_cistatic inline struct rxe_ucontext *to_ruc(struct ib_ucontext *uc) 41962306a36Sopenharmony_ci{ 42062306a36Sopenharmony_ci return uc ? container_of(uc, struct rxe_ucontext, ibuc) : NULL; 42162306a36Sopenharmony_ci} 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_cistatic inline struct rxe_pd *to_rpd(struct ib_pd *pd) 42462306a36Sopenharmony_ci{ 42562306a36Sopenharmony_ci return pd ? container_of(pd, struct rxe_pd, ibpd) : NULL; 42662306a36Sopenharmony_ci} 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_cistatic inline struct rxe_ah *to_rah(struct ib_ah *ah) 42962306a36Sopenharmony_ci{ 43062306a36Sopenharmony_ci return ah ? container_of(ah, struct rxe_ah, ibah) : NULL; 43162306a36Sopenharmony_ci} 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_cistatic inline struct rxe_srq *to_rsrq(struct ib_srq *srq) 43462306a36Sopenharmony_ci{ 43562306a36Sopenharmony_ci return srq ? container_of(srq, struct rxe_srq, ibsrq) : NULL; 43662306a36Sopenharmony_ci} 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic inline struct rxe_qp *to_rqp(struct ib_qp *qp) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci return qp ? container_of(qp, struct rxe_qp, ibqp) : NULL; 44162306a36Sopenharmony_ci} 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistatic inline struct rxe_cq *to_rcq(struct ib_cq *cq) 44462306a36Sopenharmony_ci{ 44562306a36Sopenharmony_ci return cq ? container_of(cq, struct rxe_cq, ibcq) : NULL; 44662306a36Sopenharmony_ci} 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cistatic inline struct rxe_mr *to_rmr(struct ib_mr *mr) 44962306a36Sopenharmony_ci{ 45062306a36Sopenharmony_ci return mr ? container_of(mr, struct rxe_mr, ibmr) : NULL; 45162306a36Sopenharmony_ci} 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_cistatic inline struct rxe_mw *to_rmw(struct ib_mw *mw) 45462306a36Sopenharmony_ci{ 45562306a36Sopenharmony_ci return mw ? container_of(mw, struct rxe_mw, ibmw) : NULL; 45662306a36Sopenharmony_ci} 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_cistatic inline struct rxe_pd *rxe_ah_pd(struct rxe_ah *ah) 45962306a36Sopenharmony_ci{ 46062306a36Sopenharmony_ci return to_rpd(ah->ibah.pd); 46162306a36Sopenharmony_ci} 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cistatic inline struct rxe_pd *mr_pd(struct rxe_mr *mr) 46462306a36Sopenharmony_ci{ 46562306a36Sopenharmony_ci return to_rpd(mr->ibmr.pd); 46662306a36Sopenharmony_ci} 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistatic inline struct rxe_pd *rxe_mw_pd(struct rxe_mw *mw) 46962306a36Sopenharmony_ci{ 47062306a36Sopenharmony_ci return to_rpd(mw->ibmw.pd); 47162306a36Sopenharmony_ci} 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ciint rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name); 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci#endif /* RXE_VERBS_H */ 476