summaryrefslogtreecommitdiffstats
path: root/core/modules/kernel-vanilla/patches/dirty-hack-vblank-hang-i915.patch
blob: f8179684943f68d5e7d3a80eba04e55d3f71de67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 7c22fac3..de70665f 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -653,6 +653,7 @@ enum intel_sbi_destination {
 #define QUIRK_PIN_SWIZZLED_PAGES (1<<5)
 #define QUIRK_INCREASE_T12_DELAY (1<<6)
 #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7)
+#define QUIRK_SKIP_WAITS (1<<13)
 
 struct intel_fbdev;
 struct intel_fbc_work;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 00486c74..f72e8591 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12466,7 +12466,8 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
 
 	intel_atomic_commit_fence_wait(intel_state);
 
-	drm_atomic_helper_wait_for_dependencies(state);
+	if (!(dev_priv->quirks & QUIRK_SKIP_WAITS))
+		drm_atomic_helper_wait_for_dependencies(state);
 
 	if (intel_state->modeset)
 		intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET);
@@ -12568,7 +12569,8 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
 	 * - switch over to the vblank wait helper in the core after that since
 	 *   we don't need out special handling any more.
 	 */
-	drm_atomic_helper_wait_for_flip_done(dev, state);
+	if (!(dev_priv->quirks & QUIRK_SKIP_WAITS))
+		drm_atomic_helper_wait_for_flip_done(dev, state);
 
 	/*
 	 * Now that the vblank has passed, we can go ahead and program the
@@ -14662,6 +14664,13 @@ static void quirk_increase_ddi_disabled_time(struct drm_device *dev)
 	DRM_INFO("Applying Increase DDI Disabled quirk\n");
 }
 
+static void quirk_ignore_wait(struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = to_i915(dev);
+	dev_priv->quirks |= QUIRK_SKIP_WAITS;
+	DRM_INFO("Skipping wait for vblank and dependencies\n");
+}
+
 struct intel_quirk {
 	int device;
 	int subsystem_vendor;
@@ -14704,6 +14713,9 @@ static struct intel_quirk intel_quirks[] = {
 	/* Sony Vaio Y cannot use SSC on LVDS */
 	{ 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
 
+	/* HP Compaq 8200 */
+	{ 0x0102, 0x103c, 0x1494, quirk_ignore_wait },
+
 	/* Acer Aspire 5734Z must invert backlight brightness */
 	{ 0x2a42, 0x1025, 0x0459, quirk_invert_brightness },
 
@@ -14762,6 +14774,7 @@ static void intel_init_quirks(struct drm_device *dev)
 	struct pci_dev *d = dev->pdev;
 	int i;
 
+	DRM_INFO("iGPU: dev: %04x, subven: %04x, subdev: %04x\n", d->device, d->subsystem_vendor, d->subsystem_device);
 	for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
 		struct intel_quirk *q = &intel_quirks[i];