Message ID | 20220915-stolen-v2-3-20ff797de047@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Improvements to stolen memory setup | expand |
On 9/16/22 10:36 AM, Lucas De Marchi wrote: > There is no reason to consider the setup of Data Stolen Memory fatal on > dgfx and non-fatal on integrated. Move the debug and error propagation > around so both have the same behavior: non-fatal. Before this change, > loading i915 on a system with TGL + DG2 would result in just TGL > succeeding the initialization (without stolen). > > Now loading i915 on the same system with an injected failure in > i915_gem_init_stolen(): > > $ dmesg | grep stolen > i915 0000:00:02.0: [drm] Injected failure, disabling use of stolen memory > i915 0000:00:02.0: [drm:init_stolen_smem [i915]] Skip stolen region: failed to setup > i915 0000:03:00.0: [drm] Injected failure, disabling use of stolen memory > i915 0000:03:00.0: [drm:init_stolen_lmem [i915]] Skip stolen region: failed to setup > > Both GPUs are still available: > > $ sudo build/tools/lsgpu > card1 Intel Dg2 (Gen12) drm:/dev/dri/card1 > └─renderD129 drm:/dev/dri/renderD129 > card0 Intel Tigerlake (Gen12) drm:/dev/dri/card0 > └─renderD128 drm:/dev/dri/renderD128 > > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> > Reviewed-by: Wayne Boyer <wayne.boyer@intel.com> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > index 6edf4e374f54..c5a4035c99cd 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c > @@ -494,26 +494,26 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) > drm_notice(&i915->drm, > "%s, disabling use of stolen memory\n", > "iGVT-g active"); > - return 0; > + return -ENOSPC; > } > > if (i915_vtd_active(i915) && GRAPHICS_VER(i915) < 8) { > drm_notice(&i915->drm, > "%s, disabling use of stolen memory\n", > "DMAR active"); > - return 0; > + return -ENOSPC; > } > > if (adjust_stolen(i915, &mem->region)) > - return 0; > + return -ENOSPC; > > if (request_smem_stolen(i915, &mem->region)) > - return 0; > + return -ENOSPC; > > i915->dsm = mem->region; > > if (init_reserved_stolen(i915)) > - return 0; > + return -ENOSPC; > > /* Exclude the reserved region from driver use */ > mem->region.end = i915->dsm_reserved.start - 1; > @@ -527,7 +527,7 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) > (u64)i915->stolen_usable_size >> 10); > > if (i915->stolen_usable_size == 0) > - return 0; > + return -ENOSPC; > > /* Basic memrange allocator for stolen space. */ > drm_mm_init(&i915->mm.stolen, 0, i915->stolen_usable_size); > @@ -765,11 +765,17 @@ i915_gem_object_create_stolen(struct drm_i915_private *i915, > > static int init_stolen_smem(struct intel_memory_region *mem) > { > + int err; > + > /* > * Initialise stolen early so that we may reserve preallocated > * objects for the BIOS to KMS transition. > */ > - return i915_gem_init_stolen(mem); > + err = i915_gem_init_stolen(mem); > + if (err) > + drm_dbg(&mem->i915->drm, "Skip stolen region: failed to setup\n"); > + > + return 0; > } > > static int release_stolen_smem(struct intel_memory_region *mem) > @@ -786,21 +792,25 @@ static const struct intel_memory_region_ops i915_region_stolen_smem_ops = { > > static int init_stolen_lmem(struct intel_memory_region *mem) > { > + struct drm_i915_private *i915 = mem->i915; > int err; > > if (GEM_WARN_ON(resource_size(&mem->region) == 0)) > - return -ENODEV; > + return 0; > > err = i915_gem_init_stolen(mem); > - if (err) > - return err; > + if (err) { > + drm_dbg(&mem->i915->drm, "Skip stolen region: failed to setup\n"); > + return 0; > + } > > - if (mem->io_size && !io_mapping_init_wc(&mem->iomap, > - mem->io_start, > - mem->io_size)) { > - err = -EIO; > + if (mem->io_size && > + !io_mapping_init_wc(&mem->iomap, mem->io_start, mem->io_size)) > goto err_cleanup; > - } > + > + drm_dbg(&i915->drm, "Stolen Local memory IO start: %pa\n", > + &mem->io_start); > + drm_dbg(&i915->drm, "Stolen Local DSM base: %pa\n", &mem->region.start); > > return 0; > > @@ -874,16 +884,6 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type, > if (IS_ERR(mem)) > return mem; > > - /* > - * TODO: consider creating common helper to just print all the > - * interesting stuff from intel_memory_region, which we can use for all > - * our probed regions. > - */ > - > - drm_dbg(&i915->drm, "Stolen Local memory IO start: %pa\n", > - &mem->io_start); > - drm_dbg(&i915->drm, "Stolen Local DSM base: %pa\n", &dsm_base); > - > intel_memory_region_set_name(mem, "stolen-local"); > > mem->private = true; > @@ -908,6 +908,7 @@ i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, > intel_memory_region_set_name(mem, "stolen-system"); > > mem->private = true; > + > return mem; > } > >
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c index 6edf4e374f54..c5a4035c99cd 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c @@ -494,26 +494,26 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) drm_notice(&i915->drm, "%s, disabling use of stolen memory\n", "iGVT-g active"); - return 0; + return -ENOSPC; } if (i915_vtd_active(i915) && GRAPHICS_VER(i915) < 8) { drm_notice(&i915->drm, "%s, disabling use of stolen memory\n", "DMAR active"); - return 0; + return -ENOSPC; } if (adjust_stolen(i915, &mem->region)) - return 0; + return -ENOSPC; if (request_smem_stolen(i915, &mem->region)) - return 0; + return -ENOSPC; i915->dsm = mem->region; if (init_reserved_stolen(i915)) - return 0; + return -ENOSPC; /* Exclude the reserved region from driver use */ mem->region.end = i915->dsm_reserved.start - 1; @@ -527,7 +527,7 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem) (u64)i915->stolen_usable_size >> 10); if (i915->stolen_usable_size == 0) - return 0; + return -ENOSPC; /* Basic memrange allocator for stolen space. */ drm_mm_init(&i915->mm.stolen, 0, i915->stolen_usable_size); @@ -765,11 +765,17 @@ i915_gem_object_create_stolen(struct drm_i915_private *i915, static int init_stolen_smem(struct intel_memory_region *mem) { + int err; + /* * Initialise stolen early so that we may reserve preallocated * objects for the BIOS to KMS transition. */ - return i915_gem_init_stolen(mem); + err = i915_gem_init_stolen(mem); + if (err) + drm_dbg(&mem->i915->drm, "Skip stolen region: failed to setup\n"); + + return 0; } static int release_stolen_smem(struct intel_memory_region *mem) @@ -786,21 +792,25 @@ static const struct intel_memory_region_ops i915_region_stolen_smem_ops = { static int init_stolen_lmem(struct intel_memory_region *mem) { + struct drm_i915_private *i915 = mem->i915; int err; if (GEM_WARN_ON(resource_size(&mem->region) == 0)) - return -ENODEV; + return 0; err = i915_gem_init_stolen(mem); - if (err) - return err; + if (err) { + drm_dbg(&mem->i915->drm, "Skip stolen region: failed to setup\n"); + return 0; + } - if (mem->io_size && !io_mapping_init_wc(&mem->iomap, - mem->io_start, - mem->io_size)) { - err = -EIO; + if (mem->io_size && + !io_mapping_init_wc(&mem->iomap, mem->io_start, mem->io_size)) goto err_cleanup; - } + + drm_dbg(&i915->drm, "Stolen Local memory IO start: %pa\n", + &mem->io_start); + drm_dbg(&i915->drm, "Stolen Local DSM base: %pa\n", &mem->region.start); return 0; @@ -874,16 +884,6 @@ i915_gem_stolen_lmem_setup(struct drm_i915_private *i915, u16 type, if (IS_ERR(mem)) return mem; - /* - * TODO: consider creating common helper to just print all the - * interesting stuff from intel_memory_region, which we can use for all - * our probed regions. - */ - - drm_dbg(&i915->drm, "Stolen Local memory IO start: %pa\n", - &mem->io_start); - drm_dbg(&i915->drm, "Stolen Local DSM base: %pa\n", &dsm_base); - intel_memory_region_set_name(mem, "stolen-local"); mem->private = true; @@ -908,6 +908,7 @@ i915_gem_stolen_smem_setup(struct drm_i915_private *i915, u16 type, intel_memory_region_set_name(mem, "stolen-system"); mem->private = true; + return mem; }
There is no reason to consider the setup of Data Stolen Memory fatal on dgfx and non-fatal on integrated. Move the debug and error propagation around so both have the same behavior: non-fatal. Before this change, loading i915 on a system with TGL + DG2 would result in just TGL succeeding the initialization (without stolen). Now loading i915 on the same system with an injected failure in i915_gem_init_stolen(): $ dmesg | grep stolen i915 0000:00:02.0: [drm] Injected failure, disabling use of stolen memory i915 0000:00:02.0: [drm:init_stolen_smem [i915]] Skip stolen region: failed to setup i915 0000:03:00.0: [drm] Injected failure, disabling use of stolen memory i915 0000:03:00.0: [drm:init_stolen_lmem [i915]] Skip stolen region: failed to setup Both GPUs are still available: $ sudo build/tools/lsgpu card1 Intel Dg2 (Gen12) drm:/dev/dri/card1 └─renderD129 drm:/dev/dri/renderD129 card0 Intel Tigerlake (Gen12) drm:/dev/dri/card0 └─renderD128 drm:/dev/dri/renderD128 Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>