diff options
Diffstat (limited to 'drivers/pci/iova.h')
-rw-r--r-- | drivers/pci/iova.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/drivers/pci/iova.h b/drivers/pci/iova.h new file mode 100644 index 000000000000..04c220708883 --- /dev/null +++ b/drivers/pci/iova.h | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2006, Intel Corporation. | ||
3 | * | ||
4 | * This file is released under the GPLv2. | ||
5 | * | ||
6 | * Copyright (C) 2006 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #ifndef _IOVA_H_ | ||
11 | #define _IOVA_H_ | ||
12 | |||
13 | #include <linux/types.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/rbtree.h> | ||
16 | #include <linux/dma-mapping.h> | ||
17 | |||
18 | /* | ||
19 | * We need a fixed PAGE_SIZE of 4K irrespective of | ||
20 | * arch PAGE_SIZE for IOMMU page tables. | ||
21 | */ | ||
22 | #define PAGE_SHIFT_4K (12) | ||
23 | #define PAGE_SIZE_4K (1UL << PAGE_SHIFT_4K) | ||
24 | #define PAGE_MASK_4K (((u64)-1) << PAGE_SHIFT_4K) | ||
25 | #define PAGE_ALIGN_4K(addr) (((addr) + PAGE_SIZE_4K - 1) & PAGE_MASK_4K) | ||
26 | |||
27 | /* IO virtual address start page frame number */ | ||
28 | #define IOVA_START_PFN (1) | ||
29 | |||
30 | #define IOVA_PFN(addr) ((addr) >> PAGE_SHIFT_4K) | ||
31 | #define DMA_32BIT_PFN IOVA_PFN(DMA_32BIT_MASK) | ||
32 | #define DMA_64BIT_PFN IOVA_PFN(DMA_64BIT_MASK) | ||
33 | |||
34 | /* iova structure */ | ||
35 | struct iova { | ||
36 | struct rb_node node; | ||
37 | unsigned long pfn_hi; /* IOMMU dish out addr hi */ | ||
38 | unsigned long pfn_lo; /* IOMMU dish out addr lo */ | ||
39 | }; | ||
40 | |||
41 | /* holds all the iova translations for a domain */ | ||
42 | struct iova_domain { | ||
43 | spinlock_t iova_alloc_lock;/* Lock to protect iova allocation */ | ||
44 | spinlock_t iova_rbtree_lock; /* Lock to protect update of rbtree */ | ||
45 | struct rb_root rbroot; /* iova domain rbtree root */ | ||
46 | struct rb_node *cached32_node; /* Save last alloced node */ | ||
47 | }; | ||
48 | |||
49 | struct iova *alloc_iova_mem(void); | ||
50 | void free_iova_mem(struct iova *iova); | ||
51 | void free_iova(struct iova_domain *iovad, unsigned long pfn); | ||
52 | void __free_iova(struct iova_domain *iovad, struct iova *iova); | ||
53 | struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size, | ||
54 | unsigned long limit_pfn); | ||
55 | struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo, | ||
56 | unsigned long pfn_hi); | ||
57 | void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to); | ||
58 | void init_iova_domain(struct iova_domain *iovad); | ||
59 | struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn); | ||
60 | void put_iova_domain(struct iova_domain *iovad); | ||
61 | |||
62 | #endif | ||