1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Shared Memory Communications Direct over loopback-ism device. 4 * 5 * SMC-D loopback-ism device structure definitions. 6 * 7 * Copyright (c) 2024, Alibaba Inc. 8 * 9 * Author: Wen Gu <guwen@linux.alibaba.com> 10 * Tony Lu <tonylu@linux.alibaba.com> 11 * 12 */ 13 14 #ifndef _SMC_LOOPBACK_H 15 #define _SMC_LOOPBACK_H 16 17 #include <linux/device.h> 18 #include <linux/err.h> 19 #include <net/smc.h> 20 21 #if IS_ENABLED(CONFIG_SMC_LO) 22 #define SMC_LO_MAX_DMBS 5000 23 #define SMC_LO_DMBS_HASH_BITS 12 24 #define SMC_LO_RESERVED_CHID 0xFFFF 25 26 struct smc_lo_dmb_node { 27 struct hlist_node list; 28 u64 token; 29 u32 len; 30 u32 sba_idx; 31 void *cpu_addr; 32 dma_addr_t dma_addr; 33 refcount_t refcnt; 34 }; 35 36 struct smc_lo_dev { 37 struct smcd_dev *smcd; 38 struct device dev; 39 u16 chid; 40 struct smcd_gid local_gid; 41 atomic_t dmb_cnt; 42 rwlock_t dmb_ht_lock; 43 DECLARE_BITMAP(sba_idx_mask, SMC_LO_MAX_DMBS); 44 DECLARE_HASHTABLE(dmb_ht, SMC_LO_DMBS_HASH_BITS); 45 wait_queue_head_t ldev_release; 46 }; 47 48 int smc_loopback_init(void); 49 void smc_loopback_exit(void); 50 #else 51 static inline int smc_loopback_init(void) 52 { 53 return 0; 54 } 55 56 static inline void smc_loopback_exit(void) 57 { 58 } 59 #endif 60 61 #endif /* _SMC_LOOPBACK_H */ 62