Commit c40bd3b1 authored by Lucas De Marchi's avatar Lucas De Marchi
Browse files

drm/i915/dgfx: Make failure to setup stolen non-fatal



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

Reviewed-by: default avatarWayne Boyer <wayne.boyer@intel.com>
Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220915-stolen-v2-3-20ff797de047@intel.com
parent 3d99597c
Loading
Loading
Loading
Loading
+26 −25
Original line number Diff line number Diff line
@@ -492,26 +492,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;
@@ -525,7 +525,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);
@@ -763,11 +763,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)
@@ -784,21 +790,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;

@@ -869,16 +879,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;
@@ -903,6 +903,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;
}