drivers/gpu/drm/omapdrm/omap_overlay.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/omapdrm/omap_overlay.c
Extension
.c
Size
5625 bytes
Lines
213
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 (!r_ovl) {
			overlay_map[ovl->idx] = NULL;
			*overlay = NULL;
			return -ENOMEM;
		}

		overlay_map[r_ovl->idx] = plane;
		*r_overlay = r_ovl;
	}

	DBG("%s: assign to plane %s caps %x", ovl->name, plane->name, caps);

	if (r_overlay) {
		DBG("%s: assign to right of plane %s caps %x",
		    r_ovl->name, plane->name, caps);
	}

	return 0;
}

/*
 * Release an overlay from a plane if the plane gets not visible or the plane
 * need a new overlay if overlay caps changes.
 * This should be called from the plane atomic_check() in order to prepare the
 * next global overlay_map to be enabled when atomic transaction is valid.
 */
void omap_overlay_release(struct drm_atomic_commit *s, struct omap_hw_overlay *overlay)
{
	/* Get the global state of the current atomic transaction */
	struct omap_global_state *state = omap_get_global_state(s);
	struct drm_plane **overlay_map = state->hwoverlay_to_plane;

	if (!overlay)
		return;

	if (WARN_ON(!overlay_map[overlay->idx]))
		return;

	DBG("%s: release from plane %s", overlay->name, overlay_map[overlay->idx]->name);

	overlay_map[overlay->idx] = NULL;
}

/*
 * Update an overlay state that was attached to a plane before the current atomic state.
 * This should be called from the plane atomic_update() or atomic_disable(),
 * where an overlay association to a plane could have changed between the old and current
 * atomic state.
 */
void omap_overlay_update_state(struct omap_drm_private *priv,
			       struct omap_hw_overlay *overlay)
{
	struct omap_global_state *state = omap_get_existing_global_state(priv);
	struct drm_plane **overlay_map = state->hwoverlay_to_plane;

	/* Check if this overlay is not used anymore, then disable it */
	if (!overlay_map[overlay->idx]) {
		DBG("%s: disabled", overlay->name);

		/* disable the overlay */
		dispc_ovl_enable(priv->dispc, overlay->id, false);
	}
}

static void omap_overlay_destroy(struct omap_hw_overlay *overlay)
{
	kfree(overlay);
}

static struct omap_hw_overlay *omap_overlay_init(enum omap_plane_id overlay_id,
						 enum omap_overlay_caps caps)
{
	struct omap_hw_overlay *overlay;

	overlay = kzalloc_obj(*overlay);
	if (!overlay)
		return ERR_PTR(-ENOMEM);

	overlay->name = overlay_id_to_name[overlay_id];
	overlay->id = overlay_id;
	overlay->caps = caps;

	return overlay;
}

int omap_hwoverlays_init(struct omap_drm_private *priv)
{
	static const enum omap_plane_id hw_plane_ids[] = {
			OMAP_DSS_GFX, OMAP_DSS_VIDEO1,
			OMAP_DSS_VIDEO2, OMAP_DSS_VIDEO3,

Annotation

Implementation Notes