xref: /linux/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h (revision c3bdd5e65185f46150b3bac103b3854040487857)
129c8d9ebSAdit Ranadive /*
229c8d9ebSAdit Ranadive  * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
329c8d9ebSAdit Ranadive  *
429c8d9ebSAdit Ranadive  * This program is free software; you can redistribute it and/or
529c8d9ebSAdit Ranadive  * modify it under the terms of EITHER the GNU General Public License
629c8d9ebSAdit Ranadive  * version 2 as published by the Free Software Foundation or the BSD
729c8d9ebSAdit Ranadive  * 2-Clause License. This program is distributed in the hope that it
829c8d9ebSAdit Ranadive  * will be useful, but WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED
929c8d9ebSAdit Ranadive  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1029c8d9ebSAdit Ranadive  * See the GNU General Public License version 2 for more details at
1129c8d9ebSAdit Ranadive  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html.
1229c8d9ebSAdit Ranadive  *
1329c8d9ebSAdit Ranadive  * You should have received a copy of the GNU General Public License
1429c8d9ebSAdit Ranadive  * along with this program available in the file COPYING in the main
1529c8d9ebSAdit Ranadive  * directory of this source tree.
1629c8d9ebSAdit Ranadive  *
1729c8d9ebSAdit Ranadive  * The BSD 2-Clause License
1829c8d9ebSAdit Ranadive  *
1929c8d9ebSAdit Ranadive  *     Redistribution and use in source and binary forms, with or
2029c8d9ebSAdit Ranadive  *     without modification, are permitted provided that the following
2129c8d9ebSAdit Ranadive  *     conditions are met:
2229c8d9ebSAdit Ranadive  *
2329c8d9ebSAdit Ranadive  *      - Redistributions of source code must retain the above
2429c8d9ebSAdit Ranadive  *        copyright notice, this list of conditions and the following
2529c8d9ebSAdit Ranadive  *        disclaimer.
2629c8d9ebSAdit Ranadive  *
2729c8d9ebSAdit Ranadive  *      - Redistributions in binary form must reproduce the above
2829c8d9ebSAdit Ranadive  *        copyright notice, this list of conditions and the following
2929c8d9ebSAdit Ranadive  *        disclaimer in the documentation and/or other materials
3029c8d9ebSAdit Ranadive  *        provided with the distribution.
3129c8d9ebSAdit Ranadive  *
3229c8d9ebSAdit Ranadive  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3329c8d9ebSAdit Ranadive  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3429c8d9ebSAdit Ranadive  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
3529c8d9ebSAdit Ranadive  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
3629c8d9ebSAdit Ranadive  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
3729c8d9ebSAdit Ranadive  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3829c8d9ebSAdit Ranadive  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
3929c8d9ebSAdit Ranadive  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4029c8d9ebSAdit Ranadive  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
4129c8d9ebSAdit Ranadive  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
4229c8d9ebSAdit Ranadive  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
4329c8d9ebSAdit Ranadive  * OF THE POSSIBILITY OF SUCH DAMAGE.
4429c8d9ebSAdit Ranadive  */
4529c8d9ebSAdit Ranadive 
4629c8d9ebSAdit Ranadive #ifndef __PVRDMA_H__
4729c8d9ebSAdit Ranadive #define __PVRDMA_H__
4829c8d9ebSAdit Ranadive 
4929c8d9ebSAdit Ranadive #include <linux/compiler.h>
5029c8d9ebSAdit Ranadive #include <linux/interrupt.h>
5129c8d9ebSAdit Ranadive #include <linux/list.h>
5229c8d9ebSAdit Ranadive #include <linux/mutex.h>
5329c8d9ebSAdit Ranadive #include <linux/pci.h>
5429c8d9ebSAdit Ranadive #include <linux/semaphore.h>
5529c8d9ebSAdit Ranadive #include <linux/workqueue.h>
5629c8d9ebSAdit Ranadive #include <rdma/ib_umem.h>
5729c8d9ebSAdit Ranadive #include <rdma/ib_verbs.h>
5829c8d9ebSAdit Ranadive #include <rdma/vmw_pvrdma-abi.h>
5929c8d9ebSAdit Ranadive 
6029c8d9ebSAdit Ranadive #include "pvrdma_ring.h"
6129c8d9ebSAdit Ranadive #include "pvrdma_dev_api.h"
6229c8d9ebSAdit Ranadive #include "pvrdma_verbs.h"
6329c8d9ebSAdit Ranadive 
6429c8d9ebSAdit Ranadive /* NOT the same as BIT_MASK(). */
6529c8d9ebSAdit Ranadive #define PVRDMA_MASK(n) ((n << 1) - 1)
6629c8d9ebSAdit Ranadive 
6729c8d9ebSAdit Ranadive /*
6829c8d9ebSAdit Ranadive  * VMware PVRDMA PCI device id.
6929c8d9ebSAdit Ranadive  */
7029c8d9ebSAdit Ranadive #define PCI_DEVICE_ID_VMWARE_PVRDMA	0x0820
7129c8d9ebSAdit Ranadive 
726332dee8SAdit Ranadive #define PVRDMA_NUM_RING_PAGES		4
73e51c2fb0SAdit Ranadive #define PVRDMA_QP_NUM_HEADER_PAGES	1
746332dee8SAdit Ranadive 
7529c8d9ebSAdit Ranadive struct pvrdma_dev;
7629c8d9ebSAdit Ranadive 
7729c8d9ebSAdit Ranadive struct pvrdma_page_dir {
7829c8d9ebSAdit Ranadive 	dma_addr_t dir_dma;
7929c8d9ebSAdit Ranadive 	u64 *dir;
8029c8d9ebSAdit Ranadive 	int ntables;
8129c8d9ebSAdit Ranadive 	u64 **tables;
8229c8d9ebSAdit Ranadive 	u64 npages;
8329c8d9ebSAdit Ranadive 	void **pages;
8429c8d9ebSAdit Ranadive };
8529c8d9ebSAdit Ranadive 
8629c8d9ebSAdit Ranadive struct pvrdma_cq {
8729c8d9ebSAdit Ranadive 	struct ib_cq ibcq;
8829c8d9ebSAdit Ranadive 	int offset;
8929c8d9ebSAdit Ranadive 	spinlock_t cq_lock; /* Poll lock. */
9029c8d9ebSAdit Ranadive 	struct pvrdma_uar_map *uar;
9129c8d9ebSAdit Ranadive 	struct ib_umem *umem;
9229c8d9ebSAdit Ranadive 	struct pvrdma_ring_state *ring_state;
9329c8d9ebSAdit Ranadive 	struct pvrdma_page_dir pdir;
9429c8d9ebSAdit Ranadive 	u32 cq_handle;
9529c8d9ebSAdit Ranadive 	bool is_kernel;
96a61eb613SBryan Tan 	refcount_t refcnt;
97e3524b26SBryan Tan 	struct completion free;
9829c8d9ebSAdit Ranadive };
9929c8d9ebSAdit Ranadive 
10029c8d9ebSAdit Ranadive struct pvrdma_id_table {
10129c8d9ebSAdit Ranadive 	u32 last;
10229c8d9ebSAdit Ranadive 	u32 top;
10329c8d9ebSAdit Ranadive 	u32 max;
10429c8d9ebSAdit Ranadive 	u32 mask;
10529c8d9ebSAdit Ranadive 	spinlock_t lock; /* Table lock. */
10629c8d9ebSAdit Ranadive 	unsigned long *table;
10729c8d9ebSAdit Ranadive };
10829c8d9ebSAdit Ranadive 
10929c8d9ebSAdit Ranadive struct pvrdma_uar_map {
11029c8d9ebSAdit Ranadive 	unsigned long pfn;
11129c8d9ebSAdit Ranadive 	void __iomem *map;
11229c8d9ebSAdit Ranadive 	int index;
11329c8d9ebSAdit Ranadive };
11429c8d9ebSAdit Ranadive 
11529c8d9ebSAdit Ranadive struct pvrdma_uar_table {
11629c8d9ebSAdit Ranadive 	struct pvrdma_id_table tbl;
11729c8d9ebSAdit Ranadive 	int size;
11829c8d9ebSAdit Ranadive };
11929c8d9ebSAdit Ranadive 
12029c8d9ebSAdit Ranadive struct pvrdma_ucontext {
12129c8d9ebSAdit Ranadive 	struct ib_ucontext ibucontext;
12229c8d9ebSAdit Ranadive 	struct pvrdma_dev *dev;
12329c8d9ebSAdit Ranadive 	struct pvrdma_uar_map uar;
12429c8d9ebSAdit Ranadive 	u64 ctx_handle;
12529c8d9ebSAdit Ranadive };
12629c8d9ebSAdit Ranadive 
12729c8d9ebSAdit Ranadive struct pvrdma_pd {
12829c8d9ebSAdit Ranadive 	struct ib_pd ibpd;
12929c8d9ebSAdit Ranadive 	u32 pdn;
13029c8d9ebSAdit Ranadive 	u32 pd_handle;
13129c8d9ebSAdit Ranadive 	int privileged;
13229c8d9ebSAdit Ranadive };
13329c8d9ebSAdit Ranadive 
13429c8d9ebSAdit Ranadive struct pvrdma_mr {
13529c8d9ebSAdit Ranadive 	u32 mr_handle;
13629c8d9ebSAdit Ranadive 	u64 iova;
13729c8d9ebSAdit Ranadive 	u64 size;
13829c8d9ebSAdit Ranadive };
13929c8d9ebSAdit Ranadive 
14029c8d9ebSAdit Ranadive struct pvrdma_user_mr {
14129c8d9ebSAdit Ranadive 	struct ib_mr ibmr;
14229c8d9ebSAdit Ranadive 	struct ib_umem *umem;
14329c8d9ebSAdit Ranadive 	struct pvrdma_mr mmr;
14429c8d9ebSAdit Ranadive 	struct pvrdma_page_dir pdir;
14529c8d9ebSAdit Ranadive 	u64 *pages;
14629c8d9ebSAdit Ranadive 	u32 npages;
14729c8d9ebSAdit Ranadive 	u32 max_pages;
14829c8d9ebSAdit Ranadive 	u32 page_shift;
14929c8d9ebSAdit Ranadive };
15029c8d9ebSAdit Ranadive 
15129c8d9ebSAdit Ranadive struct pvrdma_wq {
15229c8d9ebSAdit Ranadive 	struct pvrdma_ring *ring;
15329c8d9ebSAdit Ranadive 	spinlock_t lock; /* Work queue lock. */
15429c8d9ebSAdit Ranadive 	int wqe_cnt;
15529c8d9ebSAdit Ranadive 	int wqe_size;
15629c8d9ebSAdit Ranadive 	int max_sg;
15729c8d9ebSAdit Ranadive 	int offset;
15829c8d9ebSAdit Ranadive };
15929c8d9ebSAdit Ranadive 
16029c8d9ebSAdit Ranadive struct pvrdma_ah {
16129c8d9ebSAdit Ranadive 	struct ib_ah ibah;
16229c8d9ebSAdit Ranadive 	struct pvrdma_av av;
16329c8d9ebSAdit Ranadive };
16429c8d9ebSAdit Ranadive 
1658b10ba78SBryan Tan struct pvrdma_srq {
1668b10ba78SBryan Tan 	struct ib_srq ibsrq;
1678b10ba78SBryan Tan 	int offset;
1688b10ba78SBryan Tan 	spinlock_t lock; /* SRQ lock. */
1698b10ba78SBryan Tan 	int wqe_cnt;
1708b10ba78SBryan Tan 	int wqe_size;
1718b10ba78SBryan Tan 	int max_gs;
1728b10ba78SBryan Tan 	struct ib_umem *umem;
1738b10ba78SBryan Tan 	struct pvrdma_ring_state *ring;
1748b10ba78SBryan Tan 	struct pvrdma_page_dir pdir;
1758b10ba78SBryan Tan 	u32 srq_handle;
1768b10ba78SBryan Tan 	int npages;
1778b10ba78SBryan Tan 	refcount_t refcnt;
178e3524b26SBryan Tan 	struct completion free;
1798b10ba78SBryan Tan };
1808b10ba78SBryan Tan 
18129c8d9ebSAdit Ranadive struct pvrdma_qp {
18229c8d9ebSAdit Ranadive 	struct ib_qp ibqp;
18329c8d9ebSAdit Ranadive 	u32 qp_handle;
18429c8d9ebSAdit Ranadive 	u32 qkey;
18529c8d9ebSAdit Ranadive 	struct pvrdma_wq sq;
18629c8d9ebSAdit Ranadive 	struct pvrdma_wq rq;
18729c8d9ebSAdit Ranadive 	struct ib_umem *rumem;
18829c8d9ebSAdit Ranadive 	struct ib_umem *sumem;
18929c8d9ebSAdit Ranadive 	struct pvrdma_page_dir pdir;
1908b10ba78SBryan Tan 	struct pvrdma_srq *srq;
19129c8d9ebSAdit Ranadive 	int npages;
19229c8d9ebSAdit Ranadive 	int npages_send;
19329c8d9ebSAdit Ranadive 	int npages_recv;
19429c8d9ebSAdit Ranadive 	u32 flags;
19529c8d9ebSAdit Ranadive 	u8 port;
19629c8d9ebSAdit Ranadive 	u8 state;
19729c8d9ebSAdit Ranadive 	bool is_kernel;
19829c8d9ebSAdit Ranadive 	struct mutex mutex; /* QP state mutex. */
199a61eb613SBryan Tan 	refcount_t refcnt;
200e3524b26SBryan Tan 	struct completion free;
20129c8d9ebSAdit Ranadive };
20229c8d9ebSAdit Ranadive 
20329c8d9ebSAdit Ranadive struct pvrdma_dev {
20429c8d9ebSAdit Ranadive 	/* PCI device-related information. */
20529c8d9ebSAdit Ranadive 	struct ib_device ib_dev;
20629c8d9ebSAdit Ranadive 	struct pci_dev *pdev;
20729c8d9ebSAdit Ranadive 	void __iomem *regs;
20829c8d9ebSAdit Ranadive 	struct pvrdma_device_shared_region *dsr; /* Shared region pointer */
20929c8d9ebSAdit Ranadive 	dma_addr_t dsrbase; /* Shared region base address */
21029c8d9ebSAdit Ranadive 	void *cmd_slot;
21129c8d9ebSAdit Ranadive 	void *resp_slot;
21229c8d9ebSAdit Ranadive 	unsigned long flags;
21329c8d9ebSAdit Ranadive 	struct list_head device_link;
21405297b66SBryan Tan 	unsigned int dsr_version;
21529c8d9ebSAdit Ranadive 
21629c8d9ebSAdit Ranadive 	/* Locking and interrupt information. */
21729c8d9ebSAdit Ranadive 	spinlock_t cmd_lock; /* Command lock. */
21829c8d9ebSAdit Ranadive 	struct semaphore cmd_sema;
21929c8d9ebSAdit Ranadive 	struct completion cmd_done;
2207bf3976dSChristoph Hellwig 	unsigned int nr_vectors;
22129c8d9ebSAdit Ranadive 
22229c8d9ebSAdit Ranadive 	/* RDMA-related device information. */
22329c8d9ebSAdit Ranadive 	union ib_gid *sgid_tbl;
22429c8d9ebSAdit Ranadive 	struct pvrdma_ring_state *async_ring_state;
22529c8d9ebSAdit Ranadive 	struct pvrdma_page_dir async_pdir;
22629c8d9ebSAdit Ranadive 	struct pvrdma_ring_state *cq_ring_state;
22729c8d9ebSAdit Ranadive 	struct pvrdma_page_dir cq_pdir;
22829c8d9ebSAdit Ranadive 	struct pvrdma_cq **cq_tbl;
22929c8d9ebSAdit Ranadive 	spinlock_t cq_tbl_lock;
2308b10ba78SBryan Tan 	struct pvrdma_srq **srq_tbl;
2318b10ba78SBryan Tan 	spinlock_t srq_tbl_lock;
23229c8d9ebSAdit Ranadive 	struct pvrdma_qp **qp_tbl;
23329c8d9ebSAdit Ranadive 	spinlock_t qp_tbl_lock;
23429c8d9ebSAdit Ranadive 	struct pvrdma_uar_table uar_table;
23529c8d9ebSAdit Ranadive 	struct pvrdma_uar_map driver_uar;
23629c8d9ebSAdit Ranadive 	__be64 sys_image_guid;
23729c8d9ebSAdit Ranadive 	spinlock_t desc_lock; /* Device modification lock. */
23829c8d9ebSAdit Ranadive 	u32 port_cap_mask;
23929c8d9ebSAdit Ranadive 	struct mutex port_mutex; /* Port modification mutex. */
24029c8d9ebSAdit Ranadive 	bool ib_active;
24129c8d9ebSAdit Ranadive 	atomic_t num_qps;
24229c8d9ebSAdit Ranadive 	atomic_t num_cqs;
2438b10ba78SBryan Tan 	atomic_t num_srqs;
24429c8d9ebSAdit Ranadive 	atomic_t num_pds;
24529c8d9ebSAdit Ranadive 	atomic_t num_ahs;
24629c8d9ebSAdit Ranadive 
24729c8d9ebSAdit Ranadive 	/* Network device information. */
24829c8d9ebSAdit Ranadive 	struct net_device *netdev;
24929c8d9ebSAdit Ranadive 	struct notifier_block nb_netdev;
25029c8d9ebSAdit Ranadive };
25129c8d9ebSAdit Ranadive 
25229c8d9ebSAdit Ranadive struct pvrdma_netdevice_work {
25329c8d9ebSAdit Ranadive 	struct work_struct work;
25429c8d9ebSAdit Ranadive 	struct net_device *event_netdev;
25529c8d9ebSAdit Ranadive 	unsigned long event;
25629c8d9ebSAdit Ranadive };
25729c8d9ebSAdit Ranadive 
25829c8d9ebSAdit Ranadive static inline struct pvrdma_dev *to_vdev(struct ib_device *ibdev)
25929c8d9ebSAdit Ranadive {
26029c8d9ebSAdit Ranadive 	return container_of(ibdev, struct pvrdma_dev, ib_dev);
26129c8d9ebSAdit Ranadive }
26229c8d9ebSAdit Ranadive 
26329c8d9ebSAdit Ranadive static inline struct
26429c8d9ebSAdit Ranadive pvrdma_ucontext *to_vucontext(struct ib_ucontext *ibucontext)
26529c8d9ebSAdit Ranadive {
26629c8d9ebSAdit Ranadive 	return container_of(ibucontext, struct pvrdma_ucontext, ibucontext);
26729c8d9ebSAdit Ranadive }
26829c8d9ebSAdit Ranadive 
26929c8d9ebSAdit Ranadive static inline struct pvrdma_pd *to_vpd(struct ib_pd *ibpd)
27029c8d9ebSAdit Ranadive {
27129c8d9ebSAdit Ranadive 	return container_of(ibpd, struct pvrdma_pd, ibpd);
27229c8d9ebSAdit Ranadive }
27329c8d9ebSAdit Ranadive 
27429c8d9ebSAdit Ranadive static inline struct pvrdma_cq *to_vcq(struct ib_cq *ibcq)
27529c8d9ebSAdit Ranadive {
27629c8d9ebSAdit Ranadive 	return container_of(ibcq, struct pvrdma_cq, ibcq);
27729c8d9ebSAdit Ranadive }
27829c8d9ebSAdit Ranadive 
2798b10ba78SBryan Tan static inline struct pvrdma_srq *to_vsrq(struct ib_srq *ibsrq)
2808b10ba78SBryan Tan {
2818b10ba78SBryan Tan 	return container_of(ibsrq, struct pvrdma_srq, ibsrq);
2828b10ba78SBryan Tan }
2838b10ba78SBryan Tan 
28429c8d9ebSAdit Ranadive static inline struct pvrdma_user_mr *to_vmr(struct ib_mr *ibmr)
28529c8d9ebSAdit Ranadive {
28629c8d9ebSAdit Ranadive 	return container_of(ibmr, struct pvrdma_user_mr, ibmr);
28729c8d9ebSAdit Ranadive }
28829c8d9ebSAdit Ranadive 
28929c8d9ebSAdit Ranadive static inline struct pvrdma_qp *to_vqp(struct ib_qp *ibqp)
29029c8d9ebSAdit Ranadive {
29129c8d9ebSAdit Ranadive 	return container_of(ibqp, struct pvrdma_qp, ibqp);
29229c8d9ebSAdit Ranadive }
29329c8d9ebSAdit Ranadive 
29429c8d9ebSAdit Ranadive static inline struct pvrdma_ah *to_vah(struct ib_ah *ibah)
29529c8d9ebSAdit Ranadive {
29629c8d9ebSAdit Ranadive 	return container_of(ibah, struct pvrdma_ah, ibah);
29729c8d9ebSAdit Ranadive }
29829c8d9ebSAdit Ranadive 
29929c8d9ebSAdit Ranadive static inline void pvrdma_write_reg(struct pvrdma_dev *dev, u32 reg, u32 val)
30029c8d9ebSAdit Ranadive {
30129c8d9ebSAdit Ranadive 	writel(cpu_to_le32(val), dev->regs + reg);
30229c8d9ebSAdit Ranadive }
30329c8d9ebSAdit Ranadive 
30429c8d9ebSAdit Ranadive static inline u32 pvrdma_read_reg(struct pvrdma_dev *dev, u32 reg)
30529c8d9ebSAdit Ranadive {
30629c8d9ebSAdit Ranadive 	return le32_to_cpu(readl(dev->regs + reg));
30729c8d9ebSAdit Ranadive }
30829c8d9ebSAdit Ranadive 
30929c8d9ebSAdit Ranadive static inline void pvrdma_write_uar_cq(struct pvrdma_dev *dev, u32 val)
31029c8d9ebSAdit Ranadive {
31129c8d9ebSAdit Ranadive 	writel(cpu_to_le32(val), dev->driver_uar.map + PVRDMA_UAR_CQ_OFFSET);
31229c8d9ebSAdit Ranadive }
31329c8d9ebSAdit Ranadive 
31429c8d9ebSAdit Ranadive static inline void pvrdma_write_uar_qp(struct pvrdma_dev *dev, u32 val)
31529c8d9ebSAdit Ranadive {
31629c8d9ebSAdit Ranadive 	writel(cpu_to_le32(val), dev->driver_uar.map + PVRDMA_UAR_QP_OFFSET);
31729c8d9ebSAdit Ranadive }
31829c8d9ebSAdit Ranadive 
31929c8d9ebSAdit Ranadive static inline void *pvrdma_page_dir_get_ptr(struct pvrdma_page_dir *pdir,
32029c8d9ebSAdit Ranadive 					    u64 offset)
32129c8d9ebSAdit Ranadive {
32229c8d9ebSAdit Ranadive 	return pdir->pages[offset / PAGE_SIZE] + (offset % PAGE_SIZE);
32329c8d9ebSAdit Ranadive }
32429c8d9ebSAdit Ranadive 
32529c8d9ebSAdit Ranadive static inline enum pvrdma_mtu ib_mtu_to_pvrdma(enum ib_mtu mtu)
32629c8d9ebSAdit Ranadive {
32729c8d9ebSAdit Ranadive 	return (enum pvrdma_mtu)mtu;
32829c8d9ebSAdit Ranadive }
32929c8d9ebSAdit Ranadive 
33029c8d9ebSAdit Ranadive static inline enum ib_mtu pvrdma_mtu_to_ib(enum pvrdma_mtu mtu)
33129c8d9ebSAdit Ranadive {
33229c8d9ebSAdit Ranadive 	return (enum ib_mtu)mtu;
33329c8d9ebSAdit Ranadive }
33429c8d9ebSAdit Ranadive 
33529c8d9ebSAdit Ranadive static inline enum pvrdma_port_state ib_port_state_to_pvrdma(
33629c8d9ebSAdit Ranadive 					enum ib_port_state state)
33729c8d9ebSAdit Ranadive {
33829c8d9ebSAdit Ranadive 	return (enum pvrdma_port_state)state;
33929c8d9ebSAdit Ranadive }
34029c8d9ebSAdit Ranadive 
34129c8d9ebSAdit Ranadive static inline enum ib_port_state pvrdma_port_state_to_ib(
34229c8d9ebSAdit Ranadive 					enum pvrdma_port_state state)
34329c8d9ebSAdit Ranadive {
34429c8d9ebSAdit Ranadive 	return (enum ib_port_state)state;
34529c8d9ebSAdit Ranadive }
34629c8d9ebSAdit Ranadive 
34729c8d9ebSAdit Ranadive static inline int ib_port_cap_flags_to_pvrdma(int flags)
34829c8d9ebSAdit Ranadive {
34929c8d9ebSAdit Ranadive 	return flags & PVRDMA_MASK(PVRDMA_PORT_CAP_FLAGS_MAX);
35029c8d9ebSAdit Ranadive }
35129c8d9ebSAdit Ranadive 
35229c8d9ebSAdit Ranadive static inline int pvrdma_port_cap_flags_to_ib(int flags)
35329c8d9ebSAdit Ranadive {
35429c8d9ebSAdit Ranadive 	return flags;
35529c8d9ebSAdit Ranadive }
35629c8d9ebSAdit Ranadive 
35729c8d9ebSAdit Ranadive static inline enum pvrdma_port_width ib_port_width_to_pvrdma(
35829c8d9ebSAdit Ranadive 					enum ib_port_width width)
35929c8d9ebSAdit Ranadive {
36029c8d9ebSAdit Ranadive 	return (enum pvrdma_port_width)width;
36129c8d9ebSAdit Ranadive }
36229c8d9ebSAdit Ranadive 
36329c8d9ebSAdit Ranadive static inline enum ib_port_width pvrdma_port_width_to_ib(
36429c8d9ebSAdit Ranadive 					enum pvrdma_port_width width)
36529c8d9ebSAdit Ranadive {
36629c8d9ebSAdit Ranadive 	return (enum ib_port_width)width;
36729c8d9ebSAdit Ranadive }
36829c8d9ebSAdit Ranadive 
36929c8d9ebSAdit Ranadive static inline enum pvrdma_port_speed ib_port_speed_to_pvrdma(
37029c8d9ebSAdit Ranadive 					enum ib_port_speed speed)
37129c8d9ebSAdit Ranadive {
37229c8d9ebSAdit Ranadive 	return (enum pvrdma_port_speed)speed;
37329c8d9ebSAdit Ranadive }
37429c8d9ebSAdit Ranadive 
37529c8d9ebSAdit Ranadive static inline enum ib_port_speed pvrdma_port_speed_to_ib(
37629c8d9ebSAdit Ranadive 					enum pvrdma_port_speed speed)
37729c8d9ebSAdit Ranadive {
37829c8d9ebSAdit Ranadive 	return (enum ib_port_speed)speed;
37929c8d9ebSAdit Ranadive }
38029c8d9ebSAdit Ranadive 
38129c8d9ebSAdit Ranadive static inline int ib_qp_attr_mask_to_pvrdma(int attr_mask)
38229c8d9ebSAdit Ranadive {
38329c8d9ebSAdit Ranadive 	return attr_mask & PVRDMA_MASK(PVRDMA_QP_ATTR_MASK_MAX);
38429c8d9ebSAdit Ranadive }
38529c8d9ebSAdit Ranadive 
38629c8d9ebSAdit Ranadive static inline enum pvrdma_mig_state ib_mig_state_to_pvrdma(
38729c8d9ebSAdit Ranadive 					enum ib_mig_state state)
38829c8d9ebSAdit Ranadive {
38929c8d9ebSAdit Ranadive 	return (enum pvrdma_mig_state)state;
39029c8d9ebSAdit Ranadive }
39129c8d9ebSAdit Ranadive 
39229c8d9ebSAdit Ranadive static inline enum ib_mig_state pvrdma_mig_state_to_ib(
39329c8d9ebSAdit Ranadive 					enum pvrdma_mig_state state)
39429c8d9ebSAdit Ranadive {
39529c8d9ebSAdit Ranadive 	return (enum ib_mig_state)state;
39629c8d9ebSAdit Ranadive }
39729c8d9ebSAdit Ranadive 
39829c8d9ebSAdit Ranadive static inline int ib_access_flags_to_pvrdma(int flags)
39929c8d9ebSAdit Ranadive {
40029c8d9ebSAdit Ranadive 	return flags;
40129c8d9ebSAdit Ranadive }
40229c8d9ebSAdit Ranadive 
40329c8d9ebSAdit Ranadive static inline int pvrdma_access_flags_to_ib(int flags)
40429c8d9ebSAdit Ranadive {
40529c8d9ebSAdit Ranadive 	return flags & PVRDMA_MASK(PVRDMA_ACCESS_FLAGS_MAX);
40629c8d9ebSAdit Ranadive }
40729c8d9ebSAdit Ranadive 
40829c8d9ebSAdit Ranadive static inline enum pvrdma_qp_type ib_qp_type_to_pvrdma(enum ib_qp_type type)
40929c8d9ebSAdit Ranadive {
41029c8d9ebSAdit Ranadive 	return (enum pvrdma_qp_type)type;
41129c8d9ebSAdit Ranadive }
41229c8d9ebSAdit Ranadive 
41329c8d9ebSAdit Ranadive static inline enum ib_qp_type pvrdma_qp_type_to_ib(enum pvrdma_qp_type type)
41429c8d9ebSAdit Ranadive {
41529c8d9ebSAdit Ranadive 	return (enum ib_qp_type)type;
41629c8d9ebSAdit Ranadive }
41729c8d9ebSAdit Ranadive 
41829c8d9ebSAdit Ranadive static inline enum pvrdma_qp_state ib_qp_state_to_pvrdma(enum ib_qp_state state)
41929c8d9ebSAdit Ranadive {
42029c8d9ebSAdit Ranadive 	return (enum pvrdma_qp_state)state;
42129c8d9ebSAdit Ranadive }
42229c8d9ebSAdit Ranadive 
42329c8d9ebSAdit Ranadive static inline enum ib_qp_state pvrdma_qp_state_to_ib(enum pvrdma_qp_state state)
42429c8d9ebSAdit Ranadive {
42529c8d9ebSAdit Ranadive 	return (enum ib_qp_state)state;
42629c8d9ebSAdit Ranadive }
42729c8d9ebSAdit Ranadive 
42829c8d9ebSAdit Ranadive static inline enum pvrdma_wr_opcode ib_wr_opcode_to_pvrdma(enum ib_wr_opcode op)
42929c8d9ebSAdit Ranadive {
430*6325e01bSAdit Ranadive 	switch (op) {
431*6325e01bSAdit Ranadive 	case IB_WR_RDMA_WRITE:
432*6325e01bSAdit Ranadive 		return PVRDMA_WR_RDMA_WRITE;
433*6325e01bSAdit Ranadive 	case IB_WR_RDMA_WRITE_WITH_IMM:
434*6325e01bSAdit Ranadive 		return PVRDMA_WR_RDMA_WRITE_WITH_IMM;
435*6325e01bSAdit Ranadive 	case IB_WR_SEND:
436*6325e01bSAdit Ranadive 		return PVRDMA_WR_SEND;
437*6325e01bSAdit Ranadive 	case IB_WR_SEND_WITH_IMM:
438*6325e01bSAdit Ranadive 		return PVRDMA_WR_SEND_WITH_IMM;
439*6325e01bSAdit Ranadive 	case IB_WR_RDMA_READ:
440*6325e01bSAdit Ranadive 		return PVRDMA_WR_RDMA_READ;
441*6325e01bSAdit Ranadive 	case IB_WR_ATOMIC_CMP_AND_SWP:
442*6325e01bSAdit Ranadive 		return PVRDMA_WR_ATOMIC_CMP_AND_SWP;
443*6325e01bSAdit Ranadive 	case IB_WR_ATOMIC_FETCH_AND_ADD:
444*6325e01bSAdit Ranadive 		return PVRDMA_WR_ATOMIC_FETCH_AND_ADD;
445*6325e01bSAdit Ranadive 	case IB_WR_LSO:
446*6325e01bSAdit Ranadive 		return PVRDMA_WR_LSO;
447*6325e01bSAdit Ranadive 	case IB_WR_SEND_WITH_INV:
448*6325e01bSAdit Ranadive 		return PVRDMA_WR_SEND_WITH_INV;
449*6325e01bSAdit Ranadive 	case IB_WR_RDMA_READ_WITH_INV:
450*6325e01bSAdit Ranadive 		return PVRDMA_WR_RDMA_READ_WITH_INV;
451*6325e01bSAdit Ranadive 	case IB_WR_LOCAL_INV:
452*6325e01bSAdit Ranadive 		return PVRDMA_WR_LOCAL_INV;
453*6325e01bSAdit Ranadive 	case IB_WR_REG_MR:
454*6325e01bSAdit Ranadive 		return PVRDMA_WR_FAST_REG_MR;
455*6325e01bSAdit Ranadive 	case IB_WR_MASKED_ATOMIC_CMP_AND_SWP:
456*6325e01bSAdit Ranadive 		return PVRDMA_WR_MASKED_ATOMIC_CMP_AND_SWP;
457*6325e01bSAdit Ranadive 	case IB_WR_MASKED_ATOMIC_FETCH_AND_ADD:
458*6325e01bSAdit Ranadive 		return PVRDMA_WR_MASKED_ATOMIC_FETCH_AND_ADD;
459*6325e01bSAdit Ranadive 	case IB_WR_REG_SIG_MR:
460*6325e01bSAdit Ranadive 		return PVRDMA_WR_REG_SIG_MR;
461*6325e01bSAdit Ranadive 	default:
462*6325e01bSAdit Ranadive 		return PVRDMA_WR_ERROR;
463*6325e01bSAdit Ranadive 	}
46429c8d9ebSAdit Ranadive }
46529c8d9ebSAdit Ranadive 
46629c8d9ebSAdit Ranadive static inline enum ib_wc_status pvrdma_wc_status_to_ib(
46729c8d9ebSAdit Ranadive 					enum pvrdma_wc_status status)
46829c8d9ebSAdit Ranadive {
46929c8d9ebSAdit Ranadive 	return (enum ib_wc_status)status;
47029c8d9ebSAdit Ranadive }
47129c8d9ebSAdit Ranadive 
47201df7f5aSAdit Ranadive static inline int pvrdma_wc_opcode_to_ib(unsigned int opcode)
47329c8d9ebSAdit Ranadive {
47401df7f5aSAdit Ranadive 	switch (opcode) {
47501df7f5aSAdit Ranadive 	case PVRDMA_WC_SEND:
47601df7f5aSAdit Ranadive 		return IB_WC_SEND;
47701df7f5aSAdit Ranadive 	case PVRDMA_WC_RDMA_WRITE:
47801df7f5aSAdit Ranadive 		return IB_WC_RDMA_WRITE;
47901df7f5aSAdit Ranadive 	case PVRDMA_WC_RDMA_READ:
48001df7f5aSAdit Ranadive 		return IB_WC_RDMA_READ;
48101df7f5aSAdit Ranadive 	case PVRDMA_WC_COMP_SWAP:
48201df7f5aSAdit Ranadive 		return IB_WC_COMP_SWAP;
48301df7f5aSAdit Ranadive 	case PVRDMA_WC_FETCH_ADD:
48401df7f5aSAdit Ranadive 		return IB_WC_FETCH_ADD;
48501df7f5aSAdit Ranadive 	case PVRDMA_WC_LOCAL_INV:
48601df7f5aSAdit Ranadive 		return IB_WC_LOCAL_INV;
48701df7f5aSAdit Ranadive 	case PVRDMA_WC_FAST_REG_MR:
48801df7f5aSAdit Ranadive 		return IB_WC_REG_MR;
48901df7f5aSAdit Ranadive 	case PVRDMA_WC_MASKED_COMP_SWAP:
49001df7f5aSAdit Ranadive 		return IB_WC_MASKED_COMP_SWAP;
49101df7f5aSAdit Ranadive 	case PVRDMA_WC_MASKED_FETCH_ADD:
49201df7f5aSAdit Ranadive 		return IB_WC_MASKED_FETCH_ADD;
49301df7f5aSAdit Ranadive 	case PVRDMA_WC_RECV:
49401df7f5aSAdit Ranadive 		return IB_WC_RECV;
49501df7f5aSAdit Ranadive 	case PVRDMA_WC_RECV_RDMA_WITH_IMM:
49601df7f5aSAdit Ranadive 		return IB_WC_RECV_RDMA_WITH_IMM;
49701df7f5aSAdit Ranadive 	default:
49801df7f5aSAdit Ranadive 		return IB_WC_SEND;
49901df7f5aSAdit Ranadive 	}
50029c8d9ebSAdit Ranadive }
50129c8d9ebSAdit Ranadive 
50229c8d9ebSAdit Ranadive static inline int pvrdma_wc_flags_to_ib(int flags)
50329c8d9ebSAdit Ranadive {
50429c8d9ebSAdit Ranadive 	return flags;
50529c8d9ebSAdit Ranadive }
50629c8d9ebSAdit Ranadive 
50729c8d9ebSAdit Ranadive static inline int ib_send_flags_to_pvrdma(int flags)
50829c8d9ebSAdit Ranadive {
50929c8d9ebSAdit Ranadive 	return flags & PVRDMA_MASK(PVRDMA_SEND_FLAGS_MAX);
51029c8d9ebSAdit Ranadive }
51129c8d9ebSAdit Ranadive 
51229c8d9ebSAdit Ranadive void pvrdma_qp_cap_to_ib(struct ib_qp_cap *dst,
51329c8d9ebSAdit Ranadive 			 const struct pvrdma_qp_cap *src);
51429c8d9ebSAdit Ranadive void ib_qp_cap_to_pvrdma(struct pvrdma_qp_cap *dst,
51529c8d9ebSAdit Ranadive 			 const struct ib_qp_cap *src);
51629c8d9ebSAdit Ranadive void pvrdma_gid_to_ib(union ib_gid *dst, const union pvrdma_gid *src);
51729c8d9ebSAdit Ranadive void ib_gid_to_pvrdma(union pvrdma_gid *dst, const union ib_gid *src);
51829c8d9ebSAdit Ranadive void pvrdma_global_route_to_ib(struct ib_global_route *dst,
51929c8d9ebSAdit Ranadive 			       const struct pvrdma_global_route *src);
52029c8d9ebSAdit Ranadive void ib_global_route_to_pvrdma(struct pvrdma_global_route *dst,
52129c8d9ebSAdit Ranadive 			       const struct ib_global_route *src);
522f988653aSDasaratharaman Chandramouli void pvrdma_ah_attr_to_rdma(struct rdma_ah_attr *dst,
52329c8d9ebSAdit Ranadive 			    const struct pvrdma_ah_attr *src);
524f988653aSDasaratharaman Chandramouli void rdma_ah_attr_to_pvrdma(struct pvrdma_ah_attr *dst,
52590898850SDasaratharaman Chandramouli 			    const struct rdma_ah_attr *src);
52605297b66SBryan Tan u8 ib_gid_type_to_pvrdma(enum ib_gid_type gid_type);
52729c8d9ebSAdit Ranadive 
52829c8d9ebSAdit Ranadive int pvrdma_uar_table_init(struct pvrdma_dev *dev);
52929c8d9ebSAdit Ranadive void pvrdma_uar_table_cleanup(struct pvrdma_dev *dev);
53029c8d9ebSAdit Ranadive 
53129c8d9ebSAdit Ranadive int pvrdma_uar_alloc(struct pvrdma_dev *dev, struct pvrdma_uar_map *uar);
53229c8d9ebSAdit Ranadive void pvrdma_uar_free(struct pvrdma_dev *dev, struct pvrdma_uar_map *uar);
53329c8d9ebSAdit Ranadive 
53429c8d9ebSAdit Ranadive void _pvrdma_flush_cqe(struct pvrdma_qp *qp, struct pvrdma_cq *cq);
53529c8d9ebSAdit Ranadive 
53629c8d9ebSAdit Ranadive int pvrdma_page_dir_init(struct pvrdma_dev *dev, struct pvrdma_page_dir *pdir,
53729c8d9ebSAdit Ranadive 			 u64 npages, bool alloc_pages);
53829c8d9ebSAdit Ranadive void pvrdma_page_dir_cleanup(struct pvrdma_dev *dev,
53929c8d9ebSAdit Ranadive 			     struct pvrdma_page_dir *pdir);
54029c8d9ebSAdit Ranadive int pvrdma_page_dir_insert_dma(struct pvrdma_page_dir *pdir, u64 idx,
54129c8d9ebSAdit Ranadive 			       dma_addr_t daddr);
54229c8d9ebSAdit Ranadive int pvrdma_page_dir_insert_umem(struct pvrdma_page_dir *pdir,
54329c8d9ebSAdit Ranadive 				struct ib_umem *umem, u64 offset);
54429c8d9ebSAdit Ranadive dma_addr_t pvrdma_page_dir_get_dma(struct pvrdma_page_dir *pdir, u64 idx);
54529c8d9ebSAdit Ranadive int pvrdma_page_dir_insert_page_list(struct pvrdma_page_dir *pdir,
54629c8d9ebSAdit Ranadive 				     u64 *page_list, int num_pages);
54729c8d9ebSAdit Ranadive 
54829c8d9ebSAdit Ranadive int pvrdma_cmd_post(struct pvrdma_dev *dev, union pvrdma_cmd_req *req,
54929c8d9ebSAdit Ranadive 		    union pvrdma_cmd_resp *rsp, unsigned resp_code);
55029c8d9ebSAdit Ranadive 
55129c8d9ebSAdit Ranadive #endif /* __PVRDMA_H__ */
552