Or: How to fix cpu edp in 81 simple steps. Admittedly this includes some minor detours. Yeah, I've managed to pull it through and finally put the last piece into place that started this entire endeavour: cpu edp on my ivb works! I'm too lazy to repeat all the high-level overview stuff from the cover-letter of the rfc series. But I think it's nice to give a short overview of where in our code we still rely on crtc helper infrastructure: - We still use the ->mode_fixup callbacks from the crtc helper. We also still use the encoder->mode_set callbacks. Boht can easily be moved to callbacks in intel_encoder, but honestly I didn't see the point. - The fb helper code has a ridiculously incetious relationship with the crtc helper code. Read through the commit messages to see which pitfalls I've stumbled into. I plan to eventually fix this up, but this series only contains the minimal changes to drm_fb_helper.c to move ahead - I need to sharpen my broadsword first again. - We also still rely on the crtc helper for hotplug detection and connector status probing. Also, after this we still have some large opportunities to clean things up: - I think we should create struct intel_mode and use it as the adjusted mode everywhere to store little pieces like needs_tvclock, pipe dithering values or dp link parameters. That would still be a layering violation, but at least we wouldn't need to recompute these kinds of things in intel_display.c. Especially the port bpc computation needed for selecting the pipe bpc and dithering settings in intel_display.c is rather gross. - In a related rework I think we should implement ->mode_valid in terms of ->mode_fixup in a generic way - I've hunted too many bugs where ->mode_valid did the right thing, but ->mode_fixup didn't. Or vice versa, resulting in funny bugs for user-supplied modes. - I think we should ditch the idea to rework the hdp handling in the common crtc helper code and just move things to i915.ko. Which would rid us of the ->detect crtc helper dependencies. - lvds wire pair and pll enabling is all done. We should be able to move this to the crtc_enable callbacks. I haven't thought about how we could merge this (presuming people don't scream an tear it apart), but there are definitely patches in here which can be merged right away. If you see one, review + a nod highly appreciated, I've lost the big picture a bit recently ;-) Compared to the first part, I haven't yet tested this on anything but snb/ivb - but the newly addded consistency checks are _extremely_ good, things essentially started to work correctly once I've squashed the last WARN. So I'm positive that further testing of the newly added patches on all my other machines won't turn up anything troubling. For reviewing this patch-carpet-bomber I suggest you grab the rfc intro mail at http://lists.freedesktop.org/archives/intel-gfx/2012-July/018635.html Then read the last patch, which motivated pretty much everything else and work backwards from there, at least for the high-level picture. Comments, flames and test reports highly welcome. Cheers, Daniel Daniel Vetter (81): 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 disable/enable drm/i915: simplify dvo dpms interface drm/i915/dvo: convert to encoder disable/enable 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 drm/i915: rip out intel_crtc->dpms_mode drm/i915: rip out intel_dp->dpms_mode drm/i915: ensure the force pipe A quirk is actually followed drm/i915: introduce struct intel_set_config drm/i915: extract modeset config save/restore code drm/i915: extract intel_set_config_compute_mode_changes drm/i915: extract intel_set_config_update_output_state drm/i915: implement crtc helper semantics relied upon by the fb helper drm/i915: don't update the fb base if there is no fb drm/i915: convert pointless error checks in set_config to BUGs drm/i915: don't save all the encoder/crtc state in set_config drm/i915: stage modeset output changes drm/i915: push crtc->fb update into pipe_set_base drm/i915: remove crtc disabling special case drm/i915: move output commit and crtc disabling into set_mode drm/i915: extract adjusted mode computation drm/i915: use staged outuput config in tv->mode_fixup drm/i915: use staged outuput config in lvds->mode_fixup drm/i915: compute masks of crtcs affected in set_mode drm/i915: implement new set_mode code flow drm/i915: push commit_output_state past crtc disabling drm/i915: s/intel_encoder_disable/intel_encoder_noop drm/i915: kill a few unused things in dev_priv drm/i915: WARN if the pipe won't turn off drm/i915: switch the load detect code to the staged modeset config drm/i915: push commit_output_state past the crtc/encoder preparing drm/i915: disable all crtcs at suspend time drm/i915: add tons of modeset state checks drm/i915: extract ironlake_fdi_pll_disable drm/i915: rip out intel_disable_pch_ports drm/i915: don't disable fdi links harder in ilk_crtc_enable drm/i915: don't call dpms funcs after set_mode drm/i915: update dpms property in set_mode drm/i915: add encoder->pre_enable/post_disable drm/i915: clean up the cpu edp pll special case drm/i915: robustify edp_pll_on/off drm/i915: rip out dp port enabling cludges^Wchecks drm/i915: disable the cpu edp port after the cpu pipe 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_dma.c | 22 +- drivers/gpu/drm/i915/i915_drv.c | 6 +- drivers/gpu/drm/i915/i915_drv.h | 17 +- 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 | 1600 +++++++++++++++++++++++++++------- drivers/gpu/drm/i915/intel_dp.c | 218 +++-- drivers/gpu/drm/i915/intel_drv.h | 94 ++- drivers/gpu/drm/i915/intel_dvo.c | 105 ++- drivers/gpu/drm/i915/intel_hdmi.c | 203 +++-- drivers/gpu/drm/i915/intel_lvds.c | 104 +-- drivers/gpu/drm/i915/intel_overlay.c | 58 +-- drivers/gpu/drm/i915/intel_sdvo.c | 178 +++- drivers/gpu/drm/i915/intel_tv.c | 63 +- include/drm/drm_crtc.h | 2 - 23 files changed, 2196 insertions(+), 858 deletions(-) -- 1.7.7.6