diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 39 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 29 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 |
3 files changed, 69 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 473dda2b9ae7..4b852c6c799e 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -1920,6 +1920,44 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) | |||
1920 | return 0; | 1920 | return 0; |
1921 | } | 1921 | } |
1922 | 1922 | ||
1923 | static int i915_sink_crc(struct seq_file *m, void *data) | ||
1924 | { | ||
1925 | struct drm_info_node *node = m->private; | ||
1926 | struct drm_device *dev = node->minor->dev; | ||
1927 | struct intel_encoder *encoder; | ||
1928 | struct intel_connector *connector; | ||
1929 | struct intel_dp *intel_dp = NULL; | ||
1930 | int ret; | ||
1931 | u8 crc[6]; | ||
1932 | |||
1933 | drm_modeset_lock_all(dev); | ||
1934 | list_for_each_entry(connector, &dev->mode_config.connector_list, | ||
1935 | base.head) { | ||
1936 | |||
1937 | if (connector->base.dpms != DRM_MODE_DPMS_ON) | ||
1938 | continue; | ||
1939 | |||
1940 | encoder = to_intel_encoder(connector->base.encoder); | ||
1941 | if (encoder->type != INTEL_OUTPUT_EDP) | ||
1942 | continue; | ||
1943 | |||
1944 | intel_dp = enc_to_intel_dp(&encoder->base); | ||
1945 | |||
1946 | ret = intel_dp_sink_crc(intel_dp, crc); | ||
1947 | if (ret) | ||
1948 | goto out; | ||
1949 | |||
1950 | seq_printf(m, "%02x%02x%02x%02x%02x%02x\n", | ||
1951 | crc[0], crc[1], crc[2], | ||
1952 | crc[3], crc[4], crc[5]); | ||
1953 | goto out; | ||
1954 | } | ||
1955 | ret = -ENODEV; | ||
1956 | out: | ||
1957 | drm_modeset_unlock_all(dev); | ||
1958 | return ret; | ||
1959 | } | ||
1960 | |||
1923 | static int i915_energy_uJ(struct seq_file *m, void *data) | 1961 | static int i915_energy_uJ(struct seq_file *m, void *data) |
1924 | { | 1962 | { |
1925 | struct drm_info_node *node = m->private; | 1963 | struct drm_info_node *node = m->private; |
@@ -3276,6 +3314,7 @@ static const struct drm_info_list i915_debugfs_list[] = { | |||
3276 | {"i915_dpio", i915_dpio_info, 0}, | 3314 | {"i915_dpio", i915_dpio_info, 0}, |
3277 | {"i915_llc", i915_llc, 0}, | 3315 | {"i915_llc", i915_llc, 0}, |
3278 | {"i915_edp_psr_status", i915_edp_psr_status, 0}, | 3316 | {"i915_edp_psr_status", i915_edp_psr_status, 0}, |
3317 | {"i915_sink_crc_eDP1", i915_sink_crc, 0}, | ||
3279 | {"i915_energy_uJ", i915_energy_uJ, 0}, | 3318 | {"i915_energy_uJ", i915_energy_uJ, 0}, |
3280 | {"i915_pc8_status", i915_pc8_status, 0}, | 3319 | {"i915_pc8_status", i915_pc8_status, 0}, |
3281 | {"i915_power_domain_info", i915_power_domain_info, 0}, | 3320 | {"i915_power_domain_info", i915_power_domain_info, 0}, |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index e37c7a037538..389eabf898ad 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -2922,6 +2922,35 @@ intel_dp_probe_oui(struct intel_dp *intel_dp) | |||
2922 | edp_panel_vdd_off(intel_dp, false); | 2922 | edp_panel_vdd_off(intel_dp, false); |
2923 | } | 2923 | } |
2924 | 2924 | ||
2925 | int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc) | ||
2926 | { | ||
2927 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | ||
2928 | struct drm_device *dev = intel_dig_port->base.base.dev; | ||
2929 | struct intel_crtc *intel_crtc = | ||
2930 | to_intel_crtc(intel_dig_port->base.base.crtc); | ||
2931 | u8 buf[1]; | ||
2932 | |||
2933 | if (!intel_dp_aux_native_read(intel_dp, DP_TEST_SINK_MISC, buf, 1)) | ||
2934 | return -EAGAIN; | ||
2935 | |||
2936 | if (!(buf[0] & DP_TEST_CRC_SUPPORTED)) | ||
2937 | return -ENOTTY; | ||
2938 | |||
2939 | if (!intel_dp_aux_native_write_1(intel_dp, DP_TEST_SINK, | ||
2940 | DP_TEST_SINK_START)) | ||
2941 | return -EAGAIN; | ||
2942 | |||
2943 | /* Wait 2 vblanks to be sure we will have the correct CRC value */ | ||
2944 | intel_wait_for_vblank(dev, intel_crtc->pipe); | ||
2945 | intel_wait_for_vblank(dev, intel_crtc->pipe); | ||
2946 | |||
2947 | if (!intel_dp_aux_native_read(intel_dp, DP_TEST_CRC_R_CR, crc, 6)) | ||
2948 | return -EAGAIN; | ||
2949 | |||
2950 | intel_dp_aux_native_write_1(intel_dp, DP_TEST_SINK, 0); | ||
2951 | return 0; | ||
2952 | } | ||
2953 | |||
2925 | static bool | 2954 | static bool |
2926 | intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector) | 2955 | intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector) |
2927 | { | 2956 | { |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 7b3c2090148e..44067bce5e04 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -738,6 +738,7 @@ void intel_dp_stop_link_train(struct intel_dp *intel_dp); | |||
738 | void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode); | 738 | void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode); |
739 | void intel_dp_encoder_destroy(struct drm_encoder *encoder); | 739 | void intel_dp_encoder_destroy(struct drm_encoder *encoder); |
740 | void intel_dp_check_link_status(struct intel_dp *intel_dp); | 740 | void intel_dp_check_link_status(struct intel_dp *intel_dp); |
741 | int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc); | ||
741 | bool intel_dp_compute_config(struct intel_encoder *encoder, | 742 | bool intel_dp_compute_config(struct intel_encoder *encoder, |
742 | struct intel_crtc_config *pipe_config); | 743 | struct intel_crtc_config *pipe_config); |
743 | bool intel_dp_is_edp(struct drm_device *dev, enum port port); | 744 | bool intel_dp_is_edp(struct drm_device *dev, enum port port); |