xref: /openbmc/linux/drivers/gpu/drm/amd/display/dc/inc/link.h (revision a8728dbb)
14370f72eSWenjing Liu /*
24370f72eSWenjing Liu  * Copyright 2022 Advanced Micro Devices, Inc.
34370f72eSWenjing Liu  *
44370f72eSWenjing Liu  * Permission is hereby granted, free of charge, to any person obtaining a
54370f72eSWenjing Liu  * copy of this software and associated documentation files (the "Software"),
64370f72eSWenjing Liu  * to deal in the Software without restriction, including without limitation
74370f72eSWenjing Liu  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
84370f72eSWenjing Liu  * and/or sell copies of the Software, and to permit persons to whom the
94370f72eSWenjing Liu  * Software is furnished to do so, subject to the following conditions:
104370f72eSWenjing Liu  *
114370f72eSWenjing Liu  * The above copyright notice and this permission notice shall be included in
124370f72eSWenjing Liu  * all copies or substantial portions of the Software.
134370f72eSWenjing Liu  *
144370f72eSWenjing Liu  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
154370f72eSWenjing Liu  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164370f72eSWenjing Liu  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
174370f72eSWenjing Liu  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
184370f72eSWenjing Liu  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
194370f72eSWenjing Liu  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
204370f72eSWenjing Liu  * OTHER DEALINGS IN THE SOFTWARE.
214370f72eSWenjing Liu  *
224370f72eSWenjing Liu  * Authors: AMD
234370f72eSWenjing Liu  *
244370f72eSWenjing Liu  */
254370f72eSWenjing Liu 
264370f72eSWenjing Liu #ifndef __DC_LINK_H__
274370f72eSWenjing Liu #define __DC_LINK_H__
284370f72eSWenjing Liu 
294370f72eSWenjing Liu /* FILE POLICY AND INTENDED USAGE:
304370f72eSWenjing Liu  *
3198ce7d32SWenjing Liu  * This header defines link component function interfaces aka link_service.
3298ce7d32SWenjing Liu  * link_service provides the only entry point to link functions with function
3398ce7d32SWenjing Liu  * pointer style. This header is strictly private in dc and should never be
3498ce7d32SWenjing Liu  * included by DM because it exposes too much dc detail including all dc
3598ce7d32SWenjing Liu  * private types defined in core_types.h. Otherwise it will break DM - DC
3698ce7d32SWenjing Liu  * encapsulation and turn DM into a maintenance nightmare.
3798ce7d32SWenjing Liu  *
3898ce7d32SWenjing Liu  * The following shows a link component relation map.
3998ce7d32SWenjing Liu  *
4098ce7d32SWenjing Liu  * DM to DC:
4198ce7d32SWenjing Liu  * DM includes dc.h
4298ce7d32SWenjing Liu  * dc_link_exports.c or other dc files implement dc.h
4398ce7d32SWenjing Liu  *
4498ce7d32SWenjing Liu  * DC to Link:
4598ce7d32SWenjing Liu  * dc_link_exports.c or other dc files include link.h
4698ce7d32SWenjing Liu  * link_factory.c implements link.h
4798ce7d32SWenjing Liu  *
4898ce7d32SWenjing Liu  * Link sub-component to Link sub-component:
4998ce7d32SWenjing Liu  * link_factory.c includes --> link_xxx.h
5098ce7d32SWenjing Liu  * link_xxx.c implements link_xxx.h
5198ce7d32SWenjing Liu 
5298ce7d32SWenjing Liu  * As you can see if you ever need to add a new dc link function and call it on
5398ce7d32SWenjing Liu  * DM/dc side, it is very difficult because you will need layers of translation.
5498ce7d32SWenjing Liu  * The most appropriate approach to implement new requirements on DM/dc side is
5598ce7d32SWenjing Liu  * to extend or generalize the functionality of existing link function
5698ce7d32SWenjing Liu  * interfaces so minimal modification is needed outside link component to
5798ce7d32SWenjing Liu  * achieve your new requirements. This approach reduces or even eliminates the
5898ce7d32SWenjing Liu  * effort needed outside link component to support a new link feature. This also
5998ce7d32SWenjing Liu  * reduces code discrepancy among DMs to support the same link feature. If we
6098ce7d32SWenjing Liu  * test full code path on one version of DM, and there is no feature specific
6198ce7d32SWenjing Liu  * modification required on other DMs, then we can have higher confidence that
6298ce7d32SWenjing Liu  * the feature will run on other DMs and produce the same result. The following
6398ce7d32SWenjing Liu  * are some good examples to start with:
6498ce7d32SWenjing Liu  *
6598ce7d32SWenjing Liu  * - detect_link --> to add new link detection or capability retrieval routines
6698ce7d32SWenjing Liu  *
6798ce7d32SWenjing Liu  * - validate_mode_timing --> to add new timing validation conditions
6898ce7d32SWenjing Liu  *
6998ce7d32SWenjing Liu  * - set_dpms_on/set_dpms_off --> to include new link enablement sequences
7098ce7d32SWenjing Liu  *
7198ce7d32SWenjing Liu  * If you must add new link functions, you will need to:
7298ce7d32SWenjing Liu  * 1. declare the function pointer here under the suitable commented category.
7398ce7d32SWenjing Liu  * 2. Implement your function in the suitable link_xxx.c file.
7498ce7d32SWenjing Liu  * 3. Assign the function to link_service in link_factory.c
7598ce7d32SWenjing Liu  * 4. NEVER include link_xxx.h headers outside link component.
7698ce7d32SWenjing Liu  * 5. NEVER include link.h on DM side.
774370f72eSWenjing Liu  */
784370f72eSWenjing Liu #include "core_types.h"
794370f72eSWenjing Liu 
8098ce7d32SWenjing Liu struct link_service *link_create_link_service(void);
8198ce7d32SWenjing Liu void link_destroy_link_service(struct link_service **link_srv);
8298ce7d32SWenjing Liu 
8354618888SWenjing Liu struct link_init_data {
8454618888SWenjing Liu 	const struct dc *dc;
8554618888SWenjing Liu 	struct dc_context *ctx; /* TODO: remove 'dal' when DC is complete. */
8654618888SWenjing Liu 	uint32_t connector_index; /* this will be mapped to the HPD pins */
8754618888SWenjing Liu 	uint32_t link_index; /* this is mapped to DAL display_index
8854618888SWenjing Liu 				TODO: remove it when DC is complete. */
8954618888SWenjing Liu 	bool is_dpia_link;
9054618888SWenjing Liu };
9154618888SWenjing Liu 
9298ce7d32SWenjing Liu struct ddc_service_init_data {
9398ce7d32SWenjing Liu 	struct graphics_object_id id;
9498ce7d32SWenjing Liu 	struct dc_context *ctx;
9598ce7d32SWenjing Liu 	struct dc_link *link;
9698ce7d32SWenjing Liu 	bool is_dpia_link;
9798ce7d32SWenjing Liu };
9898ce7d32SWenjing Liu 
9936516001SWenjing Liu struct link_service {
10098ce7d32SWenjing Liu 	/************************** Factory ***********************************/
10198ce7d32SWenjing Liu 	struct dc_link *(*create_link)(
10298ce7d32SWenjing Liu 			const struct link_init_data *init_params);
10398ce7d32SWenjing Liu 	void (*destroy_link)(struct dc_link **link);
10498ce7d32SWenjing Liu 
10598ce7d32SWenjing Liu 
10698ce7d32SWenjing Liu 	/************************** Detection *********************************/
10798ce7d32SWenjing Liu 	bool (*detect_link)(struct dc_link *link, enum dc_detect_reason reason);
10898ce7d32SWenjing Liu 	bool (*detect_connection_type)(struct dc_link *link,
10998ce7d32SWenjing Liu 			enum dc_connection_type *type);
11076f5dc40SWenjing Liu 	struct dc_sink *(*add_remote_sink)(
11176f5dc40SWenjing Liu 			struct dc_link *link,
11276f5dc40SWenjing Liu 			const uint8_t *edid,
11376f5dc40SWenjing Liu 			int len,
11476f5dc40SWenjing Liu 			struct dc_sink_init_data *init_data);
11576f5dc40SWenjing Liu 	void (*remove_remote_sink)(struct dc_link *link, struct dc_sink *sink);
116202a3816SWenjing Liu 	bool (*get_hpd_state)(struct dc_link *link);
11798ce7d32SWenjing Liu 	struct gpio *(*get_hpd_gpio)(struct dc_bios *dcb,
11898ce7d32SWenjing Liu 			struct graphics_object_id link_id,
11998ce7d32SWenjing Liu 			struct gpio_service *gpio_service);
120202a3816SWenjing Liu 	void (*enable_hpd)(const struct dc_link *link);
121202a3816SWenjing Liu 	void (*disable_hpd)(const struct dc_link *link);
122202a3816SWenjing Liu 	void (*enable_hpd_filter)(struct dc_link *link, bool enable);
12398ce7d32SWenjing Liu 	bool (*reset_cur_dp_mst_topology)(struct dc_link *link);
12498ce7d32SWenjing Liu 	const struct dc_link_status *(*get_status)(const struct dc_link *link);
12598ce7d32SWenjing Liu 	bool (*is_hdcp1x_supported)(struct dc_link *link,
12698ce7d32SWenjing Liu 			enum signal_type signal);
12798ce7d32SWenjing Liu 	bool (*is_hdcp2x_supported)(struct dc_link *link,
12898ce7d32SWenjing Liu 			enum signal_type signal);
12998ce7d32SWenjing Liu 	void (*clear_dprx_states)(struct dc_link *link);
130202a3816SWenjing Liu 
13198ce7d32SWenjing Liu 
13298ce7d32SWenjing Liu 	/*************************** Resource *********************************/
13398ce7d32SWenjing Liu 	void (*get_cur_res_map)(const struct dc *dc, uint32_t *map);
13498ce7d32SWenjing Liu 	void (*restore_res_map)(const struct dc *dc, uint32_t *map);
13598ce7d32SWenjing Liu 	void (*get_cur_link_res)(const struct dc_link *link,
13698ce7d32SWenjing Liu 			struct link_resource *link_res);
13798ce7d32SWenjing Liu 
13898ce7d32SWenjing Liu 
13998ce7d32SWenjing Liu 	/*************************** Validation *******************************/
14098ce7d32SWenjing Liu 	enum dc_status (*validate_mode_timing)(
14198ce7d32SWenjing Liu 			const struct dc_stream_state *stream,
14298ce7d32SWenjing Liu 			struct dc_link *link,
14398ce7d32SWenjing Liu 			const struct dc_crtc_timing *timing);
14498ce7d32SWenjing Liu 	uint32_t (*dp_link_bandwidth_kbps)(
14598ce7d32SWenjing Liu 		const struct dc_link *link,
14698ce7d32SWenjing Liu 		const struct dc_link_settings *link_settings);
147a8b53760SMustapha Ghaddar 	bool (*validate_dpia_bandwidth)(
148a8b53760SMustapha Ghaddar 			const struct dc_stream_state *stream,
149a8b53760SMustapha Ghaddar 			const unsigned int num_streams);
15098ce7d32SWenjing Liu 
15198ce7d32SWenjing Liu 
15298ce7d32SWenjing Liu 	/*************************** DPMS *************************************/
15398ce7d32SWenjing Liu 	void (*set_dpms_on)(struct dc_state *state, struct pipe_ctx *pipe_ctx);
15498ce7d32SWenjing Liu 	void (*set_dpms_off)(struct pipe_ctx *pipe_ctx);
15598ce7d32SWenjing Liu 	void (*resume)(struct dc_link *link);
15698ce7d32SWenjing Liu 	void (*blank_all_dp_displays)(struct dc *dc);
15798ce7d32SWenjing Liu 	void (*blank_all_edp_displays)(struct dc *dc);
15898ce7d32SWenjing Liu 	void (*blank_dp_stream)(struct dc_link *link, bool hw_init);
15998ce7d32SWenjing Liu 	enum dc_status (*increase_mst_payload)(
16098ce7d32SWenjing Liu 			struct pipe_ctx *pipe_ctx, uint32_t req_pbn);
16198ce7d32SWenjing Liu 	enum dc_status (*reduce_mst_payload)(
16298ce7d32SWenjing Liu 			struct pipe_ctx *pipe_ctx, uint32_t req_pbn);
16398ce7d32SWenjing Liu 	void (*set_dsc_on_stream)(struct pipe_ctx *pipe_ctx, bool enable);
16498ce7d32SWenjing Liu 	bool (*set_dsc_enable)(struct pipe_ctx *pipe_ctx, bool enable);
16598ce7d32SWenjing Liu 	bool (*update_dsc_config)(struct pipe_ctx *pipe_ctx);
16698ce7d32SWenjing Liu 
16798ce7d32SWenjing Liu 
16898ce7d32SWenjing Liu 	/*************************** DDC **************************************/
16998ce7d32SWenjing Liu 	struct ddc_service *(*create_ddc_service)(
17098ce7d32SWenjing Liu 			struct ddc_service_init_data *ddc_init_data);
17198ce7d32SWenjing Liu 	void (*destroy_ddc_service)(struct ddc_service **ddc);
17298ce7d32SWenjing Liu 	bool (*query_ddc_data)(
17398ce7d32SWenjing Liu 			struct ddc_service *ddc,
17498ce7d32SWenjing Liu 			uint32_t address,
17598ce7d32SWenjing Liu 			uint8_t *write_buf,
17698ce7d32SWenjing Liu 			uint32_t write_size,
17798ce7d32SWenjing Liu 			uint8_t *read_buf,
17898ce7d32SWenjing Liu 			uint32_t read_size);
179202a3816SWenjing Liu 	int (*aux_transfer_raw)(struct ddc_service *ddc,
180202a3816SWenjing Liu 			struct aux_payload *payload,
181202a3816SWenjing Liu 			enum aux_return_code_type *operation_result);
182ad5594adSMichael Strauss 	bool (*configure_fixed_vs_pe_retimer)(
183ad5594adSMichael Strauss 			struct ddc_service *ddc,
184ad5594adSMichael Strauss 			const uint8_t *data,
185ad5594adSMichael Strauss 			uint32_t len);
18698ce7d32SWenjing Liu 	bool (*aux_transfer_with_retries_no_mutex)(struct ddc_service *ddc,
18798ce7d32SWenjing Liu 			struct aux_payload *payload);
18898ce7d32SWenjing Liu 	bool (*is_in_aux_transaction_mode)(struct ddc_service *ddc);
18998ce7d32SWenjing Liu 	uint32_t (*get_aux_defer_delay)(struct ddc_service *ddc);
190202a3816SWenjing Liu 
19198ce7d32SWenjing Liu 
19298ce7d32SWenjing Liu 	/*************************** DP Capability ****************************/
193202a3816SWenjing Liu 	bool (*dp_is_sink_present)(struct dc_link *link);
194202a3816SWenjing Liu 	bool (*dp_is_fec_supported)(const struct dc_link *link);
19598ce7d32SWenjing Liu 	bool (*dp_is_128b_132b_signal)(struct pipe_ctx *pipe_ctx);
196202a3816SWenjing Liu 	bool (*dp_get_max_link_enc_cap)(const struct dc_link *link,
197202a3816SWenjing Liu 			struct dc_link_settings *max_link_enc_cap);
198202a3816SWenjing Liu 	const struct dc_link_settings *(*dp_get_verified_link_cap)(
199202a3816SWenjing Liu 			const struct dc_link *link);
20098ce7d32SWenjing Liu 	enum dp_link_encoding (*dp_get_encoding_format)(
20198ce7d32SWenjing Liu 			const struct dc_link_settings *link_settings);
202202a3816SWenjing Liu 	bool (*dp_should_enable_fec)(const struct dc_link *link);
20398ce7d32SWenjing Liu 	bool (*dp_decide_link_settings)(
20498ce7d32SWenjing Liu 		struct dc_stream_state *stream,
20598ce7d32SWenjing Liu 		struct dc_link_settings *link_setting);
20698ce7d32SWenjing Liu 	enum dp_link_encoding (*mst_decide_link_encoding_format)(
20798ce7d32SWenjing Liu 			const struct dc_link *link);
208202a3816SWenjing Liu 	bool (*edp_decide_link_settings)(struct dc_link *link,
209202a3816SWenjing Liu 			struct dc_link_settings *link_setting, uint32_t req_bw);
210202a3816SWenjing Liu 	uint32_t (*bw_kbps_from_raw_frl_link_rate_data)(uint8_t bw);
211202a3816SWenjing Liu 	bool (*dp_overwrite_extended_receiver_cap)(struct dc_link *link);
212202a3816SWenjing Liu 	enum lttpr_mode (*dp_decide_lttpr_mode)(struct dc_link *link,
213202a3816SWenjing Liu 			struct dc_link_settings *link_setting);
214202a3816SWenjing Liu 
21598ce7d32SWenjing Liu 
21698ce7d32SWenjing Liu 	/*************************** DP DPIA/PHY ******************************/
21798ce7d32SWenjing Liu 	int (*dpia_handle_usb4_bandwidth_allocation_for_link)(
21898ce7d32SWenjing Liu 			struct dc_link *link, int peak_bw);
21998ce7d32SWenjing Liu 	void (*dpia_handle_bw_alloc_response)(
22098ce7d32SWenjing Liu 			struct dc_link *link, uint8_t bw, uint8_t result);
22198ce7d32SWenjing Liu 	void (*dp_set_drive_settings)(
22298ce7d32SWenjing Liu 		struct dc_link *link,
22398ce7d32SWenjing Liu 		const struct link_resource *link_res,
22498ce7d32SWenjing Liu 		struct link_training_settings *lt_settings);
225202a3816SWenjing Liu 	void (*dpcd_write_rx_power_ctrl)(struct dc_link *link, bool on);
226202a3816SWenjing Liu 
22798ce7d32SWenjing Liu 
22898ce7d32SWenjing Liu 	/*************************** DP IRQ Handler ***************************/
229202a3816SWenjing Liu 	bool (*dp_parse_link_loss_status)(
230202a3816SWenjing Liu 		struct dc_link *link,
231202a3816SWenjing Liu 		union hpd_irq_data *hpd_irq_dpcd_data);
232202a3816SWenjing Liu 	bool (*dp_should_allow_hpd_rx_irq)(const struct dc_link *link);
233202a3816SWenjing Liu 	void (*dp_handle_link_loss)(struct dc_link *link);
234202a3816SWenjing Liu 	enum dc_status (*dp_read_hpd_rx_irq_data)(
235202a3816SWenjing Liu 		struct dc_link *link,
236202a3816SWenjing Liu 		union hpd_irq_data *irq_data);
237202a3816SWenjing Liu 	bool (*dp_handle_hpd_rx_irq)(struct dc_link *link,
23898ce7d32SWenjing Liu 			union hpd_irq_data *out_hpd_irq_dpcd_data,
23998ce7d32SWenjing Liu 			bool *out_link_loss,
240202a3816SWenjing Liu 			bool defer_handling, bool *has_left_work);
241202a3816SWenjing Liu 
24298ce7d32SWenjing Liu 
24398ce7d32SWenjing Liu 	/*************************** eDP Panel Control ************************/
24498ce7d32SWenjing Liu 	void (*edp_panel_backlight_power_on)(
24598ce7d32SWenjing Liu 			struct dc_link *link, bool wait_for_hpd);
246202a3816SWenjing Liu 	int (*edp_get_backlight_level)(const struct dc_link *link);
247202a3816SWenjing Liu 	bool (*edp_get_backlight_level_nits)(struct dc_link *link,
248202a3816SWenjing Liu 			uint32_t *backlight_millinits_avg,
249202a3816SWenjing Liu 			uint32_t *backlight_millinits_peak);
250202a3816SWenjing Liu 	bool (*edp_set_backlight_level)(const struct dc_link *link,
251202a3816SWenjing Liu 			uint32_t backlight_pwm_u16_16,
252202a3816SWenjing Liu 			uint32_t frame_ramp);
253202a3816SWenjing Liu 	bool (*edp_set_backlight_level_nits)(struct dc_link *link,
254202a3816SWenjing Liu 			bool isHDR,
255202a3816SWenjing Liu 			uint32_t backlight_millinits,
256202a3816SWenjing Liu 			uint32_t transition_time_in_ms);
257202a3816SWenjing Liu 	int (*edp_get_target_backlight_pwm)(const struct dc_link *link);
25898ce7d32SWenjing Liu 	bool (*edp_get_psr_state)(
25998ce7d32SWenjing Liu 			const struct dc_link *link, enum dc_psr_state *state);
26098ce7d32SWenjing Liu 	bool (*edp_set_psr_allow_active)(
26198ce7d32SWenjing Liu 			struct dc_link *link,
26298ce7d32SWenjing Liu 			const bool *allow_active,
26398ce7d32SWenjing Liu 			bool wait,
26498ce7d32SWenjing Liu 			bool force_static,
26598ce7d32SWenjing Liu 			const unsigned int *power_opts);
266202a3816SWenjing Liu 	bool (*edp_setup_psr)(struct dc_link *link,
267202a3816SWenjing Liu 			const struct dc_stream_state *stream,
268202a3816SWenjing Liu 			struct psr_config *psr_config,
269202a3816SWenjing Liu 			struct psr_context *psr_context);
27098ce7d32SWenjing Liu 	bool (*edp_set_sink_vtotal_in_psr_active)(
27198ce7d32SWenjing Liu 			const struct dc_link *link,
27298ce7d32SWenjing Liu 			uint16_t psr_vtotal_idle,
27398ce7d32SWenjing Liu 			uint16_t psr_vtotal_su);
27498ce7d32SWenjing Liu 	void (*edp_get_psr_residency)(
27598ce7d32SWenjing Liu 			const struct dc_link *link, uint32_t *residency);
276c7ddc0a8SBhawanpreet Lakha 
277c7ddc0a8SBhawanpreet Lakha 	bool (*edp_get_replay_state)(
278c7ddc0a8SBhawanpreet Lakha 			const struct dc_link *link, uint64_t *state);
279c7ddc0a8SBhawanpreet Lakha 	bool (*edp_set_replay_allow_active)(struct dc_link *dc_link,
280c7ddc0a8SBhawanpreet Lakha 			const bool *enable, bool wait, bool force_static,
281c7ddc0a8SBhawanpreet Lakha 			const unsigned int *power_opts);
282c7ddc0a8SBhawanpreet Lakha 	bool (*edp_setup_replay)(struct dc_link *link,
283c7ddc0a8SBhawanpreet Lakha 			const struct dc_stream_state *stream);
284c7ddc0a8SBhawanpreet Lakha 	bool (*edp_set_coasting_vtotal)(
285c7ddc0a8SBhawanpreet Lakha 			struct dc_link *link, uint16_t coasting_vtotal);
286c7ddc0a8SBhawanpreet Lakha 	bool (*edp_replay_residency)(const struct dc_link *link,
287c7ddc0a8SBhawanpreet Lakha 			unsigned int *residency, const bool is_start,
288c7ddc0a8SBhawanpreet Lakha 			const bool is_alpm);
289c7ddc0a8SBhawanpreet Lakha 
290202a3816SWenjing Liu 	bool (*edp_wait_for_t12)(struct dc_link *link);
29198ce7d32SWenjing Liu 	bool (*edp_is_ilr_optimization_required)(struct dc_link *link,
29298ce7d32SWenjing Liu 			struct dc_crtc_timing *crtc_timing);
29398ce7d32SWenjing Liu 	bool (*edp_backlight_enable_aux)(struct dc_link *link, bool enable);
29498ce7d32SWenjing Liu 	void (*edp_add_delay_for_T9)(struct dc_link *link);
29598ce7d32SWenjing Liu 	bool (*edp_receiver_ready_T9)(struct dc_link *link);
29698ce7d32SWenjing Liu 	bool (*edp_receiver_ready_T7)(struct dc_link *link);
29798ce7d32SWenjing Liu 	bool (*edp_power_alpm_dpcd_enable)(struct dc_link *link, bool enable);
298*a8728dbbSIan Chen 	void (*edp_set_panel_power)(struct dc_link *link, bool powerOn);
299202a3816SWenjing Liu 
30098ce7d32SWenjing Liu 
30198ce7d32SWenjing Liu 	/*************************** DP CTS ************************************/
30236516001SWenjing Liu 	void (*dp_handle_automated_test)(struct dc_link *link);
30336516001SWenjing Liu 	bool (*dp_set_test_pattern)(
30436516001SWenjing Liu 			struct dc_link *link,
30536516001SWenjing Liu 			enum dp_test_pattern test_pattern,
30636516001SWenjing Liu 			enum dp_test_pattern_color_space test_pattern_color_space,
30736516001SWenjing Liu 			const struct link_training_settings *p_link_settings,
30836516001SWenjing Liu 			const unsigned char *p_custom_pattern,
30936516001SWenjing Liu 			unsigned int cust_pattern_size);
31036516001SWenjing Liu 	void (*dp_set_preferred_link_settings)(struct dc *dc,
31136516001SWenjing Liu 			struct dc_link_settings *link_setting,
31236516001SWenjing Liu 			struct dc_link *link);
31336516001SWenjing Liu 	void (*dp_set_preferred_training_settings)(struct dc *dc,
31436516001SWenjing Liu 			struct dc_link_settings *link_setting,
31536516001SWenjing Liu 			struct dc_link_training_overrides *lt_overrides,
31636516001SWenjing Liu 			struct dc_link *link,
31736516001SWenjing Liu 			bool skip_immediate_retrain);
318202a3816SWenjing Liu 
31998ce7d32SWenjing Liu 
32098ce7d32SWenjing Liu 	/*************************** DP Trace *********************************/
32136516001SWenjing Liu 	bool (*dp_trace_is_initialized)(struct dc_link *link);
32236516001SWenjing Liu 	void (*dp_trace_set_is_logged_flag)(struct dc_link *link,
32336516001SWenjing Liu 			bool in_detection,
32436516001SWenjing Liu 			bool is_logged);
32536516001SWenjing Liu 	bool (*dp_trace_is_logged)(struct dc_link *link, bool in_detection);
32636516001SWenjing Liu 	unsigned long long (*dp_trace_get_lt_end_timestamp)(
32736516001SWenjing Liu 			struct dc_link *link, bool in_detection);
32836516001SWenjing Liu 	const struct dp_trace_lt_counts *(*dp_trace_get_lt_counts)(
32936516001SWenjing Liu 			struct dc_link *link, bool in_detection);
33036516001SWenjing Liu 	unsigned int (*dp_trace_get_link_loss_count)(struct dc_link *link);
33198ce7d32SWenjing Liu 	void (*dp_trace_set_edp_power_timestamp)(struct dc_link *link,
332bc33f5e5SWenjing Liu 			bool power_up);
33398ce7d32SWenjing Liu 	uint64_t (*dp_trace_get_edp_poweron_timestamp)(struct dc_link *link);
33498ce7d32SWenjing Liu 	uint64_t (*dp_trace_get_edp_poweroff_timestamp)(struct dc_link *link);
33598ce7d32SWenjing Liu 	void (*dp_trace_source_sequence)(
33698ce7d32SWenjing Liu 			struct dc_link *link, uint8_t dp_test_mode);
33798ce7d32SWenjing Liu };
3384370f72eSWenjing Liu #endif /* __DC_LINK_HPD_H__ */
339