Commit | Line | Data |
---|---|---|
fa83433c JPB |
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; | |
e5c0bd7f JP |
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); | |
fa83433c JPB |
12 | |
13 | struct ioasid_set { | |
14 | int dummy; | |
15 | }; | |
16 | ||
e5c0bd7f JP |
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 | ||
fa83433c JPB |
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_free(ioasid_t ioasid); | |
38 | void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid, | |
39 | bool (*getter)(void *)); | |
e5c0bd7f JP |
40 | int ioasid_register_allocator(struct ioasid_allocator_ops *allocator); |
41 | void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator); | |
fa83433c JPB |
42 | int ioasid_set_data(ioasid_t ioasid, void *data); |
43 | ||
44 | #else /* !CONFIG_IOASID */ | |
45 | static inline ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min, | |
46 | ioasid_t max, void *private) | |
47 | { | |
48 | return INVALID_IOASID; | |
49 | } | |
50 | ||
51 | static inline void ioasid_free(ioasid_t ioasid) | |
52 | { | |
53 | } | |
54 | ||
55 | static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid, | |
56 | bool (*getter)(void *)) | |
57 | { | |
58 | return NULL; | |
59 | } | |
60 | ||
e5c0bd7f JP |
61 | static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator) |
62 | { | |
63 | return -ENOTSUPP; | |
64 | } | |
65 | ||
66 | static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator) | |
67 | { | |
68 | } | |
69 | ||
fa83433c JPB |
70 | static inline int ioasid_set_data(ioasid_t ioasid, void *data) |
71 | { | |
72 | return -ENOTSUPP; | |
73 | } | |
74 | ||
75 | #endif /* CONFIG_IOASID */ | |
76 | #endif /* __LINUX_IOASID_H */ |