On Wed, 2 Jun 2021 at 18:08, Thomas Hellström <thomas.hellstrom@xxxxxxxxxxxxxxx> wrote: > > For discrete, use TTM for both cached and WC system memory. That means > we currently rely on the TTM memory accounting / shrinker. For cached > system memory we should consider remaining shmem-backed, which can be > implemented from our ttm_tt_populate calback. We can then also reuse our > own very elaborate shrinker for that memory. > > Signed-off-by: Thomas Hellström <thomas.hellstrom@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 22 ++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_drv.h | 3 --- > drivers/gpu/drm/i915/intel_memory_region.c | 7 ++++++- > drivers/gpu/drm/i915/intel_memory_region.h | 8 ++++++++ > 4 files changed, 36 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > index 8e1c01168c6d..42e89bf43708 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > @@ -755,3 +755,25 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem, > /* i915 wants -ENXIO when out of memory region space. */ > return (ret == -ENOSPC) ? -ENXIO : ret; > } > + > +static const struct intel_memory_region_ops ttm_system_region_ops = { > + .init_object = __i915_gem_ttm_object_init, > +}; > + > +struct intel_memory_region * > +i915_gem_ttm_system_setup(struct drm_i915_private *i915, > + u16 type, u16 instance) > +{ > + struct intel_memory_region *mr; > + > + mr = intel_memory_region_create(i915, 0, > + totalram_pages() << PAGE_SHIFT, > + PAGE_SIZE, 0, > + type, instance, > + &ttm_system_region_ops); > + if (IS_ERR_OR_NULL(mr)) region_create can't return NULL. > + return mr; > + > + intel_memory_region_set_name(mr, "system-ttm"); > + return mr; > +} > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 524aaeb0e842..c6cc16ccce36 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -1768,9 +1768,6 @@ void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv); > void i915_gem_init_early(struct drm_i915_private *dev_priv); > void i915_gem_cleanup_early(struct drm_i915_private *dev_priv); > > -struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915, > - u16 type, u16 instance); > - > static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915) > { > /* > diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c > index bd27e897d4d0..a42bb36c2aea 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/intel_memory_region.c > @@ -220,7 +220,12 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915) > instance = intel_region_map[i].instance; > switch (type) { > case INTEL_MEMORY_SYSTEM: > - mem = i915_gem_shmem_setup(i915, type, instance); > + if (IS_DGFX(i915)) > + mem = i915_gem_ttm_system_setup(i915, type, > + instance); > + else > + mem = i915_gem_shmem_setup(i915, type, > + instance); > break; > case INTEL_MEMORY_STOLEN_LOCAL: > mem = i915_gem_stolen_lmem_setup(i915, type, instance); > diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h > index 7b5fa97c0b59..4d084424b55c 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.h > +++ b/drivers/gpu/drm/i915/intel_memory_region.h > @@ -142,4 +142,12 @@ void intel_memory_region_unreserve(struct intel_memory_region *mem); > int intel_memory_region_reserve(struct intel_memory_region *mem, > resource_size_t offset, > resource_size_t size); > + > +struct intel_memory_region * > +i915_gem_ttm_system_setup(struct drm_i915_private *i915, > + u16 type, u16 instance); > +struct intel_memory_region * > +i915_gem_shmem_setup(struct drm_i915_private *i915, > + u16 type, u16 instance); > + > #endif > -- > 2.31.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx