1 // SPDX-License-Identifier: MIT 2 // 3 // Copyright 2024 Advanced Micro Devices, Inc. 4 5 #ifndef __DML_TOP_DISPLAY_CFG_TYPES_H__ 6 #define __DML_TOP_DISPLAY_CFG_TYPES_H__ 7 8 #include "dml2_external_lib_deps.h" 9 10 #define DML2_MAX_PLANES 8 11 #define DML2_MAX_DCN_PIPES 8 12 #define DML2_MAX_MCACHES 8 // assume plane is going to be supported by a max of 8 mcaches 13 14 enum dml2_swizzle_mode { 15 dml2_sw_linear, 16 dml2_sw_256b_2d, 17 dml2_sw_4kb_2d, 18 dml2_sw_64kb_2d, 19 dml2_sw_256kb_2d, 20 21 dml2_gfx11_sw_linear, 22 dml2_gfx11_sw_64kb_d, 23 dml2_gfx11_sw_64kb_d_t, 24 dml2_gfx11_sw_64kb_d_x, 25 dml2_gfx11_sw_64kb_r_x, 26 dml2_gfx11_sw_256kb_d_x, 27 dml2_gfx11_sw_256kb_r_x 28 }; 29 30 enum dml2_source_format_class { 31 dml2_444_8 = 0, 32 dml2_444_16 = 1, 33 dml2_444_32 = 2, 34 dml2_444_64 = 3, 35 dml2_420_8 = 4, 36 dml2_420_10 = 5, 37 dml2_420_12 = 6, 38 dml2_rgbe_alpha = 9, 39 dml2_rgbe = 10, 40 dml2_mono_8 = 11, 41 dml2_mono_16 = 12 42 }; 43 44 enum dml2_rotation_angle { 45 dml2_rotation_0 = 0, 46 dml2_rotation_90 = 1, 47 dml2_rotation_180 = 2, 48 dml2_rotation_270 = 3 49 }; 50 51 enum dml2_output_format_class { 52 dml2_444 = 0, 53 dml2_s422 = 1, 54 dml2_n422 = 2, 55 dml2_420 = 3 56 }; 57 58 enum dml2_output_encoder_class { 59 dml2_dp = 0, 60 dml2_edp = 1, 61 dml2_dp2p0 = 2, 62 dml2_hdmi = 3, 63 dml2_hdmifrl = 4, 64 dml2_none = 5 65 }; 66 67 enum dml2_output_link_dp_rate { 68 dml2_dp_rate_na = 0, 69 dml2_dp_rate_hbr = 1, 70 dml2_dp_rate_hbr2 = 2, 71 dml2_dp_rate_hbr3 = 3, 72 dml2_dp_rate_uhbr10 = 4, 73 dml2_dp_rate_uhbr13p5 = 5, 74 dml2_dp_rate_uhbr20 = 6 75 }; 76 77 enum dml2_uclk_pstate_change_strategy { 78 dml2_uclk_pstate_change_strategy_auto = 0, 79 dml2_uclk_pstate_change_strategy_force_vactive = 1, 80 dml2_uclk_pstate_change_strategy_force_vblank = 2, 81 dml2_uclk_pstate_change_strategy_force_drr = 3, 82 dml2_uclk_pstate_change_strategy_force_mall_svp = 4, 83 dml2_uclk_pstate_change_strategy_force_mall_full_frame = 5, 84 }; 85 86 enum dml2_svp_mode_override { 87 dml2_svp_mode_override_auto = 0, 88 dml2_svp_mode_override_main_pipe = 1, 89 dml2_svp_mode_override_phantom_pipe = 2, //does not need to be defined explicitly, main overrides result in implicit phantom additions 90 dml2_svp_mode_override_phantom_pipe_no_data_return = 3, 91 dml2_svp_mode_override_imall = 4 92 }; 93 94 enum dml2_refresh_from_mall_mode_override { 95 dml2_refresh_from_mall_mode_override_auto = 0, 96 dml2_refresh_from_mall_mode_override_force_disable = 1, 97 dml2_refresh_from_mall_mode_override_force_enable = 2 98 }; 99 100 enum dml2_odm_mode { 101 dml2_odm_mode_auto = 0, 102 dml2_odm_mode_bypass, 103 dml2_odm_mode_combine_2to1, 104 dml2_odm_mode_combine_3to1, 105 dml2_odm_mode_combine_4to1, 106 dml2_odm_mode_split_1to2, 107 dml2_odm_mode_mso_1to2, 108 dml2_odm_mode_mso_1to4 109 }; 110 111 enum dml2_scaling_transform { 112 dml2_scaling_transform_explicit = 0, 113 dml2_scaling_transform_fullscreen, 114 dml2_scaling_transform_aspect_ratio, 115 dml2_scaling_transform_centered 116 }; 117 118 enum dml2_dsc_enable_option { 119 dml2_dsc_disable = 0, 120 dml2_dsc_enable = 1, 121 dml2_dsc_enable_if_necessary = 2 122 }; 123 124 enum dml2_pstate_support_method { 125 dml2_pstate_method_uninitialized, 126 dml2_pstate_method_not_supported, 127 dml2_pstate_method_vactive, 128 dml2_pstate_method_vblank, 129 dml2_pstate_method_svp, 130 dml2_pstate_method_drr 131 }; 132 133 enum dml2_tdlut_addressing_mode { 134 dml2_tdlut_sw_linear = 0, 135 dml2_tdlut_simple_linear = 1 136 }; 137 138 enum dml2_tdlut_width_mode { 139 dml2_tdlut_width_17_cube = 0, 140 dml2_tdlut_width_33_cube = 1 141 }; 142 143 enum dml2_twait_budgeting_setting { 144 dml2_twait_budgeting_setting_ignore = 0,// Ignore this budget in twait 145 146 dml2_twait_budgeting_setting_if_needed, // Budget for it only if needed 147 //(i.e. UCLK/FCLK DPM cannot be supported in active) 148 149 dml2_twait_budgeting_setting_try, // Budget for it as long as there is an SoC state that 150 // can support it 151 }; 152 153 struct dml2_get_cursor_dlg_reg{ 154 unsigned int cursor_x_position; 155 unsigned int cursor_hotspot_x; 156 unsigned int cursor_primary_offset; 157 unsigned int cursor_secondary_offset; 158 bool cursor_stereo_en; 159 bool cursor_2x_magnify; 160 double hratio; 161 double pixel_rate_mhz; 162 double dlg_refclk_mhz; 163 }; 164 165 /// @brief Surface Parameters 166 struct dml2_surface_cfg { 167 enum dml2_swizzle_mode tiling; 168 169 struct { 170 unsigned long pitch; 171 unsigned long width; 172 unsigned long height; 173 } plane0; 174 175 176 struct { 177 unsigned long pitch; 178 unsigned long width; 179 unsigned long height; 180 } plane1; 181 182 struct { 183 bool enable; 184 struct { 185 unsigned long pitch; 186 } plane0; 187 struct { 188 unsigned long pitch; 189 } plane1; 190 191 struct { 192 double dcc_rate_plane0; 193 double dcc_rate_plane1; 194 double fraction_of_zero_size_request_plane0; 195 double fraction_of_zero_size_request_plane1; 196 } informative; 197 } dcc; 198 }; 199 200 201 struct dml2_composition_cfg { 202 enum dml2_rotation_angle rotation_angle; 203 bool mirrored; 204 enum dml2_scaling_transform scaling_transform; 205 bool rect_out_height_spans_vactive; 206 207 struct { 208 bool stationary; 209 struct { 210 unsigned long width; 211 unsigned long height; 212 unsigned long x_start; 213 unsigned long y_start; 214 } plane0; 215 216 struct { 217 unsigned long width; 218 unsigned long height; 219 unsigned long x_start; 220 unsigned long y_start; 221 } plane1; 222 } viewport; 223 224 struct { 225 bool enabled; 226 struct { 227 double h_ratio; 228 double v_ratio; 229 unsigned int h_taps; 230 unsigned int v_taps; 231 } plane0; 232 233 struct { 234 double h_ratio; 235 double v_ratio; 236 unsigned int h_taps; 237 unsigned int v_taps; 238 } plane1; 239 240 unsigned long rect_out_width; 241 } scaler_info; 242 }; 243 244 struct dml2_timing_cfg { 245 unsigned long h_total; 246 unsigned long v_total; 247 unsigned long h_blank_end; 248 unsigned long v_blank_end; 249 unsigned long h_front_porch; 250 unsigned long v_front_porch; 251 unsigned long h_sync_width; 252 unsigned long pixel_clock_khz; 253 unsigned long h_active; 254 unsigned long v_active; 255 unsigned int bpc; //FIXME: review with Jun 256 struct { 257 enum dml2_dsc_enable_option enable; 258 unsigned int dsc_compressed_bpp_x16; 259 struct { 260 // for dv to specify num dsc slices to use 261 unsigned int num_slices; 262 } overrides; 263 } dsc; 264 bool interlaced; 265 struct { 266 /* static */ 267 bool enabled; 268 unsigned long min_refresh_uhz; 269 unsigned int max_instant_vtotal_delta; 270 /* dynamic */ 271 bool disallowed; 272 bool drr_active_variable; 273 bool drr_active_fixed; 274 } drr_config; 275 unsigned long vblank_nom; 276 }; 277 278 struct dml2_link_output_cfg { 279 enum dml2_output_format_class output_format; 280 enum dml2_output_encoder_class output_encoder; 281 unsigned int output_dp_lane_count; 282 enum dml2_output_link_dp_rate output_dp_link_rate; 283 unsigned long audio_sample_rate; 284 unsigned long audio_sample_layout; 285 bool output_disabled; // The stream does not go to a backend for output to a physical 286 //connector (e.g. writeback only, phantom pipe) goes to writeback 287 bool validate_output; // Do not validate the link configuration for this display stream. 288 }; 289 290 struct dml2_writeback_cfg { 291 bool enable; 292 enum dml2_source_format_class pixel_format; 293 unsigned int active_writebacks_per_surface; 294 295 struct { 296 bool enabled; 297 unsigned long input_width; 298 unsigned long input_height; 299 unsigned long output_width; 300 unsigned long output_height; 301 unsigned long v_taps; 302 unsigned long h_taps; 303 double h_ratio; 304 double v_ratio; 305 } scaling_info; 306 }; 307 308 struct dml2_plane_parameters { 309 unsigned int stream_index; // Identifies which plane will be composed 310 311 enum dml2_source_format_class pixel_format; 312 /* 313 * The surface and composition structures use 314 * the terms plane0 and plane1. These planes 315 * are expected to hold the following data based 316 * on the pixel format. 317 * 318 * RGB or YUV Non-Planar Types: 319 * dml2_444_8 320 * dml2_444_16 321 * dml2_444_32 322 * dml2_444_64 323 * dml2_rgbe 324 * 325 * plane0 = argb or rgbe 326 * plane1 = not used 327 * 328 * YUV Planar-Types: 329 * dml2_420_8 330 * dml2_420_10 331 * dml2_420_12 332 * 333 * plane0 = luma 334 * plane1 = chroma 335 * 336 * RGB Planar Types: 337 * dml2_rgbe_alpha 338 * 339 * plane0 = rgbe 340 * plane1 = alpha 341 * 342 * Mono Non-Planar Types: 343 * dml2_mono_8 344 * dml2_mono_16 345 * 346 * plane0 = luma 347 * plane1 = not used 348 */ 349 350 struct dml2_surface_cfg surface; 351 struct dml2_composition_cfg composition; 352 353 struct { 354 bool enable; 355 unsigned long lines_before_active_required; 356 unsigned long transmitted_bytes; 357 } dynamic_meta_data; 358 359 struct { 360 unsigned int num_cursors; 361 unsigned long cursor_width; 362 unsigned long cursor_bpp; 363 } cursor; 364 365 // For TDLUT, SW would assume TDLUT is setup and enable all the time and 366 // budget for worst case addressing/width mode 367 struct { 368 bool setup_for_tdlut; 369 enum dml2_tdlut_addressing_mode tdlut_addressing_mode; 370 enum dml2_tdlut_width_mode tdlut_width_mode; 371 bool tdlut_mpc_width_flag; 372 } tdlut; 373 374 bool immediate_flip; 375 376 struct { 377 // Logical overrides to power management policies (usually) 378 enum dml2_uclk_pstate_change_strategy uclk_pstate_change_strategy; 379 enum dml2_refresh_from_mall_mode_override refresh_from_mall; 380 unsigned int det_size_override_kb; 381 unsigned int mpcc_combine_factor; 382 383 // reserved_vblank_time_ns is the minimum time to reserve in vblank for Twait 384 // The actual reserved vblank time used for the corresponding stream in mode_programming would be at least as much as this per-plane override. 385 long reserved_vblank_time_ns; 386 unsigned int max_vactive_det_fill_delay_us; // 0 = no reserved time, +ve = explicit max delay 387 unsigned int gpuvm_min_page_size_kbytes; 388 389 enum dml2_svp_mode_override legacy_svp_config; //TODO remove in favor of svp_config 390 391 struct { 392 // HW specific overrides, there's almost no reason to mess with these 393 // generally used for debugging or simulation 394 bool force_one_row_for_frame; 395 struct { 396 bool enable; 397 bool value; 398 } force_pte_buffer_mode; 399 double dppclk_mhz; 400 } hw; 401 } overrides; 402 }; 403 404 struct dml2_stream_parameters { 405 struct dml2_timing_cfg timing; 406 struct dml2_link_output_cfg output; 407 struct dml2_writeback_cfg writeback; 408 409 struct { 410 enum dml2_odm_mode odm_mode; 411 bool disable_dynamic_odm; 412 bool disable_subvp; 413 int minimum_vblank_idle_requirement_us; 414 bool minimize_active_latency_hiding; 415 416 struct { 417 struct { 418 enum dml2_twait_budgeting_setting uclk_pstate; 419 enum dml2_twait_budgeting_setting fclk_pstate; 420 enum dml2_twait_budgeting_setting stutter_enter_exit; 421 } twait_budgeting; 422 } hw; 423 } overrides; 424 }; 425 426 struct dml2_display_cfg { 427 bool gpuvm_enable; 428 bool hostvm_enable; 429 430 // Allocate DET proportionally between streams based on pixel rate 431 // and then allocate proportionally between planes. 432 bool minimize_det_reallocation; 433 434 unsigned int gpuvm_max_page_table_levels; 435 unsigned int hostvm_max_non_cached_page_table_levels; 436 437 struct dml2_plane_parameters plane_descriptors[DML2_MAX_PLANES]; 438 struct dml2_stream_parameters stream_descriptors[DML2_MAX_PLANES]; 439 440 unsigned int num_planes; 441 unsigned int num_streams; 442 443 struct { 444 struct { 445 // HW specific overrides, there's almost no reason to mess with these 446 // generally used for debugging or simulation 447 struct { 448 bool enable; 449 bool value; 450 } force_unbounded_requesting; 451 452 struct { 453 bool enable; 454 bool value; 455 } force_nom_det_size_kbytes; 456 bool mode_support_check_disable; 457 bool mcache_admissibility_check_disable; 458 bool surface_viewport_size_check_disable; 459 double dlg_ref_clk_mhz; 460 double dispclk_mhz; 461 double dcfclk_mhz; 462 bool optimize_tdlut_scheduling; // TBD: for DV, will set this to 1, to ensure tdlut schedule is calculated based on address/width mode 463 } hw; 464 465 struct { 466 bool uclk_pstate_change_disable; 467 bool fclk_pstate_change_disable; 468 bool g6_temp_read_pstate_disable; 469 bool g7_ppt_pstate_disable; 470 } power_management; 471 472 bool enhanced_prefetch_schedule_acceleration; 473 bool dcc_programming_assumes_scan_direction_unknown; 474 bool synchronize_timings; 475 bool synchronize_ddr_displays_for_uclk_pstate_change; 476 bool max_outstanding_when_urgent_expected_disable; 477 bool enable_subvp_implicit_pmo; //enables PMO to switch pipe uclk strategy to subvp, and generate phantom programming 478 unsigned int best_effort_min_active_latency_hiding_us; 479 bool all_streams_blanked; 480 } overrides; 481 }; 482 483 struct dml2_pipe_configuration_descriptor { 484 struct { 485 unsigned int viewport_x_start; 486 unsigned int viewport_width; 487 } plane0; 488 489 struct { 490 unsigned int viewport_x_start; 491 unsigned int viewport_width; 492 } plane1; 493 494 bool plane1_enabled; 495 bool imall_enabled; 496 }; 497 498 struct dml2_plane_mcache_configuration_descriptor { 499 const struct dml2_plane_parameters *plane_descriptor; 500 const struct dml2_mcache_surface_allocation *mcache_allocation; 501 502 struct dml2_pipe_configuration_descriptor pipe_configurations[DML2_MAX_DCN_PIPES]; 503 char num_pipes; 504 }; 505 506 #endif 507