1 /* Copyright 2024 Advanced Micro Devices, Inc.
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a
4 * copy of this software and associated documentation files (the "Software"),
5 * to deal in the Software without restriction, including without limitation
6 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7 * and/or sell copies of the Software, and to permit persons to whom the
8 * Software is furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
17 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19 * OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * Authors: AMD
22 *
23 */
24
25 #include "common.h"
26 #include "vpe_priv.h"
27 #include "vpe10_cdc_fe.h"
28 #include "reg_helper.h"
29
30 #define CTX_BASE cdc_fe
31 #define CTX vpe10_cdc_fe
32
33 enum mux_sel {
34 MUX_SEL_ALPHA = 0,
35 MUX_SEL_Y_G = 1,
36 MUX_SEL_CB_B = 2,
37 MUX_SEL_CR_R = 3
38 };
39
40 static struct cdc_fe_funcs cdc_fe_func = {
41 .check_input_format = vpe10_cdc_check_input_format,
42 .program_surface_config = vpe10_cdc_program_surface_config,
43 .program_crossbar_config = vpe10_cdc_program_crossbar_config,
44 .program_viewport = vpe10_cdc_program_viewport,
45 };
46
vpe10_construct_cdc_fe(struct vpe_priv * vpe_priv,struct cdc_fe * cdc_fe)47 void vpe10_construct_cdc_fe(struct vpe_priv *vpe_priv, struct cdc_fe *cdc_fe)
48 {
49 cdc_fe->vpe_priv = vpe_priv;
50 cdc_fe->funcs = &cdc_fe_func;
51 }
52
vpe10_cdc_check_input_format(struct cdc_fe * cdc_fe,enum vpe_surface_pixel_format format)53 bool vpe10_cdc_check_input_format(struct cdc_fe *cdc_fe, enum vpe_surface_pixel_format format)
54 {
55 if (vpe_is_32bit_packed_rgb(format))
56 return true;
57
58 if (format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr ||
59 format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb)
60 return true;
61
62 if (format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr ||
63 format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb)
64 return true;
65
66 return false;
67 }
68
vpe10_cdc_program_surface_config(struct cdc_fe * cdc_fe,enum vpe_surface_pixel_format format,enum vpe_rotation_angle rotation,bool horizontal_mirror,enum vpe_swizzle_mode_values swizzle)69 void vpe10_cdc_program_surface_config(struct cdc_fe *cdc_fe, enum vpe_surface_pixel_format format,
70 enum vpe_rotation_angle rotation, bool horizontal_mirror, enum vpe_swizzle_mode_values swizzle)
71 {
72 uint32_t rotation_angle = 0, surface_linear;
73 uint32_t surf_format = 8;
74
75 PROGRAM_ENTRY();
76
77 /* Program rotation angle and horz mirror - no mirror */
78 if (rotation == VPE_ROTATION_ANGLE_0)
79 rotation_angle = 0;
80 else if (rotation == VPE_ROTATION_ANGLE_90)
81 rotation_angle = 1;
82 else if (rotation == VPE_ROTATION_ANGLE_180)
83 rotation_angle = 2;
84 else if (rotation == VPE_ROTATION_ANGLE_270)
85 rotation_angle = 3;
86
87 if (swizzle == VPE_SW_LINEAR)
88 surface_linear = 1;
89 else
90 surface_linear = 0;
91
92 switch (format) {
93 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB1555:
94 surf_format = 1;
95 break;
96 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGB565:
97 surf_format = 3;
98 break;
99 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
100 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
101 case VPE_SURFACE_PIXEL_FORMAT_GRPH_XRGB8888:
102 case VPE_SURFACE_PIXEL_FORMAT_GRPH_XBGR8888:
103 surf_format = 8;
104 break;
105 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA8888:
106 case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA8888:
107 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBX8888:
108 case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRX8888:
109 surf_format = 9;
110 break;
111 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
112 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
113 surf_format = 10;
114 break;
115 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA1010102:
116 case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA1010102:
117 surf_format = 11;
118 break;
119 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
120 surf_format = 22;
121 break;
122 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F:
123 case VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: /* use crossbar */
124 surf_format = 24;
125 break;
126 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616F:
127 case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F:
128 surf_format = 25;
129 break;
130 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
131 surf_format = 65;
132 break;
133 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb:
134 surf_format = 64;
135 break;
136 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr:
137 surf_format = 67;
138 break;
139 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb:
140 surf_format = 66;
141 break;
142 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCrCb8888:
143 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCbCr8888: // use crossbar
144 surf_format = 12;
145 break;
146 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGB111110_FIX:
147 surf_format = 112;
148 break;
149 case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FIX:
150 surf_format = 113;
151 break;
152 case VPE_SURFACE_PIXEL_FORMAT_VIDEO_ACrYCb2101010:
153 surf_format = 114;
154 break;
155 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGB111110_FLOAT:
156 surf_format = 118;
157 break;
158 case VPE_SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FLOAT:
159 surf_format = 119;
160 break;
161 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBE:
162 case VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA:
163 default:
164 vpe_log("cdc: invalid pixel format %d\n", (int)format);
165 break;
166 }
167
168 REG_SET_4(VPCDC_FE0_SURFACE_CONFIG, 0, SURFACE_PIXEL_FORMAT_FE0, surf_format,
169 ROTATION_ANGLE_FE0, rotation_angle, H_MIRROR_EN_FE0, (unsigned)horizontal_mirror,
170 PIX_SURFACE_LINEAR_FE0, surface_linear);
171 }
172
vpe10_cdc_program_crossbar_config(struct cdc_fe * cdc_fe,enum vpe_surface_pixel_format format)173 void vpe10_cdc_program_crossbar_config(struct cdc_fe *cdc_fe, enum vpe_surface_pixel_format format)
174 {
175 uint32_t alpha_bar = (uint32_t)MUX_SEL_ALPHA;
176 uint32_t green_bar = (uint32_t)MUX_SEL_Y_G;
177 uint32_t red_bar = (uint32_t)MUX_SEL_CR_R;
178 uint32_t blue_bar = (uint32_t)MUX_SEL_CB_B;
179
180 PROGRAM_ENTRY();
181
182 if (format == VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR8888 ||
183 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_XBGR8888 ||
184 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010 ||
185 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F ||
186 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA8888 ||
187 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRX8888 ||
188 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA1010102 ||
189 format == VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F ||
190 format == VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCbCr8888) {
191 red_bar = MUX_SEL_CB_B;
192 blue_bar = MUX_SEL_CR_R;
193 }
194
195 REG_SET_4(VPCDC_FE0_CROSSBAR_CONFIG, 0, CROSSBAR_SRC_ALPHA_FE0, alpha_bar,
196 CROSSBAR_SRC_CR_R_FE0, red_bar, CROSSBAR_SRC_Y_G_FE0, green_bar, CROSSBAR_SRC_CB_B_FE0,
197 blue_bar);
198 }
199
200 /** segment specific */
vpe10_cdc_program_viewport(struct cdc_fe * cdc_fe,const struct vpe_rect * viewport,const struct vpe_rect * viewport_c)201 void vpe10_cdc_program_viewport(
202 struct cdc_fe *cdc_fe, const struct vpe_rect *viewport, const struct vpe_rect *viewport_c)
203 {
204
205 PROGRAM_ENTRY();
206
207 REG_SET_2(VPCDC_FE0_VIEWPORT_START_CONFIG, 0, VIEWPORT_X_START_FE0, viewport->x,
208 VIEWPORT_Y_START_FE0, viewport->y);
209
210 REG_SET_2(VPCDC_FE0_VIEWPORT_DIMENSION_CONFIG, 0, VIEWPORT_WIDTH_FE0, viewport->width,
211 VIEWPORT_HEIGHT_FE0, viewport->height);
212
213 REG_SET_2(VPCDC_FE0_VIEWPORT_START_C_CONFIG, 0, VIEWPORT_X_START_C_FE0, viewport_c->x,
214 VIEWPORT_Y_START_C_FE0, viewport_c->y);
215
216 REG_SET_2(VPCDC_FE0_VIEWPORT_DIMENSION_C_CONFIG, 0, VIEWPORT_WIDTH_C_FE0, viewport_c->width,
217 VIEWPORT_HEIGHT_C_FE0, viewport_c->height);
218 }
219
220