drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/renesas/rcar-du/rcar_du_vsp.c
Extension
.c
Size
13868 bytes
Lines
554
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 (fourcc) {
		case DRM_FORMAT_ARGB1555:
			fourcc = DRM_FORMAT_XRGB1555;
			break;

		case DRM_FORMAT_ARGB4444:
			fourcc = DRM_FORMAT_XRGB4444;
			break;

		case DRM_FORMAT_ARGB8888:
			fourcc = DRM_FORMAT_XRGB8888;
			break;

		case DRM_FORMAT_ABGR8888:
			fourcc = DRM_FORMAT_XBGR8888;
			break;

		case DRM_FORMAT_BGRA8888:
			fourcc = DRM_FORMAT_BGRX8888;
			break;

		case DRM_FORMAT_RGBA1010102:
			fourcc = DRM_FORMAT_RGBX1010102;
			break;
		}
	}

	return fourcc;
}

static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
{
	struct rcar_du_vsp_plane_state *state =
		to_rcar_vsp_plane_state(plane->plane.state);
	struct rcar_du_crtc *crtc = to_rcar_crtc(state->state.crtc);
	struct drm_framebuffer *fb = plane->plane.state->fb;
	const struct rcar_du_format_info *format;
	struct vsp1_du_atomic_config cfg = {
		.pixelformat = 0,
		.pitch = fb->pitches[0],
		.alpha = state->state.alpha >> 8,
		.zpos = state->state.zpos,
	};
	u32 fourcc = rcar_du_vsp_state_get_format(state);
	unsigned int i;

	cfg.src.left = state->state.src.x1 >> 16;
	cfg.src.top = state->state.src.y1 >> 16;
	cfg.src.width = drm_rect_width(&state->state.src) >> 16;
	cfg.src.height = drm_rect_height(&state->state.src) >> 16;

	cfg.dst.left = state->state.dst.x1;
	cfg.dst.top = state->state.dst.y1;
	cfg.dst.width = drm_rect_width(&state->state.dst);
	cfg.dst.height = drm_rect_height(&state->state.dst);

	for (i = 0; i < state->format->planes; ++i)
		cfg.mem[i] = sg_dma_address(state->sg_tables[i].sgl)
			   + fb->offsets[i];

	format = rcar_du_format_info(fourcc);
	cfg.pixelformat = format->v4l2;

	cfg.premult = state->state.pixel_blend_mode == DRM_MODE_BLEND_PREMULTI;

	vsp1_du_atomic_update(plane->vsp->vsp, crtc->vsp_pipe,
			      plane->index, &cfg);
}

int rcar_du_vsp_map_fb(struct rcar_du_vsp *vsp, struct drm_framebuffer *fb,
		       struct sg_table sg_tables[3])
{
	struct rcar_du_device *rcdu = vsp->dev;
	unsigned int i, j;
	int ret;

	for (i = 0; i < fb->format->num_planes; ++i) {
		struct drm_gem_dma_object *gem = drm_fb_dma_get_gem_obj(fb, i);
		struct sg_table *sgt = &sg_tables[i];

		if (gem->sgt) {
			struct scatterlist *src;
			struct scatterlist *dst;

			/*
			 * If the GEM buffer has a scatter gather table, it has
			 * been imported from a dma-buf and has no physical
			 * address as it might not be physically contiguous.
			 * Copy the original scatter gather table to map it to
			 * the VSP.

Annotation

Implementation Notes