Commit aee3bac0 authored by José Roberto de Souza's avatar José Roberto de Souza Committed by Rodrigo Vivi

drm/i915/psr: Tie PSR2 support to Y coordinate requirement

Although i915 don't implement aux sync frame through tests was
findout that pannels can do selective update when the y-coordinate
is also included in SDP, that is why it is required to run PSR2 in
i915.

So moving to only one place the sink requirements that the actual
driver needs to enable PSR2.

Also intel_psr2_config_valid() is called every time the crtc config
is computed, wasting some time every time it was checking for
Y coordinate requirement.

This allow us to nuke y_cord_support and some of VSC setup code that
was handling a scenario that would never happen(PSR2 without Y
coordinate).

Also here renaming intel_dp_get_y_cord_status() to
intel_dp_get_y_coord_required() as it more accurate to the name and
function of bit according to eDP spec.

Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180328223046.16125-4-jose.souza@intel.com
parent 6ce9b78a
...@@ -604,7 +604,6 @@ struct i915_psr { ...@@ -604,7 +604,6 @@ struct i915_psr {
unsigned busy_frontbuffer_bits; unsigned busy_frontbuffer_bits;
bool psr2_support; bool psr2_support;
bool link_standby; bool link_standby;
bool y_cord_support;
bool colorimetry_support; bool colorimetry_support;
bool alpm; bool alpm;
bool has_hw_tracking; bool has_hw_tracking;
......
...@@ -93,7 +93,7 @@ static void psr_aux_io_power_put(struct intel_dp *intel_dp) ...@@ -93,7 +93,7 @@ static void psr_aux_io_power_put(struct intel_dp *intel_dp)
intel_display_power_put(dev_priv, psr_aux_domain(intel_dp)); intel_display_power_put(dev_priv, psr_aux_domain(intel_dp));
} }
static bool intel_dp_get_y_cord_status(struct intel_dp *intel_dp) static bool intel_dp_get_y_coord_required(struct intel_dp *intel_dp)
{ {
uint8_t psr_caps = 0; uint8_t psr_caps = 0;
...@@ -130,22 +130,29 @@ void intel_psr_init_dpcd(struct intel_dp *intel_dp) ...@@ -130,22 +130,29 @@ void intel_psr_init_dpcd(struct intel_dp *intel_dp)
drm_dp_dpcd_read(&intel_dp->aux, DP_PSR_SUPPORT, intel_dp->psr_dpcd, drm_dp_dpcd_read(&intel_dp->aux, DP_PSR_SUPPORT, intel_dp->psr_dpcd,
sizeof(intel_dp->psr_dpcd)); sizeof(intel_dp->psr_dpcd));
if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) { if (intel_dp->psr_dpcd[0]) {
dev_priv->psr.sink_support = true; dev_priv->psr.sink_support = true;
DRM_DEBUG_KMS("Detected EDP PSR Panel.\n"); DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
} }
if (INTEL_GEN(dev_priv) >= 9 && if (INTEL_GEN(dev_priv) >= 9 &&
(intel_dp->psr_dpcd[0] & DP_PSR2_IS_SUPPORTED)) { (intel_dp->psr_dpcd[0] == DP_PSR2_WITH_Y_COORD_IS_SUPPORTED)) {
/*
dev_priv->psr.sink_support = true; * All panels that supports PSR version 03h (PSR2 +
dev_priv->psr.psr2_support = true; * Y-coordinate) can handle Y-coordinates in VSC but we are
* only sure that it is going to be used when required by the
* panel. This way panel is capable to do selective update
* without a aux frame sync.
*
* To support PSR version 02h and PSR version 03h without
* Y-coordinate requirement panels we would need to enable
* GTC first.
*/
dev_priv->psr.psr2_support = intel_dp_get_y_coord_required(intel_dp);
DRM_DEBUG_KMS("PSR2 %s on sink", DRM_DEBUG_KMS("PSR2 %s on sink",
dev_priv->psr.psr2_support ? "supported" : "not supported"); dev_priv->psr.psr2_support ? "supported" : "not supported");
if (dev_priv->psr.psr2_support) { if (dev_priv->psr.psr2_support) {
dev_priv->psr.y_cord_support =
intel_dp_get_y_cord_status(intel_dp);
dev_priv->psr.colorimetry_support = dev_priv->psr.colorimetry_support =
intel_dp_get_colorimetry_status(intel_dp); intel_dp_get_colorimetry_status(intel_dp);
dev_priv->psr.alpm = dev_priv->psr.alpm =
...@@ -191,16 +198,12 @@ static void hsw_psr_setup_vsc(struct intel_dp *intel_dp, ...@@ -191,16 +198,12 @@ static void hsw_psr_setup_vsc(struct intel_dp *intel_dp,
memset(&psr_vsc, 0, sizeof(psr_vsc)); memset(&psr_vsc, 0, sizeof(psr_vsc));
psr_vsc.sdp_header.HB0 = 0; psr_vsc.sdp_header.HB0 = 0;
psr_vsc.sdp_header.HB1 = 0x7; psr_vsc.sdp_header.HB1 = 0x7;
if (dev_priv->psr.colorimetry_support && if (dev_priv->psr.colorimetry_support) {
dev_priv->psr.y_cord_support) {
psr_vsc.sdp_header.HB2 = 0x5; psr_vsc.sdp_header.HB2 = 0x5;
psr_vsc.sdp_header.HB3 = 0x13; psr_vsc.sdp_header.HB3 = 0x13;
} else if (dev_priv->psr.y_cord_support) { } else {
psr_vsc.sdp_header.HB2 = 0x4; psr_vsc.sdp_header.HB2 = 0x4;
psr_vsc.sdp_header.HB3 = 0xe; psr_vsc.sdp_header.HB3 = 0xe;
} else {
psr_vsc.sdp_header.HB2 = 0x3;
psr_vsc.sdp_header.HB3 = 0xc;
} }
} else { } else {
/* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */ /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */
...@@ -457,15 +460,6 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp, ...@@ -457,15 +460,6 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp,
return false; return false;
} }
/*
* FIXME:enable psr2 only for y-cordinate psr2 panels
* After gtc implementation , remove this restriction.
*/
if (!dev_priv->psr.y_cord_support) {
DRM_DEBUG_KMS("PSR2 not enabled, panel does not support Y coordinate\n");
return false;
}
return true; return true;
} }
...@@ -565,7 +559,6 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp, ...@@ -565,7 +559,6 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp,
struct drm_device *dev = dig_port->base.base.dev; struct drm_device *dev = dig_port->base.base.dev;
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
u32 chicken;
psr_aux_io_power_get(intel_dp); psr_aux_io_power_get(intel_dp);
...@@ -576,9 +569,8 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp, ...@@ -576,9 +569,8 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp,
hsw_psr_setup_aux(intel_dp); hsw_psr_setup_aux(intel_dp);
if (dev_priv->psr.psr2_support) { if (dev_priv->psr.psr2_support) {
chicken = PSR2_VSC_ENABLE_PROG_HEADER; u32 chicken = PSR2_VSC_ENABLE_PROG_HEADER
if (dev_priv->psr.y_cord_support) | PSR2_ADD_VERTICAL_LINE_COUNT;
chicken |= PSR2_ADD_VERTICAL_LINE_COUNT;
I915_WRITE(CHICKEN_TRANS(cpu_transcoder), chicken); I915_WRITE(CHICKEN_TRANS(cpu_transcoder), chicken);
I915_WRITE(EDP_PSR_DEBUG, I915_WRITE(EDP_PSR_DEBUG,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment