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