• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2022 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 #pragma once
26 
27 #include <stdint.h>
28 #include <stddef.h>
29 #include <stdbool.h>
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 /***********************************************************************
36  * Note: do *not* add any types which are *not* used for HW programming.
37  * this will ensure separation of Logic layer from HW layer
38  ***********************************************************************/
39 union large_integer {
40     struct {
41         uint32_t low_part;
42         int32_t  high_part;
43     };
44 
45     struct {
46         uint32_t low_part;
47         int32_t  high_part;
48     } u;
49 
50     int64_t quad_part;
51 };
52 
53 #define PHYSICAL_ADDRESS_LOC union large_integer
54 
55 enum vpe_plane_addr_type {
56     VPE_PLN_ADDR_TYPE_GRAPHICS = 0,
57     VPE_PLN_ADDR_TYPE_VIDEO_PROGRESSIVE
58 };
59 
60 struct vpe_plane_address {
61     enum vpe_plane_addr_type type;
62     bool                     tmz_surface;
63     union {
64         struct {
65             PHYSICAL_ADDRESS_LOC addr;
66             PHYSICAL_ADDRESS_LOC meta_addr;
67             union large_integer  dcc_const_color;
68         } grph;
69 
70         /*video  progressive*/
71         struct {
72             PHYSICAL_ADDRESS_LOC luma_addr;
73             PHYSICAL_ADDRESS_LOC luma_meta_addr;
74             union large_integer  luma_dcc_const_color;
75 
76             PHYSICAL_ADDRESS_LOC chroma_addr;
77             PHYSICAL_ADDRESS_LOC chroma_meta_addr;
78             union large_integer  chroma_dcc_const_color;
79         } video_progressive;
80     };
81 };
82 
83 /* Rotation angle */
84 enum vpe_rotation_angle {
85     VPE_ROTATION_ANGLE_0 = 0,
86     VPE_ROTATION_ANGLE_90,
87     VPE_ROTATION_ANGLE_180,
88     VPE_ROTATION_ANGLE_270,
89     VPE_ROTATION_ANGLE_COUNT
90 };
91 
92 /* mirror */
93 enum vpe_mirror {
94     VPE_MIRROR_NONE,
95     VPE_MIRROR_HORIZONTAL,
96     VPE_MIRROR_VERTICAL
97 };
98 
99 enum vpe_scan_direction {
100     VPE_SCAN_DIRECTION_UNKNOWN    = 0,
101     VPE_SCAN_DIRECTION_HORIZONTAL = 1, /* 0, 180 rotation */
102     VPE_SCAN_DIRECTION_VERTICAL   = 2, /* 90, 270 rotation */
103 };
104 
105 struct vpe_size {
106     uint32_t width;
107     uint32_t height;
108 };
109 
110 struct vpe_rect {
111     int32_t  x;
112     int32_t  y;
113     uint32_t width;
114     uint32_t height;
115 };
116 
117 struct vpe_plane_size {
118     struct vpe_rect surface_size;
119     struct vpe_rect chroma_size;
120 
121     // actual aligned pitch and height
122     uint32_t surface_pitch;
123     uint32_t chroma_pitch;
124 
125     uint32_t surface_aligned_height;
126     uint32_t chrome_aligned_height;
127 };
128 
129 struct vpe_plane_dcc_param {
130     bool enable;
131 
132     uint32_t meta_pitch;
133     bool     independent_64b_blks;
134     uint8_t  dcc_ind_blk;
135 
136     uint32_t meta_pitch_c;
137     bool     independent_64b_blks_c;
138     uint8_t  dcc_ind_blk_c;
139 };
140 
141 /** Displayable pixel format in fb */
142 enum vpe_surface_pixel_format {
143     VPE_SURFACE_PIXEL_FORMAT_GRPH_BEGIN = 0,
144     /*16 bpp*/
145     VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB1555,
146     /*16 bpp*/
147     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGB565,
148     /*32 bpp*/
149     VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB8888,
150     /*32 bpp swaped*/
151     VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR8888,
152     /*32 bpp alpha rotated*/
153     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA8888,
154     /*32 bpp swaped & alpha rotated*/
155     VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA8888,
156 
157     VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010,
158     /*swaped*/
159     VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010,
160     /*alpha rotated*/
161     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA1010102,
162     /*swaped & alpha rotated*/
163     VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA1010102,
164 
165     /*64 bpp */
166     VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616,
167     /*float*/
168     VPE_SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F,
169     /*swaped & float*/
170     VPE_SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F,
171     /*alpha rotated*/
172     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBA16161616F,
173     /*swaped & alpha rotated*/
174     VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRA16161616F,
175 
176     VPE_SURFACE_PIXEL_FORMAT_GRPH_XRGB8888,
177     /*swaped*/
178     VPE_SURFACE_PIXEL_FORMAT_GRPH_XBGR8888,
179     /*rotated*/
180     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBX8888,
181     /*swaped & rotated*/
182     VPE_SURFACE_PIXEL_FORMAT_GRPH_BGRX8888,
183     /*grow graphics here if necessary */
184     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGB111110_FIX,
185     VPE_SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FIX,
186     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGB111110_FLOAT,
187     VPE_SURFACE_PIXEL_FORMAT_GRPH_BGR101111_FLOAT,
188     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBE,
189     VPE_SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA,
190     VPE_SURFACE_PIXEL_FORMAT_VIDEO_BEGIN,
191     VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr = VPE_SURFACE_PIXEL_FORMAT_VIDEO_BEGIN,
192     VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb,
193     VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr,
194     VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb,
195     VPE_SURFACE_PIXEL_FORMAT_VIDEO_420_16bpc_YCrCb,
196     VPE_SURFACE_PIXEL_FORMAT_VIDEO_422_CrYCbY,
197     VPE_SURFACE_PIXEL_FORMAT_SUBSAMPLE_END = VPE_SURFACE_PIXEL_FORMAT_VIDEO_422_CrYCbY,
198     VPE_SURFACE_PIXEL_FORMAT_VIDEO_ACrYCb2101010,
199     VPE_SURFACE_PIXEL_FORMAT_VIDEO_CrYCbA1010102,
200     VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCrCb8888,
201     VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCbCr8888,
202     VPE_SURFACE_PIXEL_FORMAT_VIDEO_END = VPE_SURFACE_PIXEL_FORMAT_VIDEO_AYCbCr8888,
203     VPE_SURFACE_PIXEL_FORMAT_INVALID
204 
205     /*grow 444 video here if necessary */
206 };
207 
208 enum vpe_swizzle_mode_values {
209     VPE_SW_LINEAR   = 0,
210     VPE_SW_256B_S   = 1,
211     VPE_SW_256B_D   = 2,
212     VPE_SW_256B_R   = 3,
213     VPE_SW_4KB_Z    = 4,
214     VPE_SW_4KB_S    = 5,
215     VPE_SW_4KB_D    = 6,
216     VPE_SW_4KB_R    = 7,
217     VPE_SW_64KB_Z   = 8,
218     VPE_SW_64KB_S   = 9,
219     VPE_SW_64KB_D   = 10,
220     VPE_SW_64KB_R   = 11,
221     VPE_SW_VAR_Z    = 12,
222     VPE_SW_VAR_S    = 13,
223     VPE_SW_VAR_D    = 14,
224     VPE_SW_VAR_R    = 15,
225     VPE_SW_64KB_Z_T = 16,
226     VPE_SW_64KB_S_T = 17,
227     VPE_SW_64KB_D_T = 18,
228     VPE_SW_64KB_R_T = 19,
229     VPE_SW_4KB_Z_X  = 20,
230     VPE_SW_4KB_S_X  = 21,
231     VPE_SW_4KB_D_X  = 22,
232     VPE_SW_4KB_R_X  = 23,
233     VPE_SW_64KB_Z_X = 24,
234     VPE_SW_64KB_S_X = 25,
235     VPE_SW_64KB_D_X = 26,
236     VPE_SW_64KB_R_X = 27,
237     VPE_SW_VAR_Z_X  = 28,
238     VPE_SW_VAR_S_X  = 29,
239     VPE_SW_VAR_D_X  = 30,
240     VPE_SW_VAR_R_X  = 31,
241     VPE_SW_MAX      = 32,
242     VPE_SW_UNKNOWN  = VPE_SW_MAX
243 };
244 
245 /** specify the number of taps.
246  * if 0 is specified, it will use 4 taps by default */
247 struct vpe_scaling_taps {
248     uint32_t v_taps;
249     uint32_t h_taps;
250     uint32_t v_taps_c;
251     uint32_t h_taps_c;
252 };
253 
254 #ifdef __cplusplus
255 }
256 #endif
257