drivers/gpu/drm/sysfb/vesadrm.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/sysfb/vesadrm.c
Extension
.c
Size
17919 bytes
Lines
680
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

struct vesadrm_device {
	struct drm_sysfb_device sysfb;

#if defined(CONFIG_X86_32)
	/* VESA Protected Mode interface */
	struct {
		const u8 *PrimaryPalette;
	} pmi;
#endif

	void (*cmap_write)(struct vesadrm_device *vesa, unsigned int index,
			   u16 red, u16 green, u16 blue);

	/* modesetting */
	u32 formats[DRM_SYSFB_PLANE_NFORMATS(1)];
	struct drm_plane primary_plane;
	struct drm_crtc crtc;
	struct drm_encoder encoder;
	struct drm_connector connector;
};

static struct vesadrm_device *to_vesadrm_device(struct drm_device *dev)
{
	return container_of(to_drm_sysfb_device(dev), struct vesadrm_device, sysfb);
}

/*
 * Color LUT
 */

static void vesadrm_vga_cmap_write(struct vesadrm_device *vesa, unsigned int index,
				   u16 red, u16 green, u16 blue)
{
	u8 i8 = index;
	u8 r8 = red >> 8;
	u8 g8 = green >> 8;
	u8 b8 = blue >> 8;

	outb_p(i8, VGA_PEL_IW);
	outb_p(r8, VGA_PEL_D);
	outb_p(g8, VGA_PEL_D);
	outb_p(b8, VGA_PEL_D);
}

#if defined(CONFIG_X86_32)
static void vesadrm_pmi_cmap_write(struct vesadrm_device *vesa, unsigned int index,
				   u16 red, u16 green, u16 blue)
{
	u32 i32 = index;
	struct {
		u8 b8;
		u8 g8;
		u8 r8;
		u8 x8;
	} PaletteEntry = {
		blue >> 8,
		green >> 8,
		red >> 8,
		0x00,
	};

	__asm__ __volatile__ (
		"call *(%%esi)"
		: /* no return value */
		: "a" (0x4f09),
		  "b" (0),
		  "c" (1),
		  "d" (i32),
		  "D" (&PaletteEntry),
		  "S" (&vesa->pmi.PrimaryPalette));
}
#endif

static void vesadrm_set_color_lut(struct drm_crtc *crtc, unsigned int index,
				  u16 red, u16 green, u16 blue)
{
	struct drm_device *dev = crtc->dev;
	struct vesadrm_device *vesa = to_vesadrm_device(dev);
	u8 i8 = index & 0xff;

	if (drm_WARN_ON_ONCE(dev, index != i8))
		return; /* driver bug */

	vesa->cmap_write(vesa, i8, red, green, blue);
}

static void vesadrm_fill_gamma_lut(struct vesadrm_device *vesa,
				   const struct drm_format_info *format)
{
	struct drm_device *dev = &vesa->sysfb.dev;

Annotation

Implementation Notes