1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef DC_INTERFACE_H_
27#define DC_INTERFACE_H_
28
29#include "dc_types.h"
30#include "grph_object_defs.h"
31#include "logger_types.h"
32#if defined(CONFIG_DRM_AMD_DC_HDCP)
33#include "hdcp_types.h"
34#endif
35#include "gpio_types.h"
36#include "link_service_types.h"
37#include "grph_object_ctrl_defs.h"
38#include <inc/hw/opp.h>
39
40#include "inc/hw_sequencer.h"
41#include "inc/compressor.h"
42#include "inc/hw/dmcu.h"
43#include "dml/display_mode_lib.h"
44
45#define DC_VER "3.2.116"
46
47#define MAX_SURFACES 3
48#define MAX_PLANES 6
49#define MAX_STREAMS 6
50#define MAX_SINKS_PER_LINK 4
51
52
53
54
55struct dc_versions {
56 const char *dc_ver;
57 struct dmcu_version dmcu_version;
58};
59
60enum dp_protocol_version {
61 DP_VERSION_1_4,
62};
63
64enum dc_plane_type {
65 DC_PLANE_TYPE_INVALID,
66 DC_PLANE_TYPE_DCE_RGB,
67 DC_PLANE_TYPE_DCE_UNDERLAY,
68 DC_PLANE_TYPE_DCN_UNIVERSAL,
69};
70
71struct dc_plane_cap {
72 enum dc_plane_type type;
73 uint32_t blends_with_above : 1;
74 uint32_t blends_with_below : 1;
75 uint32_t per_pixel_alpha : 1;
76 struct {
77 uint32_t argb8888 : 1;
78 uint32_t nv12 : 1;
79 uint32_t fp16 : 1;
80 uint32_t p010 : 1;
81 uint32_t ayuv : 1;
82 } pixel_format_support;
83
84
85
86 struct {
87 uint32_t argb8888;
88 uint32_t nv12;
89 uint32_t fp16;
90 } max_upscale_factor;
91
92
93
94 struct {
95 uint32_t argb8888;
96 uint32_t nv12;
97 uint32_t fp16;
98 } max_downscale_factor;
99
100 uint32_t min_width;
101 uint32_t min_height;
102};
103
104
105struct rom_curve_caps {
106 uint16_t srgb : 1;
107 uint16_t bt2020 : 1;
108 uint16_t gamma2_2 : 1;
109 uint16_t pq : 1;
110 uint16_t hlg : 1;
111};
112
113struct dpp_color_caps {
114 uint16_t dcn_arch : 1;
115
116 uint16_t input_lut_shared : 1;
117 uint16_t icsc : 1;
118 uint16_t dgam_ram : 1;
119 uint16_t post_csc : 1;
120 uint16_t gamma_corr : 1;
121
122
123
124
125 uint16_t hw_3d_lut : 1;
126 uint16_t ogam_ram : 1;
127 uint16_t ocsc : 1;
128 uint16_t dgam_rom_for_yuv : 1;
129 struct rom_curve_caps dgam_rom_caps;
130 struct rom_curve_caps ogam_rom_caps;
131};
132
133struct mpc_color_caps {
134 uint16_t gamut_remap : 1;
135 uint16_t ogam_ram : 1;
136 uint16_t ocsc : 1;
137 uint16_t num_3dluts : 3;
138 uint16_t shared_3d_lut:1;
139
140 struct rom_curve_caps ogam_rom_caps;
141};
142
143struct dc_color_caps {
144 struct dpp_color_caps dpp;
145 struct mpc_color_caps mpc;
146};
147
148struct dc_caps {
149 uint32_t max_streams;
150 uint32_t max_links;
151 uint32_t max_audios;
152 uint32_t max_slave_planes;
153 uint32_t max_planes;
154 uint32_t max_downscale_ratio;
155 uint32_t i2c_speed_in_khz;
156 uint32_t i2c_speed_in_khz_hdcp;
157 uint32_t dmdata_alloc_size;
158 unsigned int max_cursor_size;
159 unsigned int max_video_width;
160 unsigned int min_horizontal_blanking_period;
161 int linear_pitch_alignment;
162 bool dcc_const_color;
163 bool dynamic_audio;
164 bool is_apu;
165 bool dual_link_dvi;
166 bool post_blend_color_processing;
167 bool force_dp_tps4_for_cp2520;
168 bool disable_dp_clk_share;
169 bool psp_setup_panel_mode;
170 bool extended_aux_timeout_support;
171 bool dmcub_support;
172 uint32_t num_of_internal_disp;
173 enum dp_protocol_version max_dp_protocol_version;
174 struct dc_plane_cap planes[MAX_PLANES];
175 struct dc_color_caps color;
176};
177
178struct dc_bug_wa {
179 bool no_connect_phy_config;
180 bool dedcn20_305_wa;
181 bool skip_clock_update;
182 bool lt_early_cr_pattern;
183};
184
185struct dc_dcc_surface_param {
186 struct dc_size surface_size;
187 enum surface_pixel_format format;
188 enum swizzle_mode_values swizzle_mode;
189 enum dc_scan_direction scan;
190};
191
192struct dc_dcc_setting {
193 unsigned int max_compressed_blk_size;
194 unsigned int max_uncompressed_blk_size;
195 bool independent_64b_blks;
196#if defined(CONFIG_DRM_AMD_DC_DCN)
197
198 struct {
199 uint32_t dcc_256_64_64 : 1;
200 uint32_t dcc_128_128_uncontrained : 1;
201 uint32_t dcc_256_128_128 : 1;
202 uint32_t dcc_256_256_unconstrained : 1;
203 } dcc_controls;
204#endif
205};
206
207struct dc_surface_dcc_cap {
208 union {
209 struct {
210 struct dc_dcc_setting rgb;
211 } grph;
212
213 struct {
214 struct dc_dcc_setting luma;
215 struct dc_dcc_setting chroma;
216 } video;
217 };
218
219 bool capable;
220 bool const_color_support;
221};
222
223struct dc_static_screen_params {
224 struct {
225 bool force_trigger;
226 bool cursor_update;
227 bool surface_update;
228 bool overlay_update;
229 } triggers;
230 unsigned int num_frames;
231};
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260enum surface_update_type {
261 UPDATE_TYPE_FAST,
262 UPDATE_TYPE_MED,
263 UPDATE_TYPE_FULL,
264};
265
266
267struct dc;
268struct dc_plane_state;
269struct dc_state;
270
271
272struct dc_cap_funcs {
273 bool (*get_dcc_compression_cap)(const struct dc *dc,
274 const struct dc_dcc_surface_param *input,
275 struct dc_surface_dcc_cap *output);
276};
277
278struct link_training_settings;
279
280
281
282struct dc_config {
283 bool gpu_vm_support;
284 bool disable_disp_pll_sharing;
285 bool fbc_support;
286 bool optimize_edp_link_rate;
287 bool disable_fractional_pwm;
288 bool allow_seamless_boot_optimization;
289 bool power_down_display_on_boot;
290 bool edp_not_connected;
291 bool force_enum_edp;
292 bool forced_clocks;
293 bool allow_lttpr_non_transparent_mode;
294 bool multi_mon_pp_mclk_switch;
295 bool disable_dmcu;
296 bool enable_4to1MPC;
297#if defined(CONFIG_DRM_AMD_DC_DCN)
298 bool clamp_min_dcfclk;
299#endif
300};
301
302enum visual_confirm {
303 VISUAL_CONFIRM_DISABLE = 0,
304 VISUAL_CONFIRM_SURFACE = 1,
305 VISUAL_CONFIRM_HDR = 2,
306 VISUAL_CONFIRM_MPCTREE = 4,
307 VISUAL_CONFIRM_PSR = 5,
308};
309
310enum dcc_option {
311 DCC_ENABLE = 0,
312 DCC_DISABLE = 1,
313 DCC_HALF_REQ_DISALBE = 2,
314};
315
316enum pipe_split_policy {
317 MPC_SPLIT_DYNAMIC = 0,
318 MPC_SPLIT_AVOID = 1,
319 MPC_SPLIT_AVOID_MULT_DISP = 2,
320};
321
322enum wm_report_mode {
323 WM_REPORT_DEFAULT = 0,
324 WM_REPORT_OVERRIDE = 1,
325};
326enum dtm_pstate{
327 dtm_level_p0 = 0,
328 dtm_level_p1,
329 dtm_level_p2,
330 dtm_level_p3,
331 dtm_level_p4,
332};
333
334enum dcn_pwr_state {
335 DCN_PWR_STATE_UNKNOWN = -1,
336 DCN_PWR_STATE_MISSION_MODE = 0,
337 DCN_PWR_STATE_LOW_POWER = 3,
338};
339
340
341
342
343
344struct dc_clocks {
345 int dispclk_khz;
346 int actual_dispclk_khz;
347 int dppclk_khz;
348 int actual_dppclk_khz;
349 int disp_dpp_voltage_level_khz;
350 int dcfclk_khz;
351 int socclk_khz;
352 int dcfclk_deep_sleep_khz;
353 int fclk_khz;
354 int phyclk_khz;
355 int dramclk_khz;
356 bool p_state_change_support;
357 enum dcn_pwr_state pwr_state;
358
359
360
361
362 bool prev_p_state_change_support;
363 enum dtm_pstate dtm_level;
364 int max_supported_dppclk_khz;
365 int max_supported_dispclk_khz;
366 int bw_dppclk_khz;
367 int bw_dispclk_khz;
368};
369
370struct dc_bw_validation_profile {
371 bool enable;
372
373 unsigned long long total_ticks;
374 unsigned long long voltage_level_ticks;
375 unsigned long long watermark_ticks;
376 unsigned long long rq_dlg_ticks;
377
378 unsigned long long total_count;
379 unsigned long long skip_fast_count;
380 unsigned long long skip_pass_count;
381 unsigned long long skip_fail_count;
382};
383
384#define BW_VAL_TRACE_SETUP() \
385 unsigned long long end_tick = 0; \
386 unsigned long long voltage_level_tick = 0; \
387 unsigned long long watermark_tick = 0; \
388 unsigned long long start_tick = dc->debug.bw_val_profile.enable ? \
389 dm_get_timestamp(dc->ctx) : 0
390
391#define BW_VAL_TRACE_COUNT() \
392 if (dc->debug.bw_val_profile.enable) \
393 dc->debug.bw_val_profile.total_count++
394
395#define BW_VAL_TRACE_SKIP(status) \
396 if (dc->debug.bw_val_profile.enable) { \
397 if (!voltage_level_tick) \
398 voltage_level_tick = dm_get_timestamp(dc->ctx); \
399 dc->debug.bw_val_profile.skip_ ## status ## _count++; \
400 }
401
402#define BW_VAL_TRACE_END_VOLTAGE_LEVEL() \
403 if (dc->debug.bw_val_profile.enable) \
404 voltage_level_tick = dm_get_timestamp(dc->ctx)
405
406#define BW_VAL_TRACE_END_WATERMARKS() \
407 if (dc->debug.bw_val_profile.enable) \
408 watermark_tick = dm_get_timestamp(dc->ctx)
409
410#define BW_VAL_TRACE_FINISH() \
411 if (dc->debug.bw_val_profile.enable) { \
412 end_tick = dm_get_timestamp(dc->ctx); \
413 dc->debug.bw_val_profile.total_ticks += end_tick - start_tick; \
414 dc->debug.bw_val_profile.voltage_level_ticks += voltage_level_tick - start_tick; \
415 if (watermark_tick) { \
416 dc->debug.bw_val_profile.watermark_ticks += watermark_tick - voltage_level_tick; \
417 dc->debug.bw_val_profile.rq_dlg_ticks += end_tick - watermark_tick; \
418 } \
419 }
420
421union mem_low_power_enable_options {
422 struct {
423 bool i2c: 1;
424 bool dmcu: 1;
425 bool dscl: 1;
426 bool cm: 1;
427 bool mpc: 1;
428 bool optc: 1;
429 } bits;
430 uint32_t u32All;
431};
432
433struct dc_debug_options {
434 enum visual_confirm visual_confirm;
435 bool sanity_checks;
436 bool max_disp_clk;
437 bool surface_trace;
438 bool timing_trace;
439 bool clock_trace;
440 bool validation_trace;
441 bool bandwidth_calcs_trace;
442 int max_downscale_src_width;
443
444
445 bool disable_stutter;
446 bool use_max_lb;
447 enum dcc_option disable_dcc;
448 enum pipe_split_policy pipe_split_policy;
449 bool force_single_disp_pipe_split;
450 bool voltage_align_fclk;
451
452 bool disable_dfs_bypass;
453 bool disable_dpp_power_gate;
454 bool disable_hubp_power_gate;
455 bool disable_dsc_power_gate;
456 int dsc_min_slice_height_override;
457 int dsc_bpp_increment_div;
458 bool native422_support;
459 bool disable_pplib_wm_range;
460 enum wm_report_mode pplib_wm_report_mode;
461 unsigned int min_disp_clk_khz;
462 unsigned int min_dpp_clk_khz;
463 int sr_exit_time_dpm0_ns;
464 int sr_enter_plus_exit_time_dpm0_ns;
465 int sr_exit_time_ns;
466 int sr_enter_plus_exit_time_ns;
467 int urgent_latency_ns;
468 uint32_t underflow_assert_delay_us;
469 int percent_of_ideal_drambw;
470 int dram_clock_change_latency_ns;
471 bool optimized_watermark;
472 int always_scale;
473 bool disable_pplib_clock_request;
474 bool disable_clock_gate;
475 bool disable_mem_low_power;
476 bool disable_dmcu;
477 bool disable_psr;
478 bool force_abm_enable;
479 bool disable_stereo_support;
480 bool vsr_support;
481 bool performance_trace;
482 bool az_endpoint_mute_only;
483 bool always_use_regamma;
484 bool p010_mpo_support;
485 bool recovery_enabled;
486 bool avoid_vbios_exec_table;
487 bool scl_reset_length10;
488 bool hdmi20_disable;
489 bool skip_detection_link_training;
490 uint32_t edid_read_retry_times;
491 bool remove_disconnect_edp;
492 unsigned int force_odm_combine;
493#if defined(CONFIG_DRM_AMD_DC_DCN)
494 unsigned int force_odm_combine_4to1;
495#endif
496 unsigned int force_fclk_khz;
497 bool enable_tri_buf;
498 bool dmub_offload_enabled;
499 bool dmcub_emulation;
500#if defined(CONFIG_DRM_AMD_DC_DCN)
501 bool disable_idle_power_optimizations;
502#endif
503 bool dmub_command_table;
504 struct dc_bw_validation_profile bw_val_profile;
505 bool disable_fec;
506 bool disable_48mhz_pwrdwn;
507
508
509
510 unsigned int force_min_dcfclk_mhz;
511#if defined(CONFIG_DRM_AMD_DC_DCN)
512 int dwb_fi_phase;
513#endif
514 bool disable_timing_sync;
515 bool cm_in_bypass;
516 int force_clock_mode;
517
518 bool disable_dram_clock_change_vactive_support;
519 bool validate_dml_output;
520 bool enable_dmcub_surface_flip;
521 bool usbc_combo_phy_reset_wa;
522 bool disable_dsc;
523 bool enable_dram_clock_change_one_display_vactive;
524 bool force_ignore_link_settings;
525 union mem_low_power_enable_options enable_mem_low_power;
526};
527
528struct dc_debug_data {
529 uint32_t ltFailCount;
530 uint32_t i2cErrorCount;
531 uint32_t auxErrorCount;
532};
533
534struct dc_phy_addr_space_config {
535 struct {
536 uint64_t start_addr;
537 uint64_t end_addr;
538 uint64_t fb_top;
539 uint64_t fb_offset;
540 uint64_t fb_base;
541 uint64_t agp_top;
542 uint64_t agp_bot;
543 uint64_t agp_base;
544 } system_aperture;
545
546 struct {
547 uint64_t page_table_start_addr;
548 uint64_t page_table_end_addr;
549 uint64_t page_table_base_addr;
550 } gart_config;
551
552 bool valid;
553 bool is_hvm_enabled;
554 uint64_t page_table_default_page_addr;
555};
556
557struct dc_virtual_addr_space_config {
558 uint64_t page_table_base_addr;
559 uint64_t page_table_start_addr;
560 uint64_t page_table_end_addr;
561 uint32_t page_table_block_size_in_bytes;
562 uint8_t page_table_depth;
563};
564
565struct dc_bounding_box_overrides {
566 int sr_exit_time_ns;
567 int sr_enter_plus_exit_time_ns;
568 int urgent_latency_ns;
569 int percent_of_ideal_drambw;
570 int dram_clock_change_latency_ns;
571 int dummy_clock_change_latency_ns;
572
573
574
575
576 int min_dcfclk_mhz;
577};
578
579struct dc_state;
580struct resource_pool;
581struct dce_hwseq;
582struct gpu_info_soc_bounding_box_v1_0;
583struct dc {
584 struct dc_versions versions;
585 struct dc_caps caps;
586 struct dc_cap_funcs cap_funcs;
587 struct dc_config config;
588 struct dc_debug_options debug;
589 struct dc_bounding_box_overrides bb_overrides;
590 struct dc_bug_wa work_arounds;
591 struct dc_context *ctx;
592 struct dc_phy_addr_space_config vm_pa_config;
593
594 uint8_t link_count;
595 struct dc_link *links[MAX_PIPES * 2];
596
597 struct dc_state *current_state;
598 struct resource_pool *res_pool;
599
600 struct clk_mgr *clk_mgr;
601
602
603 struct dm_pp_clock_levels sclk_lvls;
604
605
606 struct bw_calcs_dceip *bw_dceip;
607 struct bw_calcs_vbios *bw_vbios;
608#ifdef CONFIG_DRM_AMD_DC_DCN
609 struct dcn_soc_bounding_box *dcn_soc;
610 struct dcn_ip_params *dcn_ip;
611 struct display_mode_lib dml;
612#endif
613
614
615 struct hw_sequencer_funcs hwss;
616 struct dce_hwseq *hwseq;
617
618
619 bool optimized_required;
620 bool wm_optimized_required;
621#if defined(CONFIG_DRM_AMD_DC_DCN)
622 bool idle_optimizations_allowed;
623#endif
624
625
626 int optimize_seamless_boot_streams;
627
628
629 struct compressor *fbc_compressor;
630
631 struct dc_debug_data debug_data;
632 struct dpcd_vendor_signature vendor_signature;
633
634 const char *build_id;
635 struct vm_helper *vm_helper;
636 const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
637};
638
639enum frame_buffer_mode {
640 FRAME_BUFFER_MODE_LOCAL_ONLY = 0,
641 FRAME_BUFFER_MODE_ZFB_ONLY,
642 FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL,
643} ;
644
645struct dchub_init_data {
646 int64_t zfb_phys_addr_base;
647 int64_t zfb_mc_base_addr;
648 uint64_t zfb_size_in_byte;
649 enum frame_buffer_mode fb_mode;
650 bool dchub_initialzied;
651 bool dchub_info_valid;
652};
653
654struct dc_init_data {
655 struct hw_asic_id asic_id;
656 void *driver;
657 struct cgs_device *cgs_device;
658 struct dc_bounding_box_overrides bb_overrides;
659
660 int num_virtual_links;
661
662
663
664
665 struct dc_bios *vbios_override;
666 enum dce_environment dce_environment;
667
668 struct dmub_offload_funcs *dmub_if;
669 struct dc_reg_helper_state *dmub_offload;
670
671 struct dc_config flags;
672 uint64_t log_mask;
673
674
675
676
677
678 const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
679 struct dpcd_vendor_signature vendor_signature;
680#if defined(CONFIG_DRM_AMD_DC_DCN)
681 bool force_smu_not_present;
682#endif
683 bool force_ignore_link_settings;
684};
685
686struct dc_callback_init {
687#ifdef CONFIG_DRM_AMD_DC_HDCP
688 struct cp_psp cp_psp;
689#else
690 uint8_t reserved;
691#endif
692};
693
694struct dc *dc_create(const struct dc_init_data *init_params);
695void dc_hardware_init(struct dc *dc);
696
697int dc_get_vmid_use_vector(struct dc *dc);
698void dc_setup_vm_context(struct dc *dc, struct dc_virtual_addr_space_config *va_config, int vmid);
699
700int dc_setup_system_context(struct dc *dc, struct dc_phy_addr_space_config *pa_config);
701void dc_init_callbacks(struct dc *dc,
702 const struct dc_callback_init *init_params);
703void dc_deinit_callbacks(struct dc *dc);
704void dc_destroy(struct dc **dc);
705
706
707
708
709
710enum {
711 TRANSFER_FUNC_POINTS = 1025
712};
713
714struct dc_hdr_static_metadata {
715
716 unsigned int chromaticity_green_x;
717 unsigned int chromaticity_green_y;
718 unsigned int chromaticity_blue_x;
719 unsigned int chromaticity_blue_y;
720 unsigned int chromaticity_red_x;
721 unsigned int chromaticity_red_y;
722 unsigned int chromaticity_white_point_x;
723 unsigned int chromaticity_white_point_y;
724
725 uint32_t min_luminance;
726 uint32_t max_luminance;
727 uint32_t maximum_content_light_level;
728 uint32_t maximum_frame_average_light_level;
729};
730
731enum dc_transfer_func_type {
732 TF_TYPE_PREDEFINED,
733 TF_TYPE_DISTRIBUTED_POINTS,
734 TF_TYPE_BYPASS,
735 TF_TYPE_HWPWL
736};
737
738struct dc_transfer_func_distributed_points {
739 struct fixed31_32 red[TRANSFER_FUNC_POINTS];
740 struct fixed31_32 green[TRANSFER_FUNC_POINTS];
741 struct fixed31_32 blue[TRANSFER_FUNC_POINTS];
742
743 uint16_t end_exponent;
744 uint16_t x_point_at_y1_red;
745 uint16_t x_point_at_y1_green;
746 uint16_t x_point_at_y1_blue;
747};
748
749enum dc_transfer_func_predefined {
750 TRANSFER_FUNCTION_SRGB,
751 TRANSFER_FUNCTION_BT709,
752 TRANSFER_FUNCTION_PQ,
753 TRANSFER_FUNCTION_LINEAR,
754 TRANSFER_FUNCTION_UNITY,
755 TRANSFER_FUNCTION_HLG,
756 TRANSFER_FUNCTION_HLG12,
757 TRANSFER_FUNCTION_GAMMA22,
758 TRANSFER_FUNCTION_GAMMA24,
759 TRANSFER_FUNCTION_GAMMA26
760};
761
762
763struct dc_transfer_func {
764 struct kref refcount;
765 enum dc_transfer_func_type type;
766 enum dc_transfer_func_predefined tf;
767
768 uint32_t sdr_ref_white_level;
769 union {
770 struct pwl_params pwl;
771 struct dc_transfer_func_distributed_points tf_pts;
772 };
773};
774
775
776union dc_3dlut_state {
777 struct {
778 uint32_t initialized:1;
779 uint32_t rmu_idx_valid:1;
780 uint32_t rmu_mux_num:3;
781 uint32_t mpc_rmu0_mux:4;
782 uint32_t mpc_rmu1_mux:4;
783 uint32_t mpc_rmu2_mux:4;
784 uint32_t reserved:15;
785 } bits;
786 uint32_t raw;
787};
788
789
790struct dc_3dlut {
791 struct kref refcount;
792 struct tetrahedral_params lut_3d;
793 struct fixed31_32 hdr_multiplier;
794 union dc_3dlut_state state;
795};
796
797
798
799
800
801struct dc_plane_status {
802 struct dc_plane_address requested_address;
803 struct dc_plane_address current_address;
804 bool is_flip_pending;
805 bool is_right_eye;
806};
807
808union surface_update_flags {
809
810 struct {
811 uint32_t addr_update:1;
812
813 uint32_t dcc_change:1;
814 uint32_t color_space_change:1;
815 uint32_t horizontal_mirror_change:1;
816 uint32_t per_pixel_alpha_change:1;
817 uint32_t global_alpha_change:1;
818 uint32_t hdr_mult:1;
819 uint32_t rotation_change:1;
820 uint32_t swizzle_change:1;
821 uint32_t scaling_change:1;
822 uint32_t position_change:1;
823 uint32_t in_transfer_func_change:1;
824 uint32_t input_csc_change:1;
825 uint32_t coeff_reduction_change:1;
826 uint32_t output_tf_change:1;
827 uint32_t pixel_format_change:1;
828 uint32_t plane_size_change:1;
829 uint32_t gamut_remap_change:1;
830
831
832 uint32_t new_plane:1;
833 uint32_t bpp_change:1;
834 uint32_t gamma_change:1;
835 uint32_t bandwidth_change:1;
836 uint32_t clock_change:1;
837 uint32_t stereo_format_change:1;
838 uint32_t full_update:1;
839 } bits;
840
841 uint32_t raw;
842};
843
844struct dc_plane_state {
845 struct dc_plane_address address;
846 struct dc_plane_flip_time time;
847 bool triplebuffer_flips;
848 struct scaling_taps scaling_quality;
849 struct rect src_rect;
850 struct rect dst_rect;
851 struct rect clip_rect;
852
853 struct plane_size plane_size;
854 union dc_tiling_info tiling_info;
855
856 struct dc_plane_dcc_param dcc;
857
858 struct dc_gamma *gamma_correction;
859 struct dc_transfer_func *in_transfer_func;
860 struct dc_bias_and_scale *bias_and_scale;
861 struct dc_csc_transform input_csc_color_matrix;
862 struct fixed31_32 coeff_reduction_factor;
863 struct fixed31_32 hdr_mult;
864 struct colorspace_transform gamut_remap_matrix;
865
866
867 struct dc_hdr_static_metadata hdr_static_ctx;
868
869 enum dc_color_space color_space;
870
871 struct dc_3dlut *lut3d_func;
872 struct dc_transfer_func *in_shaper_func;
873 struct dc_transfer_func *blend_tf;
874
875#if defined(CONFIG_DRM_AMD_DC_DCN)
876 struct dc_transfer_func *gamcor_tf;
877#endif
878 enum surface_pixel_format format;
879 enum dc_rotation_angle rotation;
880 enum plane_stereo_format stereo_format;
881
882 bool is_tiling_rotated;
883 bool per_pixel_alpha;
884 bool global_alpha;
885 int global_alpha_value;
886 bool visible;
887 bool flip_immediate;
888 bool horizontal_mirror;
889 int layer_index;
890
891 union surface_update_flags update_flags;
892
893 struct dc_plane_status status;
894 struct dc_context *ctx;
895
896
897 bool force_full_update;
898
899
900 enum dc_irq_source irq_source;
901 struct kref refcount;
902};
903
904struct dc_plane_info {
905 struct plane_size plane_size;
906 union dc_tiling_info tiling_info;
907 struct dc_plane_dcc_param dcc;
908 enum surface_pixel_format format;
909 enum dc_rotation_angle rotation;
910 enum plane_stereo_format stereo_format;
911 enum dc_color_space color_space;
912 bool horizontal_mirror;
913 bool visible;
914 bool per_pixel_alpha;
915 bool global_alpha;
916 int global_alpha_value;
917 bool input_csc_enabled;
918 int layer_index;
919};
920
921struct dc_scaling_info {
922 struct rect src_rect;
923 struct rect dst_rect;
924 struct rect clip_rect;
925 struct scaling_taps scaling_quality;
926};
927
928struct dc_surface_update {
929 struct dc_plane_state *surface;
930
931
932 const struct dc_flip_addrs *flip_addr;
933 const struct dc_plane_info *plane_info;
934 const struct dc_scaling_info *scaling_info;
935 struct fixed31_32 hdr_mult;
936
937
938
939 const struct dc_gamma *gamma;
940 const struct dc_transfer_func *in_transfer_func;
941
942 const struct dc_csc_transform *input_csc_color_matrix;
943 const struct fixed31_32 *coeff_reduction_factor;
944 const struct dc_transfer_func *func_shaper;
945 const struct dc_3dlut *lut3d_func;
946 const struct dc_transfer_func *blend_tf;
947 const struct colorspace_transform *gamut_remap_matrix;
948};
949
950
951
952
953struct dc_plane_state *dc_create_plane_state(struct dc *dc);
954const struct dc_plane_status *dc_plane_get_status(
955 const struct dc_plane_state *plane_state);
956
957void dc_plane_state_retain(struct dc_plane_state *plane_state);
958void dc_plane_state_release(struct dc_plane_state *plane_state);
959
960void dc_gamma_retain(struct dc_gamma *dc_gamma);
961void dc_gamma_release(struct dc_gamma **dc_gamma);
962struct dc_gamma *dc_create_gamma(void);
963
964void dc_transfer_func_retain(struct dc_transfer_func *dc_tf);
965void dc_transfer_func_release(struct dc_transfer_func *dc_tf);
966struct dc_transfer_func *dc_create_transfer_func(void);
967
968struct dc_3dlut *dc_create_3dlut_func(void);
969void dc_3dlut_func_release(struct dc_3dlut *lut);
970void dc_3dlut_func_retain(struct dc_3dlut *lut);
971
972
973
974
975
976struct dc_flip_addrs {
977 struct dc_plane_address address;
978 unsigned int flip_timestamp_in_us;
979 bool flip_immediate;
980
981 bool triplebuffer_flips;
982};
983
984void dc_post_update_surfaces_to_stream(
985 struct dc *dc);
986
987#include "dc_stream.h"
988
989
990
991
992struct dc_validation_set {
993 struct dc_stream_state *stream;
994 struct dc_plane_state *plane_states[MAX_SURFACES];
995 uint8_t plane_count;
996};
997
998bool dc_validate_seamless_boot_timing(const struct dc *dc,
999 const struct dc_sink *sink,
1000 struct dc_crtc_timing *crtc_timing);
1001
1002enum dc_status dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state);
1003
1004void get_clock_requirements_for_state(struct dc_state *state, struct AsicStateEx *info);
1005
1006bool dc_set_generic_gpio_for_stereo(bool enable,
1007 struct gpio_service *gpio_service);
1008
1009
1010
1011
1012
1013enum dc_status dc_validate_global_state(
1014 struct dc *dc,
1015 struct dc_state *new_ctx,
1016 bool fast_validate);
1017
1018
1019void dc_resource_state_construct(
1020 const struct dc *dc,
1021 struct dc_state *dst_ctx);
1022
1023#if defined(CONFIG_DRM_AMD_DC_DCN)
1024bool dc_acquire_release_mpc_3dlut(
1025 struct dc *dc, bool acquire,
1026 struct dc_stream_state *stream,
1027 struct dc_3dlut **lut,
1028 struct dc_transfer_func **shaper);
1029#endif
1030
1031void dc_resource_state_copy_construct(
1032 const struct dc_state *src_ctx,
1033 struct dc_state *dst_ctx);
1034
1035void dc_resource_state_copy_construct_current(
1036 const struct dc *dc,
1037 struct dc_state *dst_ctx);
1038
1039void dc_resource_state_destruct(struct dc_state *context);
1040
1041bool dc_resource_is_dsc_encoding_supported(const struct dc *dc);
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052bool dc_commit_state(struct dc *dc, struct dc_state *context);
1053
1054void dc_power_down_on_boot(struct dc *dc);
1055
1056struct dc_state *dc_create_state(struct dc *dc);
1057struct dc_state *dc_copy_state(struct dc_state *src_ctx);
1058void dc_retain_state(struct dc_state *context);
1059void dc_release_state(struct dc_state *context);
1060
1061
1062
1063
1064
1065struct dpcd_caps {
1066 union dpcd_rev dpcd_rev;
1067 union max_lane_count max_ln_count;
1068 union max_down_spread max_down_spread;
1069 union dprx_feature dprx_feature;
1070
1071
1072 uint8_t edp_supported_link_rates_count;
1073 enum dc_link_rate edp_supported_link_rates[8];
1074
1075
1076 enum display_dongle_type dongle_type;
1077
1078 bool is_branch_dev;
1079
1080 union sink_count sink_count;
1081
1082
1083 struct dc_dongle_caps dongle_caps;
1084
1085 uint32_t sink_dev_id;
1086 int8_t sink_dev_id_str[6];
1087 int8_t sink_hw_revision;
1088 int8_t sink_fw_revision[2];
1089
1090 uint32_t branch_dev_id;
1091 int8_t branch_dev_name[6];
1092 int8_t branch_hw_revision;
1093 int8_t branch_fw_revision[2];
1094
1095 bool allow_invalid_MSA_timing_param;
1096 bool panel_mode_edp;
1097 bool dpcd_display_control_capable;
1098 bool ext_receiver_cap_field_present;
1099 bool dynamic_backlight_capable_edp;
1100 union dpcd_fec_capability fec_cap;
1101 struct dpcd_dsc_capabilities dsc_caps;
1102 struct dc_lttpr_caps lttpr_caps;
1103 struct psr_caps psr_caps;
1104
1105};
1106
1107union dpcd_sink_ext_caps {
1108 struct {
1109
1110
1111
1112 uint8_t sdr_aux_backlight_control : 1;
1113 uint8_t hdr_aux_backlight_control : 1;
1114 uint8_t reserved_1 : 2;
1115 uint8_t oled : 1;
1116 uint8_t reserved : 3;
1117 } bits;
1118 uint8_t raw;
1119};
1120
1121#if defined(CONFIG_DRM_AMD_DC_HDCP)
1122union hdcp_rx_caps {
1123 struct {
1124 uint8_t version;
1125 uint8_t reserved;
1126 struct {
1127 uint8_t repeater : 1;
1128 uint8_t hdcp_capable : 1;
1129 uint8_t reserved : 6;
1130 } byte0;
1131 } fields;
1132 uint8_t raw[3];
1133};
1134
1135union hdcp_bcaps {
1136 struct {
1137 uint8_t HDCP_CAPABLE:1;
1138 uint8_t REPEATER:1;
1139 uint8_t RESERVED:6;
1140 } bits;
1141 uint8_t raw;
1142};
1143
1144struct hdcp_caps {
1145 union hdcp_rx_caps rx_caps;
1146 union hdcp_bcaps bcaps;
1147};
1148#endif
1149
1150#include "dc_link.h"
1151
1152#if defined(CONFIG_DRM_AMD_DC_DCN)
1153uint32_t dc_get_opp_for_plane(struct dc *dc, struct dc_plane_state *plane);
1154
1155#endif
1156
1157
1158
1159
1160struct dc_container_id {
1161
1162 unsigned char guid[16];
1163
1164 unsigned int portId[2];
1165
1166 unsigned short manufacturerName;
1167
1168 unsigned short productCode;
1169};
1170
1171
1172struct dc_sink_dsc_caps {
1173
1174
1175 bool is_virtual_dpcd_dsc;
1176 struct dsc_dec_dpcd_caps dsc_dec_caps;
1177};
1178
1179struct dc_sink_fec_caps {
1180 bool is_rx_fec_supported;
1181 bool is_topology_fec_supported;
1182};
1183
1184
1185
1186
1187struct dc_sink {
1188 enum signal_type sink_signal;
1189 struct dc_edid dc_edid;
1190 struct dc_edid_caps edid_caps;
1191 struct dc_container_id *dc_container_id;
1192 uint32_t dongle_max_pix_clk;
1193 void *priv;
1194 struct stereo_3d_features features_3d[TIMING_3D_FORMAT_MAX];
1195 bool converter_disable_audio;
1196
1197 struct dc_sink_dsc_caps dsc_caps;
1198 struct dc_sink_fec_caps fec_caps;
1199
1200 bool is_vsc_sdp_colorimetry_supported;
1201
1202
1203 struct dc_link *link;
1204 struct dc_context *ctx;
1205
1206 uint32_t sink_id;
1207
1208
1209
1210
1211
1212 struct kref refcount;
1213};
1214
1215void dc_sink_retain(struct dc_sink *sink);
1216void dc_sink_release(struct dc_sink *sink);
1217
1218struct dc_sink_init_data {
1219 enum signal_type sink_signal;
1220 struct dc_link *link;
1221 uint32_t dongle_max_pix_clk;
1222 bool converter_disable_audio;
1223};
1224
1225struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params);
1226
1227
1228struct dc_cursor {
1229 struct dc_plane_address address;
1230 struct dc_cursor_attributes attributes;
1231};
1232
1233
1234
1235
1236
1237enum dc_irq_source dc_interrupt_to_irq_source(
1238 struct dc *dc,
1239 uint32_t src_id,
1240 uint32_t ext_id);
1241bool dc_interrupt_set(struct dc *dc, enum dc_irq_source src, bool enable);
1242void dc_interrupt_ack(struct dc *dc, enum dc_irq_source src);
1243enum dc_irq_source dc_get_hpd_irq_source_at_index(
1244 struct dc *dc, uint32_t link_index);
1245
1246
1247
1248
1249
1250void dc_set_power_state(
1251 struct dc *dc,
1252 enum dc_acpi_cm_power_state power_state);
1253void dc_resume(struct dc *dc);
1254
1255void dc_power_down_on_boot(struct dc *dc);
1256
1257#if defined(CONFIG_DRM_AMD_DC_HDCP)
1258
1259
1260
1261enum hdcp_message_status dc_process_hdcp_msg(
1262 enum signal_type signal,
1263 struct dc_link *link,
1264 struct hdcp_protection_message *message_info);
1265#endif
1266bool dc_is_dmcu_initialized(struct dc *dc);
1267
1268enum dc_status dc_set_clock(struct dc *dc, enum dc_clock_type clock_type, uint32_t clk_khz, uint32_t stepping);
1269void dc_get_clock(struct dc *dc, enum dc_clock_type clock_type, struct dc_clock_config *clock_cfg);
1270#if defined(CONFIG_DRM_AMD_DC_DCN)
1271
1272bool dc_is_plane_eligible_for_idle_optimizations(struct dc *dc,
1273 struct dc_plane_state *plane);
1274
1275void dc_allow_idle_optimizations(struct dc *dc, bool allow);
1276
1277
1278
1279
1280
1281void dc_unlock_memory_clock_frequency(struct dc *dc);
1282
1283
1284
1285
1286
1287void dc_lock_memory_clock_frequency(struct dc *dc);
1288
1289
1290void dc_hardware_release(struct dc *dc);
1291
1292#endif
1293
1294bool dc_set_psr_allow_active(struct dc *dc, bool enable);
1295
1296
1297
1298
1299#include "dc_dsc.h"
1300#endif
1301