18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Shared Memory Communications Direct over ISM devices (SMC-D)
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * SMC-D ISM device structure definitions.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2018
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef SMCD_ISM_H
108c2ecf20Sopenharmony_ci#define SMCD_ISM_H
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/uio.h>
138c2ecf20Sopenharmony_ci#include <linux/mutex.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include "smc.h"
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistruct smcd_dev_list {	/* List of SMCD devices */
188c2ecf20Sopenharmony_ci	struct list_head list;
198c2ecf20Sopenharmony_ci	struct mutex mutex;	/* Protects list of devices */
208c2ecf20Sopenharmony_ci};
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ciextern struct smcd_dev_list	smcd_dev_list;	/* list of smcd devices */
238c2ecf20Sopenharmony_ciextern bool	smc_ism_v2_capable;	/* HW supports ISM V2 and thus
248c2ecf20Sopenharmony_ci					 * System EID is defined
258c2ecf20Sopenharmony_ci					 */
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistruct smc_ism_vlanid {			/* VLAN id set on ISM device */
288c2ecf20Sopenharmony_ci	struct list_head list;
298c2ecf20Sopenharmony_ci	unsigned short vlanid;		/* Vlan id */
308c2ecf20Sopenharmony_ci	refcount_t refcnt;		/* Reference count */
318c2ecf20Sopenharmony_ci};
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistruct smc_ism_position {	/* ISM device position to write to */
348c2ecf20Sopenharmony_ci	u64 token;		/* Token of DMB */
358c2ecf20Sopenharmony_ci	u32 offset;		/* Offset into DMBE */
368c2ecf20Sopenharmony_ci	u8 index;		/* Index of DMBE */
378c2ecf20Sopenharmony_ci	u8 signal;		/* Generate interrupt on owner side */
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistruct smcd_dev;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ciint smc_ism_cantalk(u64 peer_gid, unsigned short vlan_id, struct smcd_dev *dev);
438c2ecf20Sopenharmony_civoid smc_ism_set_conn(struct smc_connection *conn);
448c2ecf20Sopenharmony_civoid smc_ism_unset_conn(struct smc_connection *conn);
458c2ecf20Sopenharmony_ciint smc_ism_get_vlan(struct smcd_dev *dev, unsigned short vlan_id);
468c2ecf20Sopenharmony_ciint smc_ism_put_vlan(struct smcd_dev *dev, unsigned short vlan_id);
478c2ecf20Sopenharmony_ciint smc_ism_register_dmb(struct smc_link_group *lgr, int buf_size,
488c2ecf20Sopenharmony_ci			 struct smc_buf_desc *dmb_desc);
498c2ecf20Sopenharmony_ciint smc_ism_unregister_dmb(struct smcd_dev *dev, struct smc_buf_desc *dmb_desc);
508c2ecf20Sopenharmony_ciint smc_ism_write(struct smcd_dev *dev, const struct smc_ism_position *pos,
518c2ecf20Sopenharmony_ci		  void *data, size_t len);
528c2ecf20Sopenharmony_ciint smc_ism_signal_shutdown(struct smc_link_group *lgr);
538c2ecf20Sopenharmony_civoid smc_ism_get_system_eid(struct smcd_dev *dev, u8 **eid);
548c2ecf20Sopenharmony_ciu16 smc_ism_get_chid(struct smcd_dev *dev);
558c2ecf20Sopenharmony_civoid smc_ism_init(void);
568c2ecf20Sopenharmony_ci#endif
57