drivers/gpu/drm/i915/intel_memory_region.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/intel_memory_region.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/intel_memory_region.c
Extension
.c
Size
9886 bytes
Lines
431
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (type) {
		case INTEL_MEMORY_SYSTEM:
			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);
			if (!IS_ERR(mem))
				i915->mm.stolen_region = mem;
			break;
		case INTEL_MEMORY_STOLEN_SYSTEM:
			mem = i915_gem_stolen_smem_setup(i915, type, instance);
			if (!IS_ERR(mem))
				i915->mm.stolen_region = mem;
			break;
		default:
			continue;
		}

		if (IS_ERR(mem)) {
			err = PTR_ERR(mem);
			drm_err(&i915->drm,
				"Failed to setup region(%d) type=%d\n",
				err, type);
			goto out_cleanup;
		}

		if (mem) { /* Skip on non-fatal errors */
			mem->id = i;
			i915->mm.regions[i] = mem;
		}
	}

	for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
		struct intel_memory_region *mem = i915->mm.regions[i];
		u64 region_size, io_size;

		if (!mem)
			continue;

		region_size = resource_size(&mem->region) >> 20;
		io_size = resource_size(&mem->io) >> 20;

		if (resource_size(&mem->io))
			drm_dbg(&i915->drm, "Memory region(%d): %s: %llu MiB %pR, io: %llu MiB %pR\n",
				mem->id, mem->name, region_size, &mem->region, io_size, &mem->io);
		else
			drm_dbg(&i915->drm, "Memory region(%d): %s: %llu MiB %pR, io: n/a\n",
				mem->id, mem->name, region_size, &mem->region);
	}

	return 0;

out_cleanup:
	intel_memory_regions_driver_release(i915);
	return err;
}

void intel_memory_regions_driver_release(struct drm_i915_private *i915)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
		struct intel_memory_region *region =
			fetch_and_zero(&i915->mm.regions[i]);

		if (region)
			intel_memory_region_destroy(region);
	}
}

#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/intel_memory_region.c"
#include "selftests/mock_region.c"
#endif

Annotation

Implementation Notes