18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Shared Memory Communications over RDMA (SMC-R) and RoCE 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Definitions for the SMC module (socket related) 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2016 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Author(s): Ursula Braun <ubraun@linux.vnet.ibm.com> 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci#ifndef _SMC_H 128c2ecf20Sopenharmony_ci#define _SMC_H 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define SMC_MAX_PNETID_LEN 16 /* Max. length of PNET id */ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistruct smc_hashinfo { 178c2ecf20Sopenharmony_ci rwlock_t lock; 188c2ecf20Sopenharmony_ci struct hlist_head ht; 198c2ecf20Sopenharmony_ci}; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ciint smc_hash_sk(struct sock *sk); 228c2ecf20Sopenharmony_civoid smc_unhash_sk(struct sock *sk); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* SMCD/ISM device driver interface */ 258c2ecf20Sopenharmony_cistruct smcd_dmb { 268c2ecf20Sopenharmony_ci u64 dmb_tok; 278c2ecf20Sopenharmony_ci u64 rgid; 288c2ecf20Sopenharmony_ci u32 dmb_len; 298c2ecf20Sopenharmony_ci u32 sba_idx; 308c2ecf20Sopenharmony_ci u32 vlan_valid; 318c2ecf20Sopenharmony_ci u32 vlan_id; 328c2ecf20Sopenharmony_ci void *cpu_addr; 338c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#define ISM_EVENT_DMB 0 378c2ecf20Sopenharmony_ci#define ISM_EVENT_GID 1 388c2ecf20Sopenharmony_ci#define ISM_EVENT_SWR 2 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#define ISM_RESERVED_VLANID 0x1FFF 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define ISM_ERROR 0xFFFF 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistruct smcd_event { 458c2ecf20Sopenharmony_ci u32 type; 468c2ecf20Sopenharmony_ci u32 code; 478c2ecf20Sopenharmony_ci u64 tok; 488c2ecf20Sopenharmony_ci u64 time; 498c2ecf20Sopenharmony_ci u64 info; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistruct smcd_dev; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistruct smcd_ops { 558c2ecf20Sopenharmony_ci int (*query_remote_gid)(struct smcd_dev *dev, u64 rgid, u32 vid_valid, 568c2ecf20Sopenharmony_ci u32 vid); 578c2ecf20Sopenharmony_ci int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb); 588c2ecf20Sopenharmony_ci int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb); 598c2ecf20Sopenharmony_ci int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id); 608c2ecf20Sopenharmony_ci int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id); 618c2ecf20Sopenharmony_ci int (*set_vlan_required)(struct smcd_dev *dev); 628c2ecf20Sopenharmony_ci int (*reset_vlan_required)(struct smcd_dev *dev); 638c2ecf20Sopenharmony_ci int (*signal_event)(struct smcd_dev *dev, u64 rgid, u32 trigger_irq, 648c2ecf20Sopenharmony_ci u32 event_code, u64 info); 658c2ecf20Sopenharmony_ci int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx, 668c2ecf20Sopenharmony_ci bool sf, unsigned int offset, void *data, 678c2ecf20Sopenharmony_ci unsigned int size); 688c2ecf20Sopenharmony_ci void (*get_system_eid)(struct smcd_dev *dev, u8 **eid); 698c2ecf20Sopenharmony_ci u16 (*get_chid)(struct smcd_dev *dev); 708c2ecf20Sopenharmony_ci}; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistruct smcd_dev { 738c2ecf20Sopenharmony_ci const struct smcd_ops *ops; 748c2ecf20Sopenharmony_ci struct device dev; 758c2ecf20Sopenharmony_ci void *priv; 768c2ecf20Sopenharmony_ci u64 local_gid; 778c2ecf20Sopenharmony_ci struct list_head list; 788c2ecf20Sopenharmony_ci spinlock_t lock; 798c2ecf20Sopenharmony_ci struct smc_connection **conn; 808c2ecf20Sopenharmony_ci struct list_head vlan; 818c2ecf20Sopenharmony_ci struct workqueue_struct *event_wq; 828c2ecf20Sopenharmony_ci u8 pnetid[SMC_MAX_PNETID_LEN]; 838c2ecf20Sopenharmony_ci bool pnetid_by_user; 848c2ecf20Sopenharmony_ci struct list_head lgr_list; 858c2ecf20Sopenharmony_ci spinlock_t lgr_lock; 868c2ecf20Sopenharmony_ci atomic_t lgr_cnt; 878c2ecf20Sopenharmony_ci wait_queue_head_t lgrs_deleted; 888c2ecf20Sopenharmony_ci u8 going_away : 1; 898c2ecf20Sopenharmony_ci}; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistruct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name, 928c2ecf20Sopenharmony_ci const struct smcd_ops *ops, int max_dmbs); 938c2ecf20Sopenharmony_ciint smcd_register_dev(struct smcd_dev *smcd); 948c2ecf20Sopenharmony_civoid smcd_unregister_dev(struct smcd_dev *smcd); 958c2ecf20Sopenharmony_civoid smcd_free_dev(struct smcd_dev *smcd); 968c2ecf20Sopenharmony_civoid smcd_handle_event(struct smcd_dev *dev, struct smcd_event *event); 978c2ecf20Sopenharmony_civoid smcd_handle_irq(struct smcd_dev *dev, unsigned int bit); 988c2ecf20Sopenharmony_ci#endif /* _SMC_H */ 99