drivers/gpu/drm/i915/display/intel_crtc.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/display/intel_crtc.c
Extension
.c
Size
25551 bytes
Lines
905
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

if (crtc->pipe < iter->pipe) {
			list_add_tail(&crtc->pipe_head, &iter->pipe_head);
			return;
		}
	}

	list_add_tail(&crtc->pipe_head, &display->pipe_list);
}

static int __intel_crtc_init(struct intel_display *display, enum pipe pipe)
{
	struct intel_plane *primary, *cursor;
	const struct drm_crtc_funcs *funcs;
	struct intel_crtc *crtc;
	int sprite, ret;

	crtc = intel_crtc_alloc();
	if (IS_ERR(crtc))
		return PTR_ERR(crtc);

	crtc->pipe = pipe;
	crtc->num_scalers = DISPLAY_RUNTIME_INFO(display)->num_scalers[pipe];

	if (DISPLAY_VER(display) >= 9)
		primary = skl_universal_plane_create(display, pipe, PLANE_1);
	else
		primary = intel_primary_plane_create(display, pipe);
	if (IS_ERR(primary)) {
		ret = PTR_ERR(primary);
		goto fail;
	}
	crtc->plane_ids_mask |= BIT(primary->id);

	intel_init_fifo_underrun_reporting(display, crtc, false);

	for_each_sprite(display, pipe, sprite) {
		struct intel_plane *plane;

		if (DISPLAY_VER(display) >= 9)
			plane = skl_universal_plane_create(display, pipe, PLANE_2 + sprite);
		else
			plane = intel_sprite_plane_create(display, pipe, sprite);
		if (IS_ERR(plane)) {
			ret = PTR_ERR(plane);
			goto fail;
		}
		crtc->plane_ids_mask |= BIT(plane->id);
	}

	cursor = intel_cursor_plane_create(display, pipe);
	if (IS_ERR(cursor)) {
		ret = PTR_ERR(cursor);
		goto fail;
	}
	crtc->plane_ids_mask |= BIT(cursor->id);

	if (HAS_GMCH(display)) {
		if (display->platform.cherryview ||
		    display->platform.valleyview ||
		    display->platform.g4x)
			funcs = &g4x_crtc_funcs;
		else if (DISPLAY_VER(display) == 4)
			funcs = &i965_crtc_funcs;
		else if (display->platform.i945gm ||
			 display->platform.i915gm)
			funcs = &i915gm_crtc_funcs;
		else if (DISPLAY_VER(display) == 3)
			funcs = &i915_crtc_funcs;
		else
			funcs = &i8xx_crtc_funcs;
	} else {
		if (DISPLAY_VER(display) >= 8)
			funcs = &bdw_crtc_funcs;
		else
			funcs = &ilk_crtc_funcs;
	}

	ret = drm_crtc_init_with_planes(display->drm, &crtc->base,
					&primary->base, &cursor->base,
					funcs, "pipe %c", pipe_name(pipe));
	if (ret)
		goto fail;

	if (DISPLAY_VER(display) >= 11)
		drm_crtc_create_scaling_filter_property(&crtc->base,
						BIT(DRM_SCALING_FILTER_DEFAULT) |
						BIT(DRM_SCALING_FILTER_NEAREST_NEIGHBOR));

	if (DISPLAY_VER(display) >= 9)
		drm_crtc_attach_background_color_property(&crtc->base);

Annotation

Implementation Notes