drivers/gpu/drm/drm_atomic.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/drm_atomic.c
Extension
.c
Size
68376 bytes
Lines
2144
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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 (drm_atomic_commit_init(dev, state) < 0) {
			kfree(state);
			return NULL;
		}
		return state;
	}

	return config->funcs->atomic_state_alloc(dev);
}
EXPORT_SYMBOL(drm_atomic_commit_alloc);

/**
 * drm_atomic_commit_default_clear - clear base atomic state
 * @state: atomic state
 *
 * Default implementation for clearing atomic state.
 * This should only be used by drivers which are still subclassing
 * &drm_atomic_commit and haven't switched to &drm_private_state yet.
 */
void drm_atomic_commit_default_clear(struct drm_atomic_commit *state)
{
	struct drm_device *dev = state->dev;
	struct drm_mode_config *config = &dev->mode_config;
	int i;

	drm_dbg_atomic(dev, "Clearing atomic state %p\n", state);

	state->checked = false;

	for (i = 0; i < state->num_connector; i++) {
		struct drm_connector *connector = state->connectors[i].ptr;

		if (!connector)
			continue;

		connector->funcs->atomic_destroy_state(connector,
						       state->connectors[i].state_to_destroy);
		state->connectors[i].ptr = NULL;
		state->connectors[i].state_to_destroy = NULL;
		state->connectors[i].old_state = NULL;
		state->connectors[i].new_state = NULL;
		drm_connector_put(connector);
	}

	for (i = 0; i < config->num_crtc; i++) {
		struct drm_crtc *crtc = state->crtcs[i].ptr;

		if (!crtc)
			continue;

		crtc->funcs->atomic_destroy_state(crtc,
						  state->crtcs[i].state_to_destroy);

		state->crtcs[i].ptr = NULL;
		state->crtcs[i].state_to_destroy = NULL;
		state->crtcs[i].old_state = NULL;
		state->crtcs[i].new_state = NULL;

		if (state->crtcs[i].commit) {
			drm_crtc_commit_put(state->crtcs[i].commit);
			state->crtcs[i].commit = NULL;
		}
	}

	for (i = 0; i < config->num_total_plane; i++) {
		struct drm_plane *plane = state->planes[i].ptr;

		if (!plane)
			continue;

		plane->funcs->atomic_destroy_state(plane,
						   state->planes[i].state_to_destroy);
		state->planes[i].ptr = NULL;
		state->planes[i].state_to_destroy = NULL;
		state->planes[i].old_state = NULL;
		state->planes[i].new_state = NULL;
	}

	for (i = 0; i < config->num_colorop; i++) {
		struct drm_colorop *colorop = state->colorops[i].ptr;

		if (!colorop)
			continue;

		drm_colorop_atomic_destroy_state(colorop,
						 state->colorops[i].state);
		state->colorops[i].ptr = NULL;
		state->colorops[i].state = NULL;
		state->colorops[i].old_state = NULL;
		state->colorops[i].new_state = NULL;

Annotation

Implementation Notes