1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #ifndef __LINUX_IOASID_H
- #define __LINUX_IOASID_H
- #include <linux/types.h>
- #include <linux/errno.h>
- #define INVALID_IOASID ((ioasid_t)-1)
- typedef unsigned int ioasid_t;
- typedef ioasid_t (*ioasid_alloc_fn_t)(ioasid_t min, ioasid_t max, void *data);
- typedef void (*ioasid_free_fn_t)(ioasid_t ioasid, void *data);
- struct ioasid_set {
- int dummy;
- };
- /**
- * struct ioasid_allocator_ops - IOASID allocator helper functions and data
- *
- * @alloc: helper function to allocate IOASID
- * @free: helper function to free IOASID
- * @list: for tracking ops that share helper functions but not data
- * @pdata: data belong to the allocator, provided when calling alloc()
- */
- struct ioasid_allocator_ops {
- ioasid_alloc_fn_t alloc;
- ioasid_free_fn_t free;
- struct list_head list;
- void *pdata;
- };
- #define DECLARE_IOASID_SET(name) struct ioasid_set name = { 0 }
- #if IS_ENABLED(CONFIG_IOASID)
- ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min, ioasid_t max,
- void *private);
- void ioasid_free(ioasid_t ioasid);
- void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
- bool (*getter)(void *));
- int ioasid_register_allocator(struct ioasid_allocator_ops *allocator);
- void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator);
- int ioasid_set_data(ioasid_t ioasid, void *data);
- static inline bool pasid_valid(ioasid_t ioasid)
- {
- return ioasid != INVALID_IOASID;
- }
- #else /* !CONFIG_IOASID */
- static inline ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min,
- ioasid_t max, void *private)
- {
- return INVALID_IOASID;
- }
- static inline void ioasid_free(ioasid_t ioasid) { }
- static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
- bool (*getter)(void *))
- {
- return NULL;
- }
- static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator)
- {
- return -ENOTSUPP;
- }
- static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator)
- {
- }
- static inline int ioasid_set_data(ioasid_t ioasid, void *data)
- {
- return -ENOTSUPP;
- }
- static inline bool pasid_valid(ioasid_t ioasid)
- {
- return false;
- }
- #endif /* CONFIG_IOASID */
- #endif /* __LINUX_IOASID_H */
|