drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
Extension
.c
Size
20591 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 ovl_adaptor_comp_match {
	enum mtk_ovl_adaptor_comp_type type;
	enum mtk_ddp_comp_id comp_id;
	int alias_id;
	const struct mtk_ddp_comp_funcs *funcs;
};

struct mtk_disp_ovl_adaptor {
	struct device *ovl_adaptor_comp[OVL_ADAPTOR_ID_MAX];
	struct device *mmsys_dev;
	bool children_bound;
};

static const char * const private_comp_stem[OVL_ADAPTOR_TYPE_NUM] = {
	[OVL_ADAPTOR_TYPE_ETHDR]	= "ethdr",
	[OVL_ADAPTOR_TYPE_MDP_RDMA]	= "vdo1-rdma",
	[OVL_ADAPTOR_TYPE_MERGE]	= "merge",
	[OVL_ADAPTOR_TYPE_PADDING]	= "padding",
};

static const struct mtk_ddp_comp_funcs ethdr = {
	.clk_enable = mtk_ethdr_clk_enable,
	.clk_disable = mtk_ethdr_clk_disable,
	.start = mtk_ethdr_start,
	.stop = mtk_ethdr_stop,
};

static const struct mtk_ddp_comp_funcs merge = {
	.clk_enable = mtk_merge_clk_enable,
	.clk_disable = mtk_merge_clk_disable,
	.mode_valid = mtk_merge_mode_valid,
};

static const struct mtk_ddp_comp_funcs padding = {
	.clk_enable = mtk_padding_clk_enable,
	.clk_disable = mtk_padding_clk_disable,
	.start = mtk_padding_start,
	.stop = mtk_padding_stop,
};

static const struct mtk_ddp_comp_funcs rdma = {
	.power_on = mtk_mdp_rdma_power_on,
	.power_off = mtk_mdp_rdma_power_off,
	.clk_enable = mtk_mdp_rdma_clk_enable,
	.clk_disable = mtk_mdp_rdma_clk_disable,
};

static const struct ovl_adaptor_comp_match comp_matches[OVL_ADAPTOR_ID_MAX] = {
	[OVL_ADAPTOR_ETHDR0] = { OVL_ADAPTOR_TYPE_ETHDR, DDP_COMPONENT_ETHDR_MIXER, 0, &ethdr },
	[OVL_ADAPTOR_MDP_RDMA0] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA0, 0, &rdma },
	[OVL_ADAPTOR_MDP_RDMA1] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA1, 1, &rdma },
	[OVL_ADAPTOR_MDP_RDMA2] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA2, 2, &rdma },
	[OVL_ADAPTOR_MDP_RDMA3] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA3, 3, &rdma },
	[OVL_ADAPTOR_MDP_RDMA4] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA4, 4, &rdma },
	[OVL_ADAPTOR_MDP_RDMA5] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA5, 5, &rdma },
	[OVL_ADAPTOR_MDP_RDMA6] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA6, 6, &rdma },
	[OVL_ADAPTOR_MDP_RDMA7] = { OVL_ADAPTOR_TYPE_MDP_RDMA, DDP_COMPONENT_MDP_RDMA7, 7, &rdma },
	[OVL_ADAPTOR_MERGE0] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE1, 1, &merge },
	[OVL_ADAPTOR_MERGE1] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE2, 2, &merge },
	[OVL_ADAPTOR_MERGE2] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE3, 3, &merge },
	[OVL_ADAPTOR_MERGE3] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE4, 4, &merge },
	[OVL_ADAPTOR_PADDING0] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING0, 0, &padding },
	[OVL_ADAPTOR_PADDING1] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING1, 1, &padding },
	[OVL_ADAPTOR_PADDING2] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING2, 2, &padding },
	[OVL_ADAPTOR_PADDING3] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING3, 3, &padding },
	[OVL_ADAPTOR_PADDING4] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING4, 4, &padding },
	[OVL_ADAPTOR_PADDING5] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING5, 5, &padding },
	[OVL_ADAPTOR_PADDING6] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING6, 6, &padding },
	[OVL_ADAPTOR_PADDING7] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_PADDING7, 7, &padding },
};

void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int idx,
				  struct mtk_plane_state *state,
				  struct cmdq_pkt *cmdq_pkt)
{
	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
	struct mtk_plane_pending_state *pending = &state->pending;
	struct mtk_mdp_rdma_cfg rdma_config = {0};
	struct device *rdma_l;
	struct device *rdma_r;
	struct device *merge;
	struct device *ethdr;
	const struct drm_format_info *fmt_info = drm_format_info(pending->format);
	bool use_dual_pipe = false;
	unsigned int align_width;
	unsigned int l_w = 0;
	unsigned int r_w = 0;

	dev_dbg(dev, "%s+ idx:%d, enable:%d, fmt:0x%x\n", __func__, idx,
		pending->enable, pending->format);

Annotation

Implementation Notes