brintos

brintos / linux-shallow public Read only

0
0
Text · 14.1 KiB · 72a8479 Raw
344 lines · c
1/*2 * Copyright 2022 Advanced Micro Devices, Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * 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 OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 * Authors: AMD23 *24 */25 26#ifndef __DC_LINK_H__27#define __DC_LINK_H__28 29/* FILE POLICY AND INTENDED USAGE:30 *31 * This header defines link component function interfaces aka link_service.32 * link_service provides the only entry point to link functions with function33 * pointer style. This header is strictly private in dc and should never be34 * included by DM because it exposes too much dc detail including all dc35 * private types defined in core_types.h. Otherwise it will break DM - DC36 * encapsulation and turn DM into a maintenance nightmare.37 *38 * The following shows a link component relation map.39 *40 * DM to DC:41 * DM includes dc.h42 * dc_link_exports.c or other dc files implement dc.h43 *44 * DC to Link:45 * dc_link_exports.c or other dc files include link.h46 * link_factory.c implements link.h47 *48 * Link sub-component to Link sub-component:49 * link_factory.c includes --> link_xxx.h50 * link_xxx.c implements link_xxx.h51 52 * As you can see if you ever need to add a new dc link function and call it on53 * DM/dc side, it is very difficult because you will need layers of translation.54 * The most appropriate approach to implement new requirements on DM/dc side is55 * to extend or generalize the functionality of existing link function56 * interfaces so minimal modification is needed outside link component to57 * achieve your new requirements. This approach reduces or even eliminates the58 * effort needed outside link component to support a new link feature. This also59 * reduces code discrepancy among DMs to support the same link feature. If we60 * test full code path on one version of DM, and there is no feature specific61 * modification required on other DMs, then we can have higher confidence that62 * the feature will run on other DMs and produce the same result. The following63 * are some good examples to start with:64 *65 * - detect_link --> to add new link detection or capability retrieval routines66 *67 * - validate_mode_timing --> to add new timing validation conditions68 *69 * - set_dpms_on/set_dpms_off --> to include new link enablement sequences70 *71 * If you must add new link functions, you will need to:72 * 1. declare the function pointer here under the suitable commented category.73 * 2. Implement your function in the suitable link_xxx.c file.74 * 3. Assign the function to link_service in link_factory.c75 * 4. NEVER include link_xxx.h headers outside link component.76 * 5. NEVER include link.h on DM side.77 */78#include "core_types.h"79 80struct link_service *link_create_link_service(void);81void link_destroy_link_service(struct link_service **link_srv);82 83struct link_init_data {84	const struct dc *dc;85	struct dc_context *ctx; /* TODO: remove 'dal' when DC is complete. */86	uint32_t connector_index; /* this will be mapped to the HPD pins */87	uint32_t link_index; /* this is mapped to DAL display_index88				TODO: remove it when DC is complete. */89	bool is_dpia_link;90};91 92struct ddc_service_init_data {93	struct graphics_object_id id;94	struct dc_context *ctx;95	struct dc_link *link;96	bool is_dpia_link;97};98 99struct link_service {100	/************************** Factory ***********************************/101	struct dc_link *(*create_link)(102			const struct link_init_data *init_params);103	void (*destroy_link)(struct dc_link **link);104 105 106	/************************** Detection *********************************/107	bool (*detect_link)(struct dc_link *link, enum dc_detect_reason reason);108	bool (*detect_connection_type)(struct dc_link *link,109			enum dc_connection_type *type);110	struct dc_sink *(*add_remote_sink)(111			struct dc_link *link,112			const uint8_t *edid,113			int len,114			struct dc_sink_init_data *init_data);115	void (*remove_remote_sink)(struct dc_link *link, struct dc_sink *sink);116	bool (*get_hpd_state)(struct dc_link *link);117	struct gpio *(*get_hpd_gpio)(struct dc_bios *dcb,118			struct graphics_object_id link_id,119			struct gpio_service *gpio_service);120	void (*enable_hpd)(const struct dc_link *link);121	void (*disable_hpd)(const struct dc_link *link);122	void (*enable_hpd_filter)(struct dc_link *link, bool enable);123	bool (*reset_cur_dp_mst_topology)(struct dc_link *link);124	const struct dc_link_status *(*get_status)(const struct dc_link *link);125	bool (*is_hdcp1x_supported)(struct dc_link *link,126			enum signal_type signal);127	bool (*is_hdcp2x_supported)(struct dc_link *link,128			enum signal_type signal);129	void (*clear_dprx_states)(struct dc_link *link);130 131 132	/*************************** Resource *********************************/133	void (*get_cur_res_map)(const struct dc *dc, uint32_t *map);134	void (*restore_res_map)(const struct dc *dc, uint32_t *map);135	void (*get_cur_link_res)(const struct dc_link *link,136			struct link_resource *link_res);137 138 139	/*************************** Validation *******************************/140	enum dc_status (*validate_mode_timing)(141			const struct dc_stream_state *stream,142			struct dc_link *link,143			const struct dc_crtc_timing *timing);144	uint32_t (*dp_link_bandwidth_kbps)(145		const struct dc_link *link,146		const struct dc_link_settings *link_settings);147	bool (*validate_dpia_bandwidth)(148			const struct dc_stream_state *stream,149			const unsigned int num_streams);150 151 152	/*************************** DPMS *************************************/153	void (*set_dpms_on)(struct dc_state *state, struct pipe_ctx *pipe_ctx);154	void (*set_dpms_off)(struct pipe_ctx *pipe_ctx);155	void (*resume)(struct dc_link *link);156	void (*blank_all_dp_displays)(struct dc *dc);157	void (*blank_all_edp_displays)(struct dc *dc);158	void (*blank_dp_stream)(struct dc_link *link, bool hw_init);159	enum dc_status (*increase_mst_payload)(160			struct pipe_ctx *pipe_ctx, uint32_t req_pbn);161	enum dc_status (*reduce_mst_payload)(162			struct pipe_ctx *pipe_ctx, uint32_t req_pbn);163	void (*set_dsc_on_stream)(struct pipe_ctx *pipe_ctx, bool enable);164	bool (*set_dsc_enable)(struct pipe_ctx *pipe_ctx, bool enable);165	bool (*update_dsc_config)(struct pipe_ctx *pipe_ctx);166 167 168	/*************************** DDC **************************************/169	struct ddc_service *(*create_ddc_service)(170			struct ddc_service_init_data *ddc_init_data);171	void (*destroy_ddc_service)(struct ddc_service **ddc);172	bool (*query_ddc_data)(173			struct ddc_service *ddc,174			uint32_t address,175			uint8_t *write_buf,176			uint32_t write_size,177			uint8_t *read_buf,178			uint32_t read_size);179	int (*aux_transfer_raw)(struct ddc_service *ddc,180			struct aux_payload *payload,181			enum aux_return_code_type *operation_result);182	bool (*configure_fixed_vs_pe_retimer)(183			struct ddc_service *ddc,184			const uint8_t *data,185			uint32_t len);186	bool (*aux_transfer_with_retries_no_mutex)(struct ddc_service *ddc,187			struct aux_payload *payload);188	bool (*is_in_aux_transaction_mode)(struct ddc_service *ddc);189	uint32_t (*get_aux_defer_delay)(struct ddc_service *ddc);190 191 192	/*************************** DP Capability ****************************/193	bool (*dp_is_sink_present)(struct dc_link *link);194	bool (*dp_is_fec_supported)(const struct dc_link *link);195	bool (*dp_is_128b_132b_signal)(struct pipe_ctx *pipe_ctx);196	bool (*dp_get_max_link_enc_cap)(const struct dc_link *link,197			struct dc_link_settings *max_link_enc_cap);198	const struct dc_link_settings *(*dp_get_verified_link_cap)(199			const struct dc_link *link);200	enum dp_link_encoding (*dp_get_encoding_format)(201			const struct dc_link_settings *link_settings);202	bool (*dp_should_enable_fec)(const struct dc_link *link);203	bool (*dp_decide_link_settings)(204		struct dc_stream_state *stream,205		struct dc_link_settings *link_setting);206	enum dp_link_encoding (*mst_decide_link_encoding_format)(207			const struct dc_link *link);208	bool (*edp_decide_link_settings)(struct dc_link *link,209			struct dc_link_settings *link_setting, uint32_t req_bw);210	uint32_t (*bw_kbps_from_raw_frl_link_rate_data)(uint8_t bw);211	bool (*dp_overwrite_extended_receiver_cap)(struct dc_link *link);212	enum lttpr_mode (*dp_decide_lttpr_mode)(struct dc_link *link,213			struct dc_link_settings *link_setting);214 215 216	/*************************** DP DPIA/PHY ******************************/217	int (*dpia_handle_usb4_bandwidth_allocation_for_link)(218			struct dc_link *link, int peak_bw);219	void (*dpia_handle_bw_alloc_response)(220			struct dc_link *link, uint8_t bw, uint8_t result);221	void (*dp_set_drive_settings)(222		struct dc_link *link,223		const struct link_resource *link_res,224		struct link_training_settings *lt_settings);225	void (*dpcd_write_rx_power_ctrl)(struct dc_link *link, bool on);226 227 228	/*************************** DP IRQ Handler ***************************/229	bool (*dp_parse_link_loss_status)(230		struct dc_link *link,231		union hpd_irq_data *hpd_irq_dpcd_data);232	bool (*dp_should_allow_hpd_rx_irq)(const struct dc_link *link);233	void (*dp_handle_link_loss)(struct dc_link *link);234	enum dc_status (*dp_read_hpd_rx_irq_data)(235		struct dc_link *link,236		union hpd_irq_data *irq_data);237	bool (*dp_handle_hpd_rx_irq)(struct dc_link *link,238			union hpd_irq_data *out_hpd_irq_dpcd_data,239			bool *out_link_loss,240			bool defer_handling, bool *has_left_work);241 242 243	/*************************** eDP Panel Control ************************/244	void (*edp_panel_backlight_power_on)(245			struct dc_link *link, bool wait_for_hpd);246	int (*edp_get_backlight_level)(const struct dc_link *link);247	bool (*edp_get_backlight_level_nits)(struct dc_link *link,248			uint32_t *backlight_millinits_avg,249			uint32_t *backlight_millinits_peak);250	bool (*edp_set_backlight_level)(const struct dc_link *link,251			uint32_t backlight_pwm_u16_16,252			uint32_t frame_ramp);253	bool (*edp_set_backlight_level_nits)(struct dc_link *link,254			bool isHDR,255			uint32_t backlight_millinits,256			uint32_t transition_time_in_ms);257	int (*edp_get_target_backlight_pwm)(const struct dc_link *link);258	bool (*edp_get_psr_state)(259			const struct dc_link *link, enum dc_psr_state *state);260	bool (*edp_set_psr_allow_active)(261			struct dc_link *link,262			const bool *allow_active,263			bool wait,264			bool force_static,265			const unsigned int *power_opts);266	bool (*edp_setup_psr)(struct dc_link *link,267			const struct dc_stream_state *stream,268			struct psr_config *psr_config,269			struct psr_context *psr_context);270	bool (*edp_set_sink_vtotal_in_psr_active)(271			const struct dc_link *link,272			uint16_t psr_vtotal_idle,273			uint16_t psr_vtotal_su);274	void (*edp_get_psr_residency)(275			const struct dc_link *link, uint32_t *residency, enum psr_residency_mode mode);276 277	bool (*edp_get_replay_state)(278			const struct dc_link *link, uint64_t *state);279	bool (*edp_set_replay_allow_active)(struct dc_link *dc_link,280			const bool *enable, bool wait, bool force_static,281			const unsigned int *power_opts);282	bool (*edp_setup_replay)(struct dc_link *link,283			const struct dc_stream_state *stream);284	bool (*edp_send_replay_cmd)(struct dc_link *link,285			enum replay_FW_Message_type msg,286			union dmub_replay_cmd_set *cmd_data);287	bool (*edp_set_coasting_vtotal)(288			struct dc_link *link, uint32_t coasting_vtotal);289	bool (*edp_replay_residency)(const struct dc_link *link,290			unsigned int *residency, const bool is_start,291			const enum pr_residency_mode mode);292	bool (*edp_set_replay_power_opt_and_coasting_vtotal)(struct dc_link *link,293			const unsigned int *power_opts, uint32_t coasting_vtotal);294 295	bool (*edp_wait_for_t12)(struct dc_link *link);296	bool (*edp_is_ilr_optimization_required)(struct dc_link *link,297			struct dc_crtc_timing *crtc_timing);298	bool (*edp_backlight_enable_aux)(struct dc_link *link, bool enable);299	void (*edp_add_delay_for_T9)(struct dc_link *link);300	bool (*edp_receiver_ready_T9)(struct dc_link *link);301	bool (*edp_receiver_ready_T7)(struct dc_link *link);302	bool (*edp_power_alpm_dpcd_enable)(struct dc_link *link, bool enable);303	void (*edp_set_panel_power)(struct dc_link *link, bool powerOn);304 305 306	/*************************** DP CTS ************************************/307	void (*dp_handle_automated_test)(struct dc_link *link);308	bool (*dp_set_test_pattern)(309			struct dc_link *link,310			enum dp_test_pattern test_pattern,311			enum dp_test_pattern_color_space test_pattern_color_space,312			const struct link_training_settings *p_link_settings,313			const unsigned char *p_custom_pattern,314			unsigned int cust_pattern_size);315	void (*dp_set_preferred_link_settings)(struct dc *dc,316			struct dc_link_settings *link_setting,317			struct dc_link *link);318	void (*dp_set_preferred_training_settings)(struct dc *dc,319			struct dc_link_settings *link_setting,320			struct dc_link_training_overrides *lt_overrides,321			struct dc_link *link,322			bool skip_immediate_retrain);323 324 325	/*************************** DP Trace *********************************/326	bool (*dp_trace_is_initialized)(struct dc_link *link);327	void (*dp_trace_set_is_logged_flag)(struct dc_link *link,328			bool in_detection,329			bool is_logged);330	bool (*dp_trace_is_logged)(struct dc_link *link, bool in_detection);331	unsigned long long (*dp_trace_get_lt_end_timestamp)(332			struct dc_link *link, bool in_detection);333	const struct dp_trace_lt_counts *(*dp_trace_get_lt_counts)(334			struct dc_link *link, bool in_detection);335	unsigned int (*dp_trace_get_link_loss_count)(struct dc_link *link);336	void (*dp_trace_set_edp_power_timestamp)(struct dc_link *link,337			bool power_up);338	uint64_t (*dp_trace_get_edp_poweron_timestamp)(struct dc_link *link);339	uint64_t (*dp_trace_get_edp_poweroff_timestamp)(struct dc_link *link);340	void (*dp_trace_source_sequence)(341			struct dc_link *link, uint8_t dp_test_mode);342};343#endif /* __DC_LINK_HPD_H__ */344