cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dc.h (40764B)


      1/*
      2 * Copyright 2012-14 Advanced Micro Devices, Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a
      5 * copy of this software and associated documentation files (the "Software"),
      6 * to deal in the Software without restriction, including without limitation
      7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 * and/or sell copies of the Software, and to permit persons to whom the
      9 * Software is furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     20 * OTHER DEALINGS IN THE SOFTWARE.
     21 *
     22 * Authors: AMD
     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/* forward declaration */
     46struct aux_payload;
     47struct set_config_cmd_payload;
     48struct dmub_notification;
     49
     50#define DC_VER "3.2.187"
     51
     52#define MAX_SURFACES 3
     53#define MAX_PLANES 6
     54#define MAX_STREAMS 6
     55#define MAX_SINKS_PER_LINK 4
     56#define MIN_VIEWPORT_SIZE 12
     57#define MAX_NUM_EDP 2
     58
     59/*******************************************************************************
     60 * Display Core Interfaces
     61 ******************************************************************************/
     62struct dc_versions {
     63	const char *dc_ver;
     64	struct dmcu_version dmcu_version;
     65};
     66
     67enum dp_protocol_version {
     68	DP_VERSION_1_4,
     69};
     70
     71enum dc_plane_type {
     72	DC_PLANE_TYPE_INVALID,
     73	DC_PLANE_TYPE_DCE_RGB,
     74	DC_PLANE_TYPE_DCE_UNDERLAY,
     75	DC_PLANE_TYPE_DCN_UNIVERSAL,
     76};
     77
     78// Sizes defined as multiples of 64KB
     79enum det_size {
     80	DET_SIZE_DEFAULT = 0,
     81	DET_SIZE_192KB = 3,
     82	DET_SIZE_256KB = 4,
     83	DET_SIZE_320KB = 5,
     84	DET_SIZE_384KB = 6
     85};
     86
     87
     88struct dc_plane_cap {
     89	enum dc_plane_type type;
     90	uint32_t blends_with_above : 1;
     91	uint32_t blends_with_below : 1;
     92	uint32_t per_pixel_alpha : 1;
     93	struct {
     94		uint32_t argb8888 : 1;
     95		uint32_t nv12 : 1;
     96		uint32_t fp16 : 1;
     97		uint32_t p010 : 1;
     98		uint32_t ayuv : 1;
     99	} pixel_format_support;
    100	// max upscaling factor x1000
    101	// upscaling factors are always >= 1
    102	// for example, 1080p -> 8K is 4.0, or 4000 raw value
    103	struct {
    104		uint32_t argb8888;
    105		uint32_t nv12;
    106		uint32_t fp16;
    107	} max_upscale_factor;
    108	// max downscale factor x1000
    109	// downscale factors are always <= 1
    110	// for example, 8K -> 1080p is 0.25, or 250 raw value
    111	struct {
    112		uint32_t argb8888;
    113		uint32_t nv12;
    114		uint32_t fp16;
    115	} max_downscale_factor;
    116	// minimal width/height
    117	uint32_t min_width;
    118	uint32_t min_height;
    119};
    120
    121// Color management caps (DPP and MPC)
    122struct rom_curve_caps {
    123	uint16_t srgb : 1;
    124	uint16_t bt2020 : 1;
    125	uint16_t gamma2_2 : 1;
    126	uint16_t pq : 1;
    127	uint16_t hlg : 1;
    128};
    129
    130struct dpp_color_caps {
    131	uint16_t dcn_arch : 1; // all DCE generations treated the same
    132	// input lut is different than most LUTs, just plain 256-entry lookup
    133	uint16_t input_lut_shared : 1; // shared with DGAM
    134	uint16_t icsc : 1;
    135	uint16_t dgam_ram : 1;
    136	uint16_t post_csc : 1; // before gamut remap
    137	uint16_t gamma_corr : 1;
    138
    139	// hdr_mult and gamut remap always available in DPP (in that order)
    140	// 3d lut implies shaper LUT,
    141	// it may be shared with MPC - check MPC:shared_3d_lut flag
    142	uint16_t hw_3d_lut : 1;
    143	uint16_t ogam_ram : 1; // blnd gam
    144	uint16_t ocsc : 1;
    145	uint16_t dgam_rom_for_yuv : 1;
    146	struct rom_curve_caps dgam_rom_caps;
    147	struct rom_curve_caps ogam_rom_caps;
    148};
    149
    150struct mpc_color_caps {
    151	uint16_t gamut_remap : 1;
    152	uint16_t ogam_ram : 1;
    153	uint16_t ocsc : 1;
    154	uint16_t num_3dluts : 3; //3d lut always assumes a preceding shaper LUT
    155	uint16_t shared_3d_lut:1; //can be in either DPP or MPC, but single instance
    156
    157	struct rom_curve_caps ogam_rom_caps;
    158};
    159
    160struct dc_color_caps {
    161	struct dpp_color_caps dpp;
    162	struct mpc_color_caps mpc;
    163};
    164
    165struct dc_caps {
    166	uint32_t max_streams;
    167	uint32_t max_links;
    168	uint32_t max_audios;
    169	uint32_t max_slave_planes;
    170	uint32_t max_slave_yuv_planes;
    171	uint32_t max_slave_rgb_planes;
    172	uint32_t max_planes;
    173	uint32_t max_downscale_ratio;
    174	uint32_t i2c_speed_in_khz;
    175	uint32_t i2c_speed_in_khz_hdcp;
    176	uint32_t dmdata_alloc_size;
    177	unsigned int max_cursor_size;
    178	unsigned int max_video_width;
    179	unsigned int min_horizontal_blanking_period;
    180	int linear_pitch_alignment;
    181	bool dcc_const_color;
    182	bool dynamic_audio;
    183	bool is_apu;
    184	bool dual_link_dvi;
    185	bool post_blend_color_processing;
    186	bool force_dp_tps4_for_cp2520;
    187	bool disable_dp_clk_share;
    188	bool psp_setup_panel_mode;
    189	bool extended_aux_timeout_support;
    190	bool dmcub_support;
    191	bool zstate_support;
    192	uint32_t num_of_internal_disp;
    193	enum dp_protocol_version max_dp_protocol_version;
    194	unsigned int mall_size_per_mem_channel;
    195	unsigned int mall_size_total;
    196	unsigned int cursor_cache_size;
    197	struct dc_plane_cap planes[MAX_PLANES];
    198	struct dc_color_caps color;
    199	bool dp_hpo;
    200	bool hdmi_frl_pcon_support;
    201	bool edp_dsc_support;
    202	bool vbios_lttpr_aware;
    203	bool vbios_lttpr_enable;
    204	uint32_t max_otg_num;
    205};
    206
    207struct dc_bug_wa {
    208	bool no_connect_phy_config;
    209	bool dedcn20_305_wa;
    210	bool skip_clock_update;
    211	bool lt_early_cr_pattern;
    212};
    213
    214struct dc_dcc_surface_param {
    215	struct dc_size surface_size;
    216	enum surface_pixel_format format;
    217	enum swizzle_mode_values swizzle_mode;
    218	enum dc_scan_direction scan;
    219};
    220
    221struct dc_dcc_setting {
    222	unsigned int max_compressed_blk_size;
    223	unsigned int max_uncompressed_blk_size;
    224	bool independent_64b_blks;
    225	//These bitfields to be used starting with DCN
    226	struct {
    227		uint32_t dcc_256_64_64 : 1;//available in ASICs before DCN (the worst compression case)
    228		uint32_t dcc_128_128_uncontrained : 1;  //available in ASICs before DCN
    229		uint32_t dcc_256_128_128 : 1;		//available starting with DCN
    230		uint32_t dcc_256_256_unconstrained : 1;  //available in ASICs before DCN (the best compression case)
    231	} dcc_controls;
    232};
    233
    234struct dc_surface_dcc_cap {
    235	union {
    236		struct {
    237			struct dc_dcc_setting rgb;
    238		} grph;
    239
    240		struct {
    241			struct dc_dcc_setting luma;
    242			struct dc_dcc_setting chroma;
    243		} video;
    244	};
    245
    246	bool capable;
    247	bool const_color_support;
    248};
    249
    250struct dc_static_screen_params {
    251	struct {
    252		bool force_trigger;
    253		bool cursor_update;
    254		bool surface_update;
    255		bool overlay_update;
    256	} triggers;
    257	unsigned int num_frames;
    258};
    259
    260
    261/* Surface update type is used by dc_update_surfaces_and_stream
    262 * The update type is determined at the very beginning of the function based
    263 * on parameters passed in and decides how much programming (or updating) is
    264 * going to be done during the call.
    265 *
    266 * UPDATE_TYPE_FAST is used for really fast updates that do not require much
    267 * logical calculations or hardware register programming. This update MUST be
    268 * ISR safe on windows. Currently fast update will only be used to flip surface
    269 * address.
    270 *
    271 * UPDATE_TYPE_MED is used for slower updates which require significant hw
    272 * re-programming however do not affect bandwidth consumption or clock
    273 * requirements. At present, this is the level at which front end updates
    274 * that do not require us to run bw_calcs happen. These are in/out transfer func
    275 * updates, viewport offset changes, recout size changes and pixel depth changes.
    276 * This update can be done at ISR, but we want to minimize how often this happens.
    277 *
    278 * UPDATE_TYPE_FULL is slow. Really slow. This requires us to recalculate our
    279 * bandwidth and clocks, possibly rearrange some pipes and reprogram anything front
    280 * end related. Any time viewport dimensions, recout dimensions, scaling ratios or
    281 * gamma need to be adjusted or pipe needs to be turned on (or disconnected) we do
    282 * a full update. This cannot be done at ISR level and should be a rare event.
    283 * Unless someone is stress testing mpo enter/exit, playing with colour or adjusting
    284 * underscan we don't expect to see this call at all.
    285 */
    286
    287enum surface_update_type {
    288	UPDATE_TYPE_FAST, /* super fast, safe to execute in isr */
    289	UPDATE_TYPE_MED,  /* ISR safe, most of programming needed, no bw/clk change*/
    290	UPDATE_TYPE_FULL, /* may need to shuffle resources */
    291};
    292
    293/* Forward declaration*/
    294struct dc;
    295struct dc_plane_state;
    296struct dc_state;
    297
    298
    299struct dc_cap_funcs {
    300	bool (*get_dcc_compression_cap)(const struct dc *dc,
    301			const struct dc_dcc_surface_param *input,
    302			struct dc_surface_dcc_cap *output);
    303};
    304
    305struct link_training_settings;
    306
    307union allow_lttpr_non_transparent_mode {
    308	struct {
    309		bool DP1_4A : 1;
    310		bool DP2_0 : 1;
    311	} bits;
    312	unsigned char raw;
    313};
    314
    315/* Structure to hold configuration flags set by dm at dc creation. */
    316struct dc_config {
    317	bool gpu_vm_support;
    318	bool disable_disp_pll_sharing;
    319	bool fbc_support;
    320	bool disable_fractional_pwm;
    321	bool allow_seamless_boot_optimization;
    322	bool seamless_boot_edp_requested;
    323	bool edp_not_connected;
    324	bool edp_no_power_sequencing;
    325	bool force_enum_edp;
    326	bool forced_clocks;
    327	union allow_lttpr_non_transparent_mode allow_lttpr_non_transparent_mode;
    328	bool multi_mon_pp_mclk_switch;
    329	bool disable_dmcu;
    330	bool enable_4to1MPC;
    331	bool enable_windowed_mpo_odm;
    332	uint32_t allow_edp_hotplug_detection;
    333	bool clamp_min_dcfclk;
    334	uint64_t vblank_alignment_dto_params;
    335	uint8_t  vblank_alignment_max_frame_time_diff;
    336	bool is_asymmetric_memory;
    337	bool is_single_rank_dimm;
    338	bool use_pipe_ctx_sync_logic;
    339	bool ignore_dpref_ss;
    340};
    341
    342enum visual_confirm {
    343	VISUAL_CONFIRM_DISABLE = 0,
    344	VISUAL_CONFIRM_SURFACE = 1,
    345	VISUAL_CONFIRM_HDR = 2,
    346	VISUAL_CONFIRM_MPCTREE = 4,
    347	VISUAL_CONFIRM_PSR = 5,
    348	VISUAL_CONFIRM_SWIZZLE = 9,
    349};
    350
    351enum dc_psr_power_opts {
    352	psr_power_opt_invalid = 0x0,
    353	psr_power_opt_smu_opt_static_screen = 0x1,
    354	psr_power_opt_z10_static_screen = 0x10,
    355	psr_power_opt_ds_disable_allow = 0x100,
    356};
    357
    358enum dml_hostvm_override_opts {
    359	DML_HOSTVM_NO_OVERRIDE = 0x0,
    360	DML_HOSTVM_OVERRIDE_FALSE = 0x1,
    361	DML_HOSTVM_OVERRIDE_TRUE = 0x2,
    362};
    363
    364enum dcc_option {
    365	DCC_ENABLE = 0,
    366	DCC_DISABLE = 1,
    367	DCC_HALF_REQ_DISALBE = 2,
    368};
    369
    370enum pipe_split_policy {
    371	MPC_SPLIT_DYNAMIC = 0,
    372	MPC_SPLIT_AVOID = 1,
    373	MPC_SPLIT_AVOID_MULT_DISP = 2,
    374};
    375
    376enum wm_report_mode {
    377	WM_REPORT_DEFAULT = 0,
    378	WM_REPORT_OVERRIDE = 1,
    379};
    380enum dtm_pstate{
    381	dtm_level_p0 = 0,/*highest voltage*/
    382	dtm_level_p1,
    383	dtm_level_p2,
    384	dtm_level_p3,
    385	dtm_level_p4,/*when active_display_count = 0*/
    386};
    387
    388enum dcn_pwr_state {
    389	DCN_PWR_STATE_UNKNOWN = -1,
    390	DCN_PWR_STATE_MISSION_MODE = 0,
    391	DCN_PWR_STATE_LOW_POWER = 3,
    392};
    393
    394enum dcn_zstate_support_state {
    395	DCN_ZSTATE_SUPPORT_UNKNOWN,
    396	DCN_ZSTATE_SUPPORT_ALLOW,
    397	DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY,
    398	DCN_ZSTATE_SUPPORT_DISALLOW,
    399};
    400/*
    401 * For any clocks that may differ per pipe
    402 * only the max is stored in this structure
    403 */
    404struct dc_clocks {
    405	int dispclk_khz;
    406	int actual_dispclk_khz;
    407	int dppclk_khz;
    408	int actual_dppclk_khz;
    409	int disp_dpp_voltage_level_khz;
    410	int dcfclk_khz;
    411	int socclk_khz;
    412	int dcfclk_deep_sleep_khz;
    413	int fclk_khz;
    414	int phyclk_khz;
    415	int dramclk_khz;
    416	bool p_state_change_support;
    417	enum dcn_zstate_support_state zstate_support;
    418	bool dtbclk_en;
    419	int ref_dtbclk_khz;
    420	enum dcn_pwr_state pwr_state;
    421	/*
    422	 * Elements below are not compared for the purposes of
    423	 * optimization required
    424	 */
    425	bool prev_p_state_change_support;
    426	enum dtm_pstate dtm_level;
    427	int max_supported_dppclk_khz;
    428	int max_supported_dispclk_khz;
    429	int bw_dppclk_khz; /*a copy of dppclk_khz*/
    430	int bw_dispclk_khz;
    431};
    432
    433struct dc_bw_validation_profile {
    434	bool enable;
    435
    436	unsigned long long total_ticks;
    437	unsigned long long voltage_level_ticks;
    438	unsigned long long watermark_ticks;
    439	unsigned long long rq_dlg_ticks;
    440
    441	unsigned long long total_count;
    442	unsigned long long skip_fast_count;
    443	unsigned long long skip_pass_count;
    444	unsigned long long skip_fail_count;
    445};
    446
    447#define BW_VAL_TRACE_SETUP() \
    448		unsigned long long end_tick = 0; \
    449		unsigned long long voltage_level_tick = 0; \
    450		unsigned long long watermark_tick = 0; \
    451		unsigned long long start_tick = dc->debug.bw_val_profile.enable ? \
    452				dm_get_timestamp(dc->ctx) : 0
    453
    454#define BW_VAL_TRACE_COUNT() \
    455		if (dc->debug.bw_val_profile.enable) \
    456			dc->debug.bw_val_profile.total_count++
    457
    458#define BW_VAL_TRACE_SKIP(status) \
    459		if (dc->debug.bw_val_profile.enable) { \
    460			if (!voltage_level_tick) \
    461				voltage_level_tick = dm_get_timestamp(dc->ctx); \
    462			dc->debug.bw_val_profile.skip_ ## status ## _count++; \
    463		}
    464
    465#define BW_VAL_TRACE_END_VOLTAGE_LEVEL() \
    466		if (dc->debug.bw_val_profile.enable) \
    467			voltage_level_tick = dm_get_timestamp(dc->ctx)
    468
    469#define BW_VAL_TRACE_END_WATERMARKS() \
    470		if (dc->debug.bw_val_profile.enable) \
    471			watermark_tick = dm_get_timestamp(dc->ctx)
    472
    473#define BW_VAL_TRACE_FINISH() \
    474		if (dc->debug.bw_val_profile.enable) { \
    475			end_tick = dm_get_timestamp(dc->ctx); \
    476			dc->debug.bw_val_profile.total_ticks += end_tick - start_tick; \
    477			dc->debug.bw_val_profile.voltage_level_ticks += voltage_level_tick - start_tick; \
    478			if (watermark_tick) { \
    479				dc->debug.bw_val_profile.watermark_ticks += watermark_tick - voltage_level_tick; \
    480				dc->debug.bw_val_profile.rq_dlg_ticks += end_tick - watermark_tick; \
    481			} \
    482		}
    483
    484union mem_low_power_enable_options {
    485	struct {
    486		bool vga: 1;
    487		bool i2c: 1;
    488		bool dmcu: 1;
    489		bool dscl: 1;
    490		bool cm: 1;
    491		bool mpc: 1;
    492		bool optc: 1;
    493		bool vpg: 1;
    494		bool afmt: 1;
    495	} bits;
    496	uint32_t u32All;
    497};
    498
    499union root_clock_optimization_options {
    500	struct {
    501		bool dpp: 1;
    502		bool dsc: 1;
    503		bool hdmistream: 1;
    504		bool hdmichar: 1;
    505		bool dpstream: 1;
    506		bool symclk32_se: 1;
    507		bool symclk32_le: 1;
    508		bool symclk_fe: 1;
    509		bool physymclk: 1;
    510		bool dpiasymclk: 1;
    511		uint32_t reserved: 22;
    512	} bits;
    513	uint32_t u32All;
    514};
    515
    516union dpia_debug_options {
    517	struct {
    518		uint32_t disable_dpia:1; /* bit 0 */
    519		uint32_t force_non_lttpr:1; /* bit 1 */
    520		uint32_t extend_aux_rd_interval:1; /* bit 2 */
    521		uint32_t disable_mst_dsc_work_around:1; /* bit 3 */
    522		uint32_t hpd_delay_in_ms:12; /* bits 4-15 */
    523		uint32_t disable_force_tbt3_work_around:1; /* bit 16 */
    524		uint32_t reserved:15;
    525	} bits;
    526	uint32_t raw;
    527};
    528
    529/* AUX wake work around options
    530 * 0: enable/disable work around
    531 * 1: use default timeout LINK_AUX_WAKE_TIMEOUT_MS
    532 * 15-2: reserved
    533 * 31-16: timeout in ms
    534 */
    535union aux_wake_wa_options {
    536	struct {
    537		uint32_t enable_wa : 1;
    538		uint32_t use_default_timeout : 1;
    539		uint32_t rsvd: 14;
    540		uint32_t timeout_ms : 16;
    541	} bits;
    542	uint32_t raw;
    543};
    544
    545struct dc_debug_data {
    546	uint32_t ltFailCount;
    547	uint32_t i2cErrorCount;
    548	uint32_t auxErrorCount;
    549};
    550
    551struct dc_phy_addr_space_config {
    552	struct {
    553		uint64_t start_addr;
    554		uint64_t end_addr;
    555		uint64_t fb_top;
    556		uint64_t fb_offset;
    557		uint64_t fb_base;
    558		uint64_t agp_top;
    559		uint64_t agp_bot;
    560		uint64_t agp_base;
    561	} system_aperture;
    562
    563	struct {
    564		uint64_t page_table_start_addr;
    565		uint64_t page_table_end_addr;
    566		uint64_t page_table_base_addr;
    567		bool base_addr_is_mc_addr;
    568	} gart_config;
    569
    570	bool valid;
    571	bool is_hvm_enabled;
    572	uint64_t page_table_default_page_addr;
    573};
    574
    575struct dc_virtual_addr_space_config {
    576	uint64_t	page_table_base_addr;
    577	uint64_t	page_table_start_addr;
    578	uint64_t	page_table_end_addr;
    579	uint32_t	page_table_block_size_in_bytes;
    580	uint8_t		page_table_depth; // 1 = 1 level, 2 = 2 level, etc.  0 = invalid
    581};
    582
    583struct dc_bounding_box_overrides {
    584	int sr_exit_time_ns;
    585	int sr_enter_plus_exit_time_ns;
    586	int urgent_latency_ns;
    587	int percent_of_ideal_drambw;
    588	int dram_clock_change_latency_ns;
    589	int dummy_clock_change_latency_ns;
    590	/* This forces a hard min on the DCFCLK we use
    591	 * for DML.  Unlike the debug option for forcing
    592	 * DCFCLK, this override affects watermark calculations
    593	 */
    594	int min_dcfclk_mhz;
    595};
    596
    597struct dc_state;
    598struct resource_pool;
    599struct dce_hwseq;
    600
    601struct dc_debug_options {
    602	bool native422_support;
    603	bool disable_dsc;
    604	enum visual_confirm visual_confirm;
    605	int visual_confirm_rect_height;
    606
    607	bool sanity_checks;
    608	bool max_disp_clk;
    609	bool surface_trace;
    610	bool timing_trace;
    611	bool clock_trace;
    612	bool validation_trace;
    613	bool bandwidth_calcs_trace;
    614	int max_downscale_src_width;
    615
    616	/* stutter efficiency related */
    617	bool disable_stutter;
    618	bool use_max_lb;
    619	enum dcc_option disable_dcc;
    620	enum pipe_split_policy pipe_split_policy;
    621	bool force_single_disp_pipe_split;
    622	bool voltage_align_fclk;
    623	bool disable_min_fclk;
    624
    625	bool disable_dfs_bypass;
    626	bool disable_dpp_power_gate;
    627	bool disable_hubp_power_gate;
    628	bool disable_dsc_power_gate;
    629	int dsc_min_slice_height_override;
    630	int dsc_bpp_increment_div;
    631	bool disable_pplib_wm_range;
    632	enum wm_report_mode pplib_wm_report_mode;
    633	unsigned int min_disp_clk_khz;
    634	unsigned int min_dpp_clk_khz;
    635	unsigned int min_dram_clk_khz;
    636	int sr_exit_time_dpm0_ns;
    637	int sr_enter_plus_exit_time_dpm0_ns;
    638	int sr_exit_time_ns;
    639	int sr_enter_plus_exit_time_ns;
    640	int urgent_latency_ns;
    641	uint32_t underflow_assert_delay_us;
    642	int percent_of_ideal_drambw;
    643	int dram_clock_change_latency_ns;
    644	bool optimized_watermark;
    645	int always_scale;
    646	bool disable_pplib_clock_request;
    647	bool disable_clock_gate;
    648	bool disable_mem_low_power;
    649	bool pstate_enabled;
    650	bool disable_dmcu;
    651	bool disable_psr;
    652	bool force_abm_enable;
    653	bool disable_stereo_support;
    654	bool vsr_support;
    655	bool performance_trace;
    656	bool az_endpoint_mute_only;
    657	bool always_use_regamma;
    658	bool recovery_enabled;
    659	bool avoid_vbios_exec_table;
    660	bool scl_reset_length10;
    661	bool hdmi20_disable;
    662	bool skip_detection_link_training;
    663	uint32_t edid_read_retry_times;
    664	bool remove_disconnect_edp;
    665	unsigned int force_odm_combine; //bit vector based on otg inst
    666	unsigned int seamless_boot_odm_combine;
    667	unsigned int force_odm_combine_4to1; //bit vector based on otg inst
    668	bool disable_z9_mpc;
    669	unsigned int force_fclk_khz;
    670	bool enable_tri_buf;
    671	bool dmub_offload_enabled;
    672	bool dmcub_emulation;
    673	bool disable_idle_power_optimizations;
    674	unsigned int mall_size_override;
    675	unsigned int mall_additional_timer_percent;
    676	bool mall_error_as_fatal;
    677	bool dmub_command_table; /* for testing only */
    678	struct dc_bw_validation_profile bw_val_profile;
    679	bool disable_fec;
    680	bool disable_48mhz_pwrdwn;
    681	/* This forces a hard min on the DCFCLK requested to SMU/PP
    682	 * watermarks are not affected.
    683	 */
    684	unsigned int force_min_dcfclk_mhz;
    685	int dwb_fi_phase;
    686	bool disable_timing_sync;
    687	bool cm_in_bypass;
    688	int force_clock_mode;/*every mode change.*/
    689
    690	bool disable_dram_clock_change_vactive_support;
    691	bool validate_dml_output;
    692	bool enable_dmcub_surface_flip;
    693	bool usbc_combo_phy_reset_wa;
    694	bool disable_dsc_edp;
    695	unsigned int  force_dsc_edp_policy;
    696	bool enable_dram_clock_change_one_display_vactive;
    697	/* TODO - remove once tested */
    698	bool legacy_dp2_lt;
    699	bool set_mst_en_for_sst;
    700	bool disable_uhbr;
    701	bool force_dp2_lt_fallback_method;
    702	bool ignore_cable_id;
    703	union mem_low_power_enable_options enable_mem_low_power;
    704	union root_clock_optimization_options root_clock_optimization;
    705	bool hpo_optimization;
    706	bool force_vblank_alignment;
    707
    708	/* Enable dmub aux for legacy ddc */
    709	bool enable_dmub_aux_for_legacy_ddc;
    710	bool optimize_edp_link_rate; /* eDP ILR */
    711	/* FEC/PSR1 sequence enable delay in 100us */
    712	uint8_t fec_enable_delay_in100us;
    713	bool enable_driver_sequence_debug;
    714	enum det_size crb_alloc_policy;
    715	int crb_alloc_policy_min_disp_count;
    716	bool disable_z10;
    717	bool enable_z9_disable_interface;
    718	bool enable_sw_cntl_psr;
    719	union dpia_debug_options dpia_debug;
    720	bool apply_vendor_specific_lttpr_wa;
    721	bool extended_blank_optimization;
    722	union aux_wake_wa_options aux_wake_wa;
    723	/* uses value at boot and disables switch */
    724	bool disable_dtb_ref_clk_switch;
    725	uint8_t psr_power_use_phy_fsm;
    726	enum dml_hostvm_override_opts dml_hostvm_override;
    727};
    728
    729struct gpu_info_soc_bounding_box_v1_0;
    730struct dc {
    731	struct dc_debug_options debug;
    732	struct dc_versions versions;
    733	struct dc_caps caps;
    734	struct dc_cap_funcs cap_funcs;
    735	struct dc_config config;
    736	struct dc_bounding_box_overrides bb_overrides;
    737	struct dc_bug_wa work_arounds;
    738	struct dc_context *ctx;
    739	struct dc_phy_addr_space_config vm_pa_config;
    740
    741	uint8_t link_count;
    742	struct dc_link *links[MAX_PIPES * 2];
    743
    744	struct dc_state *current_state;
    745	struct resource_pool *res_pool;
    746
    747	struct clk_mgr *clk_mgr;
    748
    749	/* Display Engine Clock levels */
    750	struct dm_pp_clock_levels sclk_lvls;
    751
    752	/* Inputs into BW and WM calculations. */
    753	struct bw_calcs_dceip *bw_dceip;
    754	struct bw_calcs_vbios *bw_vbios;
    755	struct dcn_soc_bounding_box *dcn_soc;
    756	struct dcn_ip_params *dcn_ip;
    757	struct display_mode_lib dml;
    758
    759	/* HW functions */
    760	struct hw_sequencer_funcs hwss;
    761	struct dce_hwseq *hwseq;
    762
    763	/* Require to optimize clocks and bandwidth for added/removed planes */
    764	bool optimized_required;
    765	bool wm_optimized_required;
    766	bool idle_optimizations_allowed;
    767	bool enable_c20_dtm_b0;
    768
    769	/* Require to maintain clocks and bandwidth for UEFI enabled HW */
    770
    771	/* FBC compressor */
    772	struct compressor *fbc_compressor;
    773
    774	struct dc_debug_data debug_data;
    775	struct dpcd_vendor_signature vendor_signature;
    776
    777	const char *build_id;
    778	struct vm_helper *vm_helper;
    779};
    780
    781enum frame_buffer_mode {
    782	FRAME_BUFFER_MODE_LOCAL_ONLY = 0,
    783	FRAME_BUFFER_MODE_ZFB_ONLY,
    784	FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL,
    785} ;
    786
    787struct dchub_init_data {
    788	int64_t zfb_phys_addr_base;
    789	int64_t zfb_mc_base_addr;
    790	uint64_t zfb_size_in_byte;
    791	enum frame_buffer_mode fb_mode;
    792	bool dchub_initialzied;
    793	bool dchub_info_valid;
    794};
    795
    796struct dc_init_data {
    797	struct hw_asic_id asic_id;
    798	void *driver; /* ctx */
    799	struct cgs_device *cgs_device;
    800	struct dc_bounding_box_overrides bb_overrides;
    801
    802	int num_virtual_links;
    803	/*
    804	 * If 'vbios_override' not NULL, it will be called instead
    805	 * of the real VBIOS. Intended use is Diagnostics on FPGA.
    806	 */
    807	struct dc_bios *vbios_override;
    808	enum dce_environment dce_environment;
    809
    810	struct dmub_offload_funcs *dmub_if;
    811	struct dc_reg_helper_state *dmub_offload;
    812
    813	struct dc_config flags;
    814	uint64_t log_mask;
    815
    816	struct dpcd_vendor_signature vendor_signature;
    817	bool force_smu_not_present;
    818};
    819
    820struct dc_callback_init {
    821#ifdef CONFIG_DRM_AMD_DC_HDCP
    822	struct cp_psp cp_psp;
    823#else
    824	uint8_t reserved;
    825#endif
    826};
    827
    828struct dc *dc_create(const struct dc_init_data *init_params);
    829void dc_hardware_init(struct dc *dc);
    830
    831int dc_get_vmid_use_vector(struct dc *dc);
    832void dc_setup_vm_context(struct dc *dc, struct dc_virtual_addr_space_config *va_config, int vmid);
    833/* Returns the number of vmids supported */
    834int dc_setup_system_context(struct dc *dc, struct dc_phy_addr_space_config *pa_config);
    835void dc_init_callbacks(struct dc *dc,
    836		const struct dc_callback_init *init_params);
    837void dc_deinit_callbacks(struct dc *dc);
    838void dc_destroy(struct dc **dc);
    839
    840/*******************************************************************************
    841 * Surface Interfaces
    842 ******************************************************************************/
    843
    844enum {
    845	TRANSFER_FUNC_POINTS = 1025
    846};
    847
    848struct dc_hdr_static_metadata {
    849	/* display chromaticities and white point in units of 0.00001 */
    850	unsigned int chromaticity_green_x;
    851	unsigned int chromaticity_green_y;
    852	unsigned int chromaticity_blue_x;
    853	unsigned int chromaticity_blue_y;
    854	unsigned int chromaticity_red_x;
    855	unsigned int chromaticity_red_y;
    856	unsigned int chromaticity_white_point_x;
    857	unsigned int chromaticity_white_point_y;
    858
    859	uint32_t min_luminance;
    860	uint32_t max_luminance;
    861	uint32_t maximum_content_light_level;
    862	uint32_t maximum_frame_average_light_level;
    863};
    864
    865enum dc_transfer_func_type {
    866	TF_TYPE_PREDEFINED,
    867	TF_TYPE_DISTRIBUTED_POINTS,
    868	TF_TYPE_BYPASS,
    869	TF_TYPE_HWPWL
    870};
    871
    872struct dc_transfer_func_distributed_points {
    873	struct fixed31_32 red[TRANSFER_FUNC_POINTS];
    874	struct fixed31_32 green[TRANSFER_FUNC_POINTS];
    875	struct fixed31_32 blue[TRANSFER_FUNC_POINTS];
    876
    877	uint16_t end_exponent;
    878	uint16_t x_point_at_y1_red;
    879	uint16_t x_point_at_y1_green;
    880	uint16_t x_point_at_y1_blue;
    881};
    882
    883enum dc_transfer_func_predefined {
    884	TRANSFER_FUNCTION_SRGB,
    885	TRANSFER_FUNCTION_BT709,
    886	TRANSFER_FUNCTION_PQ,
    887	TRANSFER_FUNCTION_LINEAR,
    888	TRANSFER_FUNCTION_UNITY,
    889	TRANSFER_FUNCTION_HLG,
    890	TRANSFER_FUNCTION_HLG12,
    891	TRANSFER_FUNCTION_GAMMA22,
    892	TRANSFER_FUNCTION_GAMMA24,
    893	TRANSFER_FUNCTION_GAMMA26
    894};
    895
    896
    897struct dc_transfer_func {
    898	struct kref refcount;
    899	enum dc_transfer_func_type type;
    900	enum dc_transfer_func_predefined tf;
    901	/* FP16 1.0 reference level in nits, default is 80 nits, only for PQ*/
    902	uint32_t sdr_ref_white_level;
    903	union {
    904		struct pwl_params pwl;
    905		struct dc_transfer_func_distributed_points tf_pts;
    906	};
    907};
    908
    909
    910union dc_3dlut_state {
    911	struct {
    912		uint32_t initialized:1;		/*if 3dlut is went through color module for initialization */
    913		uint32_t rmu_idx_valid:1;	/*if mux settings are valid*/
    914		uint32_t rmu_mux_num:3;		/*index of mux to use*/
    915		uint32_t mpc_rmu0_mux:4;	/*select mpcc on mux, one of the following : mpcc0, mpcc1, mpcc2, mpcc3*/
    916		uint32_t mpc_rmu1_mux:4;
    917		uint32_t mpc_rmu2_mux:4;
    918		uint32_t reserved:15;
    919	} bits;
    920	uint32_t raw;
    921};
    922
    923
    924struct dc_3dlut {
    925	struct kref refcount;
    926	struct tetrahedral_params lut_3d;
    927	struct fixed31_32 hdr_multiplier;
    928	union dc_3dlut_state state;
    929};
    930/*
    931 * This structure is filled in by dc_surface_get_status and contains
    932 * the last requested address and the currently active address so the called
    933 * can determine if there are any outstanding flips
    934 */
    935struct dc_plane_status {
    936	struct dc_plane_address requested_address;
    937	struct dc_plane_address current_address;
    938	bool is_flip_pending;
    939	bool is_right_eye;
    940};
    941
    942union surface_update_flags {
    943
    944	struct {
    945		uint32_t addr_update:1;
    946		/* Medium updates */
    947		uint32_t dcc_change:1;
    948		uint32_t color_space_change:1;
    949		uint32_t horizontal_mirror_change:1;
    950		uint32_t per_pixel_alpha_change:1;
    951		uint32_t global_alpha_change:1;
    952		uint32_t hdr_mult:1;
    953		uint32_t rotation_change:1;
    954		uint32_t swizzle_change:1;
    955		uint32_t scaling_change:1;
    956		uint32_t position_change:1;
    957		uint32_t in_transfer_func_change:1;
    958		uint32_t input_csc_change:1;
    959		uint32_t coeff_reduction_change:1;
    960		uint32_t output_tf_change:1;
    961		uint32_t pixel_format_change:1;
    962		uint32_t plane_size_change:1;
    963		uint32_t gamut_remap_change:1;
    964
    965		/* Full updates */
    966		uint32_t new_plane:1;
    967		uint32_t bpp_change:1;
    968		uint32_t gamma_change:1;
    969		uint32_t bandwidth_change:1;
    970		uint32_t clock_change:1;
    971		uint32_t stereo_format_change:1;
    972		uint32_t lut_3d:1;
    973		uint32_t full_update:1;
    974	} bits;
    975
    976	uint32_t raw;
    977};
    978
    979struct dc_plane_state {
    980	struct dc_plane_address address;
    981	struct dc_plane_flip_time time;
    982	bool triplebuffer_flips;
    983	struct scaling_taps scaling_quality;
    984	struct rect src_rect;
    985	struct rect dst_rect;
    986	struct rect clip_rect;
    987
    988	struct plane_size plane_size;
    989	union dc_tiling_info tiling_info;
    990
    991	struct dc_plane_dcc_param dcc;
    992
    993	struct dc_gamma *gamma_correction;
    994	struct dc_transfer_func *in_transfer_func;
    995	struct dc_bias_and_scale *bias_and_scale;
    996	struct dc_csc_transform input_csc_color_matrix;
    997	struct fixed31_32 coeff_reduction_factor;
    998	struct fixed31_32 hdr_mult;
    999	struct colorspace_transform gamut_remap_matrix;
   1000
   1001	// TODO: No longer used, remove
   1002	struct dc_hdr_static_metadata hdr_static_ctx;
   1003
   1004	enum dc_color_space color_space;
   1005
   1006	struct dc_3dlut *lut3d_func;
   1007	struct dc_transfer_func *in_shaper_func;
   1008	struct dc_transfer_func *blend_tf;
   1009
   1010	struct dc_transfer_func *gamcor_tf;
   1011	enum surface_pixel_format format;
   1012	enum dc_rotation_angle rotation;
   1013	enum plane_stereo_format stereo_format;
   1014
   1015	bool is_tiling_rotated;
   1016	bool per_pixel_alpha;
   1017	bool pre_multiplied_alpha;
   1018	bool global_alpha;
   1019	int  global_alpha_value;
   1020	bool visible;
   1021	bool flip_immediate;
   1022	bool horizontal_mirror;
   1023	int layer_index;
   1024
   1025	union surface_update_flags update_flags;
   1026	bool flip_int_enabled;
   1027	bool skip_manual_trigger;
   1028
   1029	/* private to DC core */
   1030	struct dc_plane_status status;
   1031	struct dc_context *ctx;
   1032
   1033	/* HACK: Workaround for forcing full reprogramming under some conditions */
   1034	bool force_full_update;
   1035
   1036	/* private to dc_surface.c */
   1037	enum dc_irq_source irq_source;
   1038	struct kref refcount;
   1039};
   1040
   1041struct dc_plane_info {
   1042	struct plane_size plane_size;
   1043	union dc_tiling_info tiling_info;
   1044	struct dc_plane_dcc_param dcc;
   1045	enum surface_pixel_format format;
   1046	enum dc_rotation_angle rotation;
   1047	enum plane_stereo_format stereo_format;
   1048	enum dc_color_space color_space;
   1049	bool horizontal_mirror;
   1050	bool visible;
   1051	bool per_pixel_alpha;
   1052	bool pre_multiplied_alpha;
   1053	bool global_alpha;
   1054	int  global_alpha_value;
   1055	bool input_csc_enabled;
   1056	int layer_index;
   1057};
   1058
   1059struct dc_scaling_info {
   1060	struct rect src_rect;
   1061	struct rect dst_rect;
   1062	struct rect clip_rect;
   1063	struct scaling_taps scaling_quality;
   1064};
   1065
   1066struct dc_surface_update {
   1067	struct dc_plane_state *surface;
   1068
   1069	/* isr safe update parameters.  null means no updates */
   1070	const struct dc_flip_addrs *flip_addr;
   1071	const struct dc_plane_info *plane_info;
   1072	const struct dc_scaling_info *scaling_info;
   1073	struct fixed31_32 hdr_mult;
   1074	/* following updates require alloc/sleep/spin that is not isr safe,
   1075	 * null means no updates
   1076	 */
   1077	const struct dc_gamma *gamma;
   1078	const struct dc_transfer_func *in_transfer_func;
   1079
   1080	const struct dc_csc_transform *input_csc_color_matrix;
   1081	const struct fixed31_32 *coeff_reduction_factor;
   1082	const struct dc_transfer_func *func_shaper;
   1083	const struct dc_3dlut *lut3d_func;
   1084	const struct dc_transfer_func *blend_tf;
   1085	const struct colorspace_transform *gamut_remap_matrix;
   1086};
   1087
   1088/*
   1089 * Create a new surface with default parameters;
   1090 */
   1091struct dc_plane_state *dc_create_plane_state(struct dc *dc);
   1092const struct dc_plane_status *dc_plane_get_status(
   1093		const struct dc_plane_state *plane_state);
   1094
   1095void dc_plane_state_retain(struct dc_plane_state *plane_state);
   1096void dc_plane_state_release(struct dc_plane_state *plane_state);
   1097
   1098void dc_gamma_retain(struct dc_gamma *dc_gamma);
   1099void dc_gamma_release(struct dc_gamma **dc_gamma);
   1100struct dc_gamma *dc_create_gamma(void);
   1101
   1102void dc_transfer_func_retain(struct dc_transfer_func *dc_tf);
   1103void dc_transfer_func_release(struct dc_transfer_func *dc_tf);
   1104struct dc_transfer_func *dc_create_transfer_func(void);
   1105
   1106struct dc_3dlut *dc_create_3dlut_func(void);
   1107void dc_3dlut_func_release(struct dc_3dlut *lut);
   1108void dc_3dlut_func_retain(struct dc_3dlut *lut);
   1109
   1110void dc_post_update_surfaces_to_stream(
   1111		struct dc *dc);
   1112
   1113#include "dc_stream.h"
   1114
   1115/*
   1116 * Structure to store surface/stream associations for validation
   1117 */
   1118struct dc_validation_set {
   1119	struct dc_stream_state *stream;
   1120	struct dc_plane_state *plane_states[MAX_SURFACES];
   1121	uint8_t plane_count;
   1122};
   1123
   1124bool dc_validate_boot_timing(const struct dc *dc,
   1125				const struct dc_sink *sink,
   1126				struct dc_crtc_timing *crtc_timing);
   1127
   1128enum dc_status dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state);
   1129
   1130void get_clock_requirements_for_state(struct dc_state *state, struct AsicStateEx *info);
   1131
   1132bool dc_set_generic_gpio_for_stereo(bool enable,
   1133		struct gpio_service *gpio_service);
   1134
   1135/*
   1136 * fast_validate: we return after determining if we can support the new state,
   1137 * but before we populate the programming info
   1138 */
   1139enum dc_status dc_validate_global_state(
   1140		struct dc *dc,
   1141		struct dc_state *new_ctx,
   1142		bool fast_validate);
   1143
   1144
   1145void dc_resource_state_construct(
   1146		const struct dc *dc,
   1147		struct dc_state *dst_ctx);
   1148
   1149bool dc_acquire_release_mpc_3dlut(
   1150		struct dc *dc, bool acquire,
   1151		struct dc_stream_state *stream,
   1152		struct dc_3dlut **lut,
   1153		struct dc_transfer_func **shaper);
   1154
   1155void dc_resource_state_copy_construct(
   1156		const struct dc_state *src_ctx,
   1157		struct dc_state *dst_ctx);
   1158
   1159void dc_resource_state_copy_construct_current(
   1160		const struct dc *dc,
   1161		struct dc_state *dst_ctx);
   1162
   1163void dc_resource_state_destruct(struct dc_state *context);
   1164
   1165bool dc_resource_is_dsc_encoding_supported(const struct dc *dc);
   1166
   1167/*
   1168 * TODO update to make it about validation sets
   1169 * Set up streams and links associated to drive sinks
   1170 * The streams parameter is an absolute set of all active streams.
   1171 *
   1172 * After this call:
   1173 *   Phy, Encoder, Timing Generator are programmed and enabled.
   1174 *   New streams are enabled with blank stream; no memory read.
   1175 */
   1176bool dc_commit_state(struct dc *dc, struct dc_state *context);
   1177
   1178struct dc_state *dc_create_state(struct dc *dc);
   1179struct dc_state *dc_copy_state(struct dc_state *src_ctx);
   1180void dc_retain_state(struct dc_state *context);
   1181void dc_release_state(struct dc_state *context);
   1182
   1183/*******************************************************************************
   1184 * Link Interfaces
   1185 ******************************************************************************/
   1186
   1187struct dpcd_caps {
   1188	union dpcd_rev dpcd_rev;
   1189	union max_lane_count max_ln_count;
   1190	union max_down_spread max_down_spread;
   1191	union dprx_feature dprx_feature;
   1192
   1193	/* valid only for eDP v1.4 or higher*/
   1194	uint8_t edp_supported_link_rates_count;
   1195	enum dc_link_rate edp_supported_link_rates[8];
   1196
   1197	/* dongle type (DP converter, CV smart dongle) */
   1198	enum display_dongle_type dongle_type;
   1199	bool is_dongle_type_one;
   1200	/* branch device or sink device */
   1201	bool is_branch_dev;
   1202	/* Dongle's downstream count. */
   1203	union sink_count sink_count;
   1204	bool is_mst_capable;
   1205	/* If dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER,
   1206	indicates 'Frame Sequential-to-lllFrame Pack' conversion capability.*/
   1207	struct dc_dongle_caps dongle_caps;
   1208
   1209	uint32_t sink_dev_id;
   1210	int8_t sink_dev_id_str[6];
   1211	int8_t sink_hw_revision;
   1212	int8_t sink_fw_revision[2];
   1213
   1214	uint32_t branch_dev_id;
   1215	int8_t branch_dev_name[6];
   1216	int8_t branch_hw_revision;
   1217	int8_t branch_fw_revision[2];
   1218
   1219	bool allow_invalid_MSA_timing_param;
   1220	bool panel_mode_edp;
   1221	bool dpcd_display_control_capable;
   1222	bool ext_receiver_cap_field_present;
   1223	bool dynamic_backlight_capable_edp;
   1224	union dpcd_fec_capability fec_cap;
   1225	struct dpcd_dsc_capabilities dsc_caps;
   1226	struct dc_lttpr_caps lttpr_caps;
   1227	struct dpcd_usb4_dp_tunneling_info usb4_dp_tun_info;
   1228
   1229	union dp_128b_132b_supported_link_rates dp_128b_132b_supported_link_rates;
   1230	union dp_main_line_channel_coding_cap channel_coding_cap;
   1231	union dp_sink_video_fallback_formats fallback_formats;
   1232	union dp_fec_capability1 fec_cap1;
   1233	union dp_cable_id cable_id;
   1234	uint8_t edp_rev;
   1235	union edp_alpm_caps alpm_caps;
   1236	struct edp_psr_info psr_info;
   1237};
   1238
   1239union dpcd_sink_ext_caps {
   1240	struct {
   1241		/* 0 - Sink supports backlight adjust via PWM during SDR/HDR mode
   1242		 * 1 - Sink supports backlight adjust via AUX during SDR/HDR mode.
   1243		 */
   1244		uint8_t sdr_aux_backlight_control : 1;
   1245		uint8_t hdr_aux_backlight_control : 1;
   1246		uint8_t reserved_1 : 2;
   1247		uint8_t oled : 1;
   1248		uint8_t reserved : 3;
   1249	} bits;
   1250	uint8_t raw;
   1251};
   1252
   1253#if defined(CONFIG_DRM_AMD_DC_HDCP)
   1254union hdcp_rx_caps {
   1255	struct {
   1256		uint8_t version;
   1257		uint8_t reserved;
   1258		struct {
   1259			uint8_t repeater	: 1;
   1260			uint8_t hdcp_capable	: 1;
   1261			uint8_t reserved	: 6;
   1262		} byte0;
   1263	} fields;
   1264	uint8_t raw[3];
   1265};
   1266
   1267union hdcp_bcaps {
   1268	struct {
   1269		uint8_t HDCP_CAPABLE:1;
   1270		uint8_t REPEATER:1;
   1271		uint8_t RESERVED:6;
   1272	} bits;
   1273	uint8_t raw;
   1274};
   1275
   1276struct hdcp_caps {
   1277	union hdcp_rx_caps rx_caps;
   1278	union hdcp_bcaps bcaps;
   1279};
   1280#endif
   1281
   1282#include "dc_link.h"
   1283
   1284uint32_t dc_get_opp_for_plane(struct dc *dc, struct dc_plane_state *plane);
   1285
   1286/*******************************************************************************
   1287 * Sink Interfaces - A sink corresponds to a display output device
   1288 ******************************************************************************/
   1289
   1290struct dc_container_id {
   1291	// 128bit GUID in binary form
   1292	unsigned char  guid[16];
   1293	// 8 byte port ID -> ELD.PortID
   1294	unsigned int   portId[2];
   1295	// 128bit GUID in binary formufacturer name -> ELD.ManufacturerName
   1296	unsigned short manufacturerName;
   1297	// 2 byte product code -> ELD.ProductCode
   1298	unsigned short productCode;
   1299};
   1300
   1301
   1302struct dc_sink_dsc_caps {
   1303	// 'true' if these are virtual DPCD's DSC caps (immediately upstream of sink in MST topology),
   1304	// 'false' if they are sink's DSC caps
   1305	bool is_virtual_dpcd_dsc;
   1306#if defined(CONFIG_DRM_AMD_DC_DCN)
   1307	// 'true' if MST topology supports DSC passthrough for sink
   1308	// 'false' if MST topology does not support DSC passthrough
   1309	bool is_dsc_passthrough_supported;
   1310#endif
   1311	struct dsc_dec_dpcd_caps dsc_dec_caps;
   1312};
   1313
   1314struct dc_sink_fec_caps {
   1315	bool is_rx_fec_supported;
   1316	bool is_topology_fec_supported;
   1317};
   1318
   1319/*
   1320 * The sink structure contains EDID and other display device properties
   1321 */
   1322struct dc_sink {
   1323	enum signal_type sink_signal;
   1324	struct dc_edid dc_edid; /* raw edid */
   1325	struct dc_edid_caps edid_caps; /* parse display caps */
   1326	struct dc_container_id *dc_container_id;
   1327	uint32_t dongle_max_pix_clk;
   1328	void *priv;
   1329	struct stereo_3d_features features_3d[TIMING_3D_FORMAT_MAX];
   1330	bool converter_disable_audio;
   1331
   1332	struct dc_sink_dsc_caps dsc_caps;
   1333	struct dc_sink_fec_caps fec_caps;
   1334
   1335	bool is_vsc_sdp_colorimetry_supported;
   1336
   1337	/* private to DC core */
   1338	struct dc_link *link;
   1339	struct dc_context *ctx;
   1340
   1341	uint32_t sink_id;
   1342
   1343	/* private to dc_sink.c */
   1344	// refcount must be the last member in dc_sink, since we want the
   1345	// sink structure to be logically cloneable up to (but not including)
   1346	// refcount
   1347	struct kref refcount;
   1348};
   1349
   1350void dc_sink_retain(struct dc_sink *sink);
   1351void dc_sink_release(struct dc_sink *sink);
   1352
   1353struct dc_sink_init_data {
   1354	enum signal_type sink_signal;
   1355	struct dc_link *link;
   1356	uint32_t dongle_max_pix_clk;
   1357	bool converter_disable_audio;
   1358};
   1359
   1360bool dc_extended_blank_supported(struct dc *dc);
   1361
   1362struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params);
   1363
   1364/* Newer interfaces  */
   1365struct dc_cursor {
   1366	struct dc_plane_address address;
   1367	struct dc_cursor_attributes attributes;
   1368};
   1369
   1370
   1371/*******************************************************************************
   1372 * Interrupt interfaces
   1373 ******************************************************************************/
   1374enum dc_irq_source dc_interrupt_to_irq_source(
   1375		struct dc *dc,
   1376		uint32_t src_id,
   1377		uint32_t ext_id);
   1378bool dc_interrupt_set(struct dc *dc, enum dc_irq_source src, bool enable);
   1379void dc_interrupt_ack(struct dc *dc, enum dc_irq_source src);
   1380enum dc_irq_source dc_get_hpd_irq_source_at_index(
   1381		struct dc *dc, uint32_t link_index);
   1382
   1383void dc_notify_vsync_int_state(struct dc *dc, struct dc_stream_state *stream, bool enable);
   1384
   1385/*******************************************************************************
   1386 * Power Interfaces
   1387 ******************************************************************************/
   1388
   1389void dc_set_power_state(
   1390		struct dc *dc,
   1391		enum dc_acpi_cm_power_state power_state);
   1392void dc_resume(struct dc *dc);
   1393
   1394void dc_power_down_on_boot(struct dc *dc);
   1395
   1396#if defined(CONFIG_DRM_AMD_DC_HDCP)
   1397/*
   1398 * HDCP Interfaces
   1399 */
   1400enum hdcp_message_status dc_process_hdcp_msg(
   1401		enum signal_type signal,
   1402		struct dc_link *link,
   1403		struct hdcp_protection_message *message_info);
   1404#endif
   1405bool dc_is_dmcu_initialized(struct dc *dc);
   1406
   1407enum dc_status dc_set_clock(struct dc *dc, enum dc_clock_type clock_type, uint32_t clk_khz, uint32_t stepping);
   1408void dc_get_clock(struct dc *dc, enum dc_clock_type clock_type, struct dc_clock_config *clock_cfg);
   1409
   1410bool dc_is_plane_eligible_for_idle_optimizations(struct dc *dc, struct dc_plane_state *plane,
   1411				struct dc_cursor_attributes *cursor_attr);
   1412
   1413void dc_allow_idle_optimizations(struct dc *dc, bool allow);
   1414
   1415/*
   1416 * blank all streams, and set min and max memory clock to
   1417 * lowest and highest DPM level, respectively
   1418 */
   1419void dc_unlock_memory_clock_frequency(struct dc *dc);
   1420
   1421/*
   1422 * set min memory clock to the min required for current mode,
   1423 * max to maxDPM, and unblank streams
   1424 */
   1425void dc_lock_memory_clock_frequency(struct dc *dc);
   1426
   1427/* set soft max for memclk, to be used for AC/DC switching clock limitations */
   1428void dc_enable_dcmode_clk_limit(struct dc *dc, bool enable);
   1429
   1430/* cleanup on driver unload */
   1431void dc_hardware_release(struct dc *dc);
   1432
   1433bool dc_set_psr_allow_active(struct dc *dc, bool enable);
   1434void dc_z10_restore(const struct dc *dc);
   1435void dc_z10_save_init(struct dc *dc);
   1436
   1437bool dc_is_dmub_outbox_supported(struct dc *dc);
   1438bool dc_enable_dmub_notifications(struct dc *dc);
   1439
   1440void dc_enable_dmub_outbox(struct dc *dc);
   1441
   1442bool dc_process_dmub_aux_transfer_async(struct dc *dc,
   1443				uint32_t link_index,
   1444				struct aux_payload *payload);
   1445
   1446/* Get dc link index from dpia port index */
   1447uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
   1448				uint8_t dpia_port_index);
   1449
   1450bool dc_process_dmub_set_config_async(struct dc *dc,
   1451				uint32_t link_index,
   1452				struct set_config_cmd_payload *payload,
   1453				struct dmub_notification *notify);
   1454
   1455enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc,
   1456				uint32_t link_index,
   1457				uint8_t mst_alloc_slots,
   1458				uint8_t *mst_slots_in_use);
   1459
   1460/*******************************************************************************
   1461 * DSC Interfaces
   1462 ******************************************************************************/
   1463#include "dc_dsc.h"
   1464
   1465/*******************************************************************************
   1466 * Disable acc mode Interfaces
   1467 ******************************************************************************/
   1468void dc_disable_accelerated_mode(struct dc *dc);
   1469
   1470#endif /* DC_INTERFACE_H_ */