linux/include/linux/ioasid.h
<<
>>
Prefs
   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 */
  83