summaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.22/0033-drm-i915-Refactor-the-deferred-PM_IIR-handling-into-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.22/0033-drm-i915-Refactor-the-deferred-PM_IIR-handling-into-.patch')
-rw-r--r--recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.22/0033-drm-i915-Refactor-the-deferred-PM_IIR-handling-into-.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.22/0033-drm-i915-Refactor-the-deferred-PM_IIR-handling-into-.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.22/0033-drm-i915-Refactor-the-deferred-PM_IIR-handling-into-.patch
new file mode 100644
index 00000000..ac1efd7c
--- /dev/null
+++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.22/0033-drm-i915-Refactor-the-deferred-PM_IIR-handling-into-.patch
@@ -0,0 +1,107 @@
1From 179d0e42c797861a350b6f72e534edad4dac0f65 Mon Sep 17 00:00:00 2001
2From: Chris Wilson <chris@chris-wilson.co.uk>
3Date: Sun, 15 Apr 2012 11:56:03 +0100
4Subject: [PATCH 33/46] drm/i915: Refactor the deferred PM_IIR handling into a
5 single function
6
7commit fc6826d1dcd65f3d1e9a5377678882e4e08f02be upstream.
8
9This function, along with the registers and deferred work hander, are
10all shared with SandyBridge, IvyBridge and their variants. So remove the
11duplicate code into a single function.
12
13Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
14Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
15Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
16[bwh: Backported to 3.2: adjust context; drop changes for Valley View]
17Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
18---
19 drivers/gpu/drm/i915/i915_irq.c | 58 +++++++++++++++++++--------------------
20 1 file changed, 29 insertions(+), 29 deletions(-)
21
22diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
23index d3820c2..17c335e 100644
24--- a/drivers/gpu/drm/i915/i915_irq.c
25+++ b/drivers/gpu/drm/i915/i915_irq.c
26@@ -424,6 +424,31 @@ static void gen6_pm_rps_work(struct work_struct *work)
27 mutex_unlock(&dev_priv->dev->struct_mutex);
28 }
29
30+static void gen6_queue_rps_work(struct drm_i915_private *dev_priv,
31+ u32 pm_iir)
32+{
33+ unsigned long flags;
34+
35+ /*
36+ * IIR bits should never already be set because IMR should
37+ * prevent an interrupt from being shown in IIR. The warning
38+ * displays a case where we've unsafely cleared
39+ * dev_priv->pm_iir. Although missing an interrupt of the same
40+ * type is not a problem, it displays a problem in the logic.
41+ *
42+ * The mask bit in IMR is cleared by rps_work.
43+ */
44+
45+ spin_lock_irqsave(&dev_priv->rps_lock, flags);
46+ WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
47+ dev_priv->pm_iir |= pm_iir;
48+ I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir);
49+ POSTING_READ(GEN6_PMIMR);
50+ spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
51+
52+ queue_work(dev_priv->wq, &dev_priv->rps_work);
53+}
54+
55 static void pch_irq_handler(struct drm_device *dev, u32 pch_iir)
56 {
57 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
58@@ -529,16 +554,8 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
59 pch_irq_handler(dev, pch_iir);
60 }
61
62- if (pm_iir & GEN6_PM_DEFERRED_EVENTS) {
63- unsigned long flags;
64- spin_lock_irqsave(&dev_priv->rps_lock, flags);
65- WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
66- dev_priv->pm_iir |= pm_iir;
67- I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir);
68- POSTING_READ(GEN6_PMIMR);
69- spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
70- queue_work(dev_priv->wq, &dev_priv->rps_work);
71- }
72+ if (pm_iir & GEN6_PM_DEFERRED_EVENTS)
73+ gen6_queue_rps_work(dev_priv, pm_iir);
74
75 /* should clear PCH hotplug event before clear CPU irq */
76 I915_WRITE(SDEIIR, pch_iir);
77@@ -634,25 +651,8 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
78 i915_handle_rps_change(dev);
79 }
80
81- if (IS_GEN6(dev) && pm_iir & GEN6_PM_DEFERRED_EVENTS) {
82- /*
83- * IIR bits should never already be set because IMR should
84- * prevent an interrupt from being shown in IIR. The warning
85- * displays a case where we've unsafely cleared
86- * dev_priv->pm_iir. Although missing an interrupt of the same
87- * type is not a problem, it displays a problem in the logic.
88- *
89- * The mask bit in IMR is cleared by rps_work.
90- */
91- unsigned long flags;
92- spin_lock_irqsave(&dev_priv->rps_lock, flags);
93- WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
94- dev_priv->pm_iir |= pm_iir;
95- I915_WRITE(GEN6_PMIMR, dev_priv->pm_iir);
96- POSTING_READ(GEN6_PMIMR);
97- spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
98- queue_work(dev_priv->wq, &dev_priv->rps_work);
99- }
100+ if (IS_GEN6(dev) && pm_iir & GEN6_PM_DEFERRED_EVENTS)
101+ gen6_queue_rps_work(dev_priv, pm_iir);
102
103 /* should clear PCH hotplug event before clear CPU irq */
104 I915_WRITE(SDEIIR, pch_iir);
105--
1061.7.10
107