Merge drm/drm-next into drm-intel-gt-next
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / i915 / gem / i915_gem_ttm.c
index b9ae6b0..a878910 100644 (file)
@@ -126,14 +126,22 @@ i915_ttm_select_tt_caching(const struct drm_i915_gem_object *obj)
 static void
 i915_ttm_place_from_region(const struct intel_memory_region *mr,
                           struct ttm_place *place,
+                          resource_size_t offset,
+                          resource_size_t size,
                           unsigned int flags)
 {
        memset(place, 0, sizeof(*place));
        place->mem_type = intel_region_to_ttm_type(mr);
 
+       if (mr->type == INTEL_MEMORY_SYSTEM)
+               return;
+
        if (flags & I915_BO_ALLOC_CONTIGUOUS)
                place->flags |= TTM_PL_FLAG_CONTIGUOUS;
-       if (mr->io_size && mr->io_size < mr->total) {
+       if (offset != I915_BO_INVALID_OFFSET) {
+               place->fpfn = offset >> PAGE_SHIFT;
+               place->lpfn = place->fpfn + (size >> PAGE_SHIFT);
+       } else if (mr->io_size && mr->io_size < mr->total) {
                if (flags & I915_BO_ALLOC_GPU_ONLY) {
                        place->flags |= TTM_PL_FLAG_TOPDOWN;
                } else {
@@ -155,12 +163,14 @@ i915_ttm_placement_from_obj(const struct drm_i915_gem_object *obj,
 
        placement->num_placement = 1;
        i915_ttm_place_from_region(num_allowed ? obj->mm.placements[0] :
-                                  obj->mm.region, requested, flags);
+                                  obj->mm.region, requested, obj->bo_offset,
+                                  obj->base.size, flags);
 
        /* Cache this on object? */
        placement->num_busy_placement = num_allowed;
        for (i = 0; i < placement->num_busy_placement; ++i)
-               i915_ttm_place_from_region(obj->mm.placements[i], busy + i, flags);
+               i915_ttm_place_from_region(obj->mm.placements[i], busy + i,
+                                          obj->bo_offset, obj->base.size, flags);
 
        if (num_allowed == 0) {
                *busy = *requested;
@@ -802,7 +812,8 @@ static int __i915_ttm_migrate(struct drm_i915_gem_object *obj,
        struct ttm_placement placement;
        int ret;
 
-       i915_ttm_place_from_region(mr, &requested, flags);
+       i915_ttm_place_from_region(mr, &requested, obj->bo_offset,
+                                  obj->base.size, flags);
        placement.num_placement = 1;
        placement.num_busy_placement = 1;
        placement.placement = &requested;
@@ -1142,6 +1153,7 @@ void i915_ttm_bo_destroy(struct ttm_buffer_object *bo)
  */
 int __i915_gem_ttm_object_init(struct intel_memory_region *mem,
                               struct drm_i915_gem_object *obj,
+                              resource_size_t offset,
                               resource_size_t size,
                               resource_size_t page_size,
                               unsigned int flags)
@@ -1158,6 +1170,8 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem,
        drm_gem_private_object_init(&i915->drm, &obj->base, size);
        i915_gem_object_init(obj, &i915_gem_ttm_obj_ops, &lock_class, flags);
 
+       obj->bo_offset = offset;
+
        /* Don't put on a region list until we're either locked or fully initialized. */
        obj->mm.region = mem;
        INIT_LIST_HEAD(&obj->mm.region_link);