---
 include/drm/i915_drm.h    |  3 ++-
 intel/intel_bufmgr.c      | 11 +++++++++++
 intel/intel_bufmgr.h      |  1 +
 intel/intel_bufmgr_gem.c  | 43 +++++++++++++++++++++++++++++++++----------
 intel/intel_bufmgr_priv.h |  8 ++++++++
 5 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h
index ded43b1..426b25c 100644
--- a/include/drm/i915_drm.h
+++ b/include/drm/i915_drm.h
@@ -680,7 +680,8 @@ struct drm_i915_gem_exec_object2 {
 #define EXEC_OBJECT_NEEDS_FENCE (1<<0)
 #define EXEC_OBJECT_NEEDS_GTT  (1<<1)
 #define EXEC_OBJECT_WRITE      (1<<2)
-#define __EXEC_OBJECT_UNKNOWN_FLAGS -(EXEC_OBJECT_WRITE<<1)
+#define EXEC_OBJECT_SUPPORTS_48B_ADDRESS (1<<3)
+#define __EXEC_OBJECT_UNKNOWN_FLAGS -(EXEC_OBJECT_SUPPORTS_48B_ADDRESS<<1)
        __u64 flags;
 
        __u64 rsvd1;
diff --git a/intel/intel_bufmgr.c b/intel/intel_bufmgr.c
index 14ea9f9..97ea6ec 100644
--- a/intel/intel_bufmgr.c
+++ b/intel/intel_bufmgr.c
@@ -261,6 +261,17 @@ drm_intel_bo_get_tiling(drm_intel_bo *bo, uint32_t * 
tiling_mode,
 }
 
 int
+drm_intel_bo_use_full_range(drm_intel_bo *bo, uint32_t enable)
+{
+       if (bo->bufmgr->bo_use_full_range) {
+               bo->bufmgr->bo_use_full_range(bo, enable);
+               return 0;
+       }
+
+       return -ENODEV;
+}
+
+int
 drm_intel_bo_disable_reuse(drm_intel_bo *bo)
 {
        if (bo->bufmgr->bo_disable_reuse)
diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h
index 285919e..2635fa4 100644
--- a/intel/intel_bufmgr.h
+++ b/intel/intel_bufmgr.h
@@ -160,6 +160,7 @@ int drm_intel_bo_get_tiling(drm_intel_bo *bo, uint32_t * 
tiling_mode,
 int drm_intel_bo_flink(drm_intel_bo *bo, uint32_t * name);
 int drm_intel_bo_busy(drm_intel_bo *bo);
 int drm_intel_bo_madvise(drm_intel_bo *bo, int madv);
+int drm_intel_bo_use_full_range(drm_intel_bo *bo, uint32_t enable);
 
 int drm_intel_bo_disable_reuse(drm_intel_bo *bo);
 int drm_intel_bo_is_reusable(drm_intel_bo *bo);
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index 41de396..ef71686 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -237,6 +237,11 @@ struct _drm_intel_bo_gem {
        bool is_userptr;
 
        /**
+        * Whether this buffer can be placed in full (2^48) ppgtt range on gen8+
+        */
+       bool uses_full_range;
+
+       /**
         * Size in bytes of this buffer and its relocation descendents.
         *
         * Used to avoid costly tree walking in
@@ -395,8 +400,8 @@ drm_intel_gem_dump_validation_list(drm_intel_bufmgr_gem 
*bufmgr_gem)
                        drm_intel_bo_gem *target_gem =
                            (drm_intel_bo_gem *) target_bo;
 
-                       DBG("%2d: %d (%s)@0x%08llx -> "
-                           "%d (%s)@0x%08lx + 0x%08x\n",
+                       DBG("%2d: %d (%s)@0x%016llx -> "
+                           "%d (%s)@0x%016lx + 0x%08x\n",
                            i,
                            bo_gem->gem_handle, bo_gem->name,
                            (unsigned long long)bo_gem->relocs[j].offset,
@@ -468,11 +473,15 @@ drm_intel_add_validate_buffer2(drm_intel_bo *bo, int 
need_fence)
        drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr;
        drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo;
        int index;
+       int flags = 0;
+
+       if (need_fence)
+               flags |= EXEC_OBJECT_NEEDS_FENCE;
+       if (bo_gem->uses_full_range)
+               flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
 
        if (bo_gem->validate_index != -1) {
-               if (need_fence)
-                       bufmgr_gem->exec2_objects[bo_gem->validate_index].flags 
|=
-                               EXEC_OBJECT_NEEDS_FENCE;
+               bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |= 
flags;
                return;
        }
 
@@ -501,13 +510,9 @@ drm_intel_add_validate_buffer2(drm_intel_bo *bo, int 
need_fence)
        bufmgr_gem->exec2_objects[index].alignment = bo->align;
        bufmgr_gem->exec2_objects[index].offset = 0;
        bufmgr_gem->exec_bos[index] = bo;
-       bufmgr_gem->exec2_objects[index].flags = 0;
+       bufmgr_gem->exec2_objects[index].flags = flags;
        bufmgr_gem->exec2_objects[index].rsvd1 = 0;
        bufmgr_gem->exec2_objects[index].rsvd2 = 0;
-       if (need_fence) {
-               bufmgr_gem->exec2_objects[index].flags |=
-                       EXEC_OBJECT_NEEDS_FENCE;
-       }
        bufmgr_gem->exec_count++;
 }
 
@@ -780,6 +785,7 @@ retry:
        bo_gem->used_as_reloc_target = false;
        bo_gem->has_error = false;
        bo_gem->reusable = true;
+       bo_gem->uses_full_range = false;
 
        drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, alignment);
 
@@ -926,6 +932,7 @@ drm_intel_gem_bo_alloc_userptr(drm_intel_bufmgr *bufmgr,
        bo_gem->used_as_reloc_target = false;
        bo_gem->has_error = false;
        bo_gem->reusable = false;
+       bo_gem->uses_full_range = false;
 
        drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0);
 
@@ -1081,6 +1088,7 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr 
*bufmgr,
        bo_gem->bo.handle = open_arg.handle;
        bo_gem->global_name = handle;
        bo_gem->reusable = false;
+       bo_gem->uses_full_range = false;
 
        memclear(get_tiling);
        get_tiling.handle = bo_gem->gem_handle;
@@ -2418,6 +2426,13 @@ drm_intel_gem_bo_get_tiling(drm_intel_bo *bo, uint32_t * 
tiling_mode,
        return 0;
 }
 
+static void
+drm_intel_gem_bo_use_full_range(drm_intel_bo *bo, uint32_t enable)
+{
+       drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
+       bo_gem->uses_full_range = enable;
+}
+
 drm_intel_bo *
 drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr *bufmgr, int prime_fd, int 
size)
 {
@@ -2482,6 +2497,7 @@ drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr 
*bufmgr, int prime_fd, int s
        bo_gem->used_as_reloc_target = false;
        bo_gem->has_error = false;
        bo_gem->reusable = false;
+       bo_gem->uses_full_range = false;
 
        DRMINITLISTHEAD(&bo_gem->vma_list);
        DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named);
@@ -3278,6 +3294,13 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)
                }
        }
 
+       if (bufmgr_gem->gen >= 8) {
+               gp.param = I915_PARAM_HAS_ALIASING_PPGTT;
+               ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp);
+               if (ret == 0 && *gp.value == 3)
+                       bufmgr_gem->bufmgr.bo_use_full_range = 
drm_intel_gem_bo_use_full_range;
+       }
+
        /* Let's go with one relocation per every 2 dwords (but round down a bit
         * since a power of two will mean an extra page allocation for the reloc
         * buffer).
diff --git a/intel/intel_bufmgr_priv.h b/intel/intel_bufmgr_priv.h
index 59ebd18..3461d31 100644
--- a/intel/intel_bufmgr_priv.h
+++ b/intel/intel_bufmgr_priv.h
@@ -227,6 +227,14 @@ struct _drm_intel_bufmgr {
                              uint32_t * swizzle_mode);
 
        /**
+        * Indicate that the buffer can be placed in full ppgtt range (2^48)
+        * without restrictions.
+        * \param bo Buffer to set the full_range flag for
+        * \param enable Flag value
+        */
+       void (*bo_use_full_range) (drm_intel_bo *bo, uint32_t enable);
+
+       /**
         * Create a visible name for a buffer which can be used by other apps
         *
         * \param buf Buffer to create a name for
-- 
2.4.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to