1*2023a998SMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0-only
2*2023a998SMauro Carvalho Chehab /*
3*2023a998SMauro Carvalho Chehab  * Copyright (c) 2015-2016 MediaTek Inc.
4*2023a998SMauro Carvalho Chehab  * Author: Houlong Wei <houlong.wei@mediatek.com>
5*2023a998SMauro Carvalho Chehab  *         Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
6*2023a998SMauro Carvalho Chehab  */
7*2023a998SMauro Carvalho Chehab 
8*2023a998SMauro Carvalho Chehab #include <linux/platform_device.h>
9*2023a998SMauro Carvalho Chehab 
10*2023a998SMauro Carvalho Chehab #include "mtk_mdp_core.h"
11*2023a998SMauro Carvalho Chehab #include "mtk_mdp_regs.h"
12*2023a998SMauro Carvalho Chehab 
13*2023a998SMauro Carvalho Chehab 
14*2023a998SMauro Carvalho Chehab #define MDP_COLORFMT_PACK(VIDEO, PLANE, COPLANE, HF, VF, BITS, GROUP, SWAP, ID)\
15*2023a998SMauro Carvalho Chehab 	(((VIDEO) << 27) | ((PLANE) << 24) | ((COPLANE) << 22) |\
16*2023a998SMauro Carvalho Chehab 	((HF) << 20) | ((VF) << 18) | ((BITS) << 8) | ((GROUP) << 6) |\
17*2023a998SMauro Carvalho Chehab 	((SWAP) << 5) | ((ID) << 0))
18*2023a998SMauro Carvalho Chehab 
19*2023a998SMauro Carvalho Chehab enum MDP_COLOR_ENUM {
20*2023a998SMauro Carvalho Chehab 	MDP_COLOR_UNKNOWN = 0,
21*2023a998SMauro Carvalho Chehab 	MDP_COLOR_NV12 = MDP_COLORFMT_PACK(0, 2, 1, 1, 1, 8, 1, 0, 12),
22*2023a998SMauro Carvalho Chehab 	MDP_COLOR_I420 = MDP_COLORFMT_PACK(0, 3, 0, 1, 1, 8, 1, 0, 8),
23*2023a998SMauro Carvalho Chehab 	MDP_COLOR_YV12 = MDP_COLORFMT_PACK(0, 3, 0, 1, 1, 8, 1, 1, 8),
24*2023a998SMauro Carvalho Chehab 	/* Mediatek proprietary format */
25*2023a998SMauro Carvalho Chehab 	MDP_COLOR_420_MT21 = MDP_COLORFMT_PACK(5, 2, 1, 1, 1, 256, 1, 0, 12),
26*2023a998SMauro Carvalho Chehab };
27*2023a998SMauro Carvalho Chehab 
mtk_mdp_map_color_format(int v4l2_format)28*2023a998SMauro Carvalho Chehab static int32_t mtk_mdp_map_color_format(int v4l2_format)
29*2023a998SMauro Carvalho Chehab {
30*2023a998SMauro Carvalho Chehab 	switch (v4l2_format) {
31*2023a998SMauro Carvalho Chehab 	case V4L2_PIX_FMT_NV12M:
32*2023a998SMauro Carvalho Chehab 	case V4L2_PIX_FMT_NV12:
33*2023a998SMauro Carvalho Chehab 		return MDP_COLOR_NV12;
34*2023a998SMauro Carvalho Chehab 	case V4L2_PIX_FMT_MT21C:
35*2023a998SMauro Carvalho Chehab 		return MDP_COLOR_420_MT21;
36*2023a998SMauro Carvalho Chehab 	case V4L2_PIX_FMT_YUV420M:
37*2023a998SMauro Carvalho Chehab 	case V4L2_PIX_FMT_YUV420:
38*2023a998SMauro Carvalho Chehab 		return MDP_COLOR_I420;
39*2023a998SMauro Carvalho Chehab 	case V4L2_PIX_FMT_YVU420:
40*2023a998SMauro Carvalho Chehab 		return MDP_COLOR_YV12;
41*2023a998SMauro Carvalho Chehab 	}
42*2023a998SMauro Carvalho Chehab 
43*2023a998SMauro Carvalho Chehab 	mtk_mdp_err("Unknown format 0x%x", v4l2_format);
44*2023a998SMauro Carvalho Chehab 
45*2023a998SMauro Carvalho Chehab 	return MDP_COLOR_UNKNOWN;
46*2023a998SMauro Carvalho Chehab }
47*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_input_addr(struct mtk_mdp_ctx * ctx,struct mtk_mdp_addr * addr)48*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_input_addr(struct mtk_mdp_ctx *ctx,
49*2023a998SMauro Carvalho Chehab 			       struct mtk_mdp_addr *addr)
50*2023a998SMauro Carvalho Chehab {
51*2023a998SMauro Carvalho Chehab 	struct mdp_buffer *src_buf = &ctx->vpu.vsi->src_buffer;
52*2023a998SMauro Carvalho Chehab 	int i;
53*2023a998SMauro Carvalho Chehab 
54*2023a998SMauro Carvalho Chehab 	for (i = 0; i < ARRAY_SIZE(addr->addr); i++)
55*2023a998SMauro Carvalho Chehab 		src_buf->addr_mva[i] = (uint64_t)addr->addr[i];
56*2023a998SMauro Carvalho Chehab }
57*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_output_addr(struct mtk_mdp_ctx * ctx,struct mtk_mdp_addr * addr)58*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_output_addr(struct mtk_mdp_ctx *ctx,
59*2023a998SMauro Carvalho Chehab 				struct mtk_mdp_addr *addr)
60*2023a998SMauro Carvalho Chehab {
61*2023a998SMauro Carvalho Chehab 	struct mdp_buffer *dst_buf = &ctx->vpu.vsi->dst_buffer;
62*2023a998SMauro Carvalho Chehab 	int i;
63*2023a998SMauro Carvalho Chehab 
64*2023a998SMauro Carvalho Chehab 	for (i = 0; i < ARRAY_SIZE(addr->addr); i++)
65*2023a998SMauro Carvalho Chehab 		dst_buf->addr_mva[i] = (uint64_t)addr->addr[i];
66*2023a998SMauro Carvalho Chehab }
67*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_in_size(struct mtk_mdp_ctx * ctx)68*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_in_size(struct mtk_mdp_ctx *ctx)
69*2023a998SMauro Carvalho Chehab {
70*2023a998SMauro Carvalho Chehab 	struct mtk_mdp_frame *frame = &ctx->s_frame;
71*2023a998SMauro Carvalho Chehab 	struct mdp_config *config = &ctx->vpu.vsi->src_config;
72*2023a998SMauro Carvalho Chehab 
73*2023a998SMauro Carvalho Chehab 	/* Set input pixel offset */
74*2023a998SMauro Carvalho Chehab 	config->crop_x = frame->crop.left;
75*2023a998SMauro Carvalho Chehab 	config->crop_y = frame->crop.top;
76*2023a998SMauro Carvalho Chehab 
77*2023a998SMauro Carvalho Chehab 	/* Set input cropped size */
78*2023a998SMauro Carvalho Chehab 	config->crop_w = frame->crop.width;
79*2023a998SMauro Carvalho Chehab 	config->crop_h = frame->crop.height;
80*2023a998SMauro Carvalho Chehab 
81*2023a998SMauro Carvalho Chehab 	/* Set input original size */
82*2023a998SMauro Carvalho Chehab 	config->x = 0;
83*2023a998SMauro Carvalho Chehab 	config->y = 0;
84*2023a998SMauro Carvalho Chehab 	config->w = frame->width;
85*2023a998SMauro Carvalho Chehab 	config->h = frame->height;
86*2023a998SMauro Carvalho Chehab }
87*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_in_image_format(struct mtk_mdp_ctx * ctx)88*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_in_image_format(struct mtk_mdp_ctx *ctx)
89*2023a998SMauro Carvalho Chehab {
90*2023a998SMauro Carvalho Chehab 	unsigned int i;
91*2023a998SMauro Carvalho Chehab 	struct mtk_mdp_frame *frame = &ctx->s_frame;
92*2023a998SMauro Carvalho Chehab 	struct mdp_config *config = &ctx->vpu.vsi->src_config;
93*2023a998SMauro Carvalho Chehab 	struct mdp_buffer *src_buf = &ctx->vpu.vsi->src_buffer;
94*2023a998SMauro Carvalho Chehab 
95*2023a998SMauro Carvalho Chehab 	src_buf->plane_num = frame->fmt->num_comp;
96*2023a998SMauro Carvalho Chehab 	config->format = mtk_mdp_map_color_format(frame->fmt->pixelformat);
97*2023a998SMauro Carvalho Chehab 	config->w_stride = 0; /* MDP will calculate it by color format. */
98*2023a998SMauro Carvalho Chehab 	config->h_stride = 0; /* MDP will calculate it by color format. */
99*2023a998SMauro Carvalho Chehab 
100*2023a998SMauro Carvalho Chehab 	for (i = 0; i < src_buf->plane_num; i++)
101*2023a998SMauro Carvalho Chehab 		src_buf->plane_size[i] = frame->payload[i];
102*2023a998SMauro Carvalho Chehab }
103*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_out_size(struct mtk_mdp_ctx * ctx)104*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_out_size(struct mtk_mdp_ctx *ctx)
105*2023a998SMauro Carvalho Chehab {
106*2023a998SMauro Carvalho Chehab 	struct mtk_mdp_frame *frame = &ctx->d_frame;
107*2023a998SMauro Carvalho Chehab 	struct mdp_config *config = &ctx->vpu.vsi->dst_config;
108*2023a998SMauro Carvalho Chehab 
109*2023a998SMauro Carvalho Chehab 	config->crop_x = frame->crop.left;
110*2023a998SMauro Carvalho Chehab 	config->crop_y = frame->crop.top;
111*2023a998SMauro Carvalho Chehab 	config->crop_w = frame->crop.width;
112*2023a998SMauro Carvalho Chehab 	config->crop_h = frame->crop.height;
113*2023a998SMauro Carvalho Chehab 	config->x = 0;
114*2023a998SMauro Carvalho Chehab 	config->y = 0;
115*2023a998SMauro Carvalho Chehab 	config->w = frame->width;
116*2023a998SMauro Carvalho Chehab 	config->h = frame->height;
117*2023a998SMauro Carvalho Chehab }
118*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_out_image_format(struct mtk_mdp_ctx * ctx)119*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_out_image_format(struct mtk_mdp_ctx *ctx)
120*2023a998SMauro Carvalho Chehab {
121*2023a998SMauro Carvalho Chehab 	unsigned int i;
122*2023a998SMauro Carvalho Chehab 	struct mtk_mdp_frame *frame = &ctx->d_frame;
123*2023a998SMauro Carvalho Chehab 	struct mdp_config *config = &ctx->vpu.vsi->dst_config;
124*2023a998SMauro Carvalho Chehab 	struct mdp_buffer *dst_buf = &ctx->vpu.vsi->dst_buffer;
125*2023a998SMauro Carvalho Chehab 
126*2023a998SMauro Carvalho Chehab 	dst_buf->plane_num = frame->fmt->num_comp;
127*2023a998SMauro Carvalho Chehab 	config->format = mtk_mdp_map_color_format(frame->fmt->pixelformat);
128*2023a998SMauro Carvalho Chehab 	config->w_stride = 0; /* MDP will calculate it by color format. */
129*2023a998SMauro Carvalho Chehab 	config->h_stride = 0; /* MDP will calculate it by color format. */
130*2023a998SMauro Carvalho Chehab 	for (i = 0; i < dst_buf->plane_num; i++)
131*2023a998SMauro Carvalho Chehab 		dst_buf->plane_size[i] = frame->payload[i];
132*2023a998SMauro Carvalho Chehab }
133*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_rotation(struct mtk_mdp_ctx * ctx)134*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_rotation(struct mtk_mdp_ctx *ctx)
135*2023a998SMauro Carvalho Chehab {
136*2023a998SMauro Carvalho Chehab 	struct mdp_config_misc *misc = &ctx->vpu.vsi->misc;
137*2023a998SMauro Carvalho Chehab 
138*2023a998SMauro Carvalho Chehab 	misc->orientation = ctx->ctrls.rotate->val;
139*2023a998SMauro Carvalho Chehab 	misc->hflip = ctx->ctrls.hflip->val;
140*2023a998SMauro Carvalho Chehab 	misc->vflip = ctx->ctrls.vflip->val;
141*2023a998SMauro Carvalho Chehab }
142*2023a998SMauro Carvalho Chehab 
mtk_mdp_hw_set_global_alpha(struct mtk_mdp_ctx * ctx)143*2023a998SMauro Carvalho Chehab void mtk_mdp_hw_set_global_alpha(struct mtk_mdp_ctx *ctx)
144*2023a998SMauro Carvalho Chehab {
145*2023a998SMauro Carvalho Chehab 	struct mdp_config_misc *misc = &ctx->vpu.vsi->misc;
146*2023a998SMauro Carvalho Chehab 
147*2023a998SMauro Carvalho Chehab 	misc->alpha = ctx->ctrls.global_alpha->val;
148*2023a998SMauro Carvalho Chehab }
149