123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /* 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
- #include <linux/types.h>
- struct drm_display_info;
- struct drm_display_mode;
- struct drm_dp_aux;
- struct drm_dp_link;
- /**
- * 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;
- /**
- * tps3_supported:
- *
- * training pattern sequence 3 supported for equalization
- */
- bool tps3_supported;
- /**
- * @fast_training:
- *
- * AUX CH handshake not required for link training
- */
- bool fast_training;
- /**
- * @channel_coding:
- *
- * ANSI 8B/10B channel coding capability
- */
- bool channel_coding;
- /**
- * @alternate_scrambler_reset:
- *
- * eDP alternate scrambler reset capability
- */
- bool alternate_scrambler_reset;
- };
- void drm_dp_link_caps_copy(struct drm_dp_link_caps *dest,
- const struct drm_dp_link_caps *src);
- /**
- * 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;
- };
- /**
- * struct drm_dp_link - DP link capabilities and configuration
- * @revision: DP specification revision supported on the link
- * @max_rate: maximum clock rate supported on the link
- * @max_lanes: maximum number of lanes supported on the link
- * @caps: capabilities supported on the link (see &drm_dp_link_caps)
- * @aux_rd_interval: AUX read interval to use for training (in microseconds)
- * @edp: eDP revision (0x11: eDP 1.1, 0x12: eDP 1.2, ...)
- * @rate: currently configured link rate
- * @lanes: currently configured number of lanes
- * @rates: additional supported link rates in kHz (eDP 1.4)
- * @num_rates: number of additional supported link rates (eDP 1.4)
- */
- struct drm_dp_link {
- unsigned char revision;
- unsigned int max_rate;
- unsigned int max_lanes;
- struct drm_dp_link_caps caps;
- /**
- * @cr: clock recovery read interval
- * @ce: channel equalization read interval
- */
- struct {
- unsigned int cr;
- unsigned int ce;
- } aux_rd_interval;
- unsigned char edp;
- unsigned int rate;
- unsigned int lanes;
- unsigned long rates[DP_MAX_SUPPORTED_RATES];
- unsigned int num_rates;
- /**
- * @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;
- };
- 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);
- 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);
- int drm_dp_link_choose(struct drm_dp_link *link,
- const struct drm_display_mode *mode,
- const struct drm_display_info *info);
- void drm_dp_link_train_init(struct drm_dp_link_train *train);
- int drm_dp_link_train(struct drm_dp_link *link);
- #endif
|