Hi all, This patch bomb is just the prep work for the actual rework ;-) The goal of this little adventure is to move away from the crtc helper code, which has the fundamental assumption that encoders and crtc can be enabled/disabled in any order, as long as we take care of depencies. Our hw works differently. We already have tons of ugly cases where crtc code enable encoder hw (or encoder->mode_set enables stuff that should only be enabled in enocder->commit) to work around these issues. But on the disable side we can't pull off similar tricks - there we actually need to rework the modeset sequence that controls all this. Quick summary of the changes in here - the patches that actually introduce a new concept all have rather extensive commit messages to explain things: - Add new encoder->enable/disable functions which are directly called from the crtc->enable/disable function. This ensures that the encoder's can be enabled/disabled at a very specific in the modeset sequence, controlled by our platform specific code. - Rework the dpms code - our code has mostly 1:1 connector:encoder mappings and does support cloning on on a few encoders, so we can simplify things quite a bit. Also only ever disable/enable the entire output pipeline - this ensures that we obey the right sequence of enabling/disabling things. For cloneable encoders this requires a bit of special handling to ensure that outputs can still be disabled individually, but it simplifies the common case quite a bit. - Add infrastructure to read out the current hw state. No amount of careful ordering will help us if we brick the hw on the first modesetup. Which could happen if we just randomly disable things, oblivious to the state set up by the bios. Hence we need to be able to read that out. As a benefit, we grow a few generic functions useful to cross-check our modeset code with actual hw state. - A few little changes/cleanups in a few encoders to make the above less onerous. Things that are still needed: - Reworking the modeset code - the current copy&pasted code still pretty much works like the crtc helper and doesn't disable things correctly yet. - Once the above is in place, add new hooks to enable special connectors at the right place. I'm thinking of encoder->pre_enable and encoder->post_disable, which would each run after/before the plane/pipe/plls. - Actually fix the cpu edp bugs (and port the hsw dp code) with the new hooks. And further out, i.e. auxiliary benefits: - Fix up our confusion in the resume path - we enable a few encoders by accident when restoring registers. - Clean things up by moving a few of the existing hacks around, e.g. the edp pll enabling or the lvds/pll enabling. - fastboot - the hw state readout code is neat prep work for that, the patch itself lists some of the missing bits. - Fixing all the bugs turned up by the more stringent cross-checking the new code allows - the last patch in this series gives a glimpse, but I plan to add much more after the modeset sequence has saner semantics. Patch series lightly tested, atm I'm beating on it with my machines. Due to lack of hw, I'm looking for people with TV out and dvo encoders ... Comments, flames, ideas and rants highly welcome. I hope that I can send out and RFC with the new modeset code in a few days at most. Cheers, Daniel Daniel Vetter (43): drm/i915: introduce for_each_encoder_on_crtc drm/i915: add crtc->enable/disable vfuncs insted of dpms drm/i915: rip out crtc prepare/commit indirection drm/i915: add direct encoder disable/enable infrastructure drm/i915: add missing gen2 pipe A quirk entries drm/i915: rip out the overlay pipe A workaround drm/i915: prepare load-detect pipe code for dpms changes drm/i915/hdmi: convert to encoder->disable/enable drm/i915/tv: convert to encoder enable/disable drm/i915/lvds: ditch ->prepare special case drm/i915/lvds: convert to encoder disable/enable drm/i915/dp: convert to encoder disable/enable drm/i915: create VLV_DSIPLAY_BASE #define drm/i915: group ADPA #defines together drm/i915: add inte_crt->adpa_reg drm/i915/crt: convert to encoder disable/enable drm/i915/sdvo: convert to encoder disabl/enable drm/i915: simplify dvo dpms interface drm/i915: simplify possible_clones computation drm/i915: add port parameter to intel_hdmi_init drm/i915: convert dpms functions of dvo/sdvo/crt drm/i915: rip out encoder->disable/enable checks drm/i915: clean up encoder_prepare/commit drm/fb helper: don't call drm_crtc_helper_set_config drm: remove the list_head from drm_mode_set drm/i915: copy&paste drm_crtc_helper_set_config drm/i915: call set_base directly drm/i915: inline intel_best_encoder drm/i915: copy&paste drm_crtc_helper_set_mode drm/i915: simplify intel_crtc_prepare_encoders drm/i915: rip out encoder->prepare/commit drm/i915: call crtc functions directly drm/i915: WARN when trying to enabled an unused crtc drm/i915: Add interfaces to read out encoder/connector hw state drm/i915/dp: implement get_hw_state drm/i915/hdmi: implement get_hw_state drm/i915/tv: implement get_hw_state drm/i915/lvds: implement get_hw_state drm/i915/crt: implement get_hw_state drm/i915/sdvo: implement get_hw_state drm/i915/dvo: implement get_hw_state drm/i915: read out the modeset hw state at load and resume time drm/i915: check connector hw/sw state drivers/gpu/drm/drm_fb_helper.c | 2 +- drivers/gpu/drm/i915/dvo.h | 15 +- drivers/gpu/drm/i915/dvo_ch7017.c | 21 +- drivers/gpu/drm/i915/dvo_ch7xxx.c | 17 +- drivers/gpu/drm/i915/dvo_ivch.c | 23 +- drivers/gpu/drm/i915/dvo_sil164.c | 20 +- drivers/gpu/drm/i915/dvo_tfp410.c | 18 +- drivers/gpu/drm/i915/i915_drv.c | 3 +- drivers/gpu/drm/i915/i915_drv.h | 8 +- drivers/gpu/drm/i915/i915_reg.h | 52 +- drivers/gpu/drm/i915/intel_crt.c | 157 ++++-- drivers/gpu/drm/i915/intel_ddi.c | 59 ++- drivers/gpu/drm/i915/intel_display.c | 1006 ++++++++++++++++++++++++++-------- drivers/gpu/drm/i915/intel_dp.c | 178 ++++--- drivers/gpu/drm/i915/intel_drv.h | 64 ++- drivers/gpu/drm/i915/intel_dvo.c | 105 +++- drivers/gpu/drm/i915/intel_hdmi.c | 203 ++++--- drivers/gpu/drm/i915/intel_lvds.c | 91 ++-- drivers/gpu/drm/i915/intel_overlay.c | 58 +-- drivers/gpu/drm/i915/intel_sdvo.c | 178 +++++-- drivers/gpu/drm/i915/intel_tv.c | 56 ++- include/drm/drm_crtc.h | 2 - 22 files changed, 1645 insertions(+), 691 deletions(-) -- 1.7.7.6