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