Merge tag 'trace-v5.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux-2.6-microblaze.git] / include / linux / ioasid.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LINUX_IOASID_H
3 #define __LINUX_IOASID_H
4
5 #include <linux/types.h>
6 #include <linux/errno.h>
7
8 #define INVALID_IOASID ((ioasid_t)-1)
9 typedef unsigned int ioasid_t;
10 typedef ioasid_t (*ioasid_alloc_fn_t)(ioasid_t min, ioasid_t max, void *data);
11 typedef void (*ioasid_free_fn_t)(ioasid_t ioasid, void *data);
12
13 struct ioasid_set {
14         int dummy;
15 };
16
17 /**
18  * struct ioasid_allocator_ops - IOASID allocator helper functions and data
19  *
20  * @alloc:      helper function to allocate IOASID
21  * @free:       helper function to free IOASID
22  * @list:       for tracking ops that share helper functions but not data
23  * @pdata:      data belong to the allocator, provided when calling alloc()
24  */
25 struct ioasid_allocator_ops {
26         ioasid_alloc_fn_t alloc;
27         ioasid_free_fn_t free;
28         struct list_head list;
29         void *pdata;
30 };
31
32 #define DECLARE_IOASID_SET(name) struct ioasid_set name = { 0 }
33
34 #if IS_ENABLED(CONFIG_IOASID)
35 ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min, ioasid_t max,
36                       void *private);
37 void ioasid_get(ioasid_t ioasid);
38 bool ioasid_put(ioasid_t ioasid);
39 void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
40                   bool (*getter)(void *));
41 int ioasid_register_allocator(struct ioasid_allocator_ops *allocator);
42 void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator);
43 int ioasid_set_data(ioasid_t ioasid, void *data);
44
45 #else /* !CONFIG_IOASID */
46 static inline ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min,
47                                     ioasid_t max, void *private)
48 {
49         return INVALID_IOASID;
50 }
51
52 static inline void ioasid_get(ioasid_t ioasid)
53 {
54 }
55
56 static inline bool ioasid_put(ioasid_t ioasid)
57 {
58         return false;
59 }
60
61 static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
62                                 bool (*getter)(void *))
63 {
64         return NULL;
65 }
66
67 static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator)
68 {
69         return -ENOTSUPP;
70 }
71
72 static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator)
73 {
74 }
75
76 static inline int ioasid_set_data(ioasid_t ioasid, void *data)
77 {
78         return -ENOTSUPP;
79 }
80
81 #endif /* CONFIG_IOASID */
82 #endif /* __LINUX_IOASID_H */