--- /dev/null
+From daniel.vetter@ffwll.ch Thu Jun 15 08:32:03 2017
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date: Fri, 26 May 2017 10:29:06 +0200
+Subject: drm/i915: Do not drop pagetables when empty
+To: Intel Graphics Development <intel-gfx@lists.freedesktop.org>
+Cc: Chris Wilson <chris@chris-wilson.co.uk>, Michel Thierry <michel.thierry@intel.com>, Mika Kuoppala <mika.kuoppala@intel.com>, Joonas Lahtinen <joonas.lahtinen@linux.intel.com>, Michał Winiarski <michal.winiarski@intel.com>, Daniel Vetter <daniel.vetter@intel.com>, Jani Nikula <jani.nikula@linux.intel.com>, "# v4 . 10+" <stable@vger.kernel.org>
+Message-ID: <20170526082906.8982-1-daniel.vetter@ffwll.ch>
+
+
+From: Chris Wilson <chris@chris-wilson.co.uk>
+
+This is the minimal backport for stable of the upstream commit:
+
+commit dd19674bacba227ae5d3ce680cbc5668198894dc
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Wed Feb 15 08:43:46 2017 +0000
+
+ drm/i915: Remove bitmap tracking for used-ptes
+
+Due to a race with the shrinker, when we try to allocate a pagetable, we
+may end up shrinking it instead. This comes as a nasty surprise as we
+try to dereference it to fill in the pagetable entries for the object.
+
+In linus/master this is fixed by pinning the pagetables prior to
+allocation, but that backport is roughly
+ drivers/gpu/drm/i915/i915_gem_gtt.c | 10 ----------
+ 1 file changed, 10 deletions(-)
+i.e. unsuitable for stable. Instead we neuter the code that tried to
+free the pagetables.
+
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99295
+Fixes: 2ce5179fe826 ("drm/i915/gtt: Free unused lower-level page tables")
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: Michel Thierry <michel.thierry@intel.com>
+Cc: Mika Kuoppala <mika.kuoppala@intel.com>
+Cc: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
+Cc: Michał Winiarski <michal.winiarski@intel.com>
+Cc: Daniel Vetter <daniel.vetter@intel.com>
+Cc: Jani Nikula <jani.nikula@linux.intel.com>
+Cc: intel-gfx@lists.freedesktop.org
+Cc: <stable@vger.kernel.org> # v4.10+
+Tested-by: Maël Lavault <mael.lavault@protonmail.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
++++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
+@@ -755,10 +755,6 @@ static bool gen8_ppgtt_clear_pt(struct i
+ GEM_BUG_ON(pte_end > GEN8_PTES);
+
+ bitmap_clear(pt->used_ptes, pte, num_entries);
+- if (USES_FULL_PPGTT(vm->i915)) {
+- if (bitmap_empty(pt->used_ptes, GEN8_PTES))
+- return true;
+- }
+
+ pt_vaddr = kmap_px(pt);
+
+@@ -798,9 +794,6 @@ static bool gen8_ppgtt_clear_pd(struct i
+ }
+ }
+
+- if (bitmap_empty(pd->used_pdes, I915_PDES))
+- return true;
+-
+ return false;
+ }
+
+@@ -829,9 +822,6 @@ static bool gen8_ppgtt_clear_pdp(struct
+
+ mark_tlbs_dirty(ppgtt);
+
+- if (bitmap_empty(pdp->used_pdpes, I915_PDPES_PER_PDP(dev_priv)))
+- return true;
+-
+ return false;
+ }
+
--- /dev/null
+From 6ab92afc95c9bd6877cb42e7b24f65be887a5440 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+Date: Tue, 2 May 2017 15:04:09 +0300
+Subject: drm/i915: Prevent the system suspend complete optimization
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Imre Deak <imre.deak@intel.com>
+
+commit 6ab92afc95c9bd6877cb42e7b24f65be887a5440 upstream.
+
+Since
+
+commit bac2a909a096c9110525c18cbb8ce73c660d5f71
+Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Date: Wed Jan 21 02:17:42 2015 +0100
+
+ PCI / PM: Avoid resuming PCI devices during system suspend
+
+PCI devices will default to allowing the system suspend complete
+optimization where devices are not woken up during system suspend if
+they were already runtime suspended. This however breaks the i915/HDA
+drivers for two reasons:
+
+- The i915 driver has system suspend specific steps that it needs to
+ run, that bring the device to a different state than its runtime
+ suspended state.
+
+- The HDA driver's suspend handler requires power that it will request
+ from the i915 driver's power domain handler. This in turn requires the
+ i915 driver to runtime resume itself, but this won't be possible if the
+ suspend complete optimization is in effect: in this case the i915
+ runtime PM is disabled and trying to get an RPM reference returns
+ -EACCESS.
+
+Solve this by requiring the PCI/PM core to resume the device during
+system suspend which in effect disables the suspend complete optimization.
+
+Regardless of the above commit the optimization stayed disabled for DRM
+devices until
+
+commit d14d2a8453d650bea32a1c5271af1458cd283a0f
+Author: Lukas Wunner <lukas@wunner.de>
+Date: Wed Jun 8 12:49:29 2016 +0200
+
+ drm: Remove dev_pm_ops from drm_class
+
+so this patch is in practice a fix for this commit. Another reason for
+the bug staying hidden for so long is that the optimization for a device
+is disabled if it's disabled for any of its children devices. i915 may
+have a backlight device as its child which doesn't support runtime PM
+and so doesn't allow the optimization either. So if this backlight
+device got registered the bug stayed hidden.
+
+Credits to Marta, Tomi and David who enabled pstore logging,
+that caught one instance of this issue across a suspend/
+resume-to-ram and Ville who rememberd that the optimization was enabled
+for some devices at one point.
+
+The first WARN triggered by the problem:
+
+[ 6250.746445] WARNING: CPU: 2 PID: 17384 at drivers/gpu/drm/i915/intel_runtime_pm.c:2846 intel_runtime_pm_get+0x6b/0xd0 [i915]
+[ 6250.746448] pm_runtime_get_sync() failed: -13
+[ 6250.746451] Modules linked in: snd_hda_intel i915 vgem snd_hda_codec_hdmi x86_pkg_temp_thermal intel_powerclamp coretemp crct10dif_pclmul crc32_pclmul
+snd_hda_codec_realtek snd_hda_codec_generic ghash_clmulni_intel e1000e snd_hda_codec snd_hwdep snd_hda_core ptp mei_me pps_core snd_pcm lpc_ich mei prime_
+numbers i2c_hid i2c_designware_platform i2c_designware_core [last unloaded: i915]
+[ 6250.746512] CPU: 2 PID: 17384 Comm: kworker/u8:0 Tainted: G U W 4.11.0-rc5-CI-CI_DRM_334+ #1
+[ 6250.746515] Hardware name: /NUC5i5RYB, BIOS RYBDWi35.86A.0362.2017.0118.0940 01/18/2017
+[ 6250.746521] Workqueue: events_unbound async_run_entry_fn
+[ 6250.746525] Call Trace:
+[ 6250.746530] dump_stack+0x67/0x92
+[ 6250.746536] __warn+0xc6/0xe0
+[ 6250.746542] ? pci_restore_standard_config+0x40/0x40
+[ 6250.746546] warn_slowpath_fmt+0x46/0x50
+[ 6250.746553] ? __pm_runtime_resume+0x56/0x80
+[ 6250.746584] intel_runtime_pm_get+0x6b/0xd0 [i915]
+[ 6250.746610] intel_display_power_get+0x1b/0x40 [i915]
+[ 6250.746646] i915_audio_component_get_power+0x15/0x20 [i915]
+[ 6250.746654] snd_hdac_display_power+0xc8/0x110 [snd_hda_core]
+[ 6250.746661] azx_runtime_resume+0x218/0x280 [snd_hda_intel]
+[ 6250.746667] pci_pm_runtime_resume+0x76/0xa0
+[ 6250.746672] __rpm_callback+0xb4/0x1f0
+[ 6250.746677] ? pci_restore_standard_config+0x40/0x40
+[ 6250.746682] rpm_callback+0x1f/0x80
+[ 6250.746686] ? pci_restore_standard_config+0x40/0x40
+[ 6250.746690] rpm_resume+0x4ba/0x740
+[ 6250.746698] __pm_runtime_resume+0x49/0x80
+[ 6250.746703] pci_pm_suspend+0x57/0x140
+[ 6250.746709] dpm_run_callback+0x6f/0x330
+[ 6250.746713] ? pci_pm_freeze+0xe0/0xe0
+[ 6250.746718] __device_suspend+0xf9/0x370
+[ 6250.746724] ? dpm_watchdog_set+0x60/0x60
+[ 6250.746730] async_suspend+0x1a/0x90
+[ 6250.746735] async_run_entry_fn+0x34/0x160
+[ 6250.746741] process_one_work+0x1f2/0x6d0
+[ 6250.746749] worker_thread+0x49/0x4a0
+[ 6250.746755] kthread+0x107/0x140
+[ 6250.746759] ? process_one_work+0x6d0/0x6d0
+[ 6250.746763] ? kthread_create_on_node+0x40/0x40
+[ 6250.746768] ret_from_fork+0x2e/0x40
+[ 6250.746778] ---[ end trace 102a62fd2160f5e6 ]---
+
+v2:
+- Use the new pci_dev->needs_resume flag, to avoid any overhead during
+ the ->pm_prepare hook. (Rafael)
+
+v3:
+- Update commit message to reference the actual regressing commit.
+ (Lukas)
+
+v4:
+- Rebase on v4 of patch 1/2.
+
+Fixes: d14d2a8453d6 ("drm: Remove dev_pm_ops from drm_class")
+References: https://bugs.freedesktop.org/show_bug.cgi?id=100378
+References: https://bugs.freedesktop.org/show_bug.cgi?id=100770
+Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Cc: Marta Lofstedt <marta.lofstedt@intel.com>
+Cc: David Weinehall <david.weinehall@linux.intel.com>
+Cc: Tomi Sarvela <tomi.p.sarvela@intel.com>
+Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Cc: Mika Kuoppala <mika.kuoppala@intel.com>
+Cc: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: Takashi Iwai <tiwai@suse.de>
+Cc: Bjorn Helgaas <bhelgaas@google.com>
+Cc: Lukas Wunner <lukas@wunner.de>
+Cc: linux-pci@vger.kernel.org
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
+Reported-and-tested-by: Marta Lofstedt <marta.lofstedt@intel.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/1493726649-32094-2-git-send-email-imre.deak@intel.com
+(cherry picked from commit adfdf85d795f4d4f487b61ee0b169d64c6e19081)
+Signed-off-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/i915/i915_drv.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/drivers/gpu/drm/i915/i915_drv.c
++++ b/drivers/gpu/drm/i915/i915_drv.c
+@@ -1206,6 +1206,15 @@ int i915_driver_load(struct pci_dev *pde
+ goto out_free_priv;
+
+ pci_set_drvdata(pdev, &dev_priv->drm);
++ /*
++ * Disable the system suspend direct complete optimization, which can
++ * leave the device suspended skipping the driver's suspend handlers
++ * if the device was already runtime suspended. This is needed due to
++ * the difference in our runtime and system suspend sequence and
++ * becaue the HDA driver may require us to enable the audio power
++ * domain during system suspend.
++ */
++ pdev->dev_flags |= PCI_DEV_FLAGS_NEEDS_RESUME;
+
+ ret = i915_driver_init_early(dev_priv, ent);
+ if (ret < 0)
--- /dev/null
+From 4d071c3238987325b9e50e33051a40d1cce311cc Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+Date: Tue, 23 May 2017 14:18:17 -0500
+Subject: PCI/PM: Add needs_resume flag to avoid suspend complete optimization
+
+From: Imre Deak <imre.deak@intel.com>
+
+commit 4d071c3238987325b9e50e33051a40d1cce311cc upstream.
+
+Some drivers - like i915 - may not support the system suspend direct
+complete optimization due to differences in their runtime and system
+suspend sequence. Add a flag that when set resumes the device before
+calling the driver's system suspend handlers which effectively disables
+the optimization.
+
+Needed by a future patch fixing suspend/resume on i915.
+
+Suggested by Rafael.
+
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Cc: stable@vger.kernel.org
+(rebased on v4.8, added kernel version to commit message stable tag)
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/pci/pci.c | 3 ++-
+ include/linux/pci.h | 5 +++++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -2142,7 +2142,8 @@ bool pci_dev_keep_suspended(struct pci_d
+
+ if (!pm_runtime_suspended(dev)
+ || pci_target_state(pci_dev) != pci_dev->current_state
+- || platform_pci_need_resume(pci_dev))
++ || platform_pci_need_resume(pci_dev)
++ || (pci_dev->dev_flags & PCI_DEV_FLAGS_NEEDS_RESUME))
+ return false;
+
+ /*
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -178,6 +178,11 @@ enum pci_dev_flags {
+ PCI_DEV_FLAGS_NO_PM_RESET = (__force pci_dev_flags_t) (1 << 7),
+ /* Get VPD from function 0 VPD */
+ PCI_DEV_FLAGS_VPD_REF_F0 = (__force pci_dev_flags_t) (1 << 8),
++ /*
++ * Resume before calling the driver's system suspend hooks, disabling
++ * the direct_complete optimization.
++ */
++ PCI_DEV_FLAGS_NEEDS_RESUME = (__force pci_dev_flags_t) (1 << 11),
+ };
+
+ enum pci_irq_reroute_variant {