138032Speter/* $NetBSD: dc_link.h,v 1.2 2021/12/18 23:45:00 riastradh Exp $ */ 290792Sgshapiro 364562Sgshapiro/* 438032Speter * Copyright 2012-14 Advanced Micro Devices, Inc. 538032Speter * 638032Speter * Permission is hereby granted, free of charge, to any person obtaining a 738032Speter * copy of this software and associated documentation files (the "Software"), 838032Speter * to deal in the Software without restriction, including without limitation 938032Speter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1038032Speter * and/or sell copies of the Software, and to permit persons to whom the 1138032Speter * Software is furnished to do so, subject to the following conditions: 1238032Speter * 1338032Speter * The above copyright notice and this permission notice shall be included in 1464562Sgshapiro * all copies or substantial portions of the Software. 1538032Speter * 1698121Sgshapiro * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1764562Sgshapiro * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1864562Sgshapiro * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1964562Sgshapiro * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 2038032Speter * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2190792Sgshapiro * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2264562Sgshapiro * OTHER DEALINGS IN THE SOFTWARE. 2364562Sgshapiro * 2464562Sgshapiro * Authors: AMD 2590792Sgshapiro * 2638032Speter */ 2790792Sgshapiro 2890792Sgshapiro#ifndef DC_LINK_H_ 2990792Sgshapiro#define DC_LINK_H_ 3090792Sgshapiro 3190792Sgshapiro#include "dc_types.h" 3238032Speter#include "grph_object_defs.h" 3338032Speter 3438032Speterenum dc_link_fec_state { 3538032Speter dc_link_fec_not_ready, 3638032Speter dc_link_fec_ready, 3738032Speter dc_link_fec_enabled 3890792Sgshapiro}; 3990792Sgshapirostruct dc_link_status { 4090792Sgshapiro bool link_active; 4138032Speter struct dpcd_caps *dpcd_caps; 4290792Sgshapiro}; 4338032Speter 4490792Sgshapiro/* DP MST stream allocation (payload bandwidth number) */ 4590792Sgshapirostruct link_mst_stream_allocation { 4690792Sgshapiro /* DIG front */ 4764562Sgshapiro const struct stream_encoder *stream_enc; 4864562Sgshapiro /* associate DRM payload table with DC stream encoder */ 4964562Sgshapiro uint8_t vcp_id; 5090792Sgshapiro /* number of slots required for the DP stream in transport packet */ 5138032Speter uint8_t slot_count; 5238032Speter}; 5338032Speter 5438032Speter/* DP MST stream allocation table */ 5538032Speterstruct link_mst_stream_allocation_table { 5638032Speter /* number of DP video streams */ 5764562Sgshapiro int stream_count; 5864562Sgshapiro /* array of stream allocations */ 5964562Sgshapiro struct link_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM]; 6038032Speter}; 6138032Speter 6238032Speterstruct time_stamp { 6338032Speter uint64_t edp_poweroff; 6438032Speter uint64_t edp_poweron; 6538032Speter}; 6638032Speter 6738032Speterstruct link_trace { 6838032Speter struct time_stamp time_stamp; 6964562Sgshapiro}; 7038032Speter/* 7138032Speter * A link contains one or more sinks and their connected status. 7238032Speter * The currently active signal type (HDMI, DP-SST, DP-MST) is also reported. 7364562Sgshapiro */ 7438032Speterstruct dc_link { 7538032Speter struct dc_sink *remote_sinks[MAX_SINKS_PER_LINK]; 7694334Sgshapiro unsigned int sink_count; 7738032Speter struct dc_sink *local_sink; 7864562Sgshapiro unsigned int link_index; 7964562Sgshapiro enum dc_connection_type type; 8038032Speter enum signal_type connector_signal; 8164562Sgshapiro enum dc_irq_source irq_source_hpd; 8238032Speter enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse */ 8338032Speter bool is_hpd_filter_disabled; 8490792Sgshapiro bool dp_ss_off; 8590792Sgshapiro bool link_state_valid; 8638032Speter bool aux_access_disabled; 8738032Speter bool sync_lt_in_progress; 8838032Speter bool is_lttpr_mode_transparent; 8938032Speter 9038032Speter /* caps is the same as reported_link_cap. link_traing use 9138032Speter * reported_link_cap. Will clean up. TODO 9238032Speter */ 9338032Speter struct dc_link_settings reported_link_cap; 9438032Speter struct dc_link_settings verified_link_cap; 9538032Speter struct dc_link_settings cur_link_settings; 9690792Sgshapiro struct dc_lane_settings cur_lane_setting; 9794334Sgshapiro struct dc_link_settings preferred_link_setting; 9898121Sgshapiro struct dc_link_training_overrides preferred_training_settings; 9938032Speter struct dp_audio_test_data audio_test_data; 10090792Sgshapiro 10190792Sgshapiro uint8_t ddc_hw_inst; 10290792Sgshapiro 10338032Speter uint8_t hpd_src; 10438032Speter 10564562Sgshapiro uint8_t link_enc_hw_inst; 10638032Speter 10738032Speter bool test_pattern_enabled; 10864562Sgshapiro union compliance_test_state compliance_test_state; 10964562Sgshapiro 11064562Sgshapiro void *priv; 11138032Speter 11238032Speter struct ddc_service *ddc; 11364562Sgshapiro 11438032Speter bool aux_mode; 11538032Speter 11638032Speter /* Private to DC core */ 11764562Sgshapiro 11838032Speter const struct dc *dc; 11938032Speter 12094334Sgshapiro struct dc_context *ctx; 12138032Speter 12238032Speter struct link_encoder *link_enc; 12338032Speter struct graphics_object_id link_id; 12438032Speter union ddi_channel_mapping ddi_channel_mapping; 12538032Speter struct connector_device_tag_info device_tag; 12664562Sgshapiro struct dpcd_caps dpcd_caps; 12764562Sgshapiro uint32_t dongle_max_pix_clk; 12838032Speter unsigned short chip_caps; 12938032Speter unsigned int dpcd_sink_count; 13038032Speter enum edp_revision edp_revision; 13138032Speter bool psr_feature_enabled; 13238032Speter bool psr_allow_active; 13338032Speter 13438032Speter /* MST record stream using this link */ 13538032Speter struct link_flags { 13638032Speter bool dp_keep_receiver_powered; 13738032Speter bool dp_skip_DID2; 13890792Sgshapiro bool dp_skip_reset_segment; 13964562Sgshapiro } wa_flags; 14064562Sgshapiro struct link_mst_stream_allocation_table mst_stream_alloc_table; 14138032Speter 14238032Speter struct dc_link_status link_status; 14338032Speter 14438032Speter struct link_trace link_trace; 14538032Speter struct gpio *hpd_gpio; 14638032Speter enum dc_link_fec_state fec_state; 14738032Speter}; 14838032Speter 14938032Speterconst struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link); 15038032Speter 15138032Speter/** 15238032Speter * dc_get_link_at_index() - Return an enumerated dc_link. 15364562Sgshapiro * 15438032Speter * dc_link order is constant and determined at 15538032Speter * boot time. They cannot be created or destroyed. 15664562Sgshapiro * Use dc_get_caps() to get number of links. 15738032Speter */ 15838032Speterstatic inline struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_index) 15990792Sgshapiro{ 16090792Sgshapiro return dc->links[link_index]; 16190792Sgshapiro} 16238032Speter 16338032Speterstatic inline struct dc_link *get_edp_link(const struct dc *dc) 16464562Sgshapiro{ 16538032Speter int i; 16638032Speter 16790792Sgshapiro // report any eDP links, even unconnected DDI's 16890792Sgshapiro for (i = 0; i < dc->link_count; i++) { 16938032Speter if (dc->links[i]->connector_signal == SIGNAL_TYPE_EDP) 17064562Sgshapiro return dc->links[i]; 17138032Speter } 17238032Speter return NULL; 17338032Speter} 17438032Speter 17564562Sgshapiro/* Set backlight level of an embedded panel (eDP, LVDS). 17638032Speter * backlight_pwm_u16_16 is unsigned 32 bit with 16 bit integer 17790792Sgshapiro * and 16 bit fractional, where 1.0 is max backlight value. 17890792Sgshapiro */ 17990792Sgshapirobool dc_link_set_backlight_level(const struct dc_link *dc_link, 18038032Speter uint32_t backlight_pwm_u16_16, 18190792Sgshapiro uint32_t frame_ramp); 18264562Sgshapiro 18390792Sgshapiroint dc_link_get_backlight_level(const struct dc_link *dc_link); 18490792Sgshapiro 18590792Sgshapirobool dc_link_set_abm_disable(const struct dc_link *dc_link); 18690792Sgshapiro 18738032Speterbool dc_link_set_psr_allow_active(struct dc_link *dc_link, bool enable, bool wait); 18838032Speter 18938032Speterbool dc_link_get_psr_state(const struct dc_link *dc_link, uint32_t *psr_state); 19038032Speter 19138032Speterbool dc_link_setup_psr(struct dc_link *dc_link, 19238032Speter const struct dc_stream_state *stream, struct psr_config *psr_config, 19338032Speter struct psr_context *psr_context); 19438032Speter 19538032Speter/* Request DC to detect if there is a Panel connected. 19638032Speter * boot - If this call is during initial boot. 19738032Speter * Return false for any type of detection failure or MST detection 19838032Speter * true otherwise. True meaning further action is required (status update 19938032Speter * and OS notification). 20038032Speter */ 20138032Speterenum dc_detect_reason { 20238032Speter DETECT_REASON_BOOT, 20338032Speter DETECT_REASON_HPD, 20438032Speter DETECT_REASON_HPDRX, 20538032Speter}; 20638032Speter 20738032Speterbool dc_link_detect(struct dc_link *dc_link, enum dc_detect_reason reason); 20838032Speterbool dc_link_get_hpd_state(struct dc_link *dc_link); 20938032Speterenum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx); 21038032Speterenum dc_status dc_link_reallocate_mst_payload(struct dc_link *link); 21138032Speter 21238032Speter/* Notify DC about DP RX Interrupt (aka Short Pulse Interrupt). 21338032Speter * Return: 21490792Sgshapiro * true - Downstream port status changed. DM should call DC to do the 21538032Speter * detection. 21664562Sgshapiro * false - no change in Downstream port status. No further action required 21738032Speter * from DM. */ 21877349Sgshapirobool dc_link_handle_hpd_rx_irq(struct dc_link *dc_link, 21977349Sgshapiro union hpd_irq_data *hpd_irq_dpcd_data, bool *out_link_loss); 22038032Speter 22138032Speterstruct dc_sink_init_data; 22238032Speter 22338032Speterstruct dc_sink *dc_link_add_remote_sink( 22438032Speter struct dc_link *dc_link, 22590792Sgshapiro const uint8_t *edid, 22638032Speter int len, 22738032Speter struct dc_sink_init_data *init_data); 22838032Speter 22938032Spetervoid dc_link_remove_remote_sink( 23038032Speter struct dc_link *link, 23138032Speter struct dc_sink *sink); 23238032Speter 23338032Speter/* Used by diagnostics for virtual link at the moment */ 23438032Speter 23564562Sgshapirovoid dc_link_dp_set_drive_settings( 23638032Speter struct dc_link *link, 23738032Speter struct link_training_settings *lt_settings); 23838032Speter 23990792Sgshapirobool dc_link_dp_perform_link_training_skip_aux( 24038032Speter struct dc_link *link, 24138032Speter const struct dc_link_settings *link_setting); 24238032Speter 24338032Speterenum link_training_result dc_link_dp_perform_link_training( 24438032Speter struct dc_link *link, 24538032Speter const struct dc_link_settings *link_setting, 24638032Speter bool skip_video_pattern); 24738032Speter 24838032Speterbool dc_link_dp_sync_lt_begin(struct dc_link *link); 24938032Speter 25064562Sgshapiroenum link_training_result dc_link_dp_sync_lt_attempt( 25138032Speter struct dc_link *link, 25238032Speter struct dc_link_settings *link_setting, 25338032Speter struct dc_link_training_overrides *lt_settings); 25438032Speter 25538032Speterbool dc_link_dp_sync_lt_end(struct dc_link *link, bool link_down); 25638032Speter 25764562Sgshapirovoid dc_link_dp_enable_hpd(const struct dc_link *link); 25864562Sgshapiro 25938032Spetervoid dc_link_dp_disable_hpd(const struct dc_link *link); 26038032Speter 26138032Speterbool dc_link_dp_set_test_pattern( 26238032Speter struct dc_link *link, 26338032Speter enum dp_test_pattern test_pattern, 26438032Speter enum dp_test_pattern_color_space test_pattern_color_space, 26538032Speter const struct link_training_settings *p_link_settings, 26638032Speter const unsigned char *p_custom_pattern, 26738032Speter unsigned int cust_pattern_size); 26890792Sgshapiro 26938032Spetervoid dc_link_enable_hpd_filter(struct dc_link *link, bool enable); 27038032Speter 27138032Speterbool dc_link_is_dp_sink_present(struct dc_link *link); 27238032Speter 27338032Speterbool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type); 27438032Speter/* 27538032Speter * DPCD access interfaces 27638032Speter */ 27738032Speter 27838032Spetervoid dc_link_set_drive_settings(struct dc *dc, 27938032Speter struct link_training_settings *lt_settings, 28038032Speter const struct dc_link *link); 28138032Spetervoid dc_link_perform_link_training(struct dc *dc, 28264562Sgshapiro struct dc_link_settings *link_setting, 28338032Speter bool skip_video_pattern); 28438032Spetervoid dc_link_set_preferred_link_settings(struct dc *dc, 28538032Speter struct dc_link_settings *link_setting, 28638032Speter struct dc_link *link); 28738032Spetervoid dc_link_set_preferred_training_settings(struct dc *dc, 28838032Speter struct dc_link_settings *link_setting, 28938032Speter struct dc_link_training_overrides *lt_overrides, 29038032Speter struct dc_link *link, 29138032Speter bool skip_immediate_retrain); 29290792Sgshapirovoid dc_link_enable_hpd(const struct dc_link *link); 29390792Sgshapirovoid dc_link_disable_hpd(const struct dc_link *link); 29490792Sgshapirovoid dc_link_set_test_pattern(struct dc_link *link, 29590792Sgshapiro enum dp_test_pattern test_pattern, 29690792Sgshapiro enum dp_test_pattern_color_space test_pattern_color_space, 29790792Sgshapiro const struct link_training_settings *p_link_settings, 29890792Sgshapiro const unsigned char *p_custom_pattern, 29990792Sgshapiro unsigned int cust_pattern_size); 30090792Sgshapirouint32_t dc_link_bandwidth_kbps( 30138032Speter const struct dc_link *link, 30238032Speter const struct dc_link_settings *link_setting); 30338032Speter 30490792Sgshapiroconst struct dc_link_settings *dc_link_get_link_cap( 30590792Sgshapiro const struct dc_link *link); 30690792Sgshapiro 30790792Sgshapirovoid dc_link_overwrite_extended_receiver_cap( 30890792Sgshapiro struct dc_link *link); 30990792Sgshapiro 31064562Sgshapirobool dc_submit_i2c( 31164562Sgshapiro struct dc *dc, 31264562Sgshapiro uint32_t link_index, 31364562Sgshapiro struct i2c_command *cmd); 31490792Sgshapiro 31564562Sgshapirobool dc_submit_i2c_oem( 31664562Sgshapiro struct dc *dc, 31764562Sgshapiro struct i2c_command *cmd); 31864562Sgshapiro 31964562Sgshapirouint32_t dc_bandwidth_in_kbps_from_timing( 32064562Sgshapiro const struct dc_crtc_timing *timing); 32190792Sgshapiro#endif /* DC_LINK_H_ */ 32264562Sgshapiro