162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or
562306a36Sopenharmony_ci * modify it under the terms of EITHER the GNU General Public License
662306a36Sopenharmony_ci * version 2 as published by the Free Software Foundation or the BSD
762306a36Sopenharmony_ci * 2-Clause License. This program is distributed in the hope that it
862306a36Sopenharmony_ci * will be useful, but WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED
962306a36Sopenharmony_ci * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1062306a36Sopenharmony_ci * See the GNU General Public License version 2 for more details at
1162306a36Sopenharmony_ci * http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html.
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * You should have received a copy of the GNU General Public License
1462306a36Sopenharmony_ci * along with this program available in the file COPYING in the main
1562306a36Sopenharmony_ci * directory of this source tree.
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * The BSD 2-Clause License
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci *     Redistribution and use in source and binary forms, with or
2062306a36Sopenharmony_ci *     without modification, are permitted provided that the following
2162306a36Sopenharmony_ci *     conditions are met:
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci *      - Redistributions of source code must retain the above
2462306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
2562306a36Sopenharmony_ci *        disclaimer.
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci *      - Redistributions in binary form must reproduce the above
2862306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
2962306a36Sopenharmony_ci *        disclaimer in the documentation and/or other materials
3062306a36Sopenharmony_ci *        provided with the distribution.
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3362306a36Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3462306a36Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
3562306a36Sopenharmony_ci * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
3662306a36Sopenharmony_ci * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
3762306a36Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3862306a36Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
3962306a36Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4062306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
4162306a36Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
4262306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
4362306a36Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE.
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#ifndef __PVRDMA_H__
4762306a36Sopenharmony_ci#define __PVRDMA_H__
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#include <linux/compiler.h>
5062306a36Sopenharmony_ci#include <linux/interrupt.h>
5162306a36Sopenharmony_ci#include <linux/list.h>
5262306a36Sopenharmony_ci#include <linux/mutex.h>
5362306a36Sopenharmony_ci#include <linux/pci.h>
5462306a36Sopenharmony_ci#include <linux/semaphore.h>
5562306a36Sopenharmony_ci#include <linux/workqueue.h>
5662306a36Sopenharmony_ci#include <rdma/ib_umem.h>
5762306a36Sopenharmony_ci#include <rdma/ib_verbs.h>
5862306a36Sopenharmony_ci#include <rdma/vmw_pvrdma-abi.h>
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#include "pvrdma_ring.h"
6162306a36Sopenharmony_ci#include "pvrdma_dev_api.h"
6262306a36Sopenharmony_ci#include "pvrdma_verbs.h"
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci/* NOT the same as BIT_MASK(). */
6562306a36Sopenharmony_ci#define PVRDMA_MASK(n) ((n << 1) - 1)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/*
6862306a36Sopenharmony_ci * VMware PVRDMA PCI device id.
6962306a36Sopenharmony_ci */
7062306a36Sopenharmony_ci#define PCI_DEVICE_ID_VMWARE_PVRDMA	0x0820
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define PVRDMA_NUM_RING_PAGES		4
7362306a36Sopenharmony_ci#define PVRDMA_QP_NUM_HEADER_PAGES	1
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistruct pvrdma_dev;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct pvrdma_page_dir {
7862306a36Sopenharmony_ci	dma_addr_t dir_dma;
7962306a36Sopenharmony_ci	u64 *dir;
8062306a36Sopenharmony_ci	int ntables;
8162306a36Sopenharmony_ci	u64 **tables;
8262306a36Sopenharmony_ci	u64 npages;
8362306a36Sopenharmony_ci	void **pages;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistruct pvrdma_cq {
8762306a36Sopenharmony_ci	struct ib_cq ibcq;
8862306a36Sopenharmony_ci	int offset;
8962306a36Sopenharmony_ci	spinlock_t cq_lock; /* Poll lock. */
9062306a36Sopenharmony_ci	struct pvrdma_uar_map *uar;
9162306a36Sopenharmony_ci	struct ib_umem *umem;
9262306a36Sopenharmony_ci	struct pvrdma_ring_state *ring_state;
9362306a36Sopenharmony_ci	struct pvrdma_page_dir pdir;
9462306a36Sopenharmony_ci	u32 cq_handle;
9562306a36Sopenharmony_ci	bool is_kernel;
9662306a36Sopenharmony_ci	refcount_t refcnt;
9762306a36Sopenharmony_ci	struct completion free;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistruct pvrdma_id_table {
10162306a36Sopenharmony_ci	u32 last;
10262306a36Sopenharmony_ci	u32 top;
10362306a36Sopenharmony_ci	u32 max;
10462306a36Sopenharmony_ci	u32 mask;
10562306a36Sopenharmony_ci	spinlock_t lock; /* Table lock. */
10662306a36Sopenharmony_ci	unsigned long *table;
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistruct pvrdma_uar_map {
11062306a36Sopenharmony_ci	unsigned long pfn;
11162306a36Sopenharmony_ci	void __iomem *map;
11262306a36Sopenharmony_ci	int index;
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistruct pvrdma_uar_table {
11662306a36Sopenharmony_ci	struct pvrdma_id_table tbl;
11762306a36Sopenharmony_ci	int size;
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistruct pvrdma_ucontext {
12162306a36Sopenharmony_ci	struct ib_ucontext ibucontext;
12262306a36Sopenharmony_ci	struct pvrdma_dev *dev;
12362306a36Sopenharmony_ci	struct pvrdma_uar_map uar;
12462306a36Sopenharmony_ci	u64 ctx_handle;
12562306a36Sopenharmony_ci};
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistruct pvrdma_pd {
12862306a36Sopenharmony_ci	struct ib_pd ibpd;
12962306a36Sopenharmony_ci	u32 pdn;
13062306a36Sopenharmony_ci	u32 pd_handle;
13162306a36Sopenharmony_ci	int privileged;
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistruct pvrdma_mr {
13562306a36Sopenharmony_ci	u32 mr_handle;
13662306a36Sopenharmony_ci	u64 iova;
13762306a36Sopenharmony_ci	u64 size;
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistruct pvrdma_user_mr {
14162306a36Sopenharmony_ci	struct ib_mr ibmr;
14262306a36Sopenharmony_ci	struct ib_umem *umem;
14362306a36Sopenharmony_ci	struct pvrdma_mr mmr;
14462306a36Sopenharmony_ci	struct pvrdma_page_dir pdir;
14562306a36Sopenharmony_ci	u64 *pages;
14662306a36Sopenharmony_ci	u32 npages;
14762306a36Sopenharmony_ci	u32 max_pages;
14862306a36Sopenharmony_ci	u32 page_shift;
14962306a36Sopenharmony_ci};
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistruct pvrdma_wq {
15262306a36Sopenharmony_ci	struct pvrdma_ring *ring;
15362306a36Sopenharmony_ci	spinlock_t lock; /* Work queue lock. */
15462306a36Sopenharmony_ci	int wqe_cnt;
15562306a36Sopenharmony_ci	int wqe_size;
15662306a36Sopenharmony_ci	int max_sg;
15762306a36Sopenharmony_ci	int offset;
15862306a36Sopenharmony_ci};
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistruct pvrdma_ah {
16162306a36Sopenharmony_ci	struct ib_ah ibah;
16262306a36Sopenharmony_ci	struct pvrdma_av av;
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistruct pvrdma_srq {
16662306a36Sopenharmony_ci	struct ib_srq ibsrq;
16762306a36Sopenharmony_ci	int offset;
16862306a36Sopenharmony_ci	spinlock_t lock; /* SRQ lock. */
16962306a36Sopenharmony_ci	int wqe_cnt;
17062306a36Sopenharmony_ci	int wqe_size;
17162306a36Sopenharmony_ci	int max_gs;
17262306a36Sopenharmony_ci	struct ib_umem *umem;
17362306a36Sopenharmony_ci	struct pvrdma_ring_state *ring;
17462306a36Sopenharmony_ci	struct pvrdma_page_dir pdir;
17562306a36Sopenharmony_ci	u32 srq_handle;
17662306a36Sopenharmony_ci	int npages;
17762306a36Sopenharmony_ci	refcount_t refcnt;
17862306a36Sopenharmony_ci	struct completion free;
17962306a36Sopenharmony_ci};
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_cistruct pvrdma_qp {
18262306a36Sopenharmony_ci	struct ib_qp ibqp;
18362306a36Sopenharmony_ci	u32 qp_handle;
18462306a36Sopenharmony_ci	u32 qkey;
18562306a36Sopenharmony_ci	struct pvrdma_wq sq;
18662306a36Sopenharmony_ci	struct pvrdma_wq rq;
18762306a36Sopenharmony_ci	struct ib_umem *rumem;
18862306a36Sopenharmony_ci	struct ib_umem *sumem;
18962306a36Sopenharmony_ci	struct pvrdma_page_dir pdir;
19062306a36Sopenharmony_ci	struct pvrdma_srq *srq;
19162306a36Sopenharmony_ci	int npages;
19262306a36Sopenharmony_ci	int npages_send;
19362306a36Sopenharmony_ci	int npages_recv;
19462306a36Sopenharmony_ci	u32 flags;
19562306a36Sopenharmony_ci	u8 port;
19662306a36Sopenharmony_ci	u8 state;
19762306a36Sopenharmony_ci	bool is_kernel;
19862306a36Sopenharmony_ci	struct mutex mutex; /* QP state mutex. */
19962306a36Sopenharmony_ci	refcount_t refcnt;
20062306a36Sopenharmony_ci	struct completion free;
20162306a36Sopenharmony_ci};
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistruct pvrdma_dev {
20462306a36Sopenharmony_ci	/* PCI device-related information. */
20562306a36Sopenharmony_ci	struct ib_device ib_dev;
20662306a36Sopenharmony_ci	struct pci_dev *pdev;
20762306a36Sopenharmony_ci	void __iomem *regs;
20862306a36Sopenharmony_ci	struct pvrdma_device_shared_region *dsr; /* Shared region pointer */
20962306a36Sopenharmony_ci	dma_addr_t dsrbase; /* Shared region base address */
21062306a36Sopenharmony_ci	void *cmd_slot;
21162306a36Sopenharmony_ci	void *resp_slot;
21262306a36Sopenharmony_ci	unsigned long flags;
21362306a36Sopenharmony_ci	struct list_head device_link;
21462306a36Sopenharmony_ci	unsigned int dsr_version;
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	/* Locking and interrupt information. */
21762306a36Sopenharmony_ci	spinlock_t cmd_lock; /* Command lock. */
21862306a36Sopenharmony_ci	struct semaphore cmd_sema;
21962306a36Sopenharmony_ci	struct completion cmd_done;
22062306a36Sopenharmony_ci	unsigned int nr_vectors;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	/* RDMA-related device information. */
22362306a36Sopenharmony_ci	union ib_gid *sgid_tbl;
22462306a36Sopenharmony_ci	struct pvrdma_ring_state *async_ring_state;
22562306a36Sopenharmony_ci	struct pvrdma_page_dir async_pdir;
22662306a36Sopenharmony_ci	struct pvrdma_ring_state *cq_ring_state;
22762306a36Sopenharmony_ci	struct pvrdma_page_dir cq_pdir;
22862306a36Sopenharmony_ci	struct pvrdma_cq **cq_tbl;
22962306a36Sopenharmony_ci	spinlock_t cq_tbl_lock;
23062306a36Sopenharmony_ci	struct pvrdma_srq **srq_tbl;
23162306a36Sopenharmony_ci	spinlock_t srq_tbl_lock;
23262306a36Sopenharmony_ci	struct pvrdma_qp **qp_tbl;
23362306a36Sopenharmony_ci	spinlock_t qp_tbl_lock;
23462306a36Sopenharmony_ci	struct pvrdma_uar_table uar_table;
23562306a36Sopenharmony_ci	struct pvrdma_uar_map driver_uar;
23662306a36Sopenharmony_ci	__be64 sys_image_guid;
23762306a36Sopenharmony_ci	spinlock_t desc_lock; /* Device modification lock. */
23862306a36Sopenharmony_ci	u32 port_cap_mask;
23962306a36Sopenharmony_ci	struct mutex port_mutex; /* Port modification mutex. */
24062306a36Sopenharmony_ci	bool ib_active;
24162306a36Sopenharmony_ci	atomic_t num_qps;
24262306a36Sopenharmony_ci	atomic_t num_cqs;
24362306a36Sopenharmony_ci	atomic_t num_srqs;
24462306a36Sopenharmony_ci	atomic_t num_pds;
24562306a36Sopenharmony_ci	atomic_t num_ahs;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	/* Network device information. */
24862306a36Sopenharmony_ci	struct net_device *netdev;
24962306a36Sopenharmony_ci	struct notifier_block nb_netdev;
25062306a36Sopenharmony_ci};
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_cistruct pvrdma_netdevice_work {
25362306a36Sopenharmony_ci	struct work_struct work;
25462306a36Sopenharmony_ci	struct net_device *event_netdev;
25562306a36Sopenharmony_ci	unsigned long event;
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistatic inline struct pvrdma_dev *to_vdev(struct ib_device *ibdev)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	return container_of(ibdev, struct pvrdma_dev, ib_dev);
26162306a36Sopenharmony_ci}
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistatic inline struct
26462306a36Sopenharmony_cipvrdma_ucontext *to_vucontext(struct ib_ucontext *ibucontext)
26562306a36Sopenharmony_ci{
26662306a36Sopenharmony_ci	return container_of(ibucontext, struct pvrdma_ucontext, ibucontext);
26762306a36Sopenharmony_ci}
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistatic inline struct pvrdma_pd *to_vpd(struct ib_pd *ibpd)
27062306a36Sopenharmony_ci{
27162306a36Sopenharmony_ci	return container_of(ibpd, struct pvrdma_pd, ibpd);
27262306a36Sopenharmony_ci}
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_cistatic inline struct pvrdma_cq *to_vcq(struct ib_cq *ibcq)
27562306a36Sopenharmony_ci{
27662306a36Sopenharmony_ci	return container_of(ibcq, struct pvrdma_cq, ibcq);
27762306a36Sopenharmony_ci}
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cistatic inline struct pvrdma_srq *to_vsrq(struct ib_srq *ibsrq)
28062306a36Sopenharmony_ci{
28162306a36Sopenharmony_ci	return container_of(ibsrq, struct pvrdma_srq, ibsrq);
28262306a36Sopenharmony_ci}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cistatic inline struct pvrdma_user_mr *to_vmr(struct ib_mr *ibmr)
28562306a36Sopenharmony_ci{
28662306a36Sopenharmony_ci	return container_of(ibmr, struct pvrdma_user_mr, ibmr);
28762306a36Sopenharmony_ci}
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_cistatic inline struct pvrdma_qp *to_vqp(struct ib_qp *ibqp)
29062306a36Sopenharmony_ci{
29162306a36Sopenharmony_ci	return container_of(ibqp, struct pvrdma_qp, ibqp);
29262306a36Sopenharmony_ci}
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cistatic inline struct pvrdma_ah *to_vah(struct ib_ah *ibah)
29562306a36Sopenharmony_ci{
29662306a36Sopenharmony_ci	return container_of(ibah, struct pvrdma_ah, ibah);
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic inline void pvrdma_write_reg(struct pvrdma_dev *dev, u32 reg, u32 val)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	writel(cpu_to_le32(val), dev->regs + reg);
30262306a36Sopenharmony_ci}
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_cistatic inline u32 pvrdma_read_reg(struct pvrdma_dev *dev, u32 reg)
30562306a36Sopenharmony_ci{
30662306a36Sopenharmony_ci	return le32_to_cpu(readl(dev->regs + reg));
30762306a36Sopenharmony_ci}
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_cistatic inline void pvrdma_write_uar_cq(struct pvrdma_dev *dev, u32 val)
31062306a36Sopenharmony_ci{
31162306a36Sopenharmony_ci	writel(cpu_to_le32(val), dev->driver_uar.map + PVRDMA_UAR_CQ_OFFSET);
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic inline void pvrdma_write_uar_qp(struct pvrdma_dev *dev, u32 val)
31562306a36Sopenharmony_ci{
31662306a36Sopenharmony_ci	writel(cpu_to_le32(val), dev->driver_uar.map + PVRDMA_UAR_QP_OFFSET);
31762306a36Sopenharmony_ci}
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_cistatic inline void *pvrdma_page_dir_get_ptr(struct pvrdma_page_dir *pdir,
32062306a36Sopenharmony_ci					    u64 offset)
32162306a36Sopenharmony_ci{
32262306a36Sopenharmony_ci	return pdir->pages[offset / PAGE_SIZE] + (offset % PAGE_SIZE);
32362306a36Sopenharmony_ci}
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_cistatic inline enum pvrdma_mtu ib_mtu_to_pvrdma(enum ib_mtu mtu)
32662306a36Sopenharmony_ci{
32762306a36Sopenharmony_ci	return (enum pvrdma_mtu)mtu;
32862306a36Sopenharmony_ci}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistatic inline enum ib_mtu pvrdma_mtu_to_ib(enum pvrdma_mtu mtu)
33162306a36Sopenharmony_ci{
33262306a36Sopenharmony_ci	return (enum ib_mtu)mtu;
33362306a36Sopenharmony_ci}
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_cistatic inline enum pvrdma_port_state ib_port_state_to_pvrdma(
33662306a36Sopenharmony_ci					enum ib_port_state state)
33762306a36Sopenharmony_ci{
33862306a36Sopenharmony_ci	return (enum pvrdma_port_state)state;
33962306a36Sopenharmony_ci}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistatic inline enum ib_port_state pvrdma_port_state_to_ib(
34262306a36Sopenharmony_ci					enum pvrdma_port_state state)
34362306a36Sopenharmony_ci{
34462306a36Sopenharmony_ci	return (enum ib_port_state)state;
34562306a36Sopenharmony_ci}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_cistatic inline int pvrdma_port_cap_flags_to_ib(int flags)
34862306a36Sopenharmony_ci{
34962306a36Sopenharmony_ci	return flags;
35062306a36Sopenharmony_ci}
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_cistatic inline enum pvrdma_port_width ib_port_width_to_pvrdma(
35362306a36Sopenharmony_ci					enum ib_port_width width)
35462306a36Sopenharmony_ci{
35562306a36Sopenharmony_ci	return (enum pvrdma_port_width)width;
35662306a36Sopenharmony_ci}
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_cistatic inline enum ib_port_width pvrdma_port_width_to_ib(
35962306a36Sopenharmony_ci					enum pvrdma_port_width width)
36062306a36Sopenharmony_ci{
36162306a36Sopenharmony_ci	return (enum ib_port_width)width;
36262306a36Sopenharmony_ci}
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_cistatic inline enum pvrdma_port_speed ib_port_speed_to_pvrdma(
36562306a36Sopenharmony_ci					enum ib_port_speed speed)
36662306a36Sopenharmony_ci{
36762306a36Sopenharmony_ci	return (enum pvrdma_port_speed)speed;
36862306a36Sopenharmony_ci}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_cistatic inline enum ib_port_speed pvrdma_port_speed_to_ib(
37162306a36Sopenharmony_ci					enum pvrdma_port_speed speed)
37262306a36Sopenharmony_ci{
37362306a36Sopenharmony_ci	return (enum ib_port_speed)speed;
37462306a36Sopenharmony_ci}
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_cistatic inline int ib_qp_attr_mask_to_pvrdma(int attr_mask)
37762306a36Sopenharmony_ci{
37862306a36Sopenharmony_ci	return attr_mask & PVRDMA_MASK(PVRDMA_QP_ATTR_MASK_MAX);
37962306a36Sopenharmony_ci}
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_cistatic inline enum pvrdma_mig_state ib_mig_state_to_pvrdma(
38262306a36Sopenharmony_ci					enum ib_mig_state state)
38362306a36Sopenharmony_ci{
38462306a36Sopenharmony_ci	return (enum pvrdma_mig_state)state;
38562306a36Sopenharmony_ci}
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cistatic inline enum ib_mig_state pvrdma_mig_state_to_ib(
38862306a36Sopenharmony_ci					enum pvrdma_mig_state state)
38962306a36Sopenharmony_ci{
39062306a36Sopenharmony_ci	return (enum ib_mig_state)state;
39162306a36Sopenharmony_ci}
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cistatic inline int ib_access_flags_to_pvrdma(int flags)
39462306a36Sopenharmony_ci{
39562306a36Sopenharmony_ci	return flags;
39662306a36Sopenharmony_ci}
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cistatic inline int pvrdma_access_flags_to_ib(int flags)
39962306a36Sopenharmony_ci{
40062306a36Sopenharmony_ci	return flags & PVRDMA_MASK(PVRDMA_ACCESS_FLAGS_MAX);
40162306a36Sopenharmony_ci}
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_cistatic inline enum pvrdma_qp_type ib_qp_type_to_pvrdma(enum ib_qp_type type)
40462306a36Sopenharmony_ci{
40562306a36Sopenharmony_ci	return (enum pvrdma_qp_type)type;
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_cistatic inline enum pvrdma_qp_state ib_qp_state_to_pvrdma(enum ib_qp_state state)
40962306a36Sopenharmony_ci{
41062306a36Sopenharmony_ci	return (enum pvrdma_qp_state)state;
41162306a36Sopenharmony_ci}
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_cistatic inline enum ib_qp_state pvrdma_qp_state_to_ib(enum pvrdma_qp_state state)
41462306a36Sopenharmony_ci{
41562306a36Sopenharmony_ci	return (enum ib_qp_state)state;
41662306a36Sopenharmony_ci}
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cistatic inline enum pvrdma_wr_opcode ib_wr_opcode_to_pvrdma(enum ib_wr_opcode op)
41962306a36Sopenharmony_ci{
42062306a36Sopenharmony_ci	switch (op) {
42162306a36Sopenharmony_ci	case IB_WR_RDMA_WRITE:
42262306a36Sopenharmony_ci		return PVRDMA_WR_RDMA_WRITE;
42362306a36Sopenharmony_ci	case IB_WR_RDMA_WRITE_WITH_IMM:
42462306a36Sopenharmony_ci		return PVRDMA_WR_RDMA_WRITE_WITH_IMM;
42562306a36Sopenharmony_ci	case IB_WR_SEND:
42662306a36Sopenharmony_ci		return PVRDMA_WR_SEND;
42762306a36Sopenharmony_ci	case IB_WR_SEND_WITH_IMM:
42862306a36Sopenharmony_ci		return PVRDMA_WR_SEND_WITH_IMM;
42962306a36Sopenharmony_ci	case IB_WR_RDMA_READ:
43062306a36Sopenharmony_ci		return PVRDMA_WR_RDMA_READ;
43162306a36Sopenharmony_ci	case IB_WR_ATOMIC_CMP_AND_SWP:
43262306a36Sopenharmony_ci		return PVRDMA_WR_ATOMIC_CMP_AND_SWP;
43362306a36Sopenharmony_ci	case IB_WR_ATOMIC_FETCH_AND_ADD:
43462306a36Sopenharmony_ci		return PVRDMA_WR_ATOMIC_FETCH_AND_ADD;
43562306a36Sopenharmony_ci	case IB_WR_LSO:
43662306a36Sopenharmony_ci		return PVRDMA_WR_LSO;
43762306a36Sopenharmony_ci	case IB_WR_SEND_WITH_INV:
43862306a36Sopenharmony_ci		return PVRDMA_WR_SEND_WITH_INV;
43962306a36Sopenharmony_ci	case IB_WR_RDMA_READ_WITH_INV:
44062306a36Sopenharmony_ci		return PVRDMA_WR_RDMA_READ_WITH_INV;
44162306a36Sopenharmony_ci	case IB_WR_LOCAL_INV:
44262306a36Sopenharmony_ci		return PVRDMA_WR_LOCAL_INV;
44362306a36Sopenharmony_ci	case IB_WR_REG_MR:
44462306a36Sopenharmony_ci		return PVRDMA_WR_FAST_REG_MR;
44562306a36Sopenharmony_ci	case IB_WR_MASKED_ATOMIC_CMP_AND_SWP:
44662306a36Sopenharmony_ci		return PVRDMA_WR_MASKED_ATOMIC_CMP_AND_SWP;
44762306a36Sopenharmony_ci	case IB_WR_MASKED_ATOMIC_FETCH_AND_ADD:
44862306a36Sopenharmony_ci		return PVRDMA_WR_MASKED_ATOMIC_FETCH_AND_ADD;
44962306a36Sopenharmony_ci	case IB_WR_REG_MR_INTEGRITY:
45062306a36Sopenharmony_ci		return PVRDMA_WR_REG_SIG_MR;
45162306a36Sopenharmony_ci	default:
45262306a36Sopenharmony_ci		return PVRDMA_WR_ERROR;
45362306a36Sopenharmony_ci	}
45462306a36Sopenharmony_ci}
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_cistatic inline enum ib_wc_status pvrdma_wc_status_to_ib(
45762306a36Sopenharmony_ci					enum pvrdma_wc_status status)
45862306a36Sopenharmony_ci{
45962306a36Sopenharmony_ci	return (enum ib_wc_status)status;
46062306a36Sopenharmony_ci}
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_cistatic inline int pvrdma_wc_opcode_to_ib(unsigned int opcode)
46362306a36Sopenharmony_ci{
46462306a36Sopenharmony_ci	switch (opcode) {
46562306a36Sopenharmony_ci	case PVRDMA_WC_SEND:
46662306a36Sopenharmony_ci		return IB_WC_SEND;
46762306a36Sopenharmony_ci	case PVRDMA_WC_RDMA_WRITE:
46862306a36Sopenharmony_ci		return IB_WC_RDMA_WRITE;
46962306a36Sopenharmony_ci	case PVRDMA_WC_RDMA_READ:
47062306a36Sopenharmony_ci		return IB_WC_RDMA_READ;
47162306a36Sopenharmony_ci	case PVRDMA_WC_COMP_SWAP:
47262306a36Sopenharmony_ci		return IB_WC_COMP_SWAP;
47362306a36Sopenharmony_ci	case PVRDMA_WC_FETCH_ADD:
47462306a36Sopenharmony_ci		return IB_WC_FETCH_ADD;
47562306a36Sopenharmony_ci	case PVRDMA_WC_LOCAL_INV:
47662306a36Sopenharmony_ci		return IB_WC_LOCAL_INV;
47762306a36Sopenharmony_ci	case PVRDMA_WC_FAST_REG_MR:
47862306a36Sopenharmony_ci		return IB_WC_REG_MR;
47962306a36Sopenharmony_ci	case PVRDMA_WC_MASKED_COMP_SWAP:
48062306a36Sopenharmony_ci		return IB_WC_MASKED_COMP_SWAP;
48162306a36Sopenharmony_ci	case PVRDMA_WC_MASKED_FETCH_ADD:
48262306a36Sopenharmony_ci		return IB_WC_MASKED_FETCH_ADD;
48362306a36Sopenharmony_ci	case PVRDMA_WC_RECV:
48462306a36Sopenharmony_ci		return IB_WC_RECV;
48562306a36Sopenharmony_ci	case PVRDMA_WC_RECV_RDMA_WITH_IMM:
48662306a36Sopenharmony_ci		return IB_WC_RECV_RDMA_WITH_IMM;
48762306a36Sopenharmony_ci	default:
48862306a36Sopenharmony_ci		return IB_WC_SEND;
48962306a36Sopenharmony_ci	}
49062306a36Sopenharmony_ci}
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_cistatic inline int pvrdma_wc_flags_to_ib(int flags)
49362306a36Sopenharmony_ci{
49462306a36Sopenharmony_ci	return flags;
49562306a36Sopenharmony_ci}
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_cistatic inline int ib_send_flags_to_pvrdma(int flags)
49862306a36Sopenharmony_ci{
49962306a36Sopenharmony_ci	return flags & PVRDMA_MASK(PVRDMA_SEND_FLAGS_MAX);
50062306a36Sopenharmony_ci}
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_cistatic inline int pvrdma_network_type_to_ib(enum pvrdma_network_type type)
50362306a36Sopenharmony_ci{
50462306a36Sopenharmony_ci	switch (type) {
50562306a36Sopenharmony_ci	case PVRDMA_NETWORK_ROCE_V1:
50662306a36Sopenharmony_ci		return RDMA_NETWORK_ROCE_V1;
50762306a36Sopenharmony_ci	case PVRDMA_NETWORK_IPV4:
50862306a36Sopenharmony_ci		return RDMA_NETWORK_IPV4;
50962306a36Sopenharmony_ci	case PVRDMA_NETWORK_IPV6:
51062306a36Sopenharmony_ci		return RDMA_NETWORK_IPV6;
51162306a36Sopenharmony_ci	default:
51262306a36Sopenharmony_ci		return RDMA_NETWORK_IPV6;
51362306a36Sopenharmony_ci	}
51462306a36Sopenharmony_ci}
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_civoid pvrdma_qp_cap_to_ib(struct ib_qp_cap *dst,
51762306a36Sopenharmony_ci			 const struct pvrdma_qp_cap *src);
51862306a36Sopenharmony_civoid ib_qp_cap_to_pvrdma(struct pvrdma_qp_cap *dst,
51962306a36Sopenharmony_ci			 const struct ib_qp_cap *src);
52062306a36Sopenharmony_civoid pvrdma_gid_to_ib(union ib_gid *dst, const union pvrdma_gid *src);
52162306a36Sopenharmony_civoid ib_gid_to_pvrdma(union pvrdma_gid *dst, const union ib_gid *src);
52262306a36Sopenharmony_civoid pvrdma_global_route_to_ib(struct ib_global_route *dst,
52362306a36Sopenharmony_ci			       const struct pvrdma_global_route *src);
52462306a36Sopenharmony_civoid ib_global_route_to_pvrdma(struct pvrdma_global_route *dst,
52562306a36Sopenharmony_ci			       const struct ib_global_route *src);
52662306a36Sopenharmony_civoid pvrdma_ah_attr_to_rdma(struct rdma_ah_attr *dst,
52762306a36Sopenharmony_ci			    const struct pvrdma_ah_attr *src);
52862306a36Sopenharmony_civoid rdma_ah_attr_to_pvrdma(struct pvrdma_ah_attr *dst,
52962306a36Sopenharmony_ci			    const struct rdma_ah_attr *src);
53062306a36Sopenharmony_ciu8 ib_gid_type_to_pvrdma(enum ib_gid_type gid_type);
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ciint pvrdma_uar_table_init(struct pvrdma_dev *dev);
53362306a36Sopenharmony_civoid pvrdma_uar_table_cleanup(struct pvrdma_dev *dev);
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ciint pvrdma_uar_alloc(struct pvrdma_dev *dev, struct pvrdma_uar_map *uar);
53662306a36Sopenharmony_civoid pvrdma_uar_free(struct pvrdma_dev *dev, struct pvrdma_uar_map *uar);
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_civoid _pvrdma_flush_cqe(struct pvrdma_qp *qp, struct pvrdma_cq *cq);
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ciint pvrdma_page_dir_init(struct pvrdma_dev *dev, struct pvrdma_page_dir *pdir,
54162306a36Sopenharmony_ci			 u64 npages, bool alloc_pages);
54262306a36Sopenharmony_civoid pvrdma_page_dir_cleanup(struct pvrdma_dev *dev,
54362306a36Sopenharmony_ci			     struct pvrdma_page_dir *pdir);
54462306a36Sopenharmony_ciint pvrdma_page_dir_insert_dma(struct pvrdma_page_dir *pdir, u64 idx,
54562306a36Sopenharmony_ci			       dma_addr_t daddr);
54662306a36Sopenharmony_ciint pvrdma_page_dir_insert_umem(struct pvrdma_page_dir *pdir,
54762306a36Sopenharmony_ci				struct ib_umem *umem, u64 offset);
54862306a36Sopenharmony_cidma_addr_t pvrdma_page_dir_get_dma(struct pvrdma_page_dir *pdir, u64 idx);
54962306a36Sopenharmony_ciint pvrdma_page_dir_insert_page_list(struct pvrdma_page_dir *pdir,
55062306a36Sopenharmony_ci				     u64 *page_list, int num_pages);
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ciint pvrdma_cmd_post(struct pvrdma_dev *dev, union pvrdma_cmd_req *req,
55362306a36Sopenharmony_ci		    union pvrdma_cmd_resp *rsp, unsigned resp_code);
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci#endif /* __PVRDMA_H__ */
556