]>
Commit | Line | Data |
---|---|---|
f8de50eb KA |
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 |