1cb990a45SAlexandra Winter /* SPDX-License-Identifier: GPL-2.0 */ 2cb990a45SAlexandra Winter /* 3cb990a45SAlexandra Winter * dibs loopback (aka loopback-ism) device structure definitions. 4cb990a45SAlexandra Winter * 5cb990a45SAlexandra Winter * Copyright (c) 2024, Alibaba Inc. 6cb990a45SAlexandra Winter * 7cb990a45SAlexandra Winter * Author: Wen Gu <guwen@linux.alibaba.com> 8cb990a45SAlexandra Winter * Tony Lu <tonylu@linux.alibaba.com> 9cb990a45SAlexandra Winter * 10cb990a45SAlexandra Winter */ 11cb990a45SAlexandra Winter 12cb990a45SAlexandra Winter #ifndef _DIBS_LOOPBACK_H 13cb990a45SAlexandra Winter #define _DIBS_LOOPBACK_H 14cb990a45SAlexandra Winter 15cb990a45SAlexandra Winter #include <linux/dibs.h> 16*cc21191bSAlexandra Winter #include <linux/hashtable.h> 17*cc21191bSAlexandra Winter #include <linux/spinlock.h> 18cb990a45SAlexandra Winter #include <linux/types.h> 19cb990a45SAlexandra Winter #include <linux/wait.h> 20cb990a45SAlexandra Winter 21cb990a45SAlexandra Winter #if IS_ENABLED(CONFIG_DIBS_LO) 22*cc21191bSAlexandra Winter #define DIBS_LO_DMBS_HASH_BITS 12 23*cc21191bSAlexandra Winter #define DIBS_LO_MAX_DMBS 5000 24*cc21191bSAlexandra Winter 25*cc21191bSAlexandra Winter struct dibs_lo_dmb_node { 26*cc21191bSAlexandra Winter struct hlist_node list; 27*cc21191bSAlexandra Winter u64 token; 28*cc21191bSAlexandra Winter u32 len; 29*cc21191bSAlexandra Winter u32 sba_idx; 30*cc21191bSAlexandra Winter void *cpu_addr; 31*cc21191bSAlexandra Winter dma_addr_t dma_addr; 32*cc21191bSAlexandra Winter refcount_t refcnt; 33*cc21191bSAlexandra Winter }; 34cb990a45SAlexandra Winter 35cb990a45SAlexandra Winter struct dibs_lo_dev { 36cb990a45SAlexandra Winter struct dibs_dev *dibs; 37*cc21191bSAlexandra Winter atomic_t dmb_cnt; 38*cc21191bSAlexandra Winter rwlock_t dmb_ht_lock; 39*cc21191bSAlexandra Winter DECLARE_BITMAP(sba_idx_mask, DIBS_LO_MAX_DMBS); 40*cc21191bSAlexandra Winter DECLARE_HASHTABLE(dmb_ht, DIBS_LO_DMBS_HASH_BITS); 41*cc21191bSAlexandra Winter wait_queue_head_t ldev_release; 42cb990a45SAlexandra Winter }; 43cb990a45SAlexandra Winter 44cb990a45SAlexandra Winter int dibs_loopback_init(void); 45cb990a45SAlexandra Winter void dibs_loopback_exit(void); 46cb990a45SAlexandra Winter #else 47cb990a45SAlexandra Winter static inline int dibs_loopback_init(void) 48cb990a45SAlexandra Winter { 49cb990a45SAlexandra Winter return 0; 50cb990a45SAlexandra Winter } 51cb990a45SAlexandra Winter 52cb990a45SAlexandra Winter static inline void dibs_loopback_exit(void) 53cb990a45SAlexandra Winter { 54cb990a45SAlexandra Winter } 55cb990a45SAlexandra Winter #endif 56cb990a45SAlexandra Winter 57cb990a45SAlexandra Winter #endif /* _DIBS_LOOPBACK_H */ 58