Merge branch 'topic/tasklet-convert' into for-linus
[linux-block.git] / include / linux / ioasid.h
CommitLineData
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)
9typedef unsigned int ioasid_t;
e5c0bd7f
JP
10typedef ioasid_t (*ioasid_alloc_fn_t)(ioasid_t min, ioasid_t max, void *data);
11typedef void (*ioasid_free_fn_t)(ioasid_t ioasid, void *data);
fa83433c
JPB
12
13struct 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 */
25struct 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)
35ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min, ioasid_t max,
36 void *private);
37void ioasid_free(ioasid_t ioasid);
38void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
39 bool (*getter)(void *));
e5c0bd7f
JP
40int ioasid_register_allocator(struct ioasid_allocator_ops *allocator);
41void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator);
fa83433c
JPB
42int ioasid_set_data(ioasid_t ioasid, void *data);
43
44#else /* !CONFIG_IOASID */
45static 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
51static inline void ioasid_free(ioasid_t ioasid)
52{
53}
54
55static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
56 bool (*getter)(void *))
57{
58 return NULL;
59}
60
e5c0bd7f
JP
61static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator)
62{
63 return -ENOTSUPP;
64}
65
66static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator)
67{
68}
69
fa83433c
JPB
70static 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 */