[Intel-gfx] [RFC PATCH 2/7] drm/i915: Read hw state into an atomic state struct, try 2.

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Tue Jun 23 03:49:00 PDT 2015


Op 22-06-15 om 17:31 schreef Daniel Vetter:
> On Fri, Jun 19, 2015 at 10:02:25AM +0200, Maarten Lankhorst wrote:
>>  /* Scan out the current hw modeset state, sanitizes it and maps it into the drm
>> @@ -15491,37 +15569,61 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
>>  				  bool force_restore)
>>  {
>>  	struct drm_i915_private *dev_priv = dev->dev_private;
>> -	enum pipe pipe;
>> -	struct intel_crtc *crtc;
>> +	struct drm_crtc *crtc;
>> +	struct drm_crtc_state *crtc_state;
>>  	struct intel_encoder *encoder;
>> +	struct drm_atomic_state *state;
>> +	struct intel_shared_dpll_config shared_dplls[I915_NUM_PLLS];
>>  	int i;
>>  
>> -	intel_modeset_readout_hw_state(dev);
>> -
>> -	/*
>> -	 * Now that we have the config, copy it to each CRTC struct
>> -	 * Note that this could go away if we move to using crtc_config
>> -	 * checking everywhere.
>> -	 */
>> -	for_each_intel_crtc(dev, crtc) {
>> -		if (crtc->active && i915.fastboot) {
>> -			intel_mode_from_pipe_config(&crtc->base.mode,
>> -						    crtc->config);
>> -			DRM_DEBUG_KMS("[CRTC:%d] found active mode: ",
>> -				      crtc->base.base.id);
>> -			drm_mode_debug_printmodeline(&crtc->base.mode);
>> -		}
>> +	state = intel_modeset_readout_hw_state(dev);
>> +	if (IS_ERR(state)) {
>> +		DRM_ERROR("Failed to read out hw state\n");
>> +		return;
>>  	}
>>  
>> +	drm_atomic_helper_swap_state(dev, state);
>> +
>> +	/* swap sw/hw dpll state */
>> +	intel_atomic_duplicate_dpll_state(dev_priv, shared_dplls);
>> +	intel_shared_dpll_commit(state);
>> +	memcpy(to_intel_atomic_state(state)->shared_dpll,
>> +	       shared_dplls, sizeof(*shared_dplls) * dev_priv->num_shared_dpll);
> This is imo way too much open-coding of stuff that's already there. What I
> had in mind for force_restore was a generic helper to duplicate all the
> state objects into a drm_atomic_state, without calling any of the
> ->atomic_check functions or anything. Then the sequence for restoring
> state would be.
>
> 1. saved_state = drm_atomic_helper_duplicate_state()
> 2. intel_readout_hw_sate() <- this would just update ->state and sanitize
> it.
> 3. drm_atomic_commit(saved_state) wrapped in a WARN_ON to make sure it
> always works.
Well, for !force_restore we want to do an initial sanitizing modeset too, but with the full disabled state as reference point.
I'm not sure dupe state followed by a swap, is different from save old state, and read out to current state.
> Ofc we still need the ww-mutex deadlock avoidance wrapped around this, but
> since atomic_commit will first compute all derived state there's no need
> to duplicate all the i915-internal state too. That should all work like
> with any other normal modeset.
No need to wrap, readout touches everything so lock_all is fine.

~Maarten


More information about the Intel-gfx mailing list