Message ID | 20190809222643.23142-20-matthew.auld@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Introduce memory region concept (including device local memory) | expand |
Quoting Matthew Auld (2019-08-09 23:26:25) > From: Abdiel Janulgue <abdiel.janulgue@linux.intel.com> > > Nothing to enumerate yet... > > Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com> > Signed-off-by: Matthew Auld <matthew.auld@intel.com> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 3 + > drivers/gpu/drm/i915/i915_gem_gtt.c | 70 +++++++++++++++++-- > .../gpu/drm/i915/selftests/mock_gem_device.c | 6 ++ > 3 files changed, 72 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index f7be8cee4709..3d7da69f0d1b 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -2436,6 +2436,9 @@ int __must_check i915_gem_evict_for_node(struct i915_address_space *vm, > unsigned int flags); > int i915_gem_evict_vm(struct i915_address_space *vm); > > +void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915); > +int i915_gem_init_memory_regions(struct drm_i915_private *i915); > + > /* i915_gem_internal.c */ > struct drm_i915_gem_object * > i915_gem_object_create_internal(struct drm_i915_private *dev_priv, > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c > index 83a02e773c58..a1dd3e7e1ad9 100644 > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c Note this is not a GEM file. This is a hardware interface that I haven't renamed due to expected conflicted... > @@ -2713,6 +2713,66 @@ int i915_init_ggtt(struct drm_i915_private *i915) > return 0; > } > > +void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915) > +{ > + int i; > + > + i915_gem_cleanup_stolen(i915); > + > + for (i = 0; i < ARRAY_SIZE(i915->regions); ++i) { > + struct intel_memory_region *region = i915->regions[i]; > + > + if (region) > + intel_memory_region_destroy(region); > + } > +} > + > +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_MEMORY_UKNOWN; i++) { > + struct intel_memory_region *mem = NULL; > + u32 type; > + > + if (!HAS_REGION(i915, BIT(i))) > + continue; > + > + type = MEMORY_TYPE_FROM_REGION(intel_region_map[i]); > + switch (type) { > + default: > + break; > + } > + > + if (IS_ERR(mem)) { > + err = PTR_ERR(mem); > + DRM_ERROR("Failed to setup region(%d) type=%d\n", err, type); > + goto out_cleanup; > + } > + > + mem->id = intel_region_map[i]; > + mem->type = type; > + mem->instance = MEMORY_INSTANCE_FROM_REGION(intel_region_map[i]); > + > + i915->regions[i] = mem; > + } > + > + return 0; > + > +out_cleanup: > + i915_gem_cleanup_memory_regions(i915); > + return err; > +} > + > static void ggtt_cleanup_hw(struct i915_ggtt *ggtt) > { > struct drm_i915_private *i915 = ggtt->vm.i915; > @@ -2754,6 +2814,8 @@ void i915_ggtt_driver_release(struct drm_i915_private *i915) > { > struct pagevec *pvec; > > + i915_gem_cleanup_memory_regions(i915); What are you doing here? Just because ggtt and stolen were related? -Chris
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index f7be8cee4709..3d7da69f0d1b 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2436,6 +2436,9 @@ int __must_check i915_gem_evict_for_node(struct i915_address_space *vm, unsigned int flags); int i915_gem_evict_vm(struct i915_address_space *vm); +void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915); +int i915_gem_init_memory_regions(struct drm_i915_private *i915); + /* i915_gem_internal.c */ struct drm_i915_gem_object * i915_gem_object_create_internal(struct drm_i915_private *dev_priv, diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 83a02e773c58..a1dd3e7e1ad9 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -2713,6 +2713,66 @@ int i915_init_ggtt(struct drm_i915_private *i915) return 0; } +void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915) +{ + int i; + + i915_gem_cleanup_stolen(i915); + + for (i = 0; i < ARRAY_SIZE(i915->regions); ++i) { + struct intel_memory_region *region = i915->regions[i]; + + if (region) + intel_memory_region_destroy(region); + } +} + +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_MEMORY_UKNOWN; i++) { + struct intel_memory_region *mem = NULL; + u32 type; + + if (!HAS_REGION(i915, BIT(i))) + continue; + + type = MEMORY_TYPE_FROM_REGION(intel_region_map[i]); + switch (type) { + default: + break; + } + + if (IS_ERR(mem)) { + err = PTR_ERR(mem); + DRM_ERROR("Failed to setup region(%d) type=%d\n", err, type); + goto out_cleanup; + } + + mem->id = intel_region_map[i]; + mem->type = type; + mem->instance = MEMORY_INSTANCE_FROM_REGION(intel_region_map[i]); + + i915->regions[i] = mem; + } + + return 0; + +out_cleanup: + i915_gem_cleanup_memory_regions(i915); + return err; +} + static void ggtt_cleanup_hw(struct i915_ggtt *ggtt) { struct drm_i915_private *i915 = ggtt->vm.i915; @@ -2754,6 +2814,8 @@ void i915_ggtt_driver_release(struct drm_i915_private *i915) { struct pagevec *pvec; + i915_gem_cleanup_memory_regions(i915); + fini_aliasing_ppgtt(&i915->ggtt); ggtt_cleanup_hw(&i915->ggtt); @@ -2763,8 +2825,6 @@ void i915_ggtt_driver_release(struct drm_i915_private *i915) set_pages_array_wb(pvec->pages, pvec->nr); __pagevec_release(pvec); } - - i915_gem_cleanup_stolen(i915); } static unsigned int gen6_get_total_gtt_size(u16 snb_gmch_ctl) @@ -3204,11 +3264,7 @@ int i915_ggtt_init_hw(struct drm_i915_private *dev_priv) if (ret) return ret; - /* - * Initialise stolen early so that we may reserve preallocated - * objects for the BIOS to KMS transition. - */ - ret = i915_gem_init_stolen(dev_priv); + ret = i915_gem_init_memory_regions(dev_priv); if (ret) goto out_gtt_cleanup; diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c index cc0fe0a79330..c6944e17a2c5 100644 --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c @@ -82,6 +82,8 @@ static void mock_device_release(struct drm_device *dev) i915_gemfs_fini(i915); + i915_gem_cleanup_memory_regions(i915); + drm_mode_config_cleanup(&i915->drm); drm_dev_fini(&i915->drm); @@ -219,6 +221,10 @@ struct drm_i915_private *mock_gem_device(void) WARN_ON(i915_gemfs_init(i915)); + err = i915_gem_init_memory_regions(i915); + if (err) + goto err_context; + return i915; err_context: