All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Ander Conselvan de Oliveira
	<ander.conselvan.de.oliveira@intel.com>,
	thomas.wood@intel.com
Subject: [PATCH 1/2] drm/i915: Make link training state machine code use function pointers
Date: Tue, 15 Sep 2015 16:11:35 +0300	[thread overview]
Message-ID: <1442322696-31286-1-git-send-email-ander.conselvan.de.oliveira@intel.com> (raw)
In-Reply-To: <1442237891.2755.24.camel@gmail.com>

Create a series of function pointers in intel_dp for the consumption of
the link training state machine, instead of calling the functions from
intel_dp.c direcly. This creates the insertion points for a link
training unit test, that will be added in the next patch.
---
 drivers/gpu/drm/i915/intel_dp.c               | 36 ++++++++++++++++++++-------
 drivers/gpu/drm/i915/intel_dp_link_training.c | 36 +++++++++++++--------------
 drivers/gpu/drm/i915/intel_drv.h              | 29 ++++++++++-----------
 3 files changed, 58 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index d914f95..6422b8a 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1189,7 +1189,7 @@ intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates)
 	return (intel_dp_max_link_bw(intel_dp) >> 3) + 1;
 }
 
-bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp)
+static bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct drm_device *dev = dig_port->base.base.dev;
@@ -1368,8 +1368,8 @@ int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
 	return rate_to_index(rate, intel_dp->sink_rates);
 }
 
-void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
-			   uint8_t *link_bw, uint8_t *rate_select)
+static void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
+				  uint8_t *link_bw, uint8_t *rate_select)
 {
 	if (intel_dp->num_sink_rates) {
 		*link_bw = 0;
@@ -3049,7 +3049,7 @@ intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
  * Fetch AUX CH registers 0x202 - 0x207 which contain
  * link status information
  */
-bool
+static bool
 intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
 {
 	return intel_dp_dpcd_read_wake(&intel_dp->aux,
@@ -3059,7 +3059,7 @@ intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_
 }
 
 /* These are source-specific values. */
-uint8_t
+static uint8_t
 intel_dp_voltage_max(struct intel_dp *intel_dp)
 {
 	struct drm_device *dev = intel_dp_to_dev(intel_dp);
@@ -3082,7 +3082,7 @@ intel_dp_voltage_max(struct intel_dp *intel_dp)
 		return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
 }
 
-uint8_t
+static uint8_t
 intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
 {
 	struct drm_device *dev = intel_dp_to_dev(intel_dp);
@@ -3570,7 +3570,7 @@ intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
 	*DP = (*DP & ~mask) | signal_levels;
 }
 
-void
+static void
 intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
 				       uint8_t dp_train_pat)
 {
@@ -3584,7 +3584,7 @@ intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
 	POSTING_READ(intel_dp->output_reg);
 }
 
-void
+static void
 intel_dp_update_signal_levels(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
@@ -3597,7 +3597,14 @@ intel_dp_update_signal_levels(struct intel_dp *intel_dp)
 	POSTING_READ(intel_dp->output_reg);
 }
 
-void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
+static ssize_t
+intel_dp_dpcd_write(struct intel_dp *intel_dp, unsigned int offset,
+		    void *buffer, size_t size)
+{
+	return drm_dp_dpcd_write(&intel_dp->aux, offset, buffer, size);
+}
+
+static void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
 	struct drm_device *dev = intel_dig_port->base.base.dev;
@@ -5742,6 +5749,17 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 	if (HAS_DDI(dev))
 		intel_dp->prepare_link_retrain = intel_ddi_prepare_link_retrain;
 
+	intel_dp->get_link_status = intel_dp_get_link_status;
+	intel_dp->update_signal_levels = intel_dp_update_signal_levels;
+	intel_dp->compute_rate = intel_dp_compute_rate;
+	intel_dp->program_link_training_pattern =
+		intel_dp_program_link_training_pattern;
+	intel_dp->set_idle_link_train = intel_dp_set_idle_link_train;
+	intel_dp->voltage_max = intel_dp_voltage_max;
+	intel_dp->pre_emphasis_max = intel_dp_pre_emphasis_max;
+	intel_dp->dpcd_write = intel_dp_dpcd_write;
+	intel_dp->source_supports_hbr2 = intel_dp_source_supports_hbr2;
+
 	/* Preserve the current hw state. */
 	intel_dp->DP = I915_READ(intel_dp->output_reg);
 	intel_dp->attached_connector = intel_connector;
diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c
index 4d2bdc0..c2982f8 100644
--- a/drivers/gpu/drm/i915/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
@@ -43,11 +43,11 @@ intel_get_adjust_train(struct intel_dp *intel_dp,
 			p = this_p;
 	}
 
-	voltage_max = intel_dp_voltage_max(intel_dp);
+	voltage_max = intel_dp->voltage_max(intel_dp);
 	if (v >= voltage_max)
 		v = voltage_max | DP_TRAIN_MAX_SWING_REACHED;
 
-	preemph_max = intel_dp_pre_emphasis_max(intel_dp, v);
+	preemph_max = intel_dp->pre_emphasis_max(intel_dp, v);
 	if (p >= preemph_max)
 		p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
 
@@ -62,7 +62,7 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
 	uint8_t buf[sizeof(intel_dp->train_set) + 1];
 	int ret, len;
 
-	intel_dp_program_link_training_pattern(intel_dp, dp_train_pat);
+	intel_dp->program_link_training_pattern(intel_dp, dp_train_pat);
 
 	buf[0] = dp_train_pat;
 	if ((dp_train_pat & DP_TRAINING_PATTERN_MASK) ==
@@ -75,8 +75,8 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
 		len = intel_dp->lane_count + 1;
 	}
 
-	ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
-				buf, len);
+	ret = intel_dp->dpcd_write(intel_dp, DP_TRAINING_PATTERN_SET,
+				   buf, len);
 
 	return ret == len;
 }
@@ -87,7 +87,7 @@ intel_dp_reset_link_train(struct intel_dp *intel_dp,
 {
 	if (!intel_dp->train_set_valid)
 		memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
-	intel_dp_update_signal_levels(intel_dp);
+	intel_dp->update_signal_levels(intel_dp);
 	return intel_dp_set_link_train(intel_dp, dp_train_pat);
 }
 
@@ -96,10 +96,10 @@ intel_dp_update_link_train(struct intel_dp *intel_dp)
 {
 	int ret;
 
-	intel_dp_update_signal_levels(intel_dp);
+	intel_dp->update_signal_levels(intel_dp);
 
-	ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
-				intel_dp->train_set, intel_dp->lane_count);
+	ret = intel_dp->dpcd_write(intel_dp, DP_TRAINING_LANE0_SET,
+				   intel_dp->train_set, intel_dp->lane_count);
 
 	return ret == intel_dp->lane_count;
 }
@@ -118,22 +118,22 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
 	if (intel_dp->prepare_link_retrain)
 		intel_dp->prepare_link_retrain(intel_dp);
 
-	intel_dp_compute_rate(intel_dp, intel_dp->link_rate,
-			      &link_bw, &rate_select);
+	intel_dp->compute_rate(intel_dp, intel_dp->link_rate,
+			       &link_bw, &rate_select);
 
 	/* Write the link configuration data */
 	link_config[0] = link_bw;
 	link_config[1] = intel_dp->lane_count;
 	if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
 		link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
-	drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
+	intel_dp->dpcd_write(intel_dp, DP_LINK_BW_SET, link_config, 2);
 	if (intel_dp->num_sink_rates)
-		drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
+		intel_dp->dpcd_write(intel_dp, DP_LINK_RATE_SET,
 				  &rate_select, 1);
 
 	link_config[0] = 0;
 	link_config[1] = DP_SET_ANSI_8B10B;
-	drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
+	intel_dp->dpcd_write(intel_dp, DP_DOWNSPREAD_CTRL, link_config, 2);
 
 	intel_dp->DP |= DP_PORT_EN;
 
@@ -150,7 +150,7 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
 	loop_tries = 0;
 	for (;;) {
 		drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
-		if (!intel_dp_get_link_status(intel_dp, link_status)) {
+		if (!intel_dp->get_link_status(intel_dp, link_status)) {
 			DRM_ERROR("failed to get link status\n");
 			break;
 		}
@@ -232,7 +232,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
 	 * Due to WaDisableHBR2 SKL < B0 is the only exception where TPS3 is
 	 * supported but still not enabled.
 	 */
-	if (intel_dp_source_supports_hbr2(intel_dp) &&
+	if (intel_dp->source_supports_hbr2(intel_dp) &&
 	    drm_dp_tps3_supported(intel_dp->dpcd))
 		training_pattern = DP_TRAINING_PATTERN_3;
 	else if (intel_dp->link_rate == 540000)
@@ -258,7 +258,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
 		}
 
 		drm_dp_link_train_channel_eq_delay(intel_dp->dpcd);
-		if (!intel_dp_get_link_status(intel_dp, link_status)) {
+		if (!intel_dp->get_link_status(intel_dp, link_status)) {
 			DRM_ERROR("failed to get link status\n");
 			break;
 		}
@@ -302,7 +302,7 @@ intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
 		++tries;
 	}
 
-	intel_dp_set_idle_link_train(intel_dp);
+	intel_dp->set_idle_link_train(intel_dp);
 
 	if (channel_eq) {
 		intel_dp->train_set_valid = true;
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 35ffe27e..bc0de6c 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -771,6 +771,19 @@ struct intel_dp {
 
 	/* This is called before a link training is starterd */
 	void (*prepare_link_retrain)(struct intel_dp *intel_dp);
+	bool (*get_link_status)(struct intel_dp *intel_dp,
+				uint8_t link_status[DP_LINK_STATUS_SIZE]);
+	void (*update_signal_levels)(struct intel_dp *intel_dp);
+	void (*compute_rate)(struct intel_dp *intel_dp, int port_clock,
+			     uint8_t *link_bw, uint8_t *rate_select);
+	void (*program_link_training_pattern)(struct intel_dp *intel_dp,
+					      uint8_t dp_train_pat);
+	void (*set_idle_link_train)(struct intel_dp *intel_dp);
+	uint8_t (*voltage_max)(struct intel_dp *intel_dp);
+	uint8_t (*pre_emphasis_max)(struct intel_dp *intel_dp, uint8_t voltage);
+	ssize_t (*dpcd_write)(struct intel_dp *intel_dp, unsigned int offset,
+			      void *buffer, size_t size);
+	bool (*source_supports_hbr2)(struct intel_dp *intel_dp);
 
 	bool train_set_valid;
 
@@ -1217,22 +1230,6 @@ void intel_edp_drrs_invalidate(struct drm_device *dev,
 void intel_edp_drrs_flush(struct drm_device *dev, unsigned frontbuffer_bits);
 void hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config);
 
-void
-intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
-				       uint8_t dp_train_pat);
-void
-intel_dp_update_signal_levels(struct intel_dp *intel_dp);
-void intel_dp_set_idle_link_train(struct intel_dp *intel_dp);
-uint8_t
-intel_dp_voltage_max(struct intel_dp *intel_dp);
-uint8_t
-intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing);
-void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
-			   uint8_t *link_bw, uint8_t *rate_select);
-bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp);
-bool
-intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]);
-
 /* intel_dp_mst.c */
 int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id);
 void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port);
-- 
2.4.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2015-09-15 13:12 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-08 12:27 [PATCH 0/8] [RFC] Link training test Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 1/8] drm/i915: Rename DP link training functions Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 2/8] drm/i915: Don't pass *DP around to " Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 3/8] drm/i915: Split intel_dp_update_link_train() Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 4/8] drm/i915: Split write of pattern to DP reg from intel_dp_set_link_train Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 5/8] drm/i915: Don't call intel_dp_set_signal_levels() on link train reset Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 6/8] drm/i915: Move generic link training code to a separate file Ander Conselvan de Oliveira
2015-09-08 12:27 ` [PATCH 7/8] drm/i915: Move max voltage and pre emphasis to intel_dp_link_training.c Ander Conselvan de Oliveira
2015-09-08 13:01   ` Ville Syrjälä
2015-10-19  5:14     ` Thulasimani, Sivakumar
2015-10-19  5:59       ` Ander Conselvan De Oliveira
2015-10-19  6:13         ` Thulasimani, Sivakumar
2015-09-08 12:27 ` [PATCH 8/8] drm/i915: Extract intel_dev_info.[ch] Ander Conselvan de Oliveira
2015-09-08 12:28 ` [PATCH i-g-t] Add a link training test Ander Conselvan de Oliveira
2015-09-08 13:11   ` Ville Syrjälä
2015-09-08 13:26     ` Ander Conselvan De Oliveira
2015-09-09 10:33   ` Thomas Wood
2015-09-11 14:11     ` [PATCH] Add a link training test (v2) Ander Conselvan de Oliveira
2015-09-14 11:51       ` [PATCH] drm/i915: Add link training test Ander Conselvan de Oliveira
2015-09-14 13:11         ` Daniel Vetter
2015-09-14 13:38           ` Ander Conselvan De Oliveira
2015-09-15 13:08             ` Ander Conselvan De Oliveira
2015-09-23  8:24               ` Daniel Vetter
2015-09-23  9:18                 ` Ander Conselvan De Oliveira
2015-09-23  9:38                   ` Shared scaffolding to unit-test kernel code in userspace (was Re: [Intel-gfx] [PATCH] drm/i915: Add link training test) Daniel Vetter
2015-09-23  9:38                     ` Daniel Vetter
2015-09-29  8:47                     ` Ander Conselvan De Oliveira
2015-09-29  8:47                       ` Shared scaffolding to unit-test kernel code in userspace (was " Ander Conselvan De Oliveira
2015-09-15 13:11             ` Ander Conselvan de Oliveira [this message]
2015-09-15 13:11               ` [PATCH 2/2] drm/i915: Add a link training test Ander Conselvan de Oliveira
2015-09-22 15:12 ` [PATCH 0/8] [RFC] Link " Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1442322696-31286-1-git-send-email-ander.conselvan.de.oliveira@intel.com \
    --to=ander.conselvan.de.oliveira@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=thomas.wood@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.