| .. | .. |
|---|
| 32 | 32 | /******************************************************************************* |
|---|
| 33 | 33 | * Stream Interfaces |
|---|
| 34 | 34 | ******************************************************************************/ |
|---|
| 35 | +struct timing_sync_info { |
|---|
| 36 | + int group_id; |
|---|
| 37 | + int group_size; |
|---|
| 38 | + bool master; |
|---|
| 39 | +}; |
|---|
| 35 | 40 | |
|---|
| 36 | 41 | struct dc_stream_status { |
|---|
| 37 | 42 | int primary_otg_inst; |
|---|
| 38 | 43 | int stream_enc_inst; |
|---|
| 39 | 44 | int plane_count; |
|---|
| 45 | + int audio_inst; |
|---|
| 46 | + struct timing_sync_info timing_sync_info; |
|---|
| 40 | 47 | struct dc_plane_state *plane_states[MAX_SURFACE_NUM]; |
|---|
| 48 | +}; |
|---|
| 41 | 49 | |
|---|
| 42 | | - /* |
|---|
| 43 | | - * link this stream passes through |
|---|
| 50 | +// TODO: References to this needs to be removed.. |
|---|
| 51 | +struct freesync_context { |
|---|
| 52 | + bool dummy; |
|---|
| 53 | +}; |
|---|
| 54 | + |
|---|
| 55 | +enum hubp_dmdata_mode { |
|---|
| 56 | + DMDATA_SW_MODE, |
|---|
| 57 | + DMDATA_HW_MODE |
|---|
| 58 | +}; |
|---|
| 59 | + |
|---|
| 60 | +struct dc_dmdata_attributes { |
|---|
| 61 | + /* Specifies whether dynamic meta data will be updated by software |
|---|
| 62 | + * or has to be fetched by hardware (DMA mode) |
|---|
| 44 | 63 | */ |
|---|
| 45 | | - struct dc_link *link; |
|---|
| 64 | + enum hubp_dmdata_mode dmdata_mode; |
|---|
| 65 | + /* Specifies if current dynamic meta data is to be used only for the current frame */ |
|---|
| 66 | + bool dmdata_repeat; |
|---|
| 67 | + /* Specifies the size of Dynamic Metadata surface in byte. Size of 0 means no Dynamic metadata is fetched */ |
|---|
| 68 | + uint32_t dmdata_size; |
|---|
| 69 | + /* Specifies if a new dynamic meta data should be fetched for an upcoming frame */ |
|---|
| 70 | + bool dmdata_updated; |
|---|
| 71 | + /* If hardware mode is used, the base address where DMDATA surface is located */ |
|---|
| 72 | + PHYSICAL_ADDRESS_LOC address; |
|---|
| 73 | + /* Specifies whether QOS level will be provided by TTU or it will come from DMDATA_QOS_LEVEL */ |
|---|
| 74 | + bool dmdata_qos_mode; |
|---|
| 75 | + /* If qos_mode = 1, this is the QOS value to be used: */ |
|---|
| 76 | + uint32_t dmdata_qos_level; |
|---|
| 77 | + /* Specifies the value in unit of REFCLK cycles to be added to the |
|---|
| 78 | + * current time to produce the Amortized deadline for Dynamic Metadata chunk request |
|---|
| 79 | + */ |
|---|
| 80 | + uint32_t dmdata_dl_delta; |
|---|
| 81 | + /* An unbounded array of uint32s, represents software dmdata to be loaded */ |
|---|
| 82 | + uint32_t *dmdata_sw_data; |
|---|
| 83 | +}; |
|---|
| 84 | + |
|---|
| 85 | +struct dc_writeback_info { |
|---|
| 86 | + bool wb_enabled; |
|---|
| 87 | + int dwb_pipe_inst; |
|---|
| 88 | + struct dc_dwb_params dwb_params; |
|---|
| 89 | + struct mcif_buf_params mcif_buf_params; |
|---|
| 90 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
|---|
| 91 | + struct mcif_warmup_params mcif_warmup_params; |
|---|
| 92 | + /* the plane that is the input to TOP_MUX for MPCC that is the DWB source */ |
|---|
| 93 | + struct dc_plane_state *writeback_source_plane; |
|---|
| 94 | + /* source MPCC instance. for use by internally by dc */ |
|---|
| 95 | + int mpcc_inst; |
|---|
| 96 | +#endif |
|---|
| 97 | +}; |
|---|
| 98 | + |
|---|
| 99 | +struct dc_writeback_update { |
|---|
| 100 | + unsigned int num_wb_info; |
|---|
| 101 | + struct dc_writeback_info writeback_info[MAX_DWB_PIPES]; |
|---|
| 102 | +}; |
|---|
| 103 | + |
|---|
| 104 | +enum vertical_interrupt_ref_point { |
|---|
| 105 | + START_V_UPDATE = 0, |
|---|
| 106 | + START_V_SYNC, |
|---|
| 107 | + INVALID_POINT |
|---|
| 108 | + |
|---|
| 109 | + //For now, only v_update interrupt is used. |
|---|
| 110 | + //START_V_BLANK, |
|---|
| 111 | + //START_V_ACTIVE |
|---|
| 112 | +}; |
|---|
| 113 | + |
|---|
| 114 | +struct periodic_interrupt_config { |
|---|
| 115 | + enum vertical_interrupt_ref_point ref_point; |
|---|
| 116 | + int lines_offset; |
|---|
| 117 | +}; |
|---|
| 118 | + |
|---|
| 119 | +union stream_update_flags { |
|---|
| 120 | + struct { |
|---|
| 121 | + uint32_t scaling:1; |
|---|
| 122 | + uint32_t out_tf:1; |
|---|
| 123 | + uint32_t out_csc:1; |
|---|
| 124 | + uint32_t abm_level:1; |
|---|
| 125 | + uint32_t dpms_off:1; |
|---|
| 126 | + uint32_t gamut_remap:1; |
|---|
| 127 | + uint32_t wb_update:1; |
|---|
| 128 | + uint32_t dsc_changed : 1; |
|---|
| 129 | + } bits; |
|---|
| 130 | + |
|---|
| 131 | + uint32_t raw; |
|---|
| 46 | 132 | }; |
|---|
| 47 | 133 | |
|---|
| 48 | 134 | struct dc_stream_state { |
|---|
| 135 | + // sink is deprecated, new code should not reference |
|---|
| 136 | + // this pointer |
|---|
| 49 | 137 | struct dc_sink *sink; |
|---|
| 138 | + |
|---|
| 139 | + struct dc_link *link; |
|---|
| 140 | + struct dc_panel_patch sink_patches; |
|---|
| 141 | + union display_content_support content_support; |
|---|
| 50 | 142 | struct dc_crtc_timing timing; |
|---|
| 51 | | - struct dc_crtc_timing_adjust timing_adjust; |
|---|
| 52 | | - struct vrr_params vrr_params; |
|---|
| 143 | + struct dc_crtc_timing_adjust adjust; |
|---|
| 144 | + struct dc_info_packet vrr_infopacket; |
|---|
| 145 | + struct dc_info_packet vsc_infopacket; |
|---|
| 146 | + struct dc_info_packet vsp_infopacket; |
|---|
| 53 | 147 | |
|---|
| 54 | 148 | struct rect src; /* composition area */ |
|---|
| 55 | 149 | struct rect dst; /* stream addressable area */ |
|---|
| 56 | 150 | |
|---|
| 57 | | - struct audio_info audio_info; |
|---|
| 58 | | - |
|---|
| 151 | + // TODO: References to this needs to be removed.. |
|---|
| 59 | 152 | struct freesync_context freesync_ctx; |
|---|
| 153 | + |
|---|
| 154 | + struct audio_info audio_info; |
|---|
| 60 | 155 | |
|---|
| 61 | 156 | struct dc_info_packet hdr_static_metadata; |
|---|
| 62 | 157 | PHYSICAL_ADDRESS_LOC dmdata_address; |
|---|
| .. | .. |
|---|
| 71 | 166 | |
|---|
| 72 | 167 | enum view_3d_format view_format; |
|---|
| 73 | 168 | |
|---|
| 169 | + bool use_vsc_sdp_for_colorimetry; |
|---|
| 74 | 170 | bool ignore_msa_timing_param; |
|---|
| 75 | | - |
|---|
| 76 | | - unsigned long long periodic_fn_vsync_delta; |
|---|
| 171 | + bool converter_disable_audio; |
|---|
| 172 | + uint8_t qs_bit; |
|---|
| 173 | + uint8_t qy_bit; |
|---|
| 77 | 174 | |
|---|
| 78 | 175 | /* TODO: custom INFO packets */ |
|---|
| 79 | 176 | /* TODO: ABM info (DMCU) */ |
|---|
| 80 | | - /* PSR info */ |
|---|
| 81 | | - unsigned char psr_version; |
|---|
| 82 | 177 | /* TODO: CEA VIC */ |
|---|
| 83 | 178 | |
|---|
| 84 | 179 | /* DMCU info */ |
|---|
| 85 | 180 | unsigned int abm_level; |
|---|
| 86 | | - unsigned int bl_pwm_level; |
|---|
| 181 | + |
|---|
| 182 | + struct periodic_interrupt_config periodic_interrupt; |
|---|
| 87 | 183 | |
|---|
| 88 | 184 | /* from core_stream struct */ |
|---|
| 89 | 185 | struct dc_context *ctx; |
|---|
| .. | .. |
|---|
| 96 | 192 | enum signal_type signal; |
|---|
| 97 | 193 | bool dpms_off; |
|---|
| 98 | 194 | |
|---|
| 99 | | - struct dc_stream_status status; |
|---|
| 195 | + void *dm_stream_context; |
|---|
| 100 | 196 | |
|---|
| 101 | 197 | struct dc_cursor_attributes cursor_attributes; |
|---|
| 102 | 198 | struct dc_cursor_position cursor_position; |
|---|
| .. | .. |
|---|
| 107 | 203 | |
|---|
| 108 | 204 | struct crtc_trigger_info triggered_crtc_reset; |
|---|
| 109 | 205 | |
|---|
| 206 | + /* writeback */ |
|---|
| 207 | + unsigned int num_wb_info; |
|---|
| 208 | + struct dc_writeback_info writeback_info[MAX_DWB_PIPES]; |
|---|
| 209 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
|---|
| 210 | + const struct dc_transfer_func *func_shaper; |
|---|
| 211 | + const struct dc_3dlut *lut3d_func; |
|---|
| 212 | +#endif |
|---|
| 110 | 213 | /* Computed state bits */ |
|---|
| 111 | 214 | bool mode_changed : 1; |
|---|
| 112 | 215 | |
|---|
| 216 | + /* Output from DC when stream state is committed or altered |
|---|
| 217 | + * DC may only access these values during: |
|---|
| 218 | + * dc_commit_state, dc_commit_state_no_check, dc_commit_streams |
|---|
| 219 | + * values may not change outside of those calls |
|---|
| 220 | + */ |
|---|
| 221 | + struct { |
|---|
| 222 | + // For interrupt management, some hardware instance |
|---|
| 223 | + // offsets need to be exposed to DM |
|---|
| 224 | + uint8_t otg_offset; |
|---|
| 225 | + } out; |
|---|
| 226 | + |
|---|
| 227 | + bool apply_edp_fast_boot_optimization; |
|---|
| 228 | + bool apply_seamless_boot_optimization; |
|---|
| 229 | + |
|---|
| 230 | + uint32_t stream_id; |
|---|
| 231 | + bool is_dsc_enabled; |
|---|
| 232 | + union stream_update_flags update_flags; |
|---|
| 113 | 233 | }; |
|---|
| 114 | 234 | |
|---|
| 235 | +#define ABM_LEVEL_IMMEDIATE_DISABLE 255 |
|---|
| 236 | + |
|---|
| 115 | 237 | struct dc_stream_update { |
|---|
| 238 | + struct dc_stream_state *stream; |
|---|
| 239 | + |
|---|
| 116 | 240 | struct rect src; |
|---|
| 117 | 241 | struct rect dst; |
|---|
| 118 | 242 | struct dc_transfer_func *out_transfer_func; |
|---|
| 119 | 243 | struct dc_info_packet *hdr_static_metadata; |
|---|
| 120 | 244 | unsigned int *abm_level; |
|---|
| 121 | 245 | |
|---|
| 122 | | - unsigned long long *periodic_fn_vsync_delta; |
|---|
| 246 | + struct periodic_interrupt_config *periodic_interrupt; |
|---|
| 247 | + |
|---|
| 248 | + struct dc_info_packet *vrr_infopacket; |
|---|
| 249 | + struct dc_info_packet *vsc_infopacket; |
|---|
| 250 | + struct dc_info_packet *vsp_infopacket; |
|---|
| 251 | + |
|---|
| 252 | + bool *dpms_off; |
|---|
| 253 | + bool integer_scaling_update; |
|---|
| 254 | + |
|---|
| 255 | + struct colorspace_transform *gamut_remap; |
|---|
| 256 | + enum dc_color_space *output_color_space; |
|---|
| 257 | + enum dc_dither_option *dither_option; |
|---|
| 258 | + |
|---|
| 259 | + struct dc_csc_transform *output_csc_transform; |
|---|
| 260 | + |
|---|
| 261 | + struct dc_writeback_update *wb_update; |
|---|
| 262 | + struct dc_dsc_config *dsc_config; |
|---|
| 263 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
|---|
| 264 | + struct dc_transfer_func *func_shaper; |
|---|
| 265 | + struct dc_3dlut *lut3d_func; |
|---|
| 266 | +#endif |
|---|
| 123 | 267 | }; |
|---|
| 124 | 268 | |
|---|
| 125 | 269 | bool dc_is_stream_unchanged( |
|---|
| .. | .. |
|---|
| 143 | 287 | int surface_count, |
|---|
| 144 | 288 | struct dc_stream_state *stream, |
|---|
| 145 | 289 | struct dc_stream_update *stream_update, |
|---|
| 146 | | - struct dc_plane_state **plane_states, |
|---|
| 147 | 290 | struct dc_state *state); |
|---|
| 148 | 291 | /* |
|---|
| 149 | 292 | * Log the current stream state. |
|---|
| .. | .. |
|---|
| 152 | 295 | |
|---|
| 153 | 296 | uint8_t dc_get_current_stream_count(struct dc *dc); |
|---|
| 154 | 297 | struct dc_stream_state *dc_get_stream_at_index(struct dc *dc, uint8_t i); |
|---|
| 298 | +struct dc_stream_state *dc_stream_find_from_link(const struct dc_link *link); |
|---|
| 155 | 299 | |
|---|
| 156 | 300 | /* |
|---|
| 157 | 301 | * Return the current frame counter. |
|---|
| 158 | 302 | */ |
|---|
| 159 | 303 | uint32_t dc_stream_get_vblank_counter(const struct dc_stream_state *stream); |
|---|
| 304 | + |
|---|
| 305 | +/* |
|---|
| 306 | + * Send dp sdp message. |
|---|
| 307 | + */ |
|---|
| 308 | +bool dc_stream_send_dp_sdp(const struct dc_stream_state *stream, |
|---|
| 309 | + const uint8_t *custom_sdp_message, |
|---|
| 310 | + unsigned int sdp_message_size); |
|---|
| 160 | 311 | |
|---|
| 161 | 312 | /* TODO: Return parsed values rather than direct register read |
|---|
| 162 | 313 | * This has a dependency on the caller (amdgpu_display_get_crtc_scanoutpos) |
|---|
| .. | .. |
|---|
| 203 | 354 | int plane_count, |
|---|
| 204 | 355 | struct dc_state *context); |
|---|
| 205 | 356 | |
|---|
| 357 | +bool dc_stream_add_writeback(struct dc *dc, |
|---|
| 358 | + struct dc_stream_state *stream, |
|---|
| 359 | + struct dc_writeback_info *wb_info); |
|---|
| 360 | + |
|---|
| 361 | +bool dc_stream_remove_writeback(struct dc *dc, |
|---|
| 362 | + struct dc_stream_state *stream, |
|---|
| 363 | + uint32_t dwb_pipe_inst); |
|---|
| 364 | + |
|---|
| 365 | +enum dc_status dc_stream_add_dsc_to_resource(struct dc *dc, |
|---|
| 366 | + struct dc_state *state, |
|---|
| 367 | + struct dc_stream_state *stream); |
|---|
| 368 | + |
|---|
| 369 | +bool dc_stream_warmup_writeback(struct dc *dc, |
|---|
| 370 | + int num_dwb, |
|---|
| 371 | + struct dc_writeback_info *wb_info); |
|---|
| 372 | + |
|---|
| 373 | +bool dc_stream_dmdata_status_done(struct dc *dc, struct dc_stream_state *stream); |
|---|
| 374 | + |
|---|
| 375 | +bool dc_stream_set_dynamic_metadata(struct dc *dc, |
|---|
| 376 | + struct dc_stream_state *stream, |
|---|
| 377 | + struct dc_dmdata_attributes *dmdata_attr); |
|---|
| 378 | + |
|---|
| 206 | 379 | enum dc_status dc_validate_stream(struct dc *dc, struct dc_stream_state *stream); |
|---|
| 207 | 380 | |
|---|
| 208 | 381 | /* |
|---|
| .. | .. |
|---|
| 223 | 396 | struct dc_stream_state *streams[], |
|---|
| 224 | 397 | uint8_t stream_count); |
|---|
| 225 | 398 | |
|---|
| 399 | +/* Triggers multi-stream synchronization. */ |
|---|
| 400 | +void dc_trigger_sync(struct dc *dc, struct dc_state *context); |
|---|
| 226 | 401 | |
|---|
| 227 | 402 | enum surface_update_type dc_check_update_surfaces_for_stream( |
|---|
| 228 | 403 | struct dc *dc, |
|---|
| .. | .. |
|---|
| 236 | 411 | */ |
|---|
| 237 | 412 | struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink); |
|---|
| 238 | 413 | |
|---|
| 239 | | -void update_stream_signal(struct dc_stream_state *stream); |
|---|
| 414 | +struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream); |
|---|
| 415 | + |
|---|
| 416 | +void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink); |
|---|
| 240 | 417 | |
|---|
| 241 | 418 | void dc_stream_retain(struct dc_stream_state *dc_stream); |
|---|
| 242 | 419 | void dc_stream_release(struct dc_stream_state *dc_stream); |
|---|
| 243 | 420 | |
|---|
| 421 | +struct dc_stream_status *dc_stream_get_status_from_state( |
|---|
| 422 | + struct dc_state *state, |
|---|
| 423 | + struct dc_stream_state *stream); |
|---|
| 244 | 424 | struct dc_stream_status *dc_stream_get_status( |
|---|
| 245 | 425 | struct dc_stream_state *dc_stream); |
|---|
| 426 | + |
|---|
| 427 | +#ifndef TRIM_FSFT |
|---|
| 428 | +bool dc_optimize_timing_for_fsft( |
|---|
| 429 | + struct dc_stream_state *pStream, |
|---|
| 430 | + unsigned int max_input_rate_in_khz); |
|---|
| 431 | +#endif |
|---|
| 246 | 432 | |
|---|
| 247 | 433 | /******************************************************************************* |
|---|
| 248 | 434 | * Cursor interfaces - To manages the cursor within a stream |
|---|
| .. | .. |
|---|
| 258 | 444 | |
|---|
| 259 | 445 | |
|---|
| 260 | 446 | bool dc_stream_adjust_vmin_vmax(struct dc *dc, |
|---|
| 261 | | - struct dc_stream_state **stream, |
|---|
| 262 | | - int num_streams, |
|---|
| 263 | | - int vmin, |
|---|
| 264 | | - int vmax); |
|---|
| 447 | + struct dc_stream_state *stream, |
|---|
| 448 | + struct dc_crtc_timing_adjust *adjust); |
|---|
| 265 | 449 | |
|---|
| 266 | 450 | bool dc_stream_get_crtc_position(struct dc *dc, |
|---|
| 267 | 451 | struct dc_stream_state **stream, |
|---|
| .. | .. |
|---|
| 280 | 464 | uint32_t *g_y, |
|---|
| 281 | 465 | uint32_t *b_cb); |
|---|
| 282 | 466 | |
|---|
| 283 | | -void dc_stream_set_static_screen_events(struct dc *dc, |
|---|
| 467 | +void dc_stream_set_static_screen_params(struct dc *dc, |
|---|
| 284 | 468 | struct dc_stream_state **stream, |
|---|
| 285 | 469 | int num_streams, |
|---|
| 286 | | - const struct dc_static_screen_events *events); |
|---|
| 470 | + const struct dc_static_screen_params *params); |
|---|
| 471 | + |
|---|
| 472 | +void dc_stream_set_dyn_expansion(struct dc *dc, struct dc_stream_state *stream, |
|---|
| 473 | + enum dc_dynamic_expansion option); |
|---|
| 287 | 474 | |
|---|
| 288 | 475 | void dc_stream_set_dither_option(struct dc_stream_state *stream, |
|---|
| 289 | 476 | enum dc_dither_option option); |
|---|
| 290 | 477 | |
|---|
| 478 | +bool dc_stream_set_gamut_remap(struct dc *dc, |
|---|
| 479 | + const struct dc_stream_state *stream); |
|---|
| 291 | 480 | |
|---|
| 292 | | -bool dc_stream_adjust_vmin_vmax(struct dc *dc, |
|---|
| 293 | | - struct dc_stream_state **stream, |
|---|
| 294 | | - int num_streams, |
|---|
| 295 | | - int vmin, |
|---|
| 296 | | - int vmax); |
|---|
| 481 | +bool dc_stream_program_csc_matrix(struct dc *dc, |
|---|
| 482 | + struct dc_stream_state *stream); |
|---|
| 297 | 483 | |
|---|
| 298 | 484 | bool dc_stream_get_crtc_position(struct dc *dc, |
|---|
| 299 | 485 | struct dc_stream_state **stream, |
|---|