|
@@ -57,6 +57,39 @@
|
|
|
#define DMA_32BIT_PFN IOVA_PFN(DMA_32BIT_MASK)
|
|
|
#define DMA_64BIT_PFN IOVA_PFN(DMA_64BIT_MASK)
|
|
|
|
|
|
+/*
|
|
|
+ * 0: Present
|
|
|
+ * 1-11: Reserved
|
|
|
+ * 12-63: Context Ptr (12 - (haw-1))
|
|
|
+ * 64-127: Reserved
|
|
|
+ */
|
|
|
+struct root_entry {
|
|
|
+ u64 val;
|
|
|
+ u64 rsvd1;
|
|
|
+};
|
|
|
+#define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry))
|
|
|
+static inline bool root_present(struct root_entry *root)
|
|
|
+{
|
|
|
+ return (root->val & 1);
|
|
|
+}
|
|
|
+static inline void set_root_present(struct root_entry *root)
|
|
|
+{
|
|
|
+ root->val |= 1;
|
|
|
+}
|
|
|
+static inline void set_root_value(struct root_entry *root, unsigned long value)
|
|
|
+{
|
|
|
+ root->val |= value & VTD_PAGE_MASK;
|
|
|
+}
|
|
|
+
|
|
|
+static inline struct context_entry *
|
|
|
+get_context_addr_from_root(struct root_entry *root)
|
|
|
+{
|
|
|
+ return (struct context_entry *)
|
|
|
+ (root_present(root)?phys_to_virt(
|
|
|
+ root->val & VTD_PAGE_MASK) :
|
|
|
+ NULL);
|
|
|
+}
|
|
|
+
|
|
|
static void flush_unmaps_timeout(unsigned long data);
|
|
|
|
|
|
DEFINE_TIMER(unmap_timer, flush_unmaps_timeout, 0, 0);
|