linux/drivers/gpu/drm/i915
Michel Thierry ba74cb10c7 drm/i915/execlists: Delay writing to ELSP until HW has processed the previous write
The hardware needs some time to process the information received in the
ExecList Submission Port, and expects us to not write anything more until
it has 'acknowledged' this new submission by sending an IDLE_ACTIVE or
PREEMPTED CSB event.

If we do not follow this, the driver could write new data into the ELSP
before HW had finishing fetching the previous one, putting us in
'undefined behaviour' space.

This seems to be the problem causing the spurious PREEMPTED & COMPLETE
events after a COMPLETE like the one below:

[] vcs0: sw rd pointer = 2, hw wr pointer = 0, current 'head' = 3.
[] vcs0:  Execlist CSB[0]: 0x00000018 _ 0x00000007
[] vcs0:  Execlist CSB[1]: 0x00000001 _ 0x00000000
[] vcs0:  Execlist CSB[2]: 0x00000018 _ 0x00000007  <<< COMPLETE
[] vcs0:  Execlist CSB[3]: 0x00000012 _ 0x00000007  <<< PREEMPTED & COMPLETE
[] vcs0:  Execlist CSB[4]: 0x00008002 _ 0x00000006
[] vcs0:  Execlist CSB[5]: 0x00000014 _ 0x00000006

The ELSP writes that lead to this CSB sequence show that the HW hadn't
started executing the previous execlist (the one with only ctx 0x6) by the
time the new one was submitted; this is a bit more clear in the data
show in the EXECLIST_STATUS register at the time of the ELSP write.

[] vcs0: ELSP[0] = 0x0_0        [execlist1] - status_reg = 0x0_302
[] vcs0: ELSP[1] = 0x6_fedb2119 [execlist0] - status_reg = 0x0_8302

[] vcs0: ELSP[2] = 0x7_fedaf119 [execlist1] - status_reg = 0x0_8308
[] vcs0: ELSP[3] = 0x6_fedb2119 [execlist0] - status_reg = 0x7_8308

Note that having to wait for this ack does not disable lite-restores,
although it may reduce their numbers.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102035
Signed-off-by: Michel Thierry <michel.thierry@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/<20171118003038.7935-1-michel.thierry@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171120123458.23242-4-chris@chris-wilson.co.uk
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Tested-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2017-11-20 17:01:38 +00:00
..
gvt drm/i915/gvt: Move request alloc to dispatch_workload path only 2017-11-16 11:51:55 +08:00
selftests drm/i915/selftest: Make guc clients static 2017-11-20 16:50:27 +00:00
dvo.h
dvo_ch7xxx.c drm/i915/dvo: fix debug logging on unknown DID 2017-06-01 15:53:03 +03:00
dvo_ch7017.c
dvo_ivch.c
dvo_ns2501.c
dvo_sil164.c
dvo_tfp410.c
i915_cmd_parser.c drm/i915: Silence smatch for cmdparser 2017-11-07 16:52:24 +00:00
i915_debugfs.c drm/i915: Pass idle crtc_state to intel_dp_sink_crc 2017-11-17 12:14:25 +01:00
i915_drv.c drm/i915/perf: reuse timestamp frequency from device info 2017-11-20 16:09:04 +00:00
i915_drv.h drm/i915/perf: reuse timestamp frequency from device info 2017-11-20 16:09:04 +00:00
i915_gem.c drm/i915: Automatic i915_switch_context for legacy 2017-11-20 15:56:16 +00:00
i915_gem.h drm/i915: Print the condition causing GEM_BUG_ON 2017-11-16 15:35:47 +02:00
i915_gem_batch_pool.c drm/i915: Reinstate reservation_object zapping for batch_pool objects 2017-06-14 14:06:22 +01:00
i915_gem_batch_pool.h
i915_gem_clflush.c drm/i915: Refactor testing obj->mm.pages 2017-10-16 20:44:19 +01:00
i915_gem_clflush.h drm/i915: Force CPU synchronisation even if userspace requests ASYNC 2017-07-27 22:07:24 +02:00
i915_gem_context.c drm/i915: Automatic i915_switch_context for legacy 2017-11-20 15:56:16 +00:00
i915_gem_context.h drm/i915: Record the default hw state after reset upon load 2017-11-10 17:23:10 +00:00
i915_gem_dmabuf.c drm/i915: s/sg_mask/sg_page_sizes/ 2017-10-09 17:07:29 +01:00
i915_gem_evict.c Linux 4.14-rc7 2017-11-02 12:40:41 +10:00
i915_gem_execbuffer.c drm/i915: Automatic i915_switch_context for legacy 2017-11-20 15:56:16 +00:00
i915_gem_fence_reg.c drm/i915: Track user GTT faulting per-vma 2017-10-09 17:07:29 +01:00
i915_gem_fence_reg.h
i915_gem_gtt.c drm/i915: Initialise entry in intel_ppat_get() for older compilers 2017-11-15 17:12:49 +00:00
i915_gem_gtt.h drm/i915: support 64K pages for the 48b PPGTT 2017-10-07 10:11:57 +01:00
i915_gem_internal.c drm/i915: s/sg_mask/sg_page_sizes/ 2017-10-09 17:07:29 +01:00
i915_gem_object.c drm/i915: Split obj->cache_coherent to track r/w 2017-08-15 15:46:57 +01:00
i915_gem_object.h drm/i915: Introduce GEM proxy 2017-11-14 12:26:36 +00:00
i915_gem_render_state.c drm/i915: Pull the unconditional GPU cache invalidation into request construction 2017-11-20 15:56:16 +00:00
i915_gem_render_state.h drm/i915: Stop caching the "golden" renderstate 2017-11-10 17:23:22 +00:00
i915_gem_request.c drm/i915: Automatic i915_switch_context for legacy 2017-11-20 15:56:16 +00:00
i915_gem_request.h drm/i915/scheduler: Support user-defined priorities 2017-10-04 17:52:46 +01:00
i915_gem_shrinker.c drm/i915: Idle the GPU before shinking everything 2017-11-09 16:18:31 +02:00
i915_gem_stolen.c drm/i915: Use ELK stolen memory reserved detection for ILK 2017-11-15 18:49:10 +02:00
i915_gem_tiling.c drm/i915: Introduce GEM proxy 2017-11-14 12:26:36 +00:00
i915_gem_timeline.c
i915_gem_timeline.h
i915_gem_userptr.c drm/i915: Mark the userptr invalidate workqueue as WQ_MEM_RECLAIM 2017-11-17 10:58:55 +00:00
i915_gemfs.c drm/i915/gemfs: enable THP 2017-10-07 10:11:43 +01:00
i915_gemfs.h drm/i915: introduce simple gemfs 2017-10-07 10:11:41 +01:00
i915_gpu_error.c drm/i915: There is only one fault register from GEN8 onwards 2017-11-13 19:04:32 +00:00
i915_guc_reg.h drm/i915/guc: Simplify programming of GUC_SHIM_CONTROL 2017-11-08 21:34:19 +00:00
i915_ioc32.c
i915_irq.c drm/i915: Update execlists tasklet naming 2017-11-16 15:01:31 +00:00
i915_memcpy.c
i915_mm.c
i915_oa_bdw.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_bdw.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_bxt.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_bxt.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_cflgt2.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_cflgt2.h drm/i915/perf: add support for Coffeelake GT2 2017-09-18 19:46:36 +01:00
i915_oa_cflgt3.c drm/i915/perf: add support for Coffeelake GT3 2017-11-13 15:59:03 +00:00
i915_oa_cflgt3.h drm/i915/perf: add support for Coffeelake GT3 2017-11-13 15:59:03 +00:00
i915_oa_chv.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_chv.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_cnl.c drm/i915/perf: enable perf support on CNL 2017-11-13 15:59:24 +00:00
i915_oa_cnl.h drm/i915/perf: enable perf support on CNL 2017-11-13 15:59:24 +00:00
i915_oa_glk.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_glk.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_hsw.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_hsw.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_kblgt2.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_kblgt2.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_kblgt3.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_kblgt3.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_sklgt2.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_sklgt2.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_sklgt3.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_sklgt3.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_oa_sklgt4.c drm/i915: ensure oa config uuid is null terminated 2017-11-02 14:52:58 +00:00
i915_oa_sklgt4.h drm/i915/perf: prune OA configs 2017-08-03 18:18:05 +01:00
i915_params.c drm/i915: Remove use_mmio_flip modparm, v2. 2017-10-04 15:51:09 +02:00
i915_params.h drm/i915: Remove use_mmio_flip modparm, v2. 2017-10-04 15:51:09 +02:00
i915_pci.c drm/i915: remove g4x lowfreq_avail and has_pipe_cxsr 2017-10-19 15:52:52 +03:00
i915_perf.c drm/i915/perf: reuse timestamp frequency from device info 2017-11-20 16:09:04 +00:00
i915_pvinfo.h drm/i915: enable to read CSB and CSB write pointer from HWSP in GVT-g VM 2017-10-16 13:56:29 +03:00
i915_reg.h Revert "drm/i915: Display WA #1133 WaFbcSkipSegments:cnl, glk" 2017-11-17 09:52:14 -08:00
i915_selftest.h drm/i915/selftests: Reduce the volume of the timeout message 2017-11-10 11:31:58 +00:00
i915_suspend.c drm/i915: Move i915_gem_restore_fences to i915_gem_resume 2017-09-29 12:30:17 +01:00
i915_sw_fence.c drm/i915: Convert timers to use timer_setup() 2017-10-18 14:56:10 +03:00
i915_sw_fence.h main drm pull for v4.13 2017-07-09 18:48:37 -07:00
i915_syncmap.c
i915_syncmap.h
i915_sysfs.c drm/i915: Rename intel_enable_rc6 to intel_rc6_enabled 2017-10-11 08:57:02 +01:00
i915_trace.h drm/i915: Remove defunct trace points 2017-10-04 15:19:20 +01:00
i915_trace_points.c
i915_utils.h drm/i915: Warn in debug builds of incorrect usages of ptr_pack_bits 2017-11-03 09:28:06 +00:00
i915_vgpu.c drm/i915: Enable guest i915 full ppgtt functionality 2017-08-15 10:12:48 +08:00
i915_vgpu.h drm/i915: enable to read CSB and CSB write pointer from HWSP in GVT-g VM 2017-10-16 13:56:29 +03:00
i915_vma.c drm/i915: Mark up i915_vma_unbind() as a potential sleeper 2017-11-09 22:06:09 +00:00
i915_vma.h drm/i915: Track user GTT faulting per-vma 2017-10-09 17:07:29 +01:00
intel_acpi.c ACPI: Switch to use generic guid_t in acpi_evaluate_dsm() 2017-06-07 12:20:49 +02:00
intel_atomic.c drm/i915/cnl: Fix Cannonlake scaler mode programing. 2017-06-12 09:45:55 -07:00
intel_atomic_plane.c drm/i915: Pass proper old/new states to intel_plane_atomic_check_with_state() 2017-09-01 16:48:24 +03:00
intel_audio.c drm/i915: Fix kerneldocs for intel_audio.c 2017-11-15 17:32:54 +02:00
intel_bios.c Merge airlied/drm-next into drm-intel-next-queued 2017-11-14 07:43:00 -08:00
intel_bios.h
intel_breadcrumbs.c drm/i915: Clear breadcrumb node when cancelling signaling 2017-11-16 14:17:08 +00:00
intel_cdclk.c drm/i915/cnl: Allow 2 pixel per clock on Cannonlake. 2017-10-25 10:36:01 -07:00
intel_color.c drm/i915: Pass crtc_state to ips toggle functions, v2 2017-11-17 12:14:25 +01:00
intel_crt.c drm/i915: Eliminate crtc->config usage from CRT code 2017-11-09 20:05:18 +02:00
intel_csr.c drm/i915: Silence compiler for csr_load_work_fn() 2017-11-07 17:50:10 +00:00
intel_ddi.c drm/i915: Generalize transcoder looping 2017-11-14 16:17:51 +02:00
intel_device_info.c drm/i915: Remove pre-production pooled-EU w/a for Broxton 2017-11-15 18:04:18 +00:00
intel_display.c drm/i915: Pass crtc_state to ips toggle functions, v2 2017-11-17 12:14:25 +01:00
intel_dp.c drm/i915: Pass crtc_state to ips toggle functions, v2 2017-11-17 12:14:25 +01:00
intel_dp_aux_backlight.c drm/i915: Rename global i915 to i915_modparams 2017-09-22 14:50:36 +03:00
intel_dp_link_training.c drm/i915: Explicit the connector name for DP link training result 2017-07-19 08:32:42 +02:00
intel_dp_mst.c drm/i915: Nuke intel_digital_port->port 2017-11-09 20:06:14 +02:00
intel_dpio_phy.c drm/i915: Nuke intel_digital_port->port 2017-11-09 20:06:14 +02:00
intel_dpll_mgr.c drm/i915/cnl: Simplify dco_fraction calculation. 2017-11-16 09:45:39 -08:00
intel_dpll_mgr.h drm/i915/cnl: Initialize PLLs 2017-06-12 09:42:18 -07:00
intel_drv.h drm/i915: Pass crtc_state to ips toggle functions, v2 2017-11-17 12:14:25 +01:00
intel_dsi.c drm/i915: Eliminate some encoder->crtc usage from DSI code 2017-11-09 20:04:35 +02:00
intel_dsi.h
intel_dsi_dcs_backlight.c drm/i915: Initialize 'data' in intel_dsi_dcs_backlight.c 2017-08-16 18:02:00 +03:00
intel_dsi_pll.c
intel_dsi_vbt.c drm/i915/bxt: use NULL for GPIO connection ID 2017-08-21 11:52:29 +03:00
intel_dvo.c drm/i915: Populate output_types from .get_config() 2017-10-30 19:53:22 +02:00
intel_engine_cs.c drm/i915: Update execlists tasklet naming 2017-11-16 15:01:31 +00:00
intel_fbc.c drm/i915: adjust get_crtc_fence_y_offset() to use base.y instead of crtc.y 2017-10-18 17:02:45 +03:00
intel_fbdev.c drm/i915: Replace *_reference/unreference() or *_ref/unref with _get/put() 2017-10-13 16:53:59 +02:00
intel_fifo_underrun.c drm/i915: Don't rmw PIPESTAT enable bits 2017-09-25 16:54:09 +03:00
intel_frontbuffer.c
intel_frontbuffer.h
intel_guc.c drm/i915/guc: Rename i915_guc_submission.c|h to intel_guc_submission.c|h 2017-11-16 15:06:18 +00:00
intel_guc.h drm/i915/guc: Rename i915_guc_client struct to intel_guc_client 2017-11-16 15:04:17 +00:00
intel_guc_ct.c drm/i915/guc: Assert ctch->vma is allocated 2017-11-06 13:57:37 +00:00
intel_guc_ct.h drm/i915/guc: Introduce buffer based cmd transport 2017-05-26 13:26:53 +01:00
intel_guc_fw.c drm/i915/guc: Simplify programming of GUC_SHIM_CONTROL 2017-11-08 21:34:19 +00:00
intel_guc_fw.h drm/i915/guc: Rename intel_guc_loader.c to intel_guc_fw.c 2017-10-16 18:53:25 +03:00
intel_guc_fwif.h drm/i915/guc: Add support for reset engine using GuC commands 2017-11-02 08:42:11 +00:00
intel_guc_log.c drm/i915: Unify uC variable types to avoid flooding checkpatch.pl 2017-10-06 14:09:40 +03:00
intel_guc_log.h drm/i915: Unify uC variable types to avoid flooding checkpatch.pl 2017-10-06 14:09:40 +03:00
intel_guc_submission.c drm/i915/selftests: Add a GuC doorbells selftest 2017-11-17 10:02:39 +00:00
intel_guc_submission.h drm/i915/guc: Rename i915_guc_submission.c|h to intel_guc_submission.c|h 2017-11-16 15:06:18 +00:00
intel_gvt.c drm/i915: Rename global i915 to i915_modparams 2017-09-22 14:50:36 +03:00
intel_gvt.h drm/i915/gvt: Add gvt options sanitize function 2017-05-30 15:59:47 +03:00
intel_hangcheck.c drm/i915: Rename global i915 to i915_modparams 2017-09-22 14:50:36 +03:00
intel_hdmi.c drm/i915/cnl: Extend HDMI 2.0 support to CNL. 2017-11-16 09:45:52 -08:00
intel_hotplug.c drm/i915: Introduce intel_hpd_pin function. 2017-08-11 11:53:47 -07:00
intel_huc.c drm/i915/huc: Use helper function while waiting for DMA completion 2017-10-26 21:35:21 +01:00
intel_huc.h drm/i915/huc: Fix includes in intel_huc.c 2017-10-06 16:01:15 +01:00
intel_i2c.c drm/i915: Make i2c lock ops static 2017-09-01 10:30:40 -07:00
intel_lpe_audio.c drm/i915: Stop pretending to mask/unmask LPE audio interrupts 2017-05-26 11:51:18 +03:00
intel_lrc.c drm/i915/execlists: Delay writing to ELSP until HW has processed the previous write 2017-11-20 17:01:38 +00:00
intel_lrc.h drm/i915/guc: Preemption! With GuC 2017-10-26 21:35:21 +01:00
intel_lspcon.c drm/i915: Add retries for LSPCON detection 2017-10-13 12:15:10 +03:00
intel_lvds.c drm/i915: Populate output_types from .get_config() 2017-10-30 19:53:22 +02:00
intel_mocs.c drm/i915/cnl: Cannonlake has same MOCS table than Skylake. 2017-06-07 07:29:51 -07:00
intel_mocs.h
intel_modes.c drm/i915: always update ELD connector type after get modes 2017-09-26 09:14:20 -07:00
intel_opregion.c drm/i915: Nuke intel_ddi_get_encoder_port() 2017-10-30 19:55:18 +02:00
intel_overlay.c drm: Pass struct drm_file * to __drm_mode_object_find [v2] 2017-10-12 10:03:04 +10:00
intel_panel.c drm/i915: Rename global i915 to i915_modparams 2017-09-22 14:50:36 +03:00
intel_pipe_crc.c drm/i915: Nuke intel_digital_port->port 2017-11-09 20:06:14 +02:00
intel_pm.c Revert "drm/i915: Display WA #1133 WaFbcSkipSegments:cnl, glk" 2017-11-17 09:52:14 -08:00
intel_psr.c drm/i915: Nuke intel_digital_port->port 2017-11-09 20:06:14 +02:00
intel_renderstate.h
intel_renderstate_gen6.c
intel_renderstate_gen7.c
intel_renderstate_gen8.c
intel_renderstate_gen9.c drm/i915/gen9: Send all components in VF state 2017-08-14 12:15:49 +03:00
intel_ringbuffer.c drm/i915: Automatic i915_switch_context for legacy 2017-11-20 15:56:16 +00:00
intel_ringbuffer.h drm/i915/execlists: Delay writing to ELSP until HW has processed the previous write 2017-11-20 17:01:38 +00:00
intel_runtime_pm.c drm/i915: Start tracking voltage level in the cdclk state 2017-10-25 13:40:00 +03:00
intel_sdvo.c drm/i915: Eliminate some encoder->crtc usage from SDVO code 2017-11-09 20:04:47 +02:00
intel_sdvo_regs.h
intel_sideband.c drm/i915: Move rps.hw_lock to dev_priv and s/hw_lock/pcu_lock 2017-10-11 08:56:56 +01:00
intel_sprite.c drm/i915/glk: Refactor handling of PLANE_COLOR_CTL for GLK+ 2017-11-14 15:43:52 +02:00
intel_tv.c drm/i915: Eliminate some encoder->crtc usage from TV code 2017-11-09 20:04:56 +02:00
intel_uc.c drm/i915/guc: Rename i915_guc_submission.c|h to intel_guc_submission.c|h 2017-11-16 15:06:18 +00:00
intel_uc.h drm/i915/guc: Move GuC core definitions into dedicated files 2017-10-06 09:37:20 +03:00
intel_uc_fw.c drm/i915: Add Guc/HuC firmware details to error state 2017-11-06 14:22:06 +00:00
intel_uc_fw.h drm/i915: Add Guc/HuC firmware details to error state 2017-11-06 14:22:06 +00:00
intel_uncore.c drm/i915: Re-register PMIC bus access notifier on runtime resume 2017-11-15 09:55:12 +01:00
intel_uncore.h drm/i915: Re-register PMIC bus access notifier on runtime resume 2017-11-15 09:55:12 +01:00
intel_vbt_defs.h drm/i915: Parse max HDMI TMDS clock from VBT 2017-10-30 19:48:11 +02:00
Kconfig drm/i915/fence: Avoid del_timer_sync() from inside a timer 2017-09-19 13:06:21 +01:00
Kconfig.debug drm/i915: Use trace_printk to provide a death rattle for GEM 2017-11-09 21:39:18 +00:00
Makefile drm/i915/guc: Rename i915_guc_submission.c|h to intel_guc_submission.c|h 2017-11-16 15:06:18 +00:00