mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 01:34:00 +08:00
cb4789b0d1
Let IOASID users take references to existing ioasids with ioasid_get(). ioasid_put() drops a reference and only frees the ioasid when its reference number is zero. It returns true if the ioasid was freed. For drivers that don't call ioasid_get(), ioasid_put() is the same as ioasid_free(). Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Reviewed-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Link: https://lore.kernel.org/r/20201106155048.997886-2-jean-philippe@linaro.org Signed-off-by: Will Deacon <will@kernel.org>
83 lines
2.1 KiB
C
83 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_get(ioasid_t ioasid);
|
|
bool ioasid_put(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);
|
|
|
|
#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_get(ioasid_t ioasid)
|
|
{
|
|
}
|
|
|
|
static inline bool ioasid_put(ioasid_t ioasid)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
#endif /* CONFIG_IOASID */
|
|
#endif /* __LINUX_IOASID_H */
|