xref: /linux/drivers/dibs/dibs_loopback.h (revision 07fdad3a93756b872da7b53647715c48d0f4a2d0)
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