mirror_ubuntu-kernels/drivers/gpu/drm
Ville Syrjälä bdfa7542d4 drm/i915: Ignore SURFLIVE and flip counter when the GPU gets reset
During a GPU reset we need to get pending page flip cleared out
since the ring contents are gone and flip will never complete
on its own. This used to work until the mmio vs. CS flip race
detection came about. That piece of code is looking for a
specific surface address in the SURFLIVE register, but as
a flip to that address may never happen the check may never
pass. So we should just skip the SURFLIVE and flip counter
checks when the GPU gets reset.

intel_display_handle_reset() tries to effectively complete
the flip anyway by calling .update_primary_plane(). But that
may not satisfy the conditions of the mmio vs. CS race
detection since there's no guarantee that a modeset didn't
sneak in between the GPU reset and intel_display_handle_reset().
Such a modeset will not wait for pending flips due to the ongoing GPU
reset, and then the primary plane updates performed by
intel_display_handle_reset() will already use the new surface
address, and thus the surface address the flip is waiting for
might never appear in SURFLIVE. The result is that the flip
will never complete and attempts to perform further page flips
will fail with -EBUSY.

During the GPU reset intel_crtc_has_pending_flip() will return
false regardless, so the deadlock with a modeset vs. the error
work acquiring crtc->mutex was avoided. And the reset_counter
check in intel_crtc_has_pending_flip() actually made this bug
even less severe since it allowed normal modesets to go through
even though there's a pending flip.

This is a regression introduced by me here:
 commit 75f7f3ec60
 Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
 Date:   Tue Apr 15 21:41:34 2014 +0300

    drm/i915: Fix mmio vs. CS flip race on ILK+

Testcase: igt/kms_flip/flip-vs-panning-vs-hang
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: stable@vger.kernel.org
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
2014-11-24 09:54:23 +02:00
..
armada Merge branch 'drm-armada-fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm into drm-fixes 2014-10-28 10:03:34 +10:00
ast drm/ast: Fix HW cursor image 2014-10-08 09:05:29 +10:00
bochs Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-10-14 09:39:08 +02:00
bridge drm: add register and unregister functions for connectors 2014-06-19 08:55:28 +02:00
cirrus drm/cirrus: bind also to qemu-xen-traditional 2014-10-23 14:09:04 +10:00
exynos drm/exynos: fix possible infinite loop issue 2014-11-10 14:40:10 +09:00
gma500 drm/gma500: use container_of to resolve psb_fbdev from drm_fb_helper 2014-09-24 12:09:27 +02:00
i2c drm/tda998x: update for new drm connector APIs. 2014-08-05 10:34:33 +10:00
i810 drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
i915 drm/i915: Ignore SURFLIVE and flip counter when the GPU gets reset 2014-11-24 09:54:23 +02:00
mga drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
mgag200 Merge branch 'for-airlied-next' of git://people.freedesktop.org/~mlankhorst/linux into drm-next 2014-10-01 19:27:38 +10:00
msm drm: Pass dma-buf as argument to gem_prime_import_sg_table 2014-09-30 14:04:00 +02:00
nouveau Merge branch 'linux-3.18' of git://anongit.freedesktop.org/git/nouveau/linux-2.6 into drm-fixes 2014-11-14 06:24:50 +10:00
omapdrm drm: Extract <drm/drm_gem.h> 2014-09-24 11:43:41 +10:00
panel drm/panel/simple: add optronics B101XTN01.0 (v3) 2014-09-10 11:19:07 -04:00
qxl qxl: don't create too large primary surface 2014-10-22 11:11:50 +10:00
r128 drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
radeon drm/radeon: fix endian swapping in vbios fetch for tdp table 2014-11-20 11:13:18 -05:00
rcar-du drm/rcar-du: Add OF support 2014-09-15 11:55:47 +03:00
savage drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
shmobile drm/shmob: Update copyright notice 2014-09-15 11:34:07 +03:00
sis drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
sti Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-10-14 09:39:08 +02:00
tdfx drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
tegra drm/tegra: dc: Add missing call to drm_vblank_on() 2014-11-13 14:07:50 +01:00
tilcdc drm/tilcdc: panel: Add support for enable GPIO 2014-09-17 10:55:27 +10:00
ttm drm/ttm: Don't evict BOs outside of the requested placement range 2014-10-16 18:34:08 -04:00
udl drm/udl: use container_of to resolve udl_fbdev from drm_fb_helper 2014-09-24 12:09:28 +02:00
via drm: move drm_mmap to <drm/drm_legacy.h> 2014-09-24 11:43:07 +10:00
vmwgfx drm/vmwgfx: Filter out modes those cannot be supported by the current VRAM size. 2014-10-31 09:58:06 +01:00
ati_pcigart.c drm: split ati_pcigart.h out of drmP.h 2014-09-12 14:11:14 +10:00
drm_agpsupport.c drm: move AGP definitions harder 2014-09-10 17:40:11 +10:00
drm_auth.c drm: Move piles of functions from drmP.h to drm_internal.h 2014-09-12 11:16:29 +02:00
drm_bufs.c drm: Move __drm_pci_free to drm_legacy.h 2014-09-12 11:08:56 +02:00
drm_cache.c
drm_context.c drm: mark drm_context support as legacy 2014-08-05 19:38:12 +02:00
drm_crtc_helper.c drm/crtc-helper: use drm_framebuffer flags 2014-07-08 11:18:47 +10:00
drm_crtc_internal.h
drm_crtc.c drm: Drop grab fpriv->fbs_lock in drm_fb_release 2014-09-25 17:13:40 +02:00
drm_debugfs.c drm: Move piles of functions from drmP.h to drm_internal.h 2014-09-12 11:16:29 +02:00
drm_dma.c drm: Move legacy buffer structures to <drm/drm_legacy.h> 2014-09-12 15:28:12 +02:00
drm_dp_helper.c
drm_dp_mst_topology.c drm/mst: rework payload table allocation to conform better. 2014-10-13 14:40:53 +10:00
drm_drv.c drm/core: use helper to check driver features 2014-10-03 10:38:56 +02:00
drm_edid_load.c
drm_edid.c drm/edid: Add missing interlaced flag to 576i@100 modes. 2014-10-01 11:36:20 +02:00
drm_encoder_slave.c
drm_fb_cma_helper.c drm: Introduce drm_fb_helper_prepare() 2014-07-08 11:31:28 +10:00
drm_fb_helper.c Merge tag 'drm-intel-next-2014-09-01' of git://anongit.freedesktop.org/drm-intel into drm-next 2014-09-03 08:30:48 +10:00
drm_flip_work.c
drm_fops.c drm/core: use helper to check driver features 2014-10-03 10:38:56 +02:00
drm_gem_cma_helper.c drm: Pass dma-buf as argument to gem_prime_import_sg_table 2014-09-30 14:04:00 +02:00
drm_gem.c drm/core: use helper to check driver features 2014-10-03 10:38:56 +02:00
drm_global.c
drm_hashtab.c list: fix order of arguments for hlist_add_after(_rcu) 2014-08-06 18:01:24 -07:00
drm_info.c drm: Extract <drm/drm_gem.h> 2014-09-24 11:43:41 +10:00
drm_internal.h drm: Move internal debugfs functions to drm_internal.h 2014-09-24 11:43:35 +10:00
drm_ioc32.c
drm_ioctl.c drm: Purge ioctl forward declarations from drmP.h 2014-09-12 15:27:47 +02:00
drm_irq.c drm: Improve debug output for drm_wait_one_vblank 2014-09-24 12:09:23 +02:00
drm_legacy.h drm: Create drm legacy driver header 2014-09-12 11:08:55 +02:00
drm_lock.c drm: unexport drm_global_mutex 2014-09-12 11:19:47 +02:00
drm_memory.c drm: Move drm_memory.c map support declarations to <drm/drm_legacy.h> 2014-09-12 15:28:12 +02:00
drm_mipi_dsi.c drm/mipi-dsi: consider low power transmission 2014-09-20 00:56:08 +09:00
drm_mm.c
drm_modes.c drm: Perform cmdline mode parsing during connector initialisation 2014-08-06 14:50:12 +02:00
drm_modeset_lock.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2014-10-14 09:39:08 +02:00
drm_of.c drm: add of_graph endpoint helper to find possible CRTCs 2014-07-11 15:38:28 +01:00
drm_panel.c
drm_pci.c drm: Move legacy buffer structures to <drm/drm_legacy.h> 2014-09-12 15:28:12 +02:00
drm_plane_helper.c drm/plane-helper: Use proper plane init function 2014-07-18 15:39:28 +02:00
drm_platform.c drm: Goody bye, drm_bus! 2014-09-10 17:43:10 +10:00
drm_prime.c drm: Pass dma-buf as argument to gem_prime_import_sg_table 2014-09-30 14:04:00 +02:00
drm_probe_helper.c drm: Perform cmdline mode parsing during connector initialisation 2014-08-06 14:50:12 +02:00
drm_rect.c drm: Add drm_rect rotation functions 2014-07-11 23:44:12 +02:00
drm_scatter.c drm: Move sg functions into drm_legacy.h 2014-09-12 11:08:54 +02:00
drm_sysfs.c drm: Move piles of functions from drmP.h to drm_internal.h 2014-09-12 11:16:29 +02:00
drm_trace_points.c
drm_trace.h
drm_vm.c drm: Move drm_vm_open_locked into drm_internal.h 2014-09-24 11:43:20 +10:00
drm_vma_manager.c
Kconfig drm: merge drm_usb into udl 2014-09-10 17:43:27 +10:00
Makefile drm: merge drm_usb into udl 2014-09-10 17:43:27 +10:00
README.drm

************************************************************
* For the very latest on DRI development, please see:      *
*     http://dri.freedesktop.org/                          *
************************************************************

The Direct Rendering Manager (drm) is a device-independent kernel-level
device driver that provides support for the XFree86 Direct Rendering
Infrastructure (DRI).

The DRM supports the Direct Rendering Infrastructure (DRI) in four major
ways:

    1. The DRM provides synchronized access to the graphics hardware via
       the use of an optimized two-tiered lock.

    2. The DRM enforces the DRI security policy for access to the graphics
       hardware by only allowing authenticated X11 clients access to
       restricted regions of memory.

    3. The DRM provides a generic DMA engine, complete with multiple
       queues and the ability to detect the need for an OpenGL context
       switch.

    4. The DRM is extensible via the use of small device-specific modules
       that rely extensively on the API exported by the DRM module.


Documentation on the DRI is available from:
    http://dri.freedesktop.org/wiki/Documentation
    http://sourceforge.net/project/showfiles.php?group_id=387
    http://dri.sourceforge.net/doc/

For specific information about kernel-level support, see:

    The Direct Rendering Manager, Kernel Support for the Direct Rendering
    Infrastructure
    http://dri.sourceforge.net/doc/drm_low_level.html

    Hardware Locking for the Direct Rendering Infrastructure
    http://dri.sourceforge.net/doc/hardware_locking_low_level.html

    A Security Analysis of the Direct Rendering Infrastructure
    http://dri.sourceforge.net/doc/security_low_level.html