drm/i915/gvt: Add GTT clear_pse operation
authorChangbin Du <changbin.du@intel.com>
Tue, 15 May 2018 02:35:38 +0000 (10:35 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Mon, 9 Jul 2018 02:23:27 +0000 (10:23 +0800)
Add clear_pse operation in case we need to split huge gtt into small pages.

v2: correct description.

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 34c401fb37d1c5a21302f3eb9fb60dc98e932e31..d34dc9ab66e10e37024d7ab922b95077126bdbfb 100644 (file)
@@ -390,6 +390,24 @@ static bool gen8_gtt_test_pse(struct intel_gvt_gtt_entry *e)
        return !!(e->val64 & _PAGE_PSE);
 }
 
+static void gen8_gtt_clear_pse(struct intel_gvt_gtt_entry *e)
+{
+       if (gen8_gtt_test_pse(e)) {
+               switch (e->type) {
+               case GTT_TYPE_PPGTT_PTE_2M_ENTRY:
+                       e->val64 &= ~_PAGE_PSE;
+                       e->type = GTT_TYPE_PPGTT_PDE_ENTRY;
+                       break;
+               case GTT_TYPE_PPGTT_PTE_1G_ENTRY:
+                       e->type = GTT_TYPE_PPGTT_PDP_ENTRY;
+                       e->val64 &= ~_PAGE_PSE;
+                       break;
+               default:
+                       WARN_ON(1);
+               }
+       }
+}
+
 static bool gen8_gtt_test_ips(struct intel_gvt_gtt_entry *e)
 {
        if (GEM_WARN_ON(e->type != GTT_TYPE_PPGTT_PDE_ENTRY))
@@ -477,6 +495,7 @@ static struct intel_gvt_gtt_pte_ops gen8_gtt_pte_ops = {
        .set_present = gtt_entry_set_present,
        .test_present = gen8_gtt_test_present,
        .test_pse = gen8_gtt_test_pse,
+       .clear_pse = gen8_gtt_clear_pse,
        .clear_ips = gen8_gtt_clear_ips,
        .test_ips = gen8_gtt_test_ips,
        .clear_64k_splited = gen8_gtt_clear_64k_splited,
index 162ef19f4117dfbc76b51095b483586fef9b1f00..b7bf68cc8418007fea2200bd6c09781a8493b1da 100644 (file)
@@ -63,6 +63,7 @@ struct intel_gvt_gtt_pte_ops {
        void (*clear_present)(struct intel_gvt_gtt_entry *e);
        void (*set_present)(struct intel_gvt_gtt_entry *e);
        bool (*test_pse)(struct intel_gvt_gtt_entry *e);
+       void (*clear_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);