Merge drm/drm-next into drm-misc-next
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / gem / i915_gem_object.c
index 7cab89618badafa9e48e13bbe4d9bbc7ffc97435..6b8710ba8ded80ddd425ca955988def5f23faedd 100644 (file)
@@ -238,7 +238,7 @@ static void __i915_gem_object_free_mmaps(struct drm_i915_gem_object *obj)
 {
        /* Skip serialisation and waking the device if known to be not used. */
 
-       if (obj->userfault_count)
+       if (obj->userfault_count && !IS_DGFX(to_i915(obj->base.dev)))
                i915_gem_object_release_mmap_gtt(obj);
 
        if (!RB_EMPTY_ROOT(&obj->mmo.offsets)) {
@@ -666,6 +666,41 @@ bool i915_gem_object_can_migrate(struct drm_i915_gem_object *obj,
 int i915_gem_object_migrate(struct drm_i915_gem_object *obj,
                            struct i915_gem_ww_ctx *ww,
                            enum intel_region_id id)
+{
+       return __i915_gem_object_migrate(obj, ww, id, obj->flags);
+}
+
+/**
+ * __i915_gem_object_migrate - Migrate an object to the desired region id, with
+ * control of the extra flags
+ * @obj: The object to migrate.
+ * @ww: An optional struct i915_gem_ww_ctx. If NULL, the backend may
+ * not be successful in evicting other objects to make room for this object.
+ * @id: The region id to migrate to.
+ * @flags: The object flags. Normally just obj->flags.
+ *
+ * Attempt to migrate the object to the desired memory region. The
+ * object backend must support migration and the object may not be
+ * pinned, (explicitly pinned pages or pinned vmas). The object must
+ * be locked.
+ * On successful completion, the object will have pages pointing to
+ * memory in the new region, but an async migration task may not have
+ * completed yet, and to accomplish that, i915_gem_object_wait_migration()
+ * must be called.
+ *
+ * Note: the @ww parameter is not used yet, but included to make sure
+ * callers put some effort into obtaining a valid ww ctx if one is
+ * available.
+ *
+ * Return: 0 on success. Negative error code on failure. In particular may
+ * return -ENXIO on lack of region space, -EDEADLK for deadlock avoidance
+ * if @ww is set, -EINTR or -ERESTARTSYS if signal pending, and
+ * -EBUSY if the object is pinned.
+ */
+int __i915_gem_object_migrate(struct drm_i915_gem_object *obj,
+                             struct i915_gem_ww_ctx *ww,
+                             enum intel_region_id id,
+                             unsigned int flags)
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
        struct intel_memory_region *mr;
@@ -686,7 +721,7 @@ int i915_gem_object_migrate(struct drm_i915_gem_object *obj,
                return 0;
        }
 
-       return obj->ops->migrate(obj, mr);
+       return obj->ops->migrate(obj, mr, flags);
 }
 
 /**