2019-10-21 16:34:37 +02:00
/* SPDX-License-Identifier: MIT */
/*
* Copyright ( C ) 2013 - 2019 NVIDIA Corporation .
* Copyright ( C ) 2015 Rob Clark
*/
# ifndef DRM_TEGRA_DP_H
# define DRM_TEGRA_DP_H 1
2015-12-03 12:45:45 +01:00
# include <linux/types.h>
2015-07-21 16:38:11 +02:00
struct drm_display_info ;
struct drm_display_mode ;
2019-10-21 16:34:37 +02:00
struct drm_dp_aux ;
2015-07-07 21:21:48 +02:00
struct drm_dp_link ;
2019-10-21 16:34:37 +02:00
2015-12-03 12:45:45 +01:00
/**
* struct drm_dp_link_caps - DP link capabilities
*/
struct drm_dp_link_caps {
/**
* @ enhanced_framing :
*
* enhanced framing capability ( mandatory as of DP 1.2 )
*/
bool enhanced_framing ;
2015-12-03 13:07:43 +01:00
2015-07-07 20:52:07 +02:00
/**
* tps3_supported :
*
* training pattern sequence 3 supported for equalization
*/
bool tps3_supported ;
2015-12-03 13:07:43 +01:00
/**
* @ fast_training :
*
* AUX CH handshake not required for link training
*/
bool fast_training ;
2018-02-05 14:07:57 +01:00
/**
* @ channel_coding :
*
* ANSI 8 B / 10 B channel coding capability
*/
bool channel_coding ;
2018-02-05 15:16:18 +01:00
/**
* @ alternate_scrambler_reset :
*
* eDP alternate scrambler reset capability
*/
bool alternate_scrambler_reset ;
2015-12-03 12:45:45 +01:00
} ;
void drm_dp_link_caps_copy ( struct drm_dp_link_caps * dest ,
const struct drm_dp_link_caps * src ) ;
2019-10-21 16:34:37 +02:00
2015-07-07 21:21:48 +02:00
/**
* struct drm_dp_link_ops - DP link operations
*/
struct drm_dp_link_ops {
/**
* @ apply_training :
*/
int ( * apply_training ) ( struct drm_dp_link * link ) ;
/**
* @ configure :
*/
int ( * configure ) ( struct drm_dp_link * link ) ;
} ;
# define DP_TRAIN_VOLTAGE_SWING_LEVEL(x) ((x) << 0)
# define DP_TRAIN_PRE_EMPHASIS_LEVEL(x) ((x) << 3)
# define DP_LANE_POST_CURSOR(i, x) (((x) & 0x3) << (((i) & 1) << 2))
/**
* struct drm_dp_link_train_set - link training settings
* @ voltage_swing : per - lane voltage swing
* @ pre_emphasis : per - lane pre - emphasis
* @ post_cursor : per - lane post - cursor
*/
struct drm_dp_link_train_set {
unsigned int voltage_swing [ 4 ] ;
unsigned int pre_emphasis [ 4 ] ;
unsigned int post_cursor [ 4 ] ;
} ;
/**
* struct drm_dp_link_train - link training state information
* @ request : currently requested settings
* @ adjust : adjustments requested by sink
* @ pattern : currently requested training pattern
* @ clock_recovered : flag to track if clock recovery has completed
* @ channel_equalized : flag to track if channel equalization has completed
*/
struct drm_dp_link_train {
struct drm_dp_link_train_set request ;
struct drm_dp_link_train_set adjust ;
unsigned int pattern ;
bool clock_recovered ;
bool channel_equalized ;
} ;
2018-02-05 14:31:27 +01:00
/**
2015-07-21 16:33:48 +02:00
* struct drm_dp_link - DP link capabilities and configuration
2018-02-05 14:31:27 +01:00
* @ revision : DP specification revision supported on the link
2015-07-21 16:33:48 +02:00
* @ max_rate : maximum clock rate supported on the link
* @ max_lanes : maximum number of lanes supported on the link
2015-12-03 12:45:45 +01:00
* @ caps : capabilities supported on the link ( see & drm_dp_link_caps )
2015-07-07 21:01:26 +02:00
* @ aux_rd_interval : AUX read interval to use for training ( in microseconds )
2015-07-07 20:59:22 +02:00
* @ edp : eDP revision ( 0x11 : eDP 1.1 , 0x12 : eDP 1.2 , . . . )
2015-07-21 16:33:48 +02:00
* @ rate : currently configured link rate
* @ lanes : currently configured number of lanes
2018-02-01 17:46:42 +01:00
* @ rates : additional supported link rates in kHz ( eDP 1.4 )
* @ num_rates : number of additional supported link rates ( eDP 1.4 )
2018-02-05 14:31:27 +01:00
*/
2019-10-21 16:34:37 +02:00
struct drm_dp_link {
unsigned char revision ;
2015-07-21 16:33:48 +02:00
unsigned int max_rate ;
unsigned int max_lanes ;
2015-12-03 12:45:45 +01:00
struct drm_dp_link_caps caps ;
2015-07-07 21:01:26 +02:00
/**
* @ cr : clock recovery read interval
* @ ce : channel equalization read interval
*/
struct {
unsigned int cr ;
unsigned int ce ;
} aux_rd_interval ;
2015-07-07 20:59:22 +02:00
unsigned char edp ;
2015-07-21 16:33:48 +02:00
unsigned int rate ;
unsigned int lanes ;
2018-02-01 17:46:42 +01:00
unsigned long rates [ DP_MAX_SUPPORTED_RATES ] ;
unsigned int num_rates ;
2015-07-07 21:21:48 +02:00
/**
* @ ops : DP link operations
*/
const struct drm_dp_link_ops * ops ;
/**
* @ aux : DP AUX channel
*/
struct drm_dp_aux * aux ;
/**
* @ train : DP link training state
*/
struct drm_dp_link_train train ;
2019-10-21 16:34:37 +02:00
} ;
2018-02-01 17:46:42 +01:00
int drm_dp_link_add_rate ( struct drm_dp_link * link , unsigned long rate ) ;
int drm_dp_link_remove_rate ( struct drm_dp_link * link , unsigned long rate ) ;
void drm_dp_link_update_rates ( struct drm_dp_link * link ) ;
2019-10-21 16:34:37 +02:00
int drm_dp_link_probe ( struct drm_dp_aux * aux , struct drm_dp_link * link ) ;
int drm_dp_link_power_up ( struct drm_dp_aux * aux , struct drm_dp_link * link ) ;
int drm_dp_link_power_down ( struct drm_dp_aux * aux , struct drm_dp_link * link ) ;
int drm_dp_link_configure ( struct drm_dp_aux * aux , struct drm_dp_link * link ) ;
2015-07-21 16:38:11 +02:00
int drm_dp_link_choose ( struct drm_dp_link * link ,
const struct drm_display_mode * mode ,
const struct drm_display_info * info ) ;
2019-10-21 16:34:37 +02:00
2015-07-07 21:21:48 +02:00
void drm_dp_link_train_init ( struct drm_dp_link_train * train ) ;
int drm_dp_link_train ( struct drm_dp_link * link ) ;
2019-10-21 16:34:37 +02:00
# endif