|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | /* | 
|  | *  Shared Memory Communications over RDMA (SMC-R) and RoCE | 
|  | * | 
|  | *  Definitions for the SMC module (socket related) | 
|  | * | 
|  | *  Copyright IBM Corp. 2016 | 
|  | * | 
|  | *  Author(s):  Ursula Braun <ubraun@linux.vnet.ibm.com> | 
|  | */ | 
|  | #ifndef _SMC_H | 
|  | #define _SMC_H | 
|  |  | 
|  | #define SMC_MAX_PNETID_LEN	16	/* Max. length of PNET id */ | 
|  |  | 
|  | struct smc_hashinfo { | 
|  | rwlock_t lock; | 
|  | struct hlist_head ht; | 
|  | }; | 
|  |  | 
|  | int smc_hash_sk(struct sock *sk); | 
|  | void smc_unhash_sk(struct sock *sk); | 
|  |  | 
|  | /* SMCD/ISM device driver interface */ | 
|  | struct smcd_dmb { | 
|  | u64 dmb_tok; | 
|  | u64 rgid; | 
|  | u32 dmb_len; | 
|  | u32 sba_idx; | 
|  | u32 vlan_valid; | 
|  | u32 vlan_id; | 
|  | void *cpu_addr; | 
|  | dma_addr_t dma_addr; | 
|  | }; | 
|  |  | 
|  | #define ISM_EVENT_DMB	0 | 
|  | #define ISM_EVENT_GID	1 | 
|  | #define ISM_EVENT_SWR	2 | 
|  |  | 
|  | struct smcd_event { | 
|  | u32 type; | 
|  | u32 code; | 
|  | u64 tok; | 
|  | u64 time; | 
|  | u64 info; | 
|  | }; | 
|  |  | 
|  | struct smcd_dev; | 
|  |  | 
|  | struct smcd_ops { | 
|  | int (*query_remote_gid)(struct smcd_dev *dev, u64 rgid, u32 vid_valid, | 
|  | u32 vid); | 
|  | int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb); | 
|  | int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb); | 
|  | int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id); | 
|  | int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id); | 
|  | int (*set_vlan_required)(struct smcd_dev *dev); | 
|  | int (*reset_vlan_required)(struct smcd_dev *dev); | 
|  | int (*signal_event)(struct smcd_dev *dev, u64 rgid, u32 trigger_irq, | 
|  | u32 event_code, u64 info); | 
|  | int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx, | 
|  | bool sf, unsigned int offset, void *data, | 
|  | unsigned int size); | 
|  | }; | 
|  |  | 
|  | struct smcd_dev { | 
|  | const struct smcd_ops *ops; | 
|  | struct device dev; | 
|  | void *priv; | 
|  | u64 local_gid; | 
|  | struct list_head list; | 
|  | spinlock_t lock; | 
|  | struct smc_connection **conn; | 
|  | struct list_head vlan; | 
|  | struct workqueue_struct *event_wq; | 
|  | u8 pnetid[SMC_MAX_PNETID_LEN]; | 
|  | }; | 
|  |  | 
|  | struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name, | 
|  | const struct smcd_ops *ops, int max_dmbs); | 
|  | int smcd_register_dev(struct smcd_dev *smcd); | 
|  | void smcd_unregister_dev(struct smcd_dev *smcd); | 
|  | void smcd_free_dev(struct smcd_dev *smcd); | 
|  | void smcd_handle_event(struct smcd_dev *dev, struct smcd_event *event); | 
|  | void smcd_handle_irq(struct smcd_dev *dev, unsigned int bit); | 
|  | #endif	/* _SMC_H */ |