drm/i915: treat stolen as a region
authorMatthew Auld <matthew.auld@intel.com>
Fri, 18 Oct 2019 09:07:51 +0000 (10:07 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 18 Oct 2019 11:41:05 +0000 (12:41 +0100)
Convert stolen memory over to a region object. Still leaves open the
question with what to do with pre-allocated objects...

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191018090751.28295-3-matthew.auld@intel.com
drivers/gpu/drm/i915/gem/i915_gem_stolen.c
drivers/gpu/drm/i915/gem/i915_gem_stolen.h
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_pci.c

index c76260ce13e3911369fac7f1a770008c7c98bce0..57cd8bc2657c008d5514218952fae8fd6e0a4912 100644 (file)
@@ -10,6 +10,7 @@
 #include <drm/drm_mm.h>
 #include <drm/i915_drm.h>
 
+#include "gem/i915_gem_region.h"
 #include "i915_drv.h"
 #include "i915_gem_stolen.h"
 
@@ -150,7 +151,7 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
        return 0;
 }
 
-void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv)
+static void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv)
 {
        if (!drm_mm_initialized(&dev_priv->mm.stolen))
                return;
@@ -355,7 +356,7 @@ static void icl_get_stolen_reserved(struct drm_i915_private *i915,
        }
 }
 
-int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
+static int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
 {
        resource_size_t reserved_base, stolen_top;
        resource_size_t reserved_total, reserved_size;
@@ -539,6 +540,9 @@ i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
 
        i915_gem_stolen_remove_node(dev_priv, stolen);
        kfree(stolen);
+
+       if (obj->mm.region)
+               i915_gem_object_release_memory_region(obj);
 }
 
 static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
@@ -548,8 +552,9 @@ static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
 };
 
 static struct drm_i915_gem_object *
-_i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
-                              struct drm_mm_node *stolen)
+__i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
+                               struct drm_mm_node *stolen,
+                               struct intel_memory_region *mem)
 {
        struct drm_i915_gem_object *obj;
        unsigned int cache_level;
@@ -571,6 +576,9 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
        if (err)
                goto cleanup;
 
+       if (mem)
+               i915_gem_object_init_memory_region(obj, mem, 0);
+
        return obj;
 
 cleanup:
@@ -579,10 +587,12 @@ err:
        return ERR_PTR(err);
 }
 
-struct drm_i915_gem_object *
-i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
-                             resource_size_t size)
+static struct drm_i915_gem_object *
+_i915_gem_object_create_stolen(struct intel_memory_region *mem,
+                              resource_size_t size,
+                              unsigned int flags)
 {
+       struct drm_i915_private *dev_priv = mem->i915;
        struct drm_i915_gem_object *obj;
        struct drm_mm_node *stolen;
        int ret;
@@ -603,7 +613,7 @@ i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
                goto err_free;
        }
 
-       obj = _i915_gem_object_create_stolen(dev_priv, stolen);
+       obj = __i915_gem_object_create_stolen(dev_priv, stolen, mem);
        if (IS_ERR(obj))
                goto err_remove;
 
@@ -616,6 +626,43 @@ err_free:
        return obj;
 }
 
+struct drm_i915_gem_object *
+i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
+                             resource_size_t size)
+{
+       return i915_gem_object_create_region(dev_priv->mm.regions[INTEL_REGION_STOLEN],
+                                            size, I915_BO_ALLOC_CONTIGUOUS);
+}
+
+static int init_stolen(struct intel_memory_region *mem)
+{
+       /*
+        * Initialise stolen early so that we may reserve preallocated
+        * objects for the BIOS to KMS transition.
+        */
+       return i915_gem_init_stolen(mem->i915);
+}
+
+static void release_stolen(struct intel_memory_region *mem)
+{
+       i915_gem_cleanup_stolen(mem->i915);
+}
+
+static const struct intel_memory_region_ops i915_region_stolen_ops = {
+       .init = init_stolen,
+       .release = release_stolen,
+       .create_object = _i915_gem_object_create_stolen,
+};
+
+struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915)
+{
+       return intel_memory_region_create(i915,
+                                         intel_graphics_stolen_res.start,
+                                         resource_size(&intel_graphics_stolen_res),
+                                         PAGE_SIZE, 0,
+                                         &i915_region_stolen_ops);
+}
+
 struct drm_i915_gem_object *
 i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv,
                                               resource_size_t stolen_offset,
@@ -655,7 +702,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
                return ERR_PTR(ret);
        }
 
-       obj = _i915_gem_object_create_stolen(dev_priv, stolen);
+       obj = __i915_gem_object_create_stolen(dev_priv, stolen, NULL);
        if (IS_ERR(obj)) {
                DRM_DEBUG_DRIVER("failed to allocate stolen object\n");
                i915_gem_stolen_remove_node(dev_priv, stolen);
index 2289644d8604b1b94f22468196dd248262d60ed5..c1040627fbf3a2377a7f375f0af09208e16d0c07 100644 (file)
@@ -21,8 +21,7 @@ int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv,
                                         u64 end);
 void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
                                 struct drm_mm_node *node);
-int i915_gem_init_stolen(struct drm_i915_private *dev_priv);
-void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv);
+struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915);
 struct drm_i915_gem_object *
 i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
                              resource_size_t size);
index 263f1cea0b640864002cdb4e5758fc1a92fc3545..0df057838a247cc01f7a64e9788bbfe66ac042cb 100644 (file)
@@ -2748,8 +2748,6 @@ void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915)
 {
        int i;
 
-       i915_gem_cleanup_stolen(i915);
-
        for (i = 0; i < INTEL_REGION_UNKNOWN; i++) {
                struct intel_memory_region *region = i915->mm.regions[i];
 
@@ -2762,15 +2760,6 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915)
 {
        int err, i;
 
-       /*
-        * Initialise stolen early so that we may reserve preallocated
-        * objects for the BIOS to KMS transition.
-        */
-       /* XXX: stolen will become a region at some point */
-       err = i915_gem_init_stolen(i915);
-       if (err)
-               return err;
-
        for (i = 0; i < INTEL_REGION_UNKNOWN; i++) {
                struct intel_memory_region *mem = ERR_PTR(-ENODEV);
                u32 type;
@@ -2783,6 +2772,9 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915)
                case INTEL_MEMORY_SYSTEM:
                        mem = i915_gem_shmem_setup(i915);
                        break;
+               case INTEL_MEMORY_STOLEN:
+                       mem = i915_gem_stolen_setup(i915);
+                       break;
                }
 
                if (IS_ERR(mem)) {
index e55ab27249968c6a46e9ddd474cc9004fb5b6080..f9a3bfe68689237c130c0ed73f1f1b252c0b3d9c 100644 (file)
        .page_sizes = I915_GTT_PAGE_SIZE_4K
 
 #define GEN_DEFAULT_REGIONS \
-       .memory_regions = REGION_SMEM
+       .memory_regions = REGION_SMEM | REGION_STOLEN
 
 #define I830_FEATURES \
        GEN(2), \