1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Shared Memory Communications over RDMA (SMC-R) and RoCE 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Definitions for IB environment 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright IBM Corp. 2016 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Author(s): Ursula Braun <Ursula Braun@linux.vnet.ibm.com> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef _SMC_IB_H 13*4882a593Smuzhiyun #define _SMC_IB_H 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/interrupt.h> 16*4882a593Smuzhiyun #include <linux/if_ether.h> 17*4882a593Smuzhiyun #include <linux/mutex.h> 18*4882a593Smuzhiyun #include <linux/wait.h> 19*4882a593Smuzhiyun #include <rdma/ib_verbs.h> 20*4882a593Smuzhiyun #include <net/smc.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define SMC_MAX_PORTS 2 /* Max # of ports */ 23*4882a593Smuzhiyun #define SMC_GID_SIZE sizeof(union ib_gid) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define SMC_IB_MAX_SEND_SGE 2 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun struct smc_ib_devices { /* list of smc ib devices definition */ 28*4882a593Smuzhiyun struct list_head list; 29*4882a593Smuzhiyun struct mutex mutex; /* protects list of smc ib devices */ 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun extern struct smc_ib_devices smc_ib_devices; /* list of smc ib devices */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct smc_ib_device { /* ib-device infos for smc */ 35*4882a593Smuzhiyun struct list_head list; 36*4882a593Smuzhiyun struct ib_device *ibdev; 37*4882a593Smuzhiyun struct ib_port_attr pattr[SMC_MAX_PORTS]; /* ib dev. port attrs */ 38*4882a593Smuzhiyun struct ib_event_handler event_handler; /* global ib_event handler */ 39*4882a593Smuzhiyun struct ib_cq *roce_cq_send; /* send completion queue */ 40*4882a593Smuzhiyun struct ib_cq *roce_cq_recv; /* recv completion queue */ 41*4882a593Smuzhiyun struct tasklet_struct send_tasklet; /* called by send cq handler */ 42*4882a593Smuzhiyun struct tasklet_struct recv_tasklet; /* called by recv cq handler */ 43*4882a593Smuzhiyun char mac[SMC_MAX_PORTS][ETH_ALEN]; 44*4882a593Smuzhiyun /* mac address per port*/ 45*4882a593Smuzhiyun u8 pnetid[SMC_MAX_PORTS][SMC_MAX_PNETID_LEN]; 46*4882a593Smuzhiyun /* pnetid per port */ 47*4882a593Smuzhiyun bool pnetid_by_user[SMC_MAX_PORTS]; 48*4882a593Smuzhiyun /* pnetid defined by user? */ 49*4882a593Smuzhiyun u8 initialized : 1; /* ib dev CQ, evthdl done */ 50*4882a593Smuzhiyun struct work_struct port_event_work; 51*4882a593Smuzhiyun unsigned long port_event_mask; 52*4882a593Smuzhiyun DECLARE_BITMAP(ports_going_away, SMC_MAX_PORTS); 53*4882a593Smuzhiyun atomic_t lnk_cnt; /* number of links on ibdev */ 54*4882a593Smuzhiyun wait_queue_head_t lnks_deleted; /* wait 4 removal of all links*/ 55*4882a593Smuzhiyun struct mutex mutex; /* protect dev setup+cleanup */ 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct smc_buf_desc; 59*4882a593Smuzhiyun struct smc_link; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun int smc_ib_register_client(void) __init; 62*4882a593Smuzhiyun void smc_ib_unregister_client(void); 63*4882a593Smuzhiyun bool smc_ib_port_active(struct smc_ib_device *smcibdev, u8 ibport); 64*4882a593Smuzhiyun int smc_ib_buf_map_sg(struct smc_link *lnk, 65*4882a593Smuzhiyun struct smc_buf_desc *buf_slot, 66*4882a593Smuzhiyun enum dma_data_direction data_direction); 67*4882a593Smuzhiyun void smc_ib_buf_unmap_sg(struct smc_link *lnk, 68*4882a593Smuzhiyun struct smc_buf_desc *buf_slot, 69*4882a593Smuzhiyun enum dma_data_direction data_direction); 70*4882a593Smuzhiyun void smc_ib_dealloc_protection_domain(struct smc_link *lnk); 71*4882a593Smuzhiyun int smc_ib_create_protection_domain(struct smc_link *lnk); 72*4882a593Smuzhiyun void smc_ib_destroy_queue_pair(struct smc_link *lnk); 73*4882a593Smuzhiyun int smc_ib_create_queue_pair(struct smc_link *lnk); 74*4882a593Smuzhiyun int smc_ib_ready_link(struct smc_link *lnk); 75*4882a593Smuzhiyun int smc_ib_modify_qp_rts(struct smc_link *lnk); 76*4882a593Smuzhiyun int smc_ib_modify_qp_reset(struct smc_link *lnk); 77*4882a593Smuzhiyun int smc_ib_modify_qp_error(struct smc_link *lnk); 78*4882a593Smuzhiyun long smc_ib_setup_per_ibdev(struct smc_ib_device *smcibdev); 79*4882a593Smuzhiyun int smc_ib_get_memory_region(struct ib_pd *pd, int access_flags, 80*4882a593Smuzhiyun struct smc_buf_desc *buf_slot, u8 link_idx); 81*4882a593Smuzhiyun void smc_ib_put_memory_region(struct ib_mr *mr); 82*4882a593Smuzhiyun void smc_ib_sync_sg_for_cpu(struct smc_link *lnk, 83*4882a593Smuzhiyun struct smc_buf_desc *buf_slot, 84*4882a593Smuzhiyun enum dma_data_direction data_direction); 85*4882a593Smuzhiyun void smc_ib_sync_sg_for_device(struct smc_link *lnk, 86*4882a593Smuzhiyun struct smc_buf_desc *buf_slot, 87*4882a593Smuzhiyun enum dma_data_direction data_direction); 88*4882a593Smuzhiyun int smc_ib_determine_gid(struct smc_ib_device *smcibdev, u8 ibport, 89*4882a593Smuzhiyun unsigned short vlan_id, u8 gid[], u8 *sgid_index); 90*4882a593Smuzhiyun bool smc_ib_is_valid_local_systemid(void); 91*4882a593Smuzhiyun #endif 92