cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ioasid.h (2174B)


      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_free(ioasid_t ioasid);
     38void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
     39		  bool (*getter)(void *));
     40int ioasid_register_allocator(struct ioasid_allocator_ops *allocator);
     41void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator);
     42int ioasid_set_data(ioasid_t ioasid, void *data);
     43static inline bool pasid_valid(ioasid_t ioasid)
     44{
     45	return ioasid != INVALID_IOASID;
     46}
     47
     48#else /* !CONFIG_IOASID */
     49static inline ioasid_t ioasid_alloc(struct ioasid_set *set, ioasid_t min,
     50				    ioasid_t max, void *private)
     51{
     52	return INVALID_IOASID;
     53}
     54
     55static inline void ioasid_free(ioasid_t ioasid) { }
     56
     57static inline void *ioasid_find(struct ioasid_set *set, ioasid_t ioasid,
     58				bool (*getter)(void *))
     59{
     60	return NULL;
     61}
     62
     63static inline int ioasid_register_allocator(struct ioasid_allocator_ops *allocator)
     64{
     65	return -ENOTSUPP;
     66}
     67
     68static inline void ioasid_unregister_allocator(struct ioasid_allocator_ops *allocator)
     69{
     70}
     71
     72static inline int ioasid_set_data(ioasid_t ioasid, void *data)
     73{
     74	return -ENOTSUPP;
     75}
     76
     77static inline bool pasid_valid(ioasid_t ioasid)
     78{
     79	return false;
     80}
     81
     82#endif /* CONFIG_IOASID */
     83#endif /* __LINUX_IOASID_H */