From: Greg Kroah-Hartman Date: Wed, 13 Apr 2016 20:46:58 +0000 (-0700) Subject: 3.14-stable patches X-Git-Tag: v3.14.67~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2f042c43a27c1e76a6aa7cacc4ab568d7ff1a748;p=thirdparty%2Fkernel%2Fstable-queue.git 3.14-stable patches 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 --- 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 index 00000000000..b0116cd005d --- /dev/null +++ b/queue-3.14/drm-radeon-add-a-dpm-quirk-for-all-r7-370-parts.patch @@ -0,0 +1,32 @@ +From 0e5585dc870af947fab2af96a88c2d8b4270247c Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 28 Mar 2016 10:21:20 -0400 +Subject: drm/radeon: add a dpm quirk for all R7 370 parts + +From: Alex Deucher + +commit 0e5585dc870af947fab2af96a88c2d8b4270247c upstream. + +Higher mclk values are not stable due to a bug somewhere. +Limit them for now. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..b82cd2764d2 --- /dev/null +++ b/queue-3.14/drm-radeon-add-a-dpm-quirk-for-sapphire-dual-x-r7-370-2g-d5.patch @@ -0,0 +1,29 @@ +From f971f2263deaa4a441e377b385c11aee0f3b3f9a Mon Sep 17 00:00:00 2001 +From: Alex Deucher +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 + +commit f971f2263deaa4a441e377b385c11aee0f3b3f9a upstream. + +bug: +https://bugs.freedesktop.org/show_bug.cgi?id=94692 + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + 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 }, + }; diff --git a/queue-3.14/series b/queue-3.14/series index 89b5fb18c2a..5e5d805bcf8 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -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 index 00000000000..ce978dfc404 --- /dev/null +++ b/queue-3.14/xen-events-mask-a-moving-irq.patch @@ -0,0 +1,93 @@ +From ff1e22e7a638a0782f54f81a6c9cb139aca2da35 Mon Sep 17 00:00:00 2001 +From: Boris Ostrovsky +Date: Fri, 18 Mar 2016 10:11:07 -0400 +Subject: xen/events: Mask a moving irq + +From: Boris Ostrovsky + +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 +Signed-off-by: David Vrabel +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + } +