[Intel-gfx] [PATCH 2/2] drm/i915/glk: Enable cold boot for GLK DSI

Jani Nikula jani.nikula at intel.com
Mon May 15 15:49:06 UTC 2017


On Tue, 09 May 2017, Ville Syrjälä <ville.syrjala at linux.intel.com> wrote:
> On Tue, May 09, 2017 at 06:59:25PM +0530, Madhav Chauhan wrote:
>> As per BSEPC, if device ready bit is '0' in enable IO sequence
>> then its a cold boot/reset scenario eg: S3/S4 resume. In these
>> conditions we need to program certain registers and prepare port
>> from the middle of DSI enable sequence otherwise feature like S3/S4
>> doesn't work.
>
> Can't we just always follow the "cold boot" sequence? Less codepaths
> means less bugs.

I agree. Madhav?

BR,
Jani.


>
>> 
>> Signed-off-by: Madhav Chauhan <madhav.chauhan at intel.com>
>> ---
>>  drivers/gpu/drm/i915/intel_dsi.c | 79 ++++++++++++++++++++++++----------------
>>  1 file changed, 48 insertions(+), 31 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
>> index fc0ef49..6b68864 100644
>> --- a/drivers/gpu/drm/i915/intel_dsi.c
>> +++ b/drivers/gpu/drm/i915/intel_dsi.c
>> @@ -346,12 +346,17 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,
>>  	return true;
>>  }
>>  
>> -static void glk_dsi_device_ready(struct intel_encoder *encoder)
>> +static void intel_dsi_prepare(struct intel_encoder *intel_encoder,
>> +			      struct intel_crtc_state *pipe_config);
>> +
>> +static void glk_dsi_device_ready(struct intel_encoder *encoder,
>> +				 struct intel_crtc_state *pipe_config)
>>  {
>>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>>  	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
>>  	enum port port;
>>  	u32 tmp, val;
>> +	bool cold_boot = false;
>>  
>>  	/* Set the MIPI mode
>>  	 * If MIPI_Mode is off, then writing to LP_Wake bit is not reflecting.
>> @@ -370,7 +375,10 @@ static void glk_dsi_device_ready(struct intel_encoder *encoder)
>>  	/* Program LP Wake */
>>  	for_each_dsi_port(port, intel_dsi->ports) {
>>  		tmp = I915_READ(MIPI_CTRL(port));
>> -		tmp |= GLK_LP_WAKE;
>> +		if (!(I915_READ(MIPI_DEVICE_READY(port)) & DEVICE_READY))
>> +			tmp &= ~GLK_LP_WAKE;
>> +		else
>> +			tmp |= GLK_LP_WAKE;
>>  		I915_WRITE(MIPI_CTRL(port), tmp);
>>  	}
>>  
>> @@ -382,6 +390,15 @@ static void glk_dsi_device_ready(struct intel_encoder *encoder)
>>  			DRM_ERROR("MIPIO port is powergated\n");
>>  	}
>>  
>> +	/* Check if cold boot scenario */
>> +	for_each_dsi_port(port, intel_dsi->ports) {
>> +		cold_boot |= !(I915_READ(MIPI_DEVICE_READY(port)) &
>> +							DEVICE_READY);
>> +	}
>> +
>> +	if (cold_boot)
>> +		intel_dsi_prepare(encoder, pipe_config);
>> +
>>  	/* Wait for MIPI PHY status bit to set */
>>  	for_each_dsi_port(port, intel_dsi->ports) {
>>  		if (intel_wait_for_register(dev_priv,
>> @@ -402,34 +419,34 @@ static void glk_dsi_device_ready(struct intel_encoder *encoder)
>>  			val |= DEVICE_READY;
>>  			I915_WRITE(MIPI_DEVICE_READY(port), val);
>>  			usleep_range(10, 15);
>> -		}
>> -
>> -		/* Enter ULPS */
>> -		val = I915_READ(MIPI_DEVICE_READY(port));
>> -		val &= ~ULPS_STATE_MASK;
>> -		val |= (ULPS_STATE_ENTER | DEVICE_READY);
>> -		I915_WRITE(MIPI_DEVICE_READY(port), val);
>> +		} else {
>> +			/* Enter ULPS */
>> +			val = I915_READ(MIPI_DEVICE_READY(port));
>> +			val &= ~ULPS_STATE_MASK;
>> +			val |= (ULPS_STATE_ENTER | DEVICE_READY);
>> +			I915_WRITE(MIPI_DEVICE_READY(port), val);
>>  
>> -		/* Wait for ULPS active */
>> -		if (intel_wait_for_register(dev_priv,
>> +			/* Wait for ULPS active */
>> +			if (intel_wait_for_register(dev_priv,
>>  				MIPI_CTRL(port), GLK_ULPS_NOT_ACTIVE, 0, 20))
>> -			DRM_ERROR("ULPS not active\n");
>> +				DRM_ERROR("ULPS not active\n");
>>  
>> -		/* Exit ULPS */
>> -		val = I915_READ(MIPI_DEVICE_READY(port));
>> -		val &= ~ULPS_STATE_MASK;
>> -		val |= (ULPS_STATE_EXIT | DEVICE_READY);
>> -		I915_WRITE(MIPI_DEVICE_READY(port), val);
>> +			/* Exit ULPS */
>> +			val = I915_READ(MIPI_DEVICE_READY(port));
>> +			val &= ~ULPS_STATE_MASK;
>> +			val |= (ULPS_STATE_EXIT | DEVICE_READY);
>> +			I915_WRITE(MIPI_DEVICE_READY(port), val);
>>  
>> -		/* Enter Normal Mode */
>> -		val = I915_READ(MIPI_DEVICE_READY(port));
>> -		val &= ~ULPS_STATE_MASK;
>> -		val |= (ULPS_STATE_NORMAL_OPERATION | DEVICE_READY);
>> -		I915_WRITE(MIPI_DEVICE_READY(port), val);
>> +			/* Enter Normal Mode */
>> +			val = I915_READ(MIPI_DEVICE_READY(port));
>> +			val &= ~ULPS_STATE_MASK;
>> +			val |= (ULPS_STATE_NORMAL_OPERATION | DEVICE_READY);
>> +			I915_WRITE(MIPI_DEVICE_READY(port), val);
>>  
>> -		tmp = I915_READ(MIPI_CTRL(port));
>> -		tmp &= ~GLK_LP_WAKE;
>> -		I915_WRITE(MIPI_CTRL(port), tmp);
>> +			tmp = I915_READ(MIPI_CTRL(port));
>> +			tmp &= ~GLK_LP_WAKE;
>> +			I915_WRITE(MIPI_CTRL(port), tmp);
>> +		}
>>  	}
>>  
>>  	/* Wait for Stop state */
>> @@ -515,7 +532,8 @@ static void vlv_dsi_device_ready(struct intel_encoder *encoder)
>>  	}
>>  }
>>  
>> -static void intel_dsi_device_ready(struct intel_encoder *encoder)
>> +static void intel_dsi_device_ready(struct intel_encoder *encoder,
>> +				   struct intel_crtc_state *pipe_config)
>>  {
>>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>>  
>> @@ -524,7 +542,7 @@ static void intel_dsi_device_ready(struct intel_encoder *encoder)
>>  	else if (IS_BROXTON(dev_priv))
>>  		bxt_dsi_device_ready(encoder);
>>  	else if (IS_GEMINILAKE(dev_priv))
>> -		glk_dsi_device_ready(encoder);
>> +		glk_dsi_device_ready(encoder, pipe_config);
>>  }
>>  
>>  static void glk_dsi_enter_low_power_mode(struct intel_encoder *encoder)
>> @@ -710,8 +728,6 @@ static void intel_dsi_port_disable(struct intel_encoder *encoder)
>>  	}
>>  }
>>  
>> -static void intel_dsi_prepare(struct intel_encoder *intel_encoder,
>> -			      struct intel_crtc_state *pipe_config);
>>  static void intel_dsi_unprepare(struct intel_encoder *encoder);
>>  
>>  static void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec)
>> @@ -800,7 +816,8 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder,
>>  		I915_WRITE(DSPCLK_GATE_D, val);
>>  	}
>>  
>> -	intel_dsi_prepare(encoder, pipe_config);
>> +	if (!IS_GEMINILAKE(dev_priv))
>> +		intel_dsi_prepare(encoder, pipe_config);
>>  
>>  	/* Power on, try both CRC pmic gpio and VBT */
>>  	if (intel_dsi->gpio_panel)
>> @@ -812,7 +829,7 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder,
>>  	intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
>>  
>>  	/* Put device in ready state (LP-11) */
>> -	intel_dsi_device_ready(encoder);
>> +	intel_dsi_device_ready(encoder, pipe_config);
>>  
>>  	/* Send initialization commands in LP mode */
>>  	intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_INIT_OTP);
>> -- 
>> 1.9.1
>> 
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Jani Nikula, Intel Open Source Technology Center


More information about the Intel-gfx mailing list