1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2f16a7dd5SUrsula Braun /* 3f16a7dd5SUrsula Braun * Shared Memory Communications over RDMA (SMC-R) and RoCE 4f16a7dd5SUrsula Braun * 5f16a7dd5SUrsula Braun * Definitions for the SMC module (socket related) 6f16a7dd5SUrsula Braun * 7f16a7dd5SUrsula Braun * Copyright IBM Corp. 2016 8f16a7dd5SUrsula Braun * 9f16a7dd5SUrsula Braun * Author(s): Ursula Braun <ubraun@linux.vnet.ibm.com> 10f16a7dd5SUrsula Braun */ 11f16a7dd5SUrsula Braun #ifndef _SMC_H 12f16a7dd5SUrsula Braun #define _SMC_H 13f16a7dd5SUrsula Braun 14949d6b40SJakub Kicinski #include <linux/device.h> 15949d6b40SJakub Kicinski #include <linux/spinlock.h> 16949d6b40SJakub Kicinski #include <linux/types.h> 17949d6b40SJakub Kicinski #include <linux/wait.h> 1889e7d2baSStefan Raspl #include "linux/ism.h" 19949d6b40SJakub Kicinski 20949d6b40SJakub Kicinski struct sock; 21949d6b40SJakub Kicinski 220afff91cSUrsula Braun #define SMC_MAX_PNETID_LEN 16 /* Max. length of PNET id */ 230afff91cSUrsula Braun 24f16a7dd5SUrsula Braun struct smc_hashinfo { 25f16a7dd5SUrsula Braun rwlock_t lock; 26f16a7dd5SUrsula Braun struct hlist_head ht; 27f16a7dd5SUrsula Braun }; 28f16a7dd5SUrsula Braun 29f16a7dd5SUrsula Braun int smc_hash_sk(struct sock *sk); 30f16a7dd5SUrsula Braun void smc_unhash_sk(struct sock *sk); 31c6ba7c9bSHans Wippel 32c6ba7c9bSHans Wippel /* SMCD/ISM device driver interface */ 33c6ba7c9bSHans Wippel struct smcd_dmb { 34c6ba7c9bSHans Wippel u64 dmb_tok; 35c6ba7c9bSHans Wippel u64 rgid; 36c6ba7c9bSHans Wippel u32 dmb_len; 37c6ba7c9bSHans Wippel u32 sba_idx; 38c6ba7c9bSHans Wippel u32 vlan_valid; 39c6ba7c9bSHans Wippel u32 vlan_id; 40c6ba7c9bSHans Wippel void *cpu_addr; 41c6ba7c9bSHans Wippel dma_addr_t dma_addr; 42c6ba7c9bSHans Wippel }; 43c6ba7c9bSHans Wippel 44c6ba7c9bSHans Wippel #define ISM_EVENT_DMB 0 45c6ba7c9bSHans Wippel #define ISM_EVENT_GID 1 46c6ba7c9bSHans Wippel #define ISM_EVENT_SWR 2 47c6ba7c9bSHans Wippel 48201091ebSUrsula Braun #define ISM_RESERVED_VLANID 0x1FFF 49201091ebSUrsula Braun 5042bfba9eSUrsula Braun #define ISM_ERROR 0xFFFF 5142bfba9eSUrsula Braun 52c6ba7c9bSHans Wippel struct smcd_dev; 53820f2100SStefan Raspl struct ism_client; 54c6ba7c9bSHans Wippel 557e5ef8ebSWen Gu struct smcd_gid { 567e5ef8ebSWen Gu u64 gid; 577e5ef8ebSWen Gu u64 gid_ext; 587e5ef8ebSWen Gu }; 597e5ef8ebSWen Gu 60c6ba7c9bSHans Wippel struct smcd_ops { 617e5ef8ebSWen Gu int (*query_remote_gid)(struct smcd_dev *dev, struct smcd_gid *rgid, 627e5ef8ebSWen Gu u32 vid_valid, u32 vid); 63820f2100SStefan Raspl int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb, 64820f2100SStefan Raspl struct ism_client *client); 65c6ba7c9bSHans Wippel int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb); 66c6ba7c9bSHans Wippel int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx, 67c6ba7c9bSHans Wippel bool sf, unsigned int offset, void *data, 68c6ba7c9bSHans Wippel unsigned int size); 69f947568eSStefan Raspl int (*supports_v2)(void); 700a2f4f98SStefan Raspl u8* (*get_system_eid)(void); 717e5ef8ebSWen Gu void (*get_local_gid)(struct smcd_dev *dev, struct smcd_gid *gid); 728caaccf5SUrsula Braun u16 (*get_chid)(struct smcd_dev *dev); 738c81ba20SStefan Raspl struct device* (*get_dev)(struct smcd_dev *dev); 74988b8102SWen Gu 75988b8102SWen Gu /* optional operations */ 76988b8102SWen Gu int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id); 77988b8102SWen Gu int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id); 78988b8102SWen Gu int (*set_vlan_required)(struct smcd_dev *dev); 79988b8102SWen Gu int (*reset_vlan_required)(struct smcd_dev *dev); 80988b8102SWen Gu int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid, 81988b8102SWen Gu u32 trigger_irq, u32 event_code, u64 info); 82*fe7ef3a1SWen Gu int (*support_dmb_nocopy)(struct smcd_dev *dev); 83*fe7ef3a1SWen Gu int (*attach_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb); 84*fe7ef3a1SWen Gu int (*detach_dmb)(struct smcd_dev *dev, u64 token); 85c6ba7c9bSHans Wippel }; 86c6ba7c9bSHans Wippel 87c6ba7c9bSHans Wippel struct smcd_dev { 88c6ba7c9bSHans Wippel const struct smcd_ops *ops; 89c6ba7c9bSHans Wippel void *priv; 90c6ba7c9bSHans Wippel struct list_head list; 91c6ba7c9bSHans Wippel spinlock_t lock; 92c6ba7c9bSHans Wippel struct smc_connection **conn; 93c6ba7c9bSHans Wippel struct list_head vlan; 94c6ba7c9bSHans Wippel struct workqueue_struct *event_wq; 951619f770SHans Wippel u8 pnetid[SMC_MAX_PNETID_LEN]; 96f3d74b22SHans Wippel bool pnetid_by_user; 97a2351c5dSUrsula Braun struct list_head lgr_list; 98a0a62ee1SUrsula Braun spinlock_t lgr_lock; 995edd6b9cSUrsula Braun atomic_t lgr_cnt; 1005edd6b9cSUrsula Braun wait_queue_head_t lgrs_deleted; 101c3d9494eSUrsula Braun u8 going_away : 1; 102c6ba7c9bSHans Wippel }; 103c6ba7c9bSHans Wippel 104f16a7dd5SUrsula Braun #endif /* _SMC_H */ 105