drivers/gpu/drm/i915/gem/i915_gem_create.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/gem/i915_gem_create.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/i915/gem/i915_gem_create.c- Extension
.c- Size
- 12466 bytes
- Lines
- 498
- 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.
- 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.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
drm/drm_fourcc.hdrm/drm_print.hdisplay/intel_display.hgem/i915_gem_ioctls.hgem/i915_gem_lmem.hgem/i915_gem_region.hpxp/intel_pxp.hi915_drv.hi915_gem_create.hi915_trace.hi915_user_extensions.h
Detected Declarations
struct create_extfunction object_max_page_sizefunction object_set_placementsfunction i915_gem_publishfunction __i915_gem_object_create_user_extfunction __i915_gem_object_create_userfunction i915_gem_dumb_createfunction i915_gem_create_ioctlfunction repr_placementsfunction set_placementsfunction ext_set_placementsfunction ext_set_protectedfunction ext_set_patfunction i915_gem_create_ext_ioctl
Annotated Snippet
struct create_ext {
struct drm_i915_private *i915;
struct intel_memory_region *placements[INTEL_REGION_UNKNOWN];
unsigned int n_placements;
unsigned int placement_mask;
unsigned long flags;
unsigned int pat_index;
};
static void repr_placements(char *buf, size_t size,
struct intel_memory_region **placements,
int n_placements)
{
int i;
buf[0] = '\0';
for (i = 0; i < n_placements; i++) {
struct intel_memory_region *mr = placements[i];
int r;
r = snprintf(buf, size, "\n %s -> { class: %d, inst: %d }",
mr->name, mr->type, mr->instance);
if (r >= size)
return;
buf += r;
size -= r;
}
}
static int set_placements(struct drm_i915_gem_create_ext_memory_regions *args,
struct create_ext *ext_data)
{
struct drm_i915_private *i915 = ext_data->i915;
struct drm_i915_gem_memory_class_instance __user *uregions =
u64_to_user_ptr(args->regions);
struct intel_memory_region *placements[INTEL_REGION_UNKNOWN];
u32 mask;
int i, ret = 0;
if (args->pad) {
drm_dbg(&i915->drm, "pad should be zero\n");
ret = -EINVAL;
}
if (!args->num_regions) {
drm_dbg(&i915->drm, "num_regions is zero\n");
ret = -EINVAL;
}
BUILD_BUG_ON(ARRAY_SIZE(i915->mm.regions) != ARRAY_SIZE(placements));
BUILD_BUG_ON(ARRAY_SIZE(ext_data->placements) != ARRAY_SIZE(placements));
if (args->num_regions > ARRAY_SIZE(i915->mm.regions)) {
drm_dbg(&i915->drm, "num_regions is too large\n");
ret = -EINVAL;
}
if (ret)
return ret;
mask = 0;
for (i = 0; i < args->num_regions; i++) {
struct drm_i915_gem_memory_class_instance region;
struct intel_memory_region *mr;
if (copy_from_user(®ion, uregions, sizeof(region)))
return -EFAULT;
mr = intel_memory_region_lookup(i915,
region.memory_class,
region.memory_instance);
if (!mr || mr->private) {
drm_dbg(&i915->drm, "Device is missing region { class: %d, inst: %d } at index = %d\n",
region.memory_class, region.memory_instance, i);
ret = -EINVAL;
goto out_dump;
}
if (mask & BIT(mr->id)) {
drm_dbg(&i915->drm, "Found duplicate placement %s -> { class: %d, inst: %d } at index = %d\n",
mr->name, region.memory_class,
region.memory_instance, i);
ret = -EINVAL;
goto out_dump;
}
placements[i] = mr;
mask |= BIT(mr->id);
Annotation
- Immediate include surface: `drm/drm_fourcc.h`, `drm/drm_print.h`, `display/intel_display.h`, `gem/i915_gem_ioctls.h`, `gem/i915_gem_lmem.h`, `gem/i915_gem_region.h`, `pxp/intel_pxp.h`, `i915_drv.h`.
- Detected declarations: `struct create_ext`, `function object_max_page_size`, `function object_set_placements`, `function i915_gem_publish`, `function __i915_gem_object_create_user_ext`, `function __i915_gem_object_create_user`, `function i915_gem_dumb_create`, `function i915_gem_create_ioctl`, `function repr_placements`, `function set_placements`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.