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