]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - include/linux/dma_remapping.h
intel-iommu: move context entry defs out from dma_remapping.h
[linux-2.6-omap-h63xx.git] / include / linux / dma_remapping.h
1 #ifndef _DMA_REMAPPING_H
2 #define _DMA_REMAPPING_H
3
4 /*
5  * VT-d hardware uses 4KiB page size regardless of host page size.
6  */
7 #define VTD_PAGE_SHIFT          (12)
8 #define VTD_PAGE_SIZE           (1UL << VTD_PAGE_SHIFT)
9 #define VTD_PAGE_MASK           (((u64)-1) << VTD_PAGE_SHIFT)
10 #define VTD_PAGE_ALIGN(addr)    (((addr) + VTD_PAGE_SIZE - 1) & VTD_PAGE_MASK)
11
12 struct root_entry;
13
14 /*
15  * 0: readable
16  * 1: writable
17  * 2-6: reserved
18  * 7: super page
19  * 8-11: available
20  * 12-63: Host physcial address
21  */
22 struct dma_pte {
23         u64 val;
24 };
25 #define dma_clear_pte(p)        do {(p).val = 0;} while (0)
26
27 #define DMA_PTE_READ (1)
28 #define DMA_PTE_WRITE (2)
29
30 #define dma_set_pte_readable(p) do {(p).val |= DMA_PTE_READ;} while (0)
31 #define dma_set_pte_writable(p) do {(p).val |= DMA_PTE_WRITE;} while (0)
32 #define dma_set_pte_prot(p, prot) \
33                 do {(p).val = ((p).val & ~3) | ((prot) & 3); } while (0)
34 #define dma_pte_addr(p) ((p).val & VTD_PAGE_MASK)
35 #define dma_set_pte_addr(p, addr) do {\
36                 (p).val |= ((addr) & VTD_PAGE_MASK); } while (0)
37 #define dma_pte_present(p) (((p).val & 3) != 0)
38
39 struct intel_iommu;
40
41 struct dmar_domain {
42         int     id;                     /* domain id */
43         struct intel_iommu *iommu;      /* back pointer to owning iommu */
44
45         struct list_head devices;       /* all devices' list */
46         struct iova_domain iovad;       /* iova's that belong to this domain */
47
48         struct dma_pte  *pgd;           /* virtual address */
49         spinlock_t      mapping_lock;   /* page table lock */
50         int             gaw;            /* max guest address width */
51
52         /* adjusted guest address width, 0 is level 2 30-bit */
53         int             agaw;
54
55 #define DOMAIN_FLAG_MULTIPLE_DEVICES 1
56         int             flags;
57 };
58
59 /* PCI domain-device relationship */
60 struct device_domain_info {
61         struct list_head link;  /* link to domain siblings */
62         struct list_head global; /* link to global list */
63         u8 bus;                 /* PCI bus numer */
64         u8 devfn;               /* PCI devfn number */
65         struct pci_dev *dev; /* it's NULL for PCIE-to-PCI bridge */
66         struct dmar_domain *domain; /* pointer to domain */
67 };
68
69 extern void free_dmar_iommu(struct intel_iommu *iommu);
70
71 extern int dmar_disabled;
72
73 #ifndef CONFIG_DMAR_GFX_WA
74 static inline void iommu_prepare_gfx_mapping(void)
75 {
76         return;
77 }
78 #endif /* !CONFIG_DMAR_GFX_WA */
79
80 #endif