drivers/gpu/drm/sysfb/drm_sysfb_modeset.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/sysfb/drm_sysfb_modeset.c
Extension
.c
Size
18923 bytes
Lines
609
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 (is_listed_fourcc(fourccs_out, fourccs - fourccs_out, fourcc)) {
			continue; /* skip duplicate entries */
		} else if (fourccs == fourccs_end) {
			drm_warn(dev, "Ignoring native format %p4cc\n", &fourcc);
			continue; /* end of available output buffer */
		}

		drm_dbg_kms(dev, "adding native format %p4cc\n", &fourcc);

		*fourccs = fourcc;
		++fourccs;
	}

	/*
	 * The extra formats, emulated by the driver, go second.
	 */

	for (i = 0; (i < extra_nfourccs) && (fourccs < fourccs_end); ++i) {
		u32 fourcc = extra_fourccs[i];

		if (is_listed_fourcc(fourccs_out, fourccs - fourccs_out, fourcc)) {
			continue; /* skip duplicate and native entries */
		} else if (fourccs == fourccs_end) {
			drm_warn(dev, "Ignoring emulated format %p4cc\n", &fourcc);
			continue; /* end of available output buffer */
		}

		drm_dbg_kms(dev, "adding emulated format %p4cc\n", &fourcc);

		*fourccs = fourcc;
		++fourccs;
	}

	return fourccs - fourccs_out;
}
EXPORT_SYMBOL(drm_sysfb_build_fourcc_list);

static void drm_sysfb_plane_state_destroy(struct drm_sysfb_plane_state *sysfb_plane_state)
{
	__drm_gem_destroy_shadow_plane_state(&sysfb_plane_state->base);

	kfree(sysfb_plane_state);
}

static void drm_sysfb_memcpy(struct iosys_map *dst, const unsigned int *dst_pitch,
			     const struct iosys_map *src, const struct drm_framebuffer *fb,
			     const struct drm_rect *clip, struct drm_format_conv_state *state)
{
	drm_fb_memcpy(dst, dst_pitch, src, fb, clip);
}

static drm_sysfb_blit_func drm_sysfb_get_blit_func(u32 dst_format, u32 src_format)
{
	if (src_format == dst_format) {
		return drm_sysfb_memcpy;
	} else if (src_format == DRM_FORMAT_XRGB8888) {
		switch (dst_format) {
		case DRM_FORMAT_RGB565:
			return drm_fb_xrgb8888_to_rgb565;
		case DRM_FORMAT_RGB565 | DRM_FORMAT_BIG_ENDIAN:
			return drm_fb_xrgb8888_to_rgb565be;
		case DRM_FORMAT_XRGB1555:
			return drm_fb_xrgb8888_to_xrgb1555;
		case DRM_FORMAT_ARGB1555:
			return drm_fb_xrgb8888_to_argb1555;
		case DRM_FORMAT_RGBA5551:
			return drm_fb_xrgb8888_to_rgba5551;
		case DRM_FORMAT_RGB888:
			return drm_fb_xrgb8888_to_rgb888;
		case DRM_FORMAT_BGR888:
			return drm_fb_xrgb8888_to_bgr888;
		case DRM_FORMAT_ARGB8888:
			return drm_fb_xrgb8888_to_argb8888;
		case DRM_FORMAT_XBGR8888:
			return drm_fb_xrgb8888_to_xbgr8888;
		case DRM_FORMAT_ABGR8888:
			return drm_fb_xrgb8888_to_abgr8888;
		case DRM_FORMAT_XRGB2101010:
			return drm_fb_xrgb8888_to_xrgb2101010;
		case DRM_FORMAT_ARGB2101010:
			return drm_fb_xrgb8888_to_argb2101010;
		case DRM_FORMAT_BGRX8888:
			return drm_fb_xrgb8888_to_bgrx8888;
		case DRM_FORMAT_RGB332:
			return drm_fb_xrgb8888_to_rgb332;
		}
	}

	return NULL;
}

Annotation

Implementation Notes