linux/drivers/gpu/drm/i915
Daniel Vetter 9a93585699 drm/i915: stage modeset output changes
This is the core of the new modeset logic.

The current code which is based upon the crtc helper code first
updates all the link of the new display pipeline and then calls the
lower-level set_mode function to execute the required callbacks to get
there. The issue with this approach is that for disabling we need to
know the _current_ display pipe state, not the new one.

Hence we need to stage the new state of the display pipe and only
update it once we have disabled the current configuration and before we
start to update the hw registers with the new configuration.

This patch here just prepares the ground by switching the new output
state computation to these staging pointers. To make it clearer,
rename the old update_output_state function to stage_output_state.

A few peculiarities:
- We're also calling the set_mode function at various places to update
  properties. Hence after a successfule modeset we need to stage the
  current configuration (for otherwise we might fall back again). This
  happens automatically because as part of the (successful) modeset we
  need to copy the staged state to the real one. But for the hw
  readout code we need to make sure that this happens, too.
- Teach the new staged output state computation code the required
  smarts to handle the disabling of outputs. The current code handles
  this in a special case, but to better handle global modeset changes
  covering more than one crtc, we want to do this all in the same
  low-level modeset code.
- The actual modeset code is still a bit ugly and wants to know the new
  crtc->enabled state a bit early. Follow-on patches will clean that
  up, for now we have to apply the staged output configuration early,
  outside of the set_mode functions.
- Improve/add comments in stage_output_state.

Essentially all that is left to do now is move the disabling code into
set_mode and then move the staged state update code also into
set_mode, at the right place between disabling things and calling the
mode_set callbacks for the new configuration.

v2: Disabling a crtc works by passing in a NULL mode or fb, userspace
doesn't hand in the list of connectors. We therefore need to detect
this case manually and tear down all the output links.

v3: Properly update the output staging pointers after having read out
the hw state.

v4: Simplify the code, add more DRM_DEBUG_KMS output and check a few
assumptions with WARN_ON. Essentially all things that I've noticed
while debugging issues in other places of the code.

v4: Correctly disable the old set of connectors when enabling an
already enabled crtc on a new set of crtc. Reported by Paulo Zanoni.

Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2012-09-06 08:02:57 +02:00
..
dvo_ch7xxx.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ch7017.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ivch.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ns2501.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_sil164.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_tfp410.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo.h drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
i915_debugfs.c drm/i915: don't grab dev->struct_mutex for userspace forcewak 2012-08-12 11:28:49 +02:00
i915_dma.c drm/i915: implement dma buf begin_cpu_access (v2) 2012-08-17 10:10:06 +02:00
i915_drv.c drm/i915: read out the modeset hw state at load and resume time 2012-09-06 07:59:24 +02:00
i915_drv.h drm/i915: read out the modeset hw state at load and resume time 2012-09-06 07:59:24 +02:00
i915_gem_context.c drm/i915: remove unused variable 2012-08-05 22:39:53 +02:00
i915_gem_debug.c drm/i915: stop using dev->agp->base 2012-06-12 22:18:06 +02:00
i915_gem_dmabuf.c drm/i915: implement dma buf begin_cpu_access (v2) 2012-08-17 10:10:06 +02:00
i915_gem_evict.c drm/i915: Segregate memory domains in the GTT using coloring 2012-07-26 12:56:25 +02:00
i915_gem_execbuffer.c Linux 3.6-rc2 2012-08-17 09:01:08 +02:00
i915_gem_gtt.c Linux 3.6-rc2 2012-08-17 09:01:08 +02:00
i915_gem_stolen.c drm/i915: Split the stolen handling for GEM out of i915_dma.c 2012-05-03 11:18:11 +02:00
i915_gem_tiling.c drm/i915: Only the zap the VMA after updating the tiling parameters 2012-05-03 11:18:07 +02:00
i915_gem.c drm/i915: Lazily apply the SNB+ seqno w/a 2012-08-10 11:11:32 +02:00
i915_ioc32.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
i915_irq.c Linux 3.6-rc2 2012-08-17 09:01:08 +02:00
i915_reg.h drm/i915/dp: implement get_hw_state 2012-09-06 07:58:18 +02:00
i915_suspend.c Linux 3.5-rc7 2012-07-20 00:53:28 -04:00
i915_sysfs.c Linux 3.6-rc2 2012-08-17 09:01:08 +02:00
i915_trace_points.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
i915_trace.h drm/i915: improve i915_wait_request_begin trace 2012-05-25 09:55:15 +02:00
intel_acpi.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
intel_bios.c drm/i915/bios: cleanup return type of intel_parse_bios() 2012-06-27 10:17:51 +01:00
intel_bios.h drm/i915/bios: cleanup return type of intel_parse_bios() 2012-06-27 10:17:51 +01:00
intel_crt.c drm/i915: check connector hw/sw state 2012-09-06 07:59:42 +02:00
intel_ddi.c drm/i915/hdmi: implement get_hw_state 2012-09-06 07:58:22 +02:00
intel_display.c drm/i915: stage modeset output changes 2012-09-06 08:02:57 +02:00
intel_dp.c drm/i915: rip out intel_dp->dpms_mode 2012-09-06 08:00:05 +02:00
intel_drv.h drm/i915: stage modeset output changes 2012-09-06 08:02:57 +02:00
intel_dvo.c drm/i915: check connector hw/sw state 2012-09-06 07:59:42 +02:00
intel_fb.c drm/i915: Zero initialize mode_cmd 2012-07-05 13:27:58 +02:00
intel_hdmi.c drm/i915/hdmi: implement get_hw_state 2012-09-06 07:58:22 +02:00
intel_i2c.c drm/i915: ensure i2c adapter is all set before adding it 2012-08-13 19:04:24 +02:00
intel_lvds.c drm/i915/lvds: implement get_hw_state 2012-09-06 07:58:33 +02:00
intel_modes.c drm/i915: kill intel_ddc_probe 2012-07-20 12:21:39 +02:00
intel_opregion.c drm/i915: [sparse] __iomem fixes for opregion 2012-05-03 11:18:00 +02:00
intel_overlay.c drm/i915: rip out the overlay pipe A workaround 2012-08-17 10:10:01 +02:00
intel_panel.c drm/i915: Fix blank panel at reopening lid 2012-08-11 21:15:16 +02:00
intel_pm.c Linux 3.6-rc2 2012-08-17 09:01:08 +02:00
intel_ringbuffer.c Linux 3.6-rc2 2012-08-17 09:01:08 +02:00
intel_ringbuffer.h drm/i915: Lazily apply the SNB+ seqno w/a 2012-08-10 11:11:32 +02:00
intel_sdvo_regs.h drm/i915: properly handle interlaced bit for sdvo dtd conversion 2012-05-24 17:53:52 +02:00
intel_sdvo.c drm/i915: check connector hw/sw state 2012-09-06 07:59:42 +02:00
intel_sprite.c drm/i915: mask tiled bit when updating ILK sprites 2012-07-20 12:21:40 +02:00
intel_tv.c drm/i915/tv: implement get_hw_state 2012-09-06 07:58:28 +02:00
Makefile drm/i915: Support for ns2501-DVO 2012-07-25 18:23:48 +02:00