drm/i915/gvt: Add software PTE flag to mark special 64K splited entry
authorChangbin Du <changbin.du@intel.com>
Tue, 15 May 2018 02:35:37 +0000 (10:35 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Mon, 9 Jul 2018 02:23:21 +0000 (10:23 +0800)
This add a software PTE flag on the Ignored bit of PTE. It will be used
to identify splited 64K shadow entries.

v2: fix mask definition.

Signed-off-by: Changbin Du <changbin.du@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gtt.c
drivers/gpu/drm/i915/gvt/gtt.h

index 3dae75b5b574886de03c34563bd77fe3016f303a..34c401fb37d1c5a21302f3eb9fb60dc98e932e31 100644 (file)
@@ -348,6 +348,9 @@ static inline int gtt_set_entry64(void *pt,
 #define ADDR_64K_MASK  GENMASK_ULL(GTT_HAW - 1, 16)
 #define ADDR_4K_MASK   GENMASK_ULL(GTT_HAW - 1, 12)
 
+#define GTT_SPTE_FLAG_MASK GENMASK_ULL(62, 52)
+#define GTT_SPTE_FLAG_64K_SPLITED BIT(52) /* splited 64K gtt entry */
+
 static unsigned long gen8_gtt_get_pfn(struct intel_gvt_gtt_entry *e)
 {
        unsigned long pfn;
@@ -427,6 +430,21 @@ static void gtt_entry_set_present(struct intel_gvt_gtt_entry *e)
        e->val64 |= _PAGE_PRESENT;
 }
 
+static bool gen8_gtt_test_64k_splited(struct intel_gvt_gtt_entry *e)
+{
+       return !!(e->val64 & GTT_SPTE_FLAG_64K_SPLITED);
+}
+
+static void gen8_gtt_set_64k_splited(struct intel_gvt_gtt_entry *e)
+{
+       e->val64 |= GTT_SPTE_FLAG_64K_SPLITED;
+}
+
+static void gen8_gtt_clear_64k_splited(struct intel_gvt_gtt_entry *e)
+{
+       e->val64 &= ~GTT_SPTE_FLAG_64K_SPLITED;
+}
+
 /*
  * Per-platform GMA routines.
  */
@@ -461,6 +479,9 @@ static struct intel_gvt_gtt_pte_ops gen8_gtt_pte_ops = {
        .test_pse = gen8_gtt_test_pse,
        .clear_ips = gen8_gtt_clear_ips,
        .test_ips = gen8_gtt_test_ips,
+       .clear_64k_splited = gen8_gtt_clear_64k_splited,
+       .set_64k_splited = gen8_gtt_set_64k_splited,
+       .test_64k_splited = gen8_gtt_test_64k_splited,
        .get_pfn = gen8_gtt_get_pfn,
        .set_pfn = gen8_gtt_set_pfn,
 };
index c11284bb291b8911a439f77accbd1f2e83e8f8a0..162ef19f4117dfbc76b51095b483586fef9b1f00 100644 (file)
@@ -65,6 +65,9 @@ struct intel_gvt_gtt_pte_ops {
        bool (*test_pse)(struct intel_gvt_gtt_entry *e);
        bool (*test_ips)(struct intel_gvt_gtt_entry *e);
        void (*clear_ips)(struct intel_gvt_gtt_entry *e);
+       bool (*test_64k_splited)(struct intel_gvt_gtt_entry *e);
+       void (*clear_64k_splited)(struct intel_gvt_gtt_entry *e);
+       void (*set_64k_splited)(struct intel_gvt_gtt_entry *e);
        void (*set_pfn)(struct intel_gvt_gtt_entry *e, unsigned long pfn);
        unsigned long (*get_pfn)(struct intel_gvt_gtt_entry *e);
 };