Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / drivers / media / platform / mtk-mdp / mtk_mdp_regs.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2015-2016 MediaTek Inc.
4  * Author: Houlong Wei <houlong.wei@mediatek.com>
5  *         Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
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
19 enum 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         /* Mediatek proprietary format */
25         MDP_COLOR_420_MT21 = MDP_COLORFMT_PACK(5, 2, 1, 1, 1, 256, 1, 0, 12),
26 };
27
28 static 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
48 void 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
58 void 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
68 void 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         /* Set input pixel offset */
74         config->crop_x = frame->crop.left;
75         config->crop_y = frame->crop.top;
76
77         /* Set input cropped size */
78         config->crop_w = frame->crop.width;
79         config->crop_h = frame->crop.height;
80
81         /* Set input original size */
82         config->x = 0;
83         config->y = 0;
84         config->w = frame->width;
85         config->h = frame->height;
86 }
87
88 void 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; /* MDP will calculate it by color format. */
98         config->h_stride = 0; /* MDP will calculate it by color format. */
99
100         for (i = 0; i < src_buf->plane_num; i++)
101                 src_buf->plane_size[i] = frame->payload[i];
102 }
103
104 void 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
119 void 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; /* MDP will calculate it by color format. */
129         config->h_stride = 0; /* MDP will calculate it by color format. */
130         for (i = 0; i < dst_buf->plane_num; i++)
131                 dst_buf->plane_size[i] = frame->payload[i];
132 }
133
134 void 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
143 void 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 }