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