drivers/gpu/drm/imx/dc/dc-fu.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/imx/dc/dc-fu.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/imx/dc/dc-fu.c
Extension
.c
Size
7028 bytes
Lines
259
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 dc_fu_pixel_format {
	u32 pixel_format;
	u32 bits;
	u32 shifts;
};

static const struct dc_fu_pixel_format pixel_formats[] = {
	{
		DRM_FORMAT_XRGB8888,
		R_BITS(8)   | G_BITS(8)   | B_BITS(8)   | A_BITS(0),
		R_SHIFT(16) | G_SHIFT(8)  | B_SHIFT(0)  | A_SHIFT(0),
	},
};

void dc_fu_get_pixel_format_bits(struct dc_fu *fu, u32 format, u32 *bits)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
		if (pixel_formats[i].pixel_format == format) {
			*bits = pixel_formats[i].bits;
			return;
		}
	}
}

void
dc_fu_get_pixel_format_shifts(struct dc_fu *fu, u32 format, u32 *shifts)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
		if (pixel_formats[i].pixel_format == format) {
			*shifts = pixel_formats[i].shifts;
			return;
		}
	}
}

static inline void dc_fu_enable_shden(struct dc_fu *fu)
{
	regmap_write_bits(fu->reg_cfg, STATICCONTROL, SHDEN, SHDEN);
}

static inline void dc_fu_baddr_autoupdate(struct dc_fu *fu, u8 layer_mask)
{
	regmap_write_bits(fu->reg_cfg, STATICCONTROL,
			  BASEADDRESSAUTOUPDATE_MASK,
			  BASEADDRESSAUTOUPDATE(layer_mask));
}

void dc_fu_shdldreq_sticky(struct dc_fu *fu, u8 layer_mask)
{
	regmap_write_bits(fu->reg_cfg, STATICCONTROL, SHDLDREQSTICKY_MASK,
			  SHDLDREQSTICKY(layer_mask));
}

static inline void dc_fu_set_linemode(struct dc_fu *fu, enum dc_linemode mode)
{
	regmap_write_bits(fu->reg_cfg, BURSTBUFFERMANAGEMENT, LINEMODE_MASK,
			  mode);
}

static inline void dc_fu_set_numbuffers(struct dc_fu *fu, unsigned int num)
{
	regmap_write_bits(fu->reg_cfg, BURSTBUFFERMANAGEMENT,
			  SETNUMBUFFERS_MASK, SETNUMBUFFERS(num));
}

static void dc_fu_set_burstlength(struct dc_fu *fu, dma_addr_t baddr)
{
	unsigned int burst_size, burst_length;

	burst_size = 1 << __ffs(baddr);
	burst_size = round_up(burst_size, 8);
	burst_size = min(burst_size, 128U);
	burst_length = burst_size / 8;

	regmap_write_bits(fu->reg_cfg, BURSTBUFFERMANAGEMENT,
			  SETBURSTLENGTH_MASK, SETBURSTLENGTH(burst_length));
}

static void dc_fu_set_baseaddress(struct dc_fu *fu, enum dc_fu_frac frac,
				  dma_addr_t baddr)
{
	regmap_write(fu->reg_cfg, fu->reg_baseaddr[frac], baddr);
}

void dc_fu_set_src_bpp(struct dc_fu *fu, enum dc_fu_frac frac, unsigned int bpp)
{

Annotation

Implementation Notes