2 * Copyright (c) 2006, Intel Corporation.
4 * This file is released under the GPLv2.
6 * Copyright (C) 2006-2008 Intel Corporation
7 * Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
14 #include <linux/types.h>
15 #include <linux/kernel.h>
16 #include <linux/rbtree.h>
17 #include <linux/dma-mapping.h>
22 unsigned long pfn_hi
; /* IOMMU dish out addr hi */
23 unsigned long pfn_lo
; /* IOMMU dish out addr lo */
26 /* holds all the iova translations for a domain */
28 spinlock_t iova_rbtree_lock
; /* Lock to protect update of rbtree */
29 struct rb_root rbroot
; /* iova domain rbtree root */
30 struct rb_node
*cached32_node
; /* Save last alloced node */
31 unsigned long granule
; /* pfn granularity for this domain */
32 unsigned long start_pfn
; /* Lower limit for this domain */
33 unsigned long dma_32bit_pfn
;
36 static inline unsigned long iova_size(struct iova
*iova
)
38 return iova
->pfn_hi
- iova
->pfn_lo
+ 1;
41 static inline unsigned long iova_shift(struct iova_domain
*iovad
)
43 return __ffs(iovad
->granule
);
46 static inline unsigned long iova_mask(struct iova_domain
*iovad
)
48 return iovad
->granule
- 1;
51 static inline size_t iova_offset(struct iova_domain
*iovad
, dma_addr_t iova
)
53 return iova
& iova_mask(iovad
);
56 static inline size_t iova_align(struct iova_domain
*iovad
, size_t size
)
58 return ALIGN(size
, iovad
->granule
);
61 static inline dma_addr_t
iova_dma_addr(struct iova_domain
*iovad
, struct iova
*iova
)
63 return (dma_addr_t
)iova
->pfn_lo
<< iova_shift(iovad
);
66 static inline unsigned long iova_pfn(struct iova_domain
*iovad
, dma_addr_t iova
)
68 return iova
>> iova_shift(iovad
);
71 int iova_cache_get(void);
72 void iova_cache_put(void);
74 struct iova
*alloc_iova_mem(void);
75 void free_iova_mem(struct iova
*iova
);
76 void free_iova(struct iova_domain
*iovad
, unsigned long pfn
);
77 void __free_iova(struct iova_domain
*iovad
, struct iova
*iova
);
78 struct iova
*alloc_iova(struct iova_domain
*iovad
, unsigned long size
,
79 unsigned long limit_pfn
,
81 struct iova
*reserve_iova(struct iova_domain
*iovad
, unsigned long pfn_lo
,
82 unsigned long pfn_hi
);
83 void copy_reserved_iova(struct iova_domain
*from
, struct iova_domain
*to
);
84 void init_iova_domain(struct iova_domain
*iovad
, unsigned long granule
,
85 unsigned long start_pfn
, unsigned long pfn_32bit
);
86 struct iova
*find_iova(struct iova_domain
*iovad
, unsigned long pfn
);
87 void put_iova_domain(struct iova_domain
*iovad
);
88 struct iova
*split_and_remove_iova(struct iova_domain
*iovad
,
89 struct iova
*iova
, unsigned long pfn_lo
, unsigned long pfn_hi
);