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: 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
This commit is contained in:
Родитель
da1184cd41
Коммит
72405c3d78
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -152,7 +152,7 @@
|
|||
.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), \
|
||||
|
|
Загрузка…
Ссылка в новой задаче