at v5.13 2.1 kB view raw
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_get(ioasid_t ioasid); 38bool ioasid_put(ioasid_t ioasid); 39void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid, 40 bool (*getter)(void *)); 41int ioasid_register_allocator(struct ioasid_allocator_ops *allocator); 42void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator); 43int ioasid_set_data(ioasid_t ioasid, void *data); 44 45#else /* !CONFIG_IOASID */ 46static 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 52static inline void ioasid_get(ioasid_t ioasid) 53{ 54} 55 56static inline bool ioasid_put(ioasid_t ioasid) 57{ 58 return false; 59} 60 61static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid, 62 bool (*getter)(void *)) 63{ 64 return NULL; 65} 66 67static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator) 68{ 69 return -ENOTSUPP; 70} 71 72static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator) 73{ 74} 75 76static 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 */