OpenCloudOS-Kernel/drivers/gpu/drm
Lyude 27082493e9 drm/i915/skl: Update DDB values atomically with wms/plane attrs
Now that we can hook into update_crtcs and control the order in which we
update CRTCs at each modeset, we can finish the final step of fixing
Skylake's watermark handling by performing DDB updates at the same time
as plane updates and watermark updates.

The first major change in this patch is skl_update_crtcs(), which
handles ensuring that we order each CRTC update in our atomic commits
properly so that they honor the DDB flush order.

The second major change in this patch is the order in which we flush the
pipes. While the previous order may have worked, it can't be used in
this approach since it no longer will do the right thing. For example,
using the old ddb flush order:

We have pipes A, B, and C enabled, and we're disabling C. Initial ddb
allocation looks like this:

|   A   |   B   |xxxxxxx|

Since we're performing the ddb updates after performing any CRTC
disablements in intel_atomic_commit_tail(), the space to the right of
pipe B is unallocated.

1. Flush pipes with new allocation contained into old space. None
   apply, so we skip this
2. Flush pipes having their allocation reduced, but overlapping with a
   previous allocation. None apply, so we also skip this
3. Flush pipes that got more space allocated. This applies to A and B,
   giving us the following update order: A, B

This is wrong, since updating pipe A first will cause it to overlap with
B and potentially burst into flames. Our new order (see the code
comments for details) would update the pipes in the proper order: B, A.

As well, we calculate the order for each DDB update during the check
phase, and reference it later in the commit phase when we hit
skl_update_crtcs().

This long overdue patch fixes the rest of the underruns on Skylake.

Changes since v1:
 - Add skl_ddb_entry_write() for cursor into skl_write_cursor_wm()
Changes since v2:
 - Use the method for updating CRTCs that Ville suggested
 - In skl_update_wm(), only copy the watermarks for the crtc that was
   passed to us
Changes since v3:
 - Small comment fix in skl_ddb_allocation_overlaps()
Changes since v4:
 - Remove the second loop in intel_update_crtcs() and use Ville's
   suggestion for updating the ddb allocations in the right order
 - Get rid of the second loop and just use the ddb state as it updates
   to determine what order to update everything in (thanks for the
   suggestion Ville)
 - Simplify skl_ddb_allocation_overlaps()
 - Split actual overlap checking into it's own helper

Fixes: 0e8fb7ba7c ("drm/i915/skl: Flush the WM configuration")
Fixes: 8211bd5bdf ("drm/i915/skl: Program the DDB allocation")
[omitting CC for stable, since this patch will need to be changed for
such backports first]

Testcase: kms_cursor_legacy
Testcase: plane-all-modeset-transition
Signed-off-by: Lyude <cpaul@redhat.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1471961565-28540-2-git-send-email-cpaul@redhat.com
2016-08-25 11:08:37 +02:00
..
amd Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
arc drm/arc: Remove redundant dev_err call in arcpgu_load() 2016-07-19 15:33:50 -04:00
arm drm: BIT(DRM_ROTATE_?) -> DRM_ROTATE_? 2016-08-08 14:17:56 -04:00
armada drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
ast drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
atmel-hlcdc drm: BIT(DRM_ROTATE_?) -> DRM_ROTATE_? 2016-08-08 14:17:56 -04:00
bochs drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
bridge drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
cirrus Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
etnaviv Merge tag 'drm-for-v4.8' of git://people.freedesktop.org/~airlied/linux 2016-08-01 21:44:08 -04:00
exynos Merge tag 'drm-for-v4.8-zpos' of git://people.freedesktop.org/~airlied/linux 2016-08-07 16:35:08 -07:00
fsl-dcu Merge tag 'topic/drm-misc-2016-07-22' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-07-27 10:33:08 +10:00
gma500 drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
hisilicon drm/hisilicon: Fix ADE vblank on/off handling 2016-07-12 14:17:03 +02:00
i2c drm/i2c: adv7511: Move to bridge folder 2016-07-13 14:24:35 +05:30
i810 drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
i915 drm/i915/skl: Update DDB values atomically with wms/plane attrs 2016-08-25 11:08:37 +02:00
imx Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
mediatek Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
mga drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
mgag200 drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
msm drm: BIT(DRM_ROTATE_?) -> DRM_ROTATE_? 2016-08-08 14:17:56 -04:00
nouveau Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
omapdrm Revert "gpu: drm: omapdrm: dss-of: add missing of_node_put after calling of_parse_phandle" 2016-08-12 07:10:37 -04:00
panel drm/panel: simple: Add support for Starry KR122EA0SRA panel 2016-07-11 14:30:43 +02:00
qxl drm: Protect fb_defio in drivers with CONFIG_KMS_FBDEV_EMULATION 2016-08-12 10:42:00 +02:00
r128 drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
radeon Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
rcar-du drm: rcar-du: Link HDMI encoder with bridge 2016-08-08 15:27:11 +10:00
rockchip drm/rockchip: Use drm_plane_helper_check_state() 2016-08-08 14:19:57 -04:00
savage drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
shmobile drm/shmobile: make fbdev support really optional 2016-07-18 09:11:37 +02:00
sis drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
sti Merge branch 'generic-zpos-v8' of http://git.linaro.org/people/benjamin.gaignard/kernel into drm-next 2016-08-03 08:40:24 +10:00
sun4i drm/fb-helper: Add a dummy remove_conflicting_framebuffers 2016-08-12 10:41:18 +02:00
tdfx drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
tegra Merge remote-tracking branch 'airlied/drm-next' into topic/drm-misc 2016-07-19 09:27:29 +02:00
tilcdc drm/tilcdc: Change tilcdc_crtc_page_flip() to tilcdc_crtc_update_fb() 2016-08-08 23:05:19 +03:00
ttm Merge branch 'drm-next-4.8' of git://people.freedesktop.org/~agd5f/linux into drm-next 2016-08-08 16:45:33 +10:00
udl drm: Protect fb_defio in drivers with CONFIG_KMS_FBDEV_EMULATION 2016-08-12 10:42:00 +02:00
vc4 drm/fb-helper: Add a dummy remove_conflicting_framebuffers 2016-08-12 10:41:18 +02:00
vgem drm/vgem: Fix non static symbol warning 2016-07-19 15:01:52 +02:00
via drm: Mark up legacy/dri1 drivers with DRM_LEGACY 2016-08-08 10:05:22 +02:00
virtio drm/fb-helper: Add a dummy remove_conflicting_framebuffers 2016-08-12 10:41:18 +02:00
vmwgfx drm/vmwgfx: select CONFIG_FB 2016-08-12 10:41:46 +02:00
Kconfig drm/radeon|amgpu: Make fbdev emulation optional 2016-08-12 10:41:53 +02:00
Makefile drm/i915: Use remap_io_mapping() to prefault all PTE in a single pass 2016-08-19 17:13:36 +01:00
ati_pcigart.c
drm_agpsupport.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_atomic.c drm: add generic zpos property 2016-07-29 09:59:30 +02:00
drm_atomic_helper.c Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
drm_auth.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_blend.c drm: add generic zpos property 2016-07-29 09:59:30 +02:00
drm_bridge.c drm/doc: Switch to sphinx/rst fixed-width quoting 2016-06-03 20:58:24 +02:00
drm_bufs.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_cache.c drm: Restore double clflush on the last partial cacheline 2016-07-12 15:57:13 +02:00
drm_context.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_crtc.c Merge tag 'topic/drm-misc-2016-08-12' of git://anongit.freedesktop.org/drm-intel into drm-next 2016-08-15 16:46:36 +10:00
drm_crtc_helper.c Linux 4.7-rc5 2016-07-02 15:56:01 +10:00
drm_crtc_internal.h drm: add generic zpos property 2016-07-29 09:59:30 +02:00
drm_debugfs.c drm: Nuke legacy maps debugfs files 2016-06-16 10:16:11 +02:00
drm_dma.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_dp_aux_dev.c drm_aux-dev: fix error handling in drm_dp_aux_dev_init() 2016-07-12 14:10:57 +02:00
drm_dp_dual_mode_helper.c drm: Add helper for DP++ adaptors 2016-05-23 11:10:46 +03:00
drm_dp_helper.c drm/dp_helper: Rate limit timeout errors from drm_dp_i2c_do_msg() 2016-08-09 18:23:44 +02:00
drm_dp_mst_topology.c drm/dp-mst: Missing kernel doc 2016-07-19 10:31:53 +02:00
drm_drv.c drm: rename DRM_MINOR_LEGACY to DRM_MINOR_PRIMARY 2016-08-08 10:05:20 +02:00
drm_edid.c drm/edid: Set 8 bpc color depth for displays with "DFP 1.x compliant TMDS". 2016-08-09 08:56:04 +10:00
drm_edid_load.c Fix annoyingly awkward typo in drm_edid_load.c 2016-05-30 09:59:28 +02:00
drm_encoder_slave.c
drm_fb_cma_helper.c Merge branch 'for-next' of http://git.agner.ch/git/linux-drm-fsl-dcu into drm-next 2016-07-02 16:21:35 +10:00
drm_fb_helper.c drm: Remove superflous linux/fb.h includes 2016-08-12 10:41:39 +02:00
drm_flip_work.c
drm_fops.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_fourcc.c drm: Move format-related helpers to drm_fourcc.c 2016-06-09 11:58:50 +02:00
drm_gem.c Merge tag 'drm-for-v4.8' of git://people.freedesktop.org/~airlied/linux 2016-08-01 21:44:08 -04:00
drm_gem_cma_helper.c drm: Wrap direct calls to driver->gem_free_object from CMA 2016-06-01 15:00:28 +10:00
drm_global.c
drm_hashtab.c
drm_info.c drm: Extract drm_is_current_master 2016-06-21 21:58:12 +02:00
drm_internal.h drm: Nuke SET_UNIQUE ioctl 2016-06-21 21:43:46 +02:00
drm_ioc32.c
drm_ioctl.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_irq.c drm: Make sure drm_vblank_no_hw_counter isn't abused 2016-08-08 14:34:05 -04:00
drm_kms_helper_common.c
drm_legacy.h drm: Hide hw.lock cleanup in filp->release better 2016-06-16 10:16:37 +02:00
drm_lock.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_memory.c drm: Fix broken use of _PAGE_NO_CACHE on powerpc 2016-07-12 13:20:39 +02:00
drm_mipi_dsi.c drm/dsi: Make set_tear_scanline command consistent 2016-07-12 13:19:26 +02:00
drm_mm.c drm: Declare that create drm_mm nodes with size 0 is illegal 2016-08-08 10:05:21 +02:00
drm_modes.c drm/imx: convey the pixelclk-active and de-active flags from DT to the ipu-di driver 2016-08-08 11:44:20 +02:00
drm_modeset_lock.c drm/doc: Switch to sphinx/rst fixed-width quoting 2016-06-03 20:58:24 +02:00
drm_of.c
drm_panel.c
drm_pci.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_plane_helper.c drm/plane-helper: Add drm_plane_helper_check_state() 2016-08-08 14:19:45 -04:00
drm_platform.c drm: Lobotomize set_busid nonsense for !pci drivers 2016-06-21 21:56:23 +02:00
drm_prime.c drm/prime: fix error path deadlock fail 2016-06-13 17:32:18 +02:00
drm_probe_helper.c drm: Only create a cmdline mode if no probed modes match 2016-06-02 15:10:22 +02:00
drm_rect.c drm: Warn about negative sizes when calculating scale factor 2016-08-08 14:17:56 -04:00
drm_scatter.c drm: Used DRM_LEGACY for all legacy functions 2016-08-08 10:05:23 +02:00
drm_simple_kms_helper.c drm/simple_kms_helper: Use drm_plane_helper_check_state() 2016-08-08 14:19:58 -04:00
drm_sysfs.c drm: Remove dev_pm_ops from drm_class 2016-06-09 08:43:25 +02:00
drm_trace.h
drm_trace_points.c
drm_vm.c drm: Fix broken use of _PAGE_NO_CACHE on powerpc 2016-07-12 13:20:39 +02:00
drm_vma_manager.c drm: Convert drm_vma_manager to embedded interval-tree in drm_mm 2016-08-08 10:05:17 +02:00