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

iova.h (4137B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (c) 2006, Intel Corporation.
      4 *
      5 * Copyright (C) 2006-2008 Intel Corporation
      6 * Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
      7 */
      8
      9#ifndef _IOVA_H_
     10#define _IOVA_H_
     11
     12#include <linux/types.h>
     13#include <linux/kernel.h>
     14#include <linux/rbtree.h>
     15#include <linux/dma-mapping.h>
     16
     17/* iova structure */
     18struct iova {
     19	struct rb_node	node;
     20	unsigned long	pfn_hi; /* Highest allocated pfn */
     21	unsigned long	pfn_lo; /* Lowest allocated pfn */
     22};
     23
     24
     25struct iova_rcache;
     26
     27/* holds all the iova translations for a domain */
     28struct iova_domain {
     29	spinlock_t	iova_rbtree_lock; /* Lock to protect update of rbtree */
     30	struct rb_root	rbroot;		/* iova domain rbtree root */
     31	struct rb_node	*cached_node;	/* Save last alloced node */
     32	struct rb_node	*cached32_node; /* Save last 32-bit alloced node */
     33	unsigned long	granule;	/* pfn granularity for this domain */
     34	unsigned long	start_pfn;	/* Lower limit for this domain */
     35	unsigned long	dma_32bit_pfn;
     36	unsigned long	max32_alloc_size; /* Size of last failed allocation */
     37	struct iova	anchor;		/* rbtree lookup anchor */
     38
     39	struct iova_rcache	*rcaches;
     40	struct hlist_node	cpuhp_dead;
     41};
     42
     43static inline unsigned long iova_size(struct iova *iova)
     44{
     45	return iova->pfn_hi - iova->pfn_lo + 1;
     46}
     47
     48static inline unsigned long iova_shift(struct iova_domain *iovad)
     49{
     50	return __ffs(iovad->granule);
     51}
     52
     53static inline unsigned long iova_mask(struct iova_domain *iovad)
     54{
     55	return iovad->granule - 1;
     56}
     57
     58static inline size_t iova_offset(struct iova_domain *iovad, dma_addr_t iova)
     59{
     60	return iova & iova_mask(iovad);
     61}
     62
     63static inline size_t iova_align(struct iova_domain *iovad, size_t size)
     64{
     65	return ALIGN(size, iovad->granule);
     66}
     67
     68static inline dma_addr_t iova_dma_addr(struct iova_domain *iovad, struct iova *iova)
     69{
     70	return (dma_addr_t)iova->pfn_lo << iova_shift(iovad);
     71}
     72
     73static inline unsigned long iova_pfn(struct iova_domain *iovad, dma_addr_t iova)
     74{
     75	return iova >> iova_shift(iovad);
     76}
     77
     78#if IS_ENABLED(CONFIG_IOMMU_IOVA)
     79int iova_cache_get(void);
     80void iova_cache_put(void);
     81
     82void free_iova(struct iova_domain *iovad, unsigned long pfn);
     83void __free_iova(struct iova_domain *iovad, struct iova *iova);
     84struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size,
     85	unsigned long limit_pfn,
     86	bool size_aligned);
     87void free_iova_fast(struct iova_domain *iovad, unsigned long pfn,
     88		    unsigned long size);
     89unsigned long alloc_iova_fast(struct iova_domain *iovad, unsigned long size,
     90			      unsigned long limit_pfn, bool flush_rcache);
     91struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,
     92	unsigned long pfn_hi);
     93void init_iova_domain(struct iova_domain *iovad, unsigned long granule,
     94	unsigned long start_pfn);
     95int iova_domain_init_rcaches(struct iova_domain *iovad);
     96struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);
     97void put_iova_domain(struct iova_domain *iovad);
     98#else
     99static inline int iova_cache_get(void)
    100{
    101	return -ENOTSUPP;
    102}
    103
    104static inline void iova_cache_put(void)
    105{
    106}
    107
    108static inline void free_iova(struct iova_domain *iovad, unsigned long pfn)
    109{
    110}
    111
    112static inline void __free_iova(struct iova_domain *iovad, struct iova *iova)
    113{
    114}
    115
    116static inline struct iova *alloc_iova(struct iova_domain *iovad,
    117				      unsigned long size,
    118				      unsigned long limit_pfn,
    119				      bool size_aligned)
    120{
    121	return NULL;
    122}
    123
    124static inline void free_iova_fast(struct iova_domain *iovad,
    125				  unsigned long pfn,
    126				  unsigned long size)
    127{
    128}
    129
    130static inline unsigned long alloc_iova_fast(struct iova_domain *iovad,
    131					    unsigned long size,
    132					    unsigned long limit_pfn,
    133					    bool flush_rcache)
    134{
    135	return 0;
    136}
    137
    138static inline struct iova *reserve_iova(struct iova_domain *iovad,
    139					unsigned long pfn_lo,
    140					unsigned long pfn_hi)
    141{
    142	return NULL;
    143}
    144
    145static inline void init_iova_domain(struct iova_domain *iovad,
    146				    unsigned long granule,
    147				    unsigned long start_pfn)
    148{
    149}
    150
    151static inline struct iova *find_iova(struct iova_domain *iovad,
    152				     unsigned long pfn)
    153{
    154	return NULL;
    155}
    156
    157static inline void put_iova_domain(struct iova_domain *iovad)
    158{
    159}
    160
    161#endif
    162
    163#endif