Commit 72405c3d authored by Matthew Auld's avatar Matthew Auld Committed by Chris Wilson

drm/i915: treat stolen as a region

Convert stolen memory over to a region object. Still leaves open the
question with what to do with pre-allocated objects...
Signed-off-by: default avatarMatthew Auld <matthew.auld@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191018090751.28295-3-matthew.auld@intel.com
parent da1184cd
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <drm/drm_mm.h> #include <drm/drm_mm.h>
#include <drm/i915_drm.h> #include <drm/i915_drm.h>
#include "gem/i915_gem_region.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_gem_stolen.h" #include "i915_gem_stolen.h"
...@@ -150,7 +151,7 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv, ...@@ -150,7 +151,7 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
return 0; 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)) if (!drm_mm_initialized(&dev_priv->mm.stolen))
return; return;
...@@ -355,7 +356,7 @@ static void icl_get_stolen_reserved(struct drm_i915_private *i915, ...@@ -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_base, stolen_top;
resource_size_t reserved_total, reserved_size; resource_size_t reserved_total, reserved_size;
...@@ -539,6 +540,9 @@ i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) ...@@ -539,6 +540,9 @@ i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
i915_gem_stolen_remove_node(dev_priv, stolen); i915_gem_stolen_remove_node(dev_priv, stolen);
kfree(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 = { 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 = { ...@@ -548,8 +552,9 @@ static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
}; };
static struct drm_i915_gem_object * static struct drm_i915_gem_object *
_i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, __i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
struct drm_mm_node *stolen) struct drm_mm_node *stolen,
struct intel_memory_region *mem)
{ {
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
unsigned int cache_level; unsigned int cache_level;
...@@ -571,6 +576,9 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, ...@@ -571,6 +576,9 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
if (err) if (err)
goto cleanup; goto cleanup;
if (mem)
i915_gem_object_init_memory_region(obj, mem, 0);
return obj; return obj;
cleanup: cleanup:
...@@ -579,10 +587,12 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, ...@@ -579,10 +587,12 @@ _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
return ERR_PTR(err); return ERR_PTR(err);
} }
struct drm_i915_gem_object * static struct drm_i915_gem_object *
i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, _i915_gem_object_create_stolen(struct intel_memory_region *mem,
resource_size_t size) resource_size_t size,
unsigned int flags)
{ {
struct drm_i915_private *dev_priv = mem->i915;
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct drm_mm_node *stolen; struct drm_mm_node *stolen;
int ret; int ret;
...@@ -603,7 +613,7 @@ i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, ...@@ -603,7 +613,7 @@ i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
goto err_free; 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)) if (IS_ERR(obj))
goto err_remove; goto err_remove;
...@@ -616,6 +626,43 @@ i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, ...@@ -616,6 +626,43 @@ i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
return obj; 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 * struct drm_i915_gem_object *
i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv, i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv,
resource_size_t stolen_offset, resource_size_t stolen_offset,
...@@ -655,7 +702,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv ...@@ -655,7 +702,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
return ERR_PTR(ret); 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)) { if (IS_ERR(obj)) {
DRM_DEBUG_DRIVER("failed to allocate stolen object\n"); DRM_DEBUG_DRIVER("failed to allocate stolen object\n");
i915_gem_stolen_remove_node(dev_priv, stolen); i915_gem_stolen_remove_node(dev_priv, stolen);
......
...@@ -21,8 +21,7 @@ int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv, ...@@ -21,8 +21,7 @@ int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv,
u64 end); u64 end);
void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv, void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
struct drm_mm_node *node); struct drm_mm_node *node);
int i915_gem_init_stolen(struct drm_i915_private *dev_priv); struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915);
void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv);
struct drm_i915_gem_object * struct drm_i915_gem_object *
i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
resource_size_t size); resource_size_t size);
......
...@@ -2748,8 +2748,6 @@ void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915) ...@@ -2748,8 +2748,6 @@ void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915)
{ {
int i; int i;
i915_gem_cleanup_stolen(i915);
for (i = 0; i < INTEL_REGION_UNKNOWN; i++) { for (i = 0; i < INTEL_REGION_UNKNOWN; i++) {
struct intel_memory_region *region = i915->mm.regions[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) ...@@ -2762,15 +2760,6 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915)
{ {
int err, i; 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++) { for (i = 0; i < INTEL_REGION_UNKNOWN; i++) {
struct intel_memory_region *mem = ERR_PTR(-ENODEV); struct intel_memory_region *mem = ERR_PTR(-ENODEV);
u32 type; u32 type;
...@@ -2783,6 +2772,9 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915) ...@@ -2783,6 +2772,9 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915)
case INTEL_MEMORY_SYSTEM: case INTEL_MEMORY_SYSTEM:
mem = i915_gem_shmem_setup(i915); mem = i915_gem_shmem_setup(i915);
break; break;
case INTEL_MEMORY_STOLEN:
mem = i915_gem_stolen_setup(i915);
break;
} }
if (IS_ERR(mem)) { if (IS_ERR(mem)) {
......
...@@ -152,7 +152,7 @@ ...@@ -152,7 +152,7 @@
.page_sizes = I915_GTT_PAGE_SIZE_4K .page_sizes = I915_GTT_PAGE_SIZE_4K
#define GEN_DEFAULT_REGIONS \ #define GEN_DEFAULT_REGIONS \
.memory_regions = REGION_SMEM .memory_regions = REGION_SMEM | REGION_STOLEN
#define I830_FEATURES \ #define I830_FEATURES \
GEN(2), \ GEN(2), \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment