xref: /openbmc/linux/include/net/smc.h (revision 278002edb19bce2c628fafb0af936e77000f3a5b)
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