84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
|
/* 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 */
|