Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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;
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);
12
13struct 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 */
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
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 *));
40int ioasid_register_allocator(struct ioasid_allocator_ops *allocator);
41void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator);
42int ioasid_set_data(ioasid_t ioasid, void *data);
43static inline bool pasid_valid(ioasid_t ioasid)
44{
45 return ioasid != INVALID_IOASID;
46}
47
48#else /* !CONFIG_IOASID */
49static inline ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min,
50 ioasid_t max, void *private)
51{
52 return INVALID_IOASID;
53}
54
55static inline void ioasid_free(ioasid_t ioasid) { }
56
57static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
58 bool (*getter)(void *))
59{
60 return NULL;
61}
62
63static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator)
64{
65 return -ENOTSUPP;
66}
67
68static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator)
69{
70}
71
72static inline int ioasid_set_data(ioasid_t ioasid, void *data)
73{
74 return -ENOTSUPP;
75}
76
77static inline bool pasid_valid(ioasid_t ioasid)
78{
79 return false;
80}
81
82#endif /* CONFIG_IOASID */
83#endif /* __LINUX_IOASID_H */