Commit bdce2bea authored by Chris Wilson's avatar Chris Wilson

drm/i915/gem: Replace implicit dev_priv->uncore for stolen init

Pass around the intended intel_uncore for mmio access during stolen
setup, and avoid relying on the implicit magic I915_READ() macros.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191111182143.23479-1-chris@chris-wilson.co.uk
parent 3c7a44bb
...@@ -26,48 +26,49 @@ ...@@ -26,48 +26,49 @@
* for is a boon. * for is a boon.
*/ */
int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv, int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *i915,
struct drm_mm_node *node, u64 size, struct drm_mm_node *node, u64 size,
unsigned alignment, u64 start, u64 end) unsigned alignment, u64 start, u64 end)
{ {
int ret; int ret;
if (!drm_mm_initialized(&dev_priv->mm.stolen)) if (!drm_mm_initialized(&i915->mm.stolen))
return -ENODEV; return -ENODEV;
/* WaSkipStolenMemoryFirstPage:bdw+ */ /* WaSkipStolenMemoryFirstPage:bdw+ */
if (INTEL_GEN(dev_priv) >= 8 && start < 4096) if (INTEL_GEN(i915) >= 8 && start < 4096)
start = 4096; start = 4096;
mutex_lock(&dev_priv->mm.stolen_lock); mutex_lock(&i915->mm.stolen_lock);
ret = drm_mm_insert_node_in_range(&dev_priv->mm.stolen, node, ret = drm_mm_insert_node_in_range(&i915->mm.stolen, node,
size, alignment, 0, size, alignment, 0,
start, end, DRM_MM_INSERT_BEST); start, end, DRM_MM_INSERT_BEST);
mutex_unlock(&dev_priv->mm.stolen_lock); mutex_unlock(&i915->mm.stolen_lock);
return ret; return ret;
} }
int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv, int i915_gem_stolen_insert_node(struct drm_i915_private *i915,
struct drm_mm_node *node, u64 size, struct drm_mm_node *node, u64 size,
unsigned alignment) unsigned alignment)
{ {
return i915_gem_stolen_insert_node_in_range(dev_priv, node, size, return i915_gem_stolen_insert_node_in_range(i915, node, size,
alignment, 0, U64_MAX); alignment, 0, U64_MAX);
} }
void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv, void i915_gem_stolen_remove_node(struct drm_i915_private *i915,
struct drm_mm_node *node) struct drm_mm_node *node)
{ {
mutex_lock(&dev_priv->mm.stolen_lock); mutex_lock(&i915->mm.stolen_lock);
drm_mm_remove_node(node); drm_mm_remove_node(node);
mutex_unlock(&dev_priv->mm.stolen_lock); mutex_unlock(&i915->mm.stolen_lock);
} }
static int i915_adjust_stolen(struct drm_i915_private *dev_priv, static int i915_adjust_stolen(struct drm_i915_private *i915,
struct resource *dsm) struct resource *dsm)
{ {
struct i915_ggtt *ggtt = &dev_priv->ggtt; struct i915_ggtt *ggtt = &i915->ggtt;
struct intel_uncore *uncore = ggtt->vm.gt->uncore;
struct resource *r; struct resource *r;
if (dsm->start == 0 || dsm->end <= dsm->start) if (dsm->start == 0 || dsm->end <= dsm->start)
...@@ -79,14 +80,14 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv, ...@@ -79,14 +80,14 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
*/ */
/* Make sure we don't clobber the GTT if it's within stolen memory */ /* Make sure we don't clobber the GTT if it's within stolen memory */
if (INTEL_GEN(dev_priv) <= 4 && if (INTEL_GEN(i915) <= 4 &&
!IS_G33(dev_priv) && !IS_PINEVIEW(dev_priv) && !IS_G4X(dev_priv)) { !IS_G33(i915) && !IS_PINEVIEW(i915) && !IS_G4X(i915)) {
struct resource stolen[2] = {*dsm, *dsm}; struct resource stolen[2] = {*dsm, *dsm};
struct resource ggtt_res; struct resource ggtt_res;
resource_size_t ggtt_start; resource_size_t ggtt_start;
ggtt_start = I915_READ(PGTBL_CTL); ggtt_start = intel_uncore_read(uncore, PGTBL_CTL);
if (IS_GEN(dev_priv, 4)) if (IS_GEN(i915, 4))
ggtt_start = (ggtt_start & PGTBL_ADDRESS_LO_MASK) | ggtt_start = (ggtt_start & PGTBL_ADDRESS_LO_MASK) |
(ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28; (ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28;
else else
...@@ -120,7 +121,7 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv, ...@@ -120,7 +121,7 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
* kernel. So if the region is already marked as busy, something * kernel. So if the region is already marked as busy, something
* is seriously wrong. * is seriously wrong.
*/ */
r = devm_request_mem_region(dev_priv->drm.dev, dsm->start, r = devm_request_mem_region(i915->drm.dev, dsm->start,
resource_size(dsm), resource_size(dsm),
"Graphics Stolen Memory"); "Graphics Stolen Memory");
if (r == NULL) { if (r == NULL) {
...@@ -133,14 +134,14 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv, ...@@ -133,14 +134,14 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
* reservation starting from 1 instead of 0. * reservation starting from 1 instead of 0.
* There's also BIOS with off-by-one on the other end. * There's also BIOS with off-by-one on the other end.
*/ */
r = devm_request_mem_region(dev_priv->drm.dev, dsm->start + 1, r = devm_request_mem_region(i915->drm.dev, dsm->start + 1,
resource_size(dsm) - 2, resource_size(dsm) - 2,
"Graphics Stolen Memory"); "Graphics Stolen Memory");
/* /*
* GEN3 firmware likes to smash pci bridges into the stolen * GEN3 firmware likes to smash pci bridges into the stolen
* range. Apparently this works. * range. Apparently this works.
*/ */
if (r == NULL && !IS_GEN(dev_priv, 3)) { if (!r && !IS_GEN(i915, 3)) {
DRM_ERROR("conflict detected with stolen region: %pR\n", DRM_ERROR("conflict detected with stolen region: %pR\n",
dsm); dsm);
...@@ -151,25 +152,27 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv, ...@@ -151,25 +152,27 @@ static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
return 0; return 0;
} }
static void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv) static void i915_gem_cleanup_stolen(struct drm_i915_private *i915)
{ {
if (!drm_mm_initialized(&dev_priv->mm.stolen)) if (!drm_mm_initialized(&i915->mm.stolen))
return; return;
drm_mm_takedown(&dev_priv->mm.stolen); drm_mm_takedown(&i915->mm.stolen);
} }
static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, static void g4x_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u32 reg_val = I915_READ(IS_GM45(dev_priv) ? u32 reg_val = intel_uncore_read(uncore,
IS_GM45(i915) ?
CTG_STOLEN_RESERVED : CTG_STOLEN_RESERVED :
ELK_STOLEN_RESERVED); ELK_STOLEN_RESERVED);
resource_size_t stolen_top = dev_priv->dsm.end + 1; resource_size_t stolen_top = i915->dsm.end + 1;
DRM_DEBUG_DRIVER("%s_STOLEN_RESERVED = %08x\n", DRM_DEBUG_DRIVER("%s_STOLEN_RESERVED = %08x\n",
IS_GM45(dev_priv) ? "CTG" : "ELK", reg_val); IS_GM45(i915) ? "CTG" : "ELK", reg_val);
if ((reg_val & G4X_STOLEN_RESERVED_ENABLE) == 0) if ((reg_val & G4X_STOLEN_RESERVED_ENABLE) == 0)
return; return;
...@@ -178,7 +181,7 @@ static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -178,7 +181,7 @@ static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv,
* Whether ILK really reuses the ELK register for this is unclear. * Whether ILK really reuses the ELK register for this is unclear.
* Let's see if we catch anyone with this supposedly enabled on ILK. * Let's see if we catch anyone with this supposedly enabled on ILK.
*/ */
WARN(IS_GEN(dev_priv, 5), "ILK stolen reserved found? 0x%08x\n", WARN(IS_GEN(i915, 5), "ILK stolen reserved found? 0x%08x\n",
reg_val); reg_val);
if (!(reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK)) if (!(reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK))
...@@ -190,11 +193,12 @@ static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -190,11 +193,12 @@ static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv,
*size = stolen_top - *base; *size = stolen_top - *base;
} }
static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv, static void gen6_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u32 reg_val = I915_READ(GEN6_STOLEN_RESERVED); u32 reg_val = intel_uncore_read(uncore, GEN6_STOLEN_RESERVED);
DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val); DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val);
...@@ -222,12 +226,13 @@ static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -222,12 +226,13 @@ static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv,
} }
} }
static void vlv_get_stolen_reserved(struct drm_i915_private *dev_priv, static void vlv_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u32 reg_val = I915_READ(GEN6_STOLEN_RESERVED); u32 reg_val = intel_uncore_read(uncore, GEN6_STOLEN_RESERVED);
resource_size_t stolen_top = dev_priv->dsm.end + 1; resource_size_t stolen_top = i915->dsm.end + 1;
DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val); DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val);
...@@ -250,11 +255,12 @@ static void vlv_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -250,11 +255,12 @@ static void vlv_get_stolen_reserved(struct drm_i915_private *dev_priv,
*base = stolen_top - *size; *base = stolen_top - *size;
} }
static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv, static void gen7_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u32 reg_val = I915_READ(GEN6_STOLEN_RESERVED); u32 reg_val = intel_uncore_read(uncore, GEN6_STOLEN_RESERVED);
DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val); DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val);
...@@ -276,11 +282,12 @@ static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -276,11 +282,12 @@ static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv,
} }
} }
static void chv_get_stolen_reserved(struct drm_i915_private *dev_priv, static void chv_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u32 reg_val = I915_READ(GEN6_STOLEN_RESERVED); u32 reg_val = intel_uncore_read(uncore, GEN6_STOLEN_RESERVED);
DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val); DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val);
...@@ -308,12 +315,13 @@ static void chv_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -308,12 +315,13 @@ static void chv_get_stolen_reserved(struct drm_i915_private *dev_priv,
} }
} }
static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, static void bdw_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u32 reg_val = I915_READ(GEN6_STOLEN_RESERVED); u32 reg_val = intel_uncore_read(uncore, GEN6_STOLEN_RESERVED);
resource_size_t stolen_top = dev_priv->dsm.end + 1; resource_size_t stolen_top = i915->dsm.end + 1;
DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val); DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = %08x\n", reg_val);
...@@ -328,10 +336,11 @@ static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, ...@@ -328,10 +336,11 @@ static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
} }
static void icl_get_stolen_reserved(struct drm_i915_private *i915, static void icl_get_stolen_reserved(struct drm_i915_private *i915,
struct intel_uncore *uncore,
resource_size_t *base, resource_size_t *base,
resource_size_t *size) resource_size_t *size)
{ {
u64 reg_val = intel_uncore_read64(&i915->uncore, GEN6_STOLEN_RESERVED); u64 reg_val = intel_uncore_read64(uncore, GEN6_STOLEN_RESERVED);
DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = 0x%016llx\n", reg_val); DRM_DEBUG_DRIVER("GEN6_STOLEN_RESERVED = 0x%016llx\n", reg_val);
...@@ -356,22 +365,23 @@ static void icl_get_stolen_reserved(struct drm_i915_private *i915, ...@@ -356,22 +365,23 @@ static void icl_get_stolen_reserved(struct drm_i915_private *i915,
} }
} }
static int i915_gem_init_stolen(struct drm_i915_private *dev_priv) static int i915_gem_init_stolen(struct drm_i915_private *i915)
{ {
struct intel_uncore *uncore = &i915->uncore;
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;
mutex_init(&dev_priv->mm.stolen_lock); mutex_init(&i915->mm.stolen_lock);
if (intel_vgpu_active(dev_priv)) { if (intel_vgpu_active(i915)) {
dev_notice(dev_priv->drm.dev, dev_notice(i915->drm.dev,
"%s, disabling use of stolen memory\n", "%s, disabling use of stolen memory\n",
"iGVT-g active"); "iGVT-g active");
return 0; return 0;
} }
if (intel_vtd_active() && INTEL_GEN(dev_priv) < 8) { if (intel_vtd_active() && INTEL_GEN(i915) < 8) {
dev_notice(dev_priv->drm.dev, dev_notice(i915->drm.dev,
"%s, disabling use of stolen memory\n", "%s, disabling use of stolen memory\n",
"DMAR active"); "DMAR active");
return 0; return 0;
...@@ -380,58 +390,59 @@ static int i915_gem_init_stolen(struct drm_i915_private *dev_priv) ...@@ -380,58 +390,59 @@ static int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
if (resource_size(&intel_graphics_stolen_res) == 0) if (resource_size(&intel_graphics_stolen_res) == 0)
return 0; return 0;
dev_priv->dsm = intel_graphics_stolen_res; i915->dsm = intel_graphics_stolen_res;
if (i915_adjust_stolen(dev_priv, &dev_priv->dsm)) if (i915_adjust_stolen(i915, &i915->dsm))
return 0; return 0;
GEM_BUG_ON(dev_priv->dsm.start == 0); GEM_BUG_ON(i915->dsm.start == 0);
GEM_BUG_ON(dev_priv->dsm.end <= dev_priv->dsm.start); GEM_BUG_ON(i915->dsm.end <= i915->dsm.start);
stolen_top = dev_priv->dsm.end + 1; stolen_top = i915->dsm.end + 1;
reserved_base = stolen_top; reserved_base = stolen_top;
reserved_size = 0; reserved_size = 0;
switch (INTEL_GEN(dev_priv)) { switch (INTEL_GEN(i915)) {
case 2: case 2:
case 3: case 3:
break; break;
case 4: case 4:
if (!IS_G4X(dev_priv)) if (!IS_G4X(i915))
break; break;
/* fall through */ /* fall through */
case 5: case 5:
g4x_get_stolen_reserved(dev_priv, g4x_get_stolen_reserved(i915, uncore,
&reserved_base, &reserved_size); &reserved_base, &reserved_size);
break; break;
case 6: case 6:
gen6_get_stolen_reserved(dev_priv, gen6_get_stolen_reserved(i915, uncore,
&reserved_base, &reserved_size); &reserved_base, &reserved_size);
break; break;
case 7: case 7:
if (IS_VALLEYVIEW(dev_priv)) if (IS_VALLEYVIEW(i915))
vlv_get_stolen_reserved(dev_priv, vlv_get_stolen_reserved(i915, uncore,
&reserved_base, &reserved_size); &reserved_base, &reserved_size);
else else
gen7_get_stolen_reserved(dev_priv, gen7_get_stolen_reserved(i915, uncore,
&reserved_base, &reserved_size); &reserved_base, &reserved_size);
break; break;
case 8: case 8:
case 9: case 9:
case 10: case 10:
if (IS_LP(dev_priv)) if (IS_LP(i915))
chv_get_stolen_reserved(dev_priv, chv_get_stolen_reserved(i915, uncore,
&reserved_base, &reserved_size); &reserved_base, &reserved_size);
else else
bdw_get_stolen_reserved(dev_priv, bdw_get_stolen_reserved(i915, uncore,
&reserved_base, &reserved_size); &reserved_base, &reserved_size);
break; break;
default: default:
MISSING_CASE(INTEL_GEN(dev_priv)); MISSING_CASE(INTEL_GEN(i915));
/* fall-through */ /* fall-through */
case 11: case 11:
case 12: case 12:
icl_get_stolen_reserved(dev_priv, &reserved_base, icl_get_stolen_reserved(i915, uncore,
&reserved_base,
&reserved_size); &reserved_size);
break; break;
} }
...@@ -448,12 +459,12 @@ static int i915_gem_init_stolen(struct drm_i915_private *dev_priv) ...@@ -448,12 +459,12 @@ static int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
reserved_size = 0; reserved_size = 0;
} }
dev_priv->dsm_reserved = i915->dsm_reserved =
(struct resource) DEFINE_RES_MEM(reserved_base, reserved_size); (struct resource)DEFINE_RES_MEM(reserved_base, reserved_size);
if (!resource_contains(&dev_priv->dsm, &dev_priv->dsm_reserved)) { if (!resource_contains(&i915->dsm, &i915->dsm_reserved)) {
DRM_ERROR("Stolen reserved area %pR outside stolen memory %pR\n", DRM_ERROR("Stolen reserved area %pR outside stolen memory %pR\n",
&dev_priv->dsm_reserved, &dev_priv->dsm); &i915->dsm_reserved, &i915->dsm);
return 0; return 0;
} }
...@@ -462,14 +473,14 @@ static int i915_gem_init_stolen(struct drm_i915_private *dev_priv) ...@@ -462,14 +473,14 @@ static int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
reserved_total = stolen_top - reserved_base; reserved_total = stolen_top - reserved_base;
DRM_DEBUG_DRIVER("Memory reserved for graphics device: %lluK, usable: %lluK\n", DRM_DEBUG_DRIVER("Memory reserved for graphics device: %lluK, usable: %lluK\n",
(u64)resource_size(&dev_priv->dsm) >> 10, (u64)resource_size(&i915->dsm) >> 10,
((u64)resource_size(&dev_priv->dsm) - reserved_total) >> 10); ((u64)resource_size(&i915->dsm) - reserved_total) >> 10);
dev_priv->stolen_usable_size = i915->stolen_usable_size =
resource_size(&dev_priv->dsm) - reserved_total; resource_size(&i915->dsm) - reserved_total;
/* Basic memrange allocator for stolen space. */ /* Basic memrange allocator for stolen space. */
drm_mm_init(&dev_priv->mm.stolen, 0, dev_priv->stolen_usable_size); drm_mm_init(&i915->mm.stolen, 0, i915->stolen_usable_size);
return 0; return 0;
} }
...@@ -478,11 +489,11 @@ static struct sg_table * ...@@ -478,11 +489,11 @@ static struct sg_table *
i915_pages_create_for_stolen(struct drm_device *dev, i915_pages_create_for_stolen(struct drm_device *dev,
resource_size_t offset, resource_size_t size) resource_size_t offset, resource_size_t size)
{ {
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *i915 = to_i915(dev);
struct sg_table *st; struct sg_table *st;
struct scatterlist *sg; struct scatterlist *sg;
GEM_BUG_ON(range_overflows(offset, size, resource_size(&dev_priv->dsm))); GEM_BUG_ON(range_overflows(offset, size, resource_size(&i915->dsm)));
/* We hide that we have no struct page backing our stolen object /* We hide that we have no struct page backing our stolen object
* by wrapping the contiguous physical allocation with a fake * by wrapping the contiguous physical allocation with a fake
...@@ -502,7 +513,7 @@ i915_pages_create_for_stolen(struct drm_device *dev, ...@@ -502,7 +513,7 @@ i915_pages_create_for_stolen(struct drm_device *dev,
sg->offset = 0; sg->offset = 0;
sg->length = size; sg->length = size;
sg_dma_address(sg) = (dma_addr_t)dev_priv->dsm.start + offset; sg_dma_address(sg) = (dma_addr_t)i915->dsm.start + offset;
sg_dma_len(sg) = size; sg_dma_len(sg) = size;
return st; return st;
...@@ -533,12 +544,12 @@ static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj, ...@@ -533,12 +544,12 @@ static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj,
static void static void
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
{ {
struct drm_i915_private *dev_priv = to_i915(obj->base.dev); struct drm_i915_private *i915 = to_i915(obj->base.dev);
struct drm_mm_node *stolen = fetch_and_zero(&obj->stolen); struct drm_mm_node *stolen = fetch_and_zero(&obj->stolen);
GEM_BUG_ON(!stolen); GEM_BUG_ON(!stolen);
i915_gem_stolen_remove_node(dev_priv, stolen); i915_gem_stolen_remove_node(i915, stolen);
kfree(stolen); kfree(stolen);
if (obj->mm.region) if (obj->mm.region)
...@@ -552,7 +563,7 @@ static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = { ...@@ -552,7 +563,7 @@ 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 *i915,
struct drm_mm_node *stolen, struct drm_mm_node *stolen,
struct intel_memory_region *mem) struct intel_memory_region *mem)
{ {
...@@ -565,12 +576,12 @@ __i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, ...@@ -565,12 +576,12 @@ __i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
if (!obj) if (!obj)
goto err; goto err;
drm_gem_private_object_init(&dev_priv->drm, &obj->base, stolen->size); drm_gem_private_object_init(&i915->drm, &obj->base, stolen->size);
i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class); i915_gem_object_init(obj, &i915_gem_object_stolen_ops, &lock_class);
obj->stolen = stolen; obj->stolen = stolen;
obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT; obj->read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
cache_level = HAS_LLC(dev_priv) ? I915_CACHE_LLC : I915_CACHE_NONE; cache_level = HAS_LLC(i915) ? I915_CACHE_LLC : I915_CACHE_NONE;
i915_gem_object_set_cache_coherency(obj, cache_level); i915_gem_object_set_cache_coherency(obj, cache_level);
err = i915_gem_object_pin_pages(obj); err = i915_gem_object_pin_pages(obj);
...@@ -593,12 +604,12 @@ _i915_gem_object_create_stolen(struct intel_memory_region *mem, ...@@ -593,12 +604,12 @@ _i915_gem_object_create_stolen(struct intel_memory_region *mem,
resource_size_t size, resource_size_t size,
unsigned int flags) unsigned int flags)
{ {
struct drm_i915_private *dev_priv = mem->i915; struct drm_i915_private *i915 = 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;
if (!drm_mm_initialized(&dev_priv->mm.stolen)) if (!drm_mm_initialized(&i915->mm.stolen))
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
if (size == 0) if (size == 0)
...@@ -608,30 +619,30 @@ _i915_gem_object_create_stolen(struct intel_memory_region *mem, ...@@ -608,30 +619,30 @@ _i915_gem_object_create_stolen(struct intel_memory_region *mem,
if (!stolen) if (!stolen)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
ret = i915_gem_stolen_insert_node(dev_priv, stolen, size, 4096); ret = i915_gem_stolen_insert_node(i915, stolen, size, 4096);
if (ret) { if (ret) {
obj = ERR_PTR(ret); obj = ERR_PTR(ret);
goto err_free; goto err_free;
} }
obj = __i915_gem_object_create_stolen(dev_priv, stolen, mem); obj = __i915_gem_object_create_stolen(i915, stolen, mem);
if (IS_ERR(obj)) if (IS_ERR(obj))
goto err_remove; goto err_remove;
return obj; return obj;
err_remove: err_remove:
i915_gem_stolen_remove_node(dev_priv, stolen); i915_gem_stolen_remove_node(i915, stolen);
err_free: err_free:
kfree(stolen); kfree(stolen);
return obj; return obj;
} }
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 *i915,
resource_size_t size) resource_size_t size)
{ {
return i915_gem_object_create_region(dev_priv->mm.regions[INTEL_REGION_STOLEN], return i915_gem_object_create_region(i915->mm.regions[INTEL_REGION_STOLEN],
size, I915_BO_ALLOC_CONTIGUOUS); size, I915_BO_ALLOC_CONTIGUOUS);
} }
...@@ -665,18 +676,18 @@ struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915) ...@@ -665,18 +676,18 @@ struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915)
} }
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 *i915,
resource_size_t stolen_offset, resource_size_t stolen_offset,
resource_size_t gtt_offset, resource_size_t gtt_offset,
resource_size_t size) resource_size_t size)
{ {
struct i915_ggtt *ggtt = &dev_priv->ggtt; struct i915_ggtt *ggtt = &i915->ggtt;
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct drm_mm_node *stolen; struct drm_mm_node *stolen;
struct i915_vma *vma; struct i915_vma *vma;
int ret; int ret;
if (!drm_mm_initialized(&dev_priv->mm.stolen)) if (!drm_mm_initialized(&i915->mm.stolen))
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
DRM_DEBUG_DRIVER("creating preallocated stolen object: stolen_offset=%pa, gtt_offset=%pa, size=%pa\n", DRM_DEBUG_DRIVER("creating preallocated stolen object: stolen_offset=%pa, gtt_offset=%pa, size=%pa\n",
...@@ -694,19 +705,19 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv ...@@ -694,19 +705,19 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
stolen->start = stolen_offset; stolen->start = stolen_offset;
stolen->size = size; stolen->size = size;
mutex_lock(&dev_priv->mm.stolen_lock); mutex_lock(&i915->mm.stolen_lock);
ret = drm_mm_reserve_node(&dev_priv->mm.stolen, stolen); ret = drm_mm_reserve_node(&i915->mm.stolen, stolen);
mutex_unlock(&dev_priv->mm.stolen_lock); mutex_unlock(&i915->mm.stolen_lock);
if (ret) { if (ret) {
DRM_DEBUG_DRIVER("failed to allocate stolen space\n"); DRM_DEBUG_DRIVER("failed to allocate stolen space\n");
kfree(stolen); kfree(stolen);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
obj = __i915_gem_object_create_stolen(dev_priv, stolen, NULL); obj = __i915_gem_object_create_stolen(i915, 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(i915, stolen);
kfree(stolen); kfree(stolen);
return obj; return obj;
} }
......
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