]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Apr 2016 20:46:58 +0000 (13:46 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Apr 2016 20:46:58 +0000 (13:46 -0700)
added patches:
drm-radeon-add-a-dpm-quirk-for-all-r7-370-parts.patch
drm-radeon-add-a-dpm-quirk-for-sapphire-dual-x-r7-370-2g-d5.patch
xen-events-mask-a-moving-irq.patch

queue-3.14/drm-radeon-add-a-dpm-quirk-for-all-r7-370-parts.patch [new file with mode: 0644]
queue-3.14/drm-radeon-add-a-dpm-quirk-for-sapphire-dual-x-r7-370-2g-d5.patch [new file with mode: 0644]
queue-3.14/series
queue-3.14/xen-events-mask-a-moving-irq.patch [new file with mode: 0644]

diff --git a/queue-3.14/drm-radeon-add-a-dpm-quirk-for-all-r7-370-parts.patch b/queue-3.14/drm-radeon-add-a-dpm-quirk-for-all-r7-370-parts.patch
new file mode 100644 (file)
index 0000000..b0116cd
--- /dev/null
@@ -0,0 +1,32 @@
+From 0e5585dc870af947fab2af96a88c2d8b4270247c Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Mon, 28 Mar 2016 10:21:20 -0400
+Subject: drm/radeon: add a dpm quirk for all R7 370 parts
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit 0e5585dc870af947fab2af96a88c2d8b4270247c upstream.
+
+Higher mclk values are not stable due to a bug somewhere.
+Limit them for now.
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/si_dpm.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/gpu/drm/radeon/si_dpm.c
++++ b/drivers/gpu/drm/radeon/si_dpm.c
+@@ -3007,6 +3007,10 @@ static void si_apply_state_adjust_rules(
+                               ps->performance_levels[i].sclk = max_sclk;
+               }
+       }
++      /* limit mclk on all R7 370 parts for stability */
++      if (rdev->pdev->device == 0x6811 &&
++          rdev->pdev->revision == 0x81)
++              max_mclk = 120000;
+       /* XXX validate the min clocks required for display */
diff --git a/queue-3.14/drm-radeon-add-a-dpm-quirk-for-sapphire-dual-x-r7-370-2g-d5.patch b/queue-3.14/drm-radeon-add-a-dpm-quirk-for-sapphire-dual-x-r7-370-2g-d5.patch
new file mode 100644 (file)
index 0000000..b82cd27
--- /dev/null
@@ -0,0 +1,29 @@
+From f971f2263deaa4a441e377b385c11aee0f3b3f9a Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Fri, 25 Mar 2016 10:31:04 -0400
+Subject: drm/radeon: add a dpm quirk for sapphire Dual-X R7 370 2G D5
+
+From: Alex Deucher <alexander.deucher@amd.com>
+
+commit f971f2263deaa4a441e377b385c11aee0f3b3f9a upstream.
+
+bug:
+https://bugs.freedesktop.org/show_bug.cgi?id=94692
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/radeon/si_dpm.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/gpu/drm/radeon/si_dpm.c
++++ b/drivers/gpu/drm/radeon/si_dpm.c
+@@ -2914,6 +2914,7 @@ static struct si_dpm_quirk si_dpm_quirk_
+       /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */
+       { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
+       { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
++      { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0x2015, 0, 120000 },
+       { PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 },
+       { 0, 0, 0, 0 },
+ };
index 89b5fb18c2a78c3cd6adb2089a669f66d251182a..5e5d805bcf85d70a0978574b1d8676042a6d87cf 100644 (file)
@@ -3,3 +3,6 @@ parisc-avoid-function-pointers-for-kernel-exception-routines.patch
 parisc-fix-kernel-crash-with-reversed-copy_from_user.patch
 alsa-timer-use-mod_timer-for-rearming-the-system-timer.patch
 mm-fix-invalid-node-in-alloc_migrate_target.patch
+drm-radeon-add-a-dpm-quirk-for-sapphire-dual-x-r7-370-2g-d5.patch
+drm-radeon-add-a-dpm-quirk-for-all-r7-370-parts.patch
+xen-events-mask-a-moving-irq.patch
diff --git a/queue-3.14/xen-events-mask-a-moving-irq.patch b/queue-3.14/xen-events-mask-a-moving-irq.patch
new file mode 100644 (file)
index 0000000..ce978df
--- /dev/null
@@ -0,0 +1,93 @@
+From ff1e22e7a638a0782f54f81a6c9cb139aca2da35 Mon Sep 17 00:00:00 2001
+From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Date: Fri, 18 Mar 2016 10:11:07 -0400
+Subject: xen/events: Mask a moving irq
+
+From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+
+commit ff1e22e7a638a0782f54f81a6c9cb139aca2da35 upstream.
+
+Moving an unmasked irq may result in irq handler being invoked on both
+source and target CPUs.
+
+With 2-level this can happen as follows:
+
+On source CPU:
+        evtchn_2l_handle_events() ->
+            generic_handle_irq() ->
+                handle_edge_irq() ->
+                   eoi_pirq():
+                       irq_move_irq(data);
+
+                       /***** WE ARE HERE *****/
+
+                       if (VALID_EVTCHN(evtchn))
+                           clear_evtchn(evtchn);
+
+If at this moment target processor is handling an unrelated event in
+evtchn_2l_handle_events()'s loop it may pick up our event since target's
+cpu_evtchn_mask claims that this event belongs to it *and* the event is
+unmasked and still pending. At the same time, source CPU will continue
+executing its own handle_edge_irq().
+
+With FIFO interrupt the scenario is similar: irq_move_irq() may result
+in a EVTCHNOP_unmask hypercall which, in turn, may make the event
+pending on the target CPU.
+
+We can avoid this situation by moving and clearing the event while
+keeping event masked.
+
+Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Signed-off-by: David Vrabel <david.vrabel@citrix.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/xen/events/events_base.c |   28 ++++++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 4 deletions(-)
+
+--- a/drivers/xen/events/events_base.c
++++ b/drivers/xen/events/events_base.c
+@@ -503,9 +503,19 @@ static void eoi_pirq(struct irq_data *da
+       struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) };
+       int rc = 0;
+-      irq_move_irq(data);
++      if (!VALID_EVTCHN(evtchn))
++              return;
+-      if (VALID_EVTCHN(evtchn))
++      if (unlikely(irqd_is_setaffinity_pending(data))) {
++              int masked = test_and_set_mask(evtchn);
++
++              clear_evtchn(evtchn);
++
++              irq_move_masked_irq(data);
++
++              if (!masked)
++                      unmask_evtchn(evtchn);
++      } else
+               clear_evtchn(evtchn);
+       if (pirq_needs_eoi(data->irq)) {
+@@ -1395,9 +1405,19 @@ static void ack_dynirq(struct irq_data *
+ {
+       int evtchn = evtchn_from_irq(data->irq);
+-      irq_move_irq(data);
++      if (!VALID_EVTCHN(evtchn))
++              return;
+-      if (VALID_EVTCHN(evtchn))
++      if (unlikely(irqd_is_setaffinity_pending(data))) {
++              int masked = test_and_set_mask(evtchn);
++
++              clear_evtchn(evtchn);
++
++              irq_move_masked_irq(data);
++
++              if (!masked)
++                      unmask_evtchn(evtchn);
++      } else
+               clear_evtchn(evtchn);
+ }