diff options
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-.patch | 107 |
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 @@ | |||
1 | From 179d0e42c797861a350b6f72e534edad4dac0f65 Mon Sep 17 00:00:00 2001 | ||
2 | From: Chris Wilson <chris@chris-wilson.co.uk> | ||
3 | Date: Sun, 15 Apr 2012 11:56:03 +0100 | ||
4 | Subject: [PATCH 33/46] drm/i915: Refactor the deferred PM_IIR handling into a | ||
5 | single function | ||
6 | |||
7 | commit fc6826d1dcd65f3d1e9a5377678882e4e08f02be upstream. | ||
8 | |||
9 | This function, along with the registers and deferred work hander, are | ||
10 | all shared with SandyBridge, IvyBridge and their variants. So remove the | ||
11 | duplicate code into a single function. | ||
12 | |||
13 | Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> | ||
14 | Reviewed-by: Ben Widawsky <ben@bwidawsk.net> | ||
15 | Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch> | ||
16 | [bwh: Backported to 3.2: adjust context; drop changes for Valley View] | ||
17 | Signed-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 | |||
22 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
23 | index 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 | -- | ||
106 | 1.7.10 | ||
107 | |||