Skip to content

Commit

Permalink
drm/i915: Pass idle crtc_state to intel_dp_sink_crc
Browse files Browse the repository at this point in the history
IPS can only be enabled if the primary plane is visible, so
first make sure sw state matches hw state by waiting for hw_done.

After this pass crtc_state to intel_dp_sink_crc() so that can be used,
instead of using legacy pointers.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171110113503.16253-7-maarten.lankhorst@linux.intel.com
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
  • Loading branch information
Maarten Lankhorst committed Nov 17, 2017
1 parent 33a4986 commit 9331353
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 13 deletions.
17 changes: 15 additions & 2 deletions drivers/gpu/drm/i915/i915_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -2746,6 +2746,7 @@ static int i915_sink_crc(struct seq_file *m, void *data)
for_each_intel_connector_iter(connector, &conn_iter) {
struct drm_crtc *crtc;
struct drm_connector_state *state;
struct intel_crtc_state *crtc_state;

if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
continue;
Expand All @@ -2764,12 +2765,24 @@ static int i915_sink_crc(struct seq_file *m, void *data)
if (ret)
goto err;

if (!crtc->state->active)
crtc_state = to_intel_crtc_state(crtc->state);
if (!crtc_state->base.active)
continue;

/*
* We need to wait for all crtc updates to complete, to make
* sure any pending modesets and plane updates are completed.
*/
if (crtc_state->base.commit) {
ret = wait_for_completion_interruptible(&crtc_state->base.commit->hw_done);

if (ret)
goto err;
}

intel_dp = enc_to_intel_dp(state->best_encoder);

ret = intel_dp_sink_crc(intel_dp, crc);
ret = intel_dp_sink_crc(intel_dp, crtc_state, crc);
if (ret)
goto err;

Expand Down
23 changes: 13 additions & 10 deletions drivers/gpu/drm/i915/intel_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -3861,11 +3861,12 @@ intel_dp_configure_mst(struct intel_dp *intel_dp)
intel_dp->is_mst);
}

static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp,
struct intel_crtc_state *crtc_state, bool disable_wa)
{
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
u8 buf;
int ret = 0;
int count = 0;
Expand Down Expand Up @@ -3901,15 +3902,17 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
}

out:
hsw_enable_ips(intel_crtc);
if (disable_wa)
hsw_enable_ips(intel_crtc);
return ret;
}

static int intel_dp_sink_crc_start(struct intel_dp *intel_dp)
static int intel_dp_sink_crc_start(struct intel_dp *intel_dp,
struct intel_crtc_state *crtc_state)
{
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
u8 buf;
int ret;

Expand All @@ -3923,7 +3926,7 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp)
return -EIO;

if (buf & DP_TEST_SINK_START) {
ret = intel_dp_sink_crc_stop(intel_dp);
ret = intel_dp_sink_crc_stop(intel_dp, crtc_state, false);
if (ret)
return ret;
}
Expand All @@ -3940,16 +3943,16 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp)
return 0;
}

int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
int intel_dp_sink_crc(struct intel_dp *intel_dp, struct intel_crtc_state *crtc_state, u8 *crc)
{
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
u8 buf;
int count, ret;
int attempts = 6;

ret = intel_dp_sink_crc_start(intel_dp);
ret = intel_dp_sink_crc_start(intel_dp, crtc_state);
if (ret)
return ret;

Expand Down Expand Up @@ -3977,7 +3980,7 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
}

stop:
intel_dp_sink_crc_stop(intel_dp);
intel_dp_sink_crc_stop(intel_dp, crtc_state, true);
return ret;
}

Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/i915/intel_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1531,7 +1531,8 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode);
void intel_dp_encoder_reset(struct drm_encoder *encoder);
void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder);
void intel_dp_encoder_destroy(struct drm_encoder *encoder);
int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc);
int intel_dp_sink_crc(struct intel_dp *intel_dp,
struct intel_crtc_state *crtc_state, u8 *crc);
bool intel_dp_compute_config(struct intel_encoder *encoder,
struct intel_crtc_state *pipe_config,
struct drm_connector_state *conn_state);
Expand Down

0 comments on commit 9331353

Please sign in to comment.