]>
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); | |
cb4789b0 JPB |
37 | void ioasid_get(ioasid_t ioasid); |
38 | bool ioasid_put(ioasid_t ioasid); | |
fa83433c JPB |
39 | void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid, |
40 | bool (*getter)(void *)); | |
e5c0bd7f JP |
41 | int ioasid_register_allocator(struct ioasid_allocator_ops *allocator); |
42 | void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator); | |
fa83433c JPB |
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 | ||
cb4789b0 | 52 | static inline void ioasid_get(ioasid_t ioasid) |
fa83433c JPB |
53 | { |
54 | } | |
55 | ||
cb4789b0 JPB |
56 | static inline bool ioasid_put(ioasid_t ioasid) |
57 | { | |
58 | return false; | |
59 | } | |
60 | ||
fa83433c JPB |
61 | static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid, |
62 | bool (*getter)(void *)) | |
63 | { | |
64 | return NULL; | |
65 | } | |
66 | ||
e5c0bd7f JP |
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 | ||
fa83433c JPB |
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 */ |