From: Greg Kroah-Hartman Date: Mon, 10 Jun 2013 07:19:33 +0000 (-0700) Subject: 3.9-stable patches X-Git-Tag: v3.0.82~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=923e8ebee4081cc2f9292e0ed3a2ef6eb6d9aae2;p=thirdparty%2Fkernel%2Fstable-queue.git 3.9-stable patches added patches: arm-7742-1-topology-export-cpu_topology.patch arm-7743-1-compressed-head.s-work-around-new-binutils-warning.patch arm-7747-1-pcpu-ensure-__my_cpu_offset-cannot-be-re-ordered-across-barrier.patch arm-kirkwood-ts219-fix-crash-by-double-pcie-instantiation.patch dmaengine-ste_dma40-fix-pm-runtime-ref-counting.patch drm-radeon-don-t-allow-audio-on-dce6.patch powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch powerpc-hw_breakpoints-add-dabrx-cpu-feature-to-fix-32-bit-regression.patch powerpc-perf-fix-deadlock-caused-by-calling-printk-in-pmu-exception.patch radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch --- diff --git a/queue-3.9/arm-7742-1-topology-export-cpu_topology.patch b/queue-3.9/arm-7742-1-topology-export-cpu_topology.patch new file mode 100644 index 00000000000..a3cbe5a3289 --- /dev/null +++ b/queue-3.9/arm-7742-1-topology-export-cpu_topology.patch @@ -0,0 +1,47 @@ +From 92bdd3f5eba299b33c2f4407977d6fa2e2a6a0da Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Fri, 31 May 2013 22:49:22 +0100 +Subject: ARM: 7742/1: topology: export cpu_topology + +From: Arnd Bergmann + +commit 92bdd3f5eba299b33c2f4407977d6fa2e2a6a0da upstream. + +The cpu_topology symbol is required by any driver using the topology +interfaces, which leads to a couple of build errors: + +ERROR: "cpu_topology" [drivers/net/ethernet/sfc/sfc.ko] undefined! +ERROR: "cpu_topology" [drivers/cpufreq/arm_big_little.ko] undefined! +ERROR: "cpu_topology" [drivers/block/mtip32xx/mtip32xx.ko] undefined! + +The obvious solution is to export this symbol. + +Signed-off-by: Arnd Bergmann +Acked-by: Will Deacon +Cc: Nicolas Pitre +Cc: Vincent Guittot +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/kernel/topology.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/arch/arm/kernel/topology.c ++++ b/arch/arm/kernel/topology.c +@@ -13,6 +13,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -200,6 +201,7 @@ static inline void update_cpu_power(unsi + * cpu topology table + */ + struct cputopo_arm cpu_topology[NR_CPUS]; ++EXPORT_SYMBOL_GPL(cpu_topology); + + const struct cpumask *cpu_coregroup_mask(int cpu) + { diff --git a/queue-3.9/arm-7743-1-compressed-head.s-work-around-new-binutils-warning.patch b/queue-3.9/arm-7743-1-compressed-head.s-work-around-new-binutils-warning.patch new file mode 100644 index 00000000000..7e15c751640 --- /dev/null +++ b/queue-3.9/arm-7743-1-compressed-head.s-work-around-new-binutils-warning.patch @@ -0,0 +1,101 @@ +From da94a829305f1c217cfdf6771cb1faca0917e3b9 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Fri, 31 May 2013 22:50:47 +0100 +Subject: ARM: 7743/1: compressed/head.S: work around new binutils warning + +From: Arnd Bergmann + +commit da94a829305f1c217cfdf6771cb1faca0917e3b9 upstream. + +In August 2012, Matthew Gretton-Dann checked a change into binutils +labelled "Error on obsolete & warn on deprecated registers", apparently as +part of ARMv8 support. Apparently, this was supposed to emit the message +"Warning: This coprocessor register access is deprecated in ARMv8" when +using certain mcr/mrc instructions and building for ARMv8. Unfortunately, +the message that is actually emitted appears to be '(null)', which is +less helpful in comparison. + +Even more unfortunately, this is biting us on every single kernel +build with a new gas, because arch/arm/boot/compressed/head.S and some +other files in that directory are built with -march=all since kernel +commit 80cec14a8 "[ARM] Add -march=all to assembly file build in +arch/arm/boot/compressed" back in v2.6.28. + +This patch reverts Russell's nice solution and instead marks the head.S +file to be built for armv7-a, which fortunately lets us build all +instructions in that file without warnings even on the broken binutils. + +Without this patch, building anything results in: + +arch/arm/boot/compressed/head.S: Assembler messages: +arch/arm/boot/compressed/head.S:565: Warning: (null) +arch/arm/boot/compressed/head.S:676: Warning: (null) +arch/arm/boot/compressed/head.S:698: Warning: (null) +arch/arm/boot/compressed/head.S:722: Warning: (null) +arch/arm/boot/compressed/head.S:726: Warning: (null) +arch/arm/boot/compressed/head.S:957: Warning: (null) +arch/arm/boot/compressed/head.S:996: Warning: (null) +arch/arm/boot/compressed/head.S:997: Warning: (null) +arch/arm/boot/compressed/head.S:1027: Warning: (null) +arch/arm/boot/compressed/head.S:1035: Warning: (null) +arch/arm/boot/compressed/head.S:1046: Warning: (null) +arch/arm/boot/compressed/head.S:1060: Warning: (null) +arch/arm/boot/compressed/head.S:1092: Warning: (null) +arch/arm/boot/compressed/head.S:1094: Warning: (null) +arch/arm/boot/compressed/head.S:1095: Warning: (null) +arch/arm/boot/compressed/head.S:1102: Warning: (null) +arch/arm/boot/compressed/head.S:1134: Warning: (null) + +Signed-off-by: Arnd Bergmann +Cc: Matthew Gretton-Dann +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/boot/compressed/Makefile | 2 +- + arch/arm/boot/compressed/head-sa1100.S | 1 + + arch/arm/boot/compressed/head-shark.S | 1 + + arch/arm/boot/compressed/head.S | 1 + + 4 files changed, 4 insertions(+), 1 deletion(-) + +--- a/arch/arm/boot/compressed/Makefile ++++ b/arch/arm/boot/compressed/Makefile +@@ -121,7 +121,7 @@ KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CF + endif + + ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj) +-asflags-y := -Wa,-march=all -DZIMAGE ++asflags-y := -DZIMAGE + + # Supply kernel BSS size to the decompressor via a linker symbol. + KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \ +--- a/arch/arm/boot/compressed/head-sa1100.S ++++ b/arch/arm/boot/compressed/head-sa1100.S +@@ -11,6 +11,7 @@ + #include + + .section ".start", "ax" ++ .arch armv4 + + __SA1100_start: + +--- a/arch/arm/boot/compressed/head-shark.S ++++ b/arch/arm/boot/compressed/head-shark.S +@@ -18,6 +18,7 @@ + + .section ".start", "ax" + ++ .arch armv4 + b __beginning + + __ofw_data: .long 0 @ the number of memory blocks +--- a/arch/arm/boot/compressed/head.S ++++ b/arch/arm/boot/compressed/head.S +@@ -11,6 +11,7 @@ + #include + #include + ++ .arch armv7-a + /* + * Debugging stuff + * diff --git a/queue-3.9/arm-7747-1-pcpu-ensure-__my_cpu_offset-cannot-be-re-ordered-across-barrier.patch b/queue-3.9/arm-7747-1-pcpu-ensure-__my_cpu_offset-cannot-be-re-ordered-across-barrier.patch new file mode 100644 index 00000000000..d1c09a1916d --- /dev/null +++ b/queue-3.9/arm-7747-1-pcpu-ensure-__my_cpu_offset-cannot-be-re-ordered-across-barrier.patch @@ -0,0 +1,54 @@ +From 509eb76ebf9771abc9fe51859382df2571f11447 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Wed, 5 Jun 2013 11:20:33 +0100 +Subject: ARM: 7747/1: pcpu: ensure __my_cpu_offset cannot be re-ordered across barrier() + +From: Will Deacon + +commit 509eb76ebf9771abc9fe51859382df2571f11447 upstream. + +__my_cpu_offset is non-volatile, since we want its value to be cached +when we access several per-cpu variables in a row with preemption +disabled. This means that we rely on preempt_{en,dis}able to hazard +with the operation via the barrier() macro, so that we can't end up +migrating CPUs without reloading the per-cpu offset. + +Unfortunately, GCC doesn't treat a "memory" clobber on a non-volatile +asm block as a side-effect, and will happily re-order it before other +memory clobbers (including those in prempt_disable()) and cache the +value. This has been observed to break the cmpxchg logic in the slub +allocator, leading to livelock in kmem_cache_alloc in mainline kernels. + +This patch adds a dummy memory input operand to __my_cpu_offset, +forcing it to be ordered with respect to the barrier() macro. + +Reviewed-by: Nicolas Pitre +Cc: Rob Herring +Signed-off-by: Will Deacon +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/include/asm/percpu.h | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +--- a/arch/arm/include/asm/percpu.h ++++ b/arch/arm/include/asm/percpu.h +@@ -30,8 +30,15 @@ static inline void set_my_cpu_offset(uns + static inline unsigned long __my_cpu_offset(void) + { + unsigned long off; +- /* Read TPIDRPRW */ +- asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : : "memory"); ++ register unsigned long *sp asm ("sp"); ++ ++ /* ++ * Read TPIDRPRW. ++ * We want to allow caching the value, so avoid using volatile and ++ * instead use a fake stack read to hazard against barrier(). ++ */ ++ asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : "Q" (*sp)); ++ + return off; + } + #define __my_cpu_offset __my_cpu_offset() diff --git a/queue-3.9/arm-kirkwood-ts219-fix-crash-by-double-pcie-instantiation.patch b/queue-3.9/arm-kirkwood-ts219-fix-crash-by-double-pcie-instantiation.patch new file mode 100644 index 00000000000..897bf17c254 --- /dev/null +++ b/queue-3.9/arm-kirkwood-ts219-fix-crash-by-double-pcie-instantiation.patch @@ -0,0 +1,47 @@ +From e89b4058096569c999fa599370162022a5a2b3d2 Mon Sep 17 00:00:00 2001 +From: Andrew Lunn +Date: Tue, 21 May 2013 19:41:48 +0200 +Subject: ARM: Kirkwood: TS219: Fix crash by double PCIe instantiation + +From: Andrew Lunn + +commit e89b4058096569c999fa599370162022a5a2b3d2 upstream. + +When creating the DT based boards-ts219.c the none DT ts219-setup.c +was used as a template. This includes a lateinit() call to initialize +the PCIe bus. The code makes use of machine_is_ts219() which is never +true on DT, so a FIXME was added and the code left as is. This was +unproblematic until b73690c8f8b5d: "ARM: Kirkwood: Support basic +hotplug for PCI-E" which changes the way the PCIe bus is +initialized. The non-DT ts219-setup.c now crashes during boot. The +lateinit() call in the DT boards-ts219.c is being called, +machine_is_ts219() is true and so the PCIe is initialized a second +time. + +This patch removes the useless, and now clearly dangerous, code from +boards-ts219.c, making ts219-setup.c work again. + +Signed-off-by: Andrew Lunn +Signed-off-by: Jason Cooper +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/mach-kirkwood/board-ts219.c | 10 ---------- + 1 file changed, 10 deletions(-) + +--- a/arch/arm/mach-kirkwood/board-ts219.c ++++ b/arch/arm/mach-kirkwood/board-ts219.c +@@ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void) + + pm_power_off = qnap_tsx1x_power_off; + } +- +-/* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ +-static int __init ts219_pci_init(void) +-{ +- if (machine_is_ts219()) +- kirkwood_pcie_init(KW_PCIE0); +- +- return 0; +-} +-subsys_initcall(ts219_pci_init); diff --git a/queue-3.9/dmaengine-ste_dma40-fix-pm-runtime-ref-counting.patch b/queue-3.9/dmaengine-ste_dma40-fix-pm-runtime-ref-counting.patch new file mode 100644 index 00000000000..2c04305c59d --- /dev/null +++ b/queue-3.9/dmaengine-ste_dma40-fix-pm-runtime-ref-counting.patch @@ -0,0 +1,40 @@ +From 9ecb41bd8cf002fd8f3e063db4df81647ddd623c Mon Sep 17 00:00:00 2001 +From: Rabin Vincent +Date: Mon, 27 May 2013 16:03:40 +0200 +Subject: dmaengine: ste_dma40: fix pm runtime ref counting + +From: Rabin Vincent + +commit 9ecb41bd8cf002fd8f3e063db4df81647ddd623c upstream. + +The pm runtime reference counting of the driver is broken for the case +when there is more than one transfer queued, leading to the device being +runtime suspend while active. Fix it. + +Signed-off-by: Rabin Vincent +Acked-by: Linus Walleij +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/dma/ste_dma40.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/drivers/dma/ste_dma40.c ++++ b/drivers/dma/ste_dma40.c +@@ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_cha + return; + } + +- if (d40_queue_start(d40c) == NULL) ++ if (d40_queue_start(d40c) == NULL) { + d40c->busy = false; +- pm_runtime_mark_last_busy(d40c->base->dev); +- pm_runtime_put_autosuspend(d40c->base->dev); ++ ++ pm_runtime_mark_last_busy(d40c->base->dev); ++ pm_runtime_put_autosuspend(d40c->base->dev); ++ } + + d40_desc_remove(d40d); + d40_desc_done(d40c, d40d); diff --git a/queue-3.9/drm-radeon-don-t-allow-audio-on-dce6.patch b/queue-3.9/drm-radeon-don-t-allow-audio-on-dce6.patch new file mode 100644 index 00000000000..4c2e0c64cd3 --- /dev/null +++ b/queue-3.9/drm-radeon-don-t-allow-audio-on-dce6.patch @@ -0,0 +1,60 @@ +From 1cbcca302a318499f20a512847c5d6a510c08c35 Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Mon, 3 Jun 2013 10:32:40 -0400 +Subject: drm/radeon: don't allow audio on DCE6 + +From: Alex Deucher + +commit 1cbcca302a318499f20a512847c5d6a510c08c35 upstream. + +It's not supported yet. Fixes display issues when +users force it on. + +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/atombios_encoders.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/radeon/atombios_encoders.c ++++ b/drivers/gpu/drm/radeon/atombios_encoders.c +@@ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encode + int + atombios_get_encoder_mode(struct drm_encoder *encoder) + { ++ struct drm_device *dev = encoder->dev; ++ struct radeon_device *rdev = dev->dev_private; + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); + struct drm_connector *connector; + struct radeon_connector *radeon_connector; +@@ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_enc + case DRM_MODE_CONNECTOR_DVII: + case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ + if (drm_detect_hdmi_monitor(radeon_connector->edid) && +- radeon_audio) ++ radeon_audio && ++ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ + return ATOM_ENCODER_MODE_HDMI; + else if (radeon_connector->use_digital) + return ATOM_ENCODER_MODE_DVI; +@@ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_enc + case DRM_MODE_CONNECTOR_HDMIA: + default: + if (drm_detect_hdmi_monitor(radeon_connector->edid) && +- radeon_audio) ++ radeon_audio && ++ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ + return ATOM_ENCODER_MODE_HDMI; + else + return ATOM_ENCODER_MODE_DVI; +@@ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_enc + (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) + return ATOM_ENCODER_MODE_DP; + else if (drm_detect_hdmi_monitor(radeon_connector->edid) && +- radeon_audio) ++ radeon_audio && ++ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ + return ATOM_ENCODER_MODE_HDMI; + else + return ATOM_ENCODER_MODE_DVI; diff --git a/queue-3.9/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch b/queue-3.9/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch new file mode 100644 index 00000000000..772942200fb --- /dev/null +++ b/queue-3.9/powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch @@ -0,0 +1,59 @@ +From b8b3de224f194005ad87ede6fd022fcc2bef3b1a Mon Sep 17 00:00:00 2001 +From: Gavin Shan +Date: Wed, 5 Jun 2013 14:25:50 +0000 +Subject: powerpc/eeh: Don't check RTAS token to get PE addr + +From: Gavin Shan + +commit b8b3de224f194005ad87ede6fd022fcc2bef3b1a upstream. + +RTAS token "ibm,get-config-addr-info" or ibm,get-config-addr-info2" +are used to retrieve the PE address according to PCI address, which +made up of domain/bus/slot/function. If we don't have those 2 tokens, +the domain/bus/slot/function would be used as the address for EEH +RTAS operations. Some older f/w might not have those 2 tokens and +that blocks the EEH functionality to be initialized. It was introduced +by commit e2af155c ("powerpc/eeh: pseries platform EEH initialization"). + +The patch skips the check on those 2 tokens so we can bring up EEH +functionality successfully. And domain/bus/slot/function will be +used as address for EEH RTAS operations. + +Reported-by: Robert Knight +Signed-off-by: Gavin Shan +Tested-by: Robert Knight +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/platforms/pseries/eeh_pseries.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +--- a/arch/powerpc/platforms/pseries/eeh_pseries.c ++++ b/arch/powerpc/platforms/pseries/eeh_pseries.c +@@ -83,7 +83,11 @@ static int pseries_eeh_init(void) + ibm_configure_pe = rtas_token("ibm,configure-pe"); + ibm_configure_bridge = rtas_token("ibm,configure-bridge"); + +- /* necessary sanity check */ ++ /* ++ * Necessary sanity check. We needn't check "get-config-addr-info" ++ * and its variant since the old firmware probably support address ++ * of domain/bus/slot/function for EEH RTAS operations. ++ */ + if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) { + pr_warning("%s: RTAS service invalid\n", + __func__); +@@ -102,12 +106,6 @@ static int pseries_eeh_init(void) + pr_warning("%s: RTAS service invalid\n", + __func__); + return -EINVAL; +- } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE && +- ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) { +- pr_warning("%s: RTAS service and " +- " invalid\n", +- __func__); +- return -EINVAL; + } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE && + ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) { + pr_warning("%s: RTAS service and " diff --git a/queue-3.9/powerpc-hw_breakpoints-add-dabrx-cpu-feature-to-fix-32-bit-regression.patch b/queue-3.9/powerpc-hw_breakpoints-add-dabrx-cpu-feature-to-fix-32-bit-regression.patch new file mode 100644 index 00000000000..1e7f5e02861 --- /dev/null +++ b/queue-3.9/powerpc-hw_breakpoints-add-dabrx-cpu-feature-to-fix-32-bit-regression.patch @@ -0,0 +1,108 @@ +From 82a9f16adc12f51c3f8ea59a7c3c120241aff836 Mon Sep 17 00:00:00 2001 +From: Michael Neuling +Date: Thu, 16 May 2013 20:27:31 +0000 +Subject: powerpc/hw_breakpoints: Add DABRX cpu feature to fix 32-bit regression + +From: Michael Neuling + +commit 82a9f16adc12f51c3f8ea59a7c3c120241aff836 upstream. + +When introducing support for DABRX in 4474ef0, we broke older 32-bit CPUs +that don't have that register. + +Some CPUs have a DABR but not DABRX. Configuration are: +- No 32bit CPUs have DABRX but some have DABR. +- POWER4+ and below have the DABR but no DABRX. +- 970 and POWER5 and above have DABR and DABRX. +- POWER8 has DAWR, hence no DABRX. + +This introduces CPU_FTR_DABRX and sets it on appropriate CPUs. We use +the top 64 bits for CPU FTR bits since only 64 bit CPUs have this. + +Processors that don't have the DABRX will still work as they will fall +back to software filtering these breakpoints via perf_exclude_event(). + +Signed-off-by: Michael Neuling +Reported-by: "Gorelik, Jacob (335F)" +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/include/asm/cputable.h | 17 ++++++++++------- + arch/powerpc/kernel/process.c | 3 ++- + 2 files changed, 12 insertions(+), 8 deletions(-) + +--- a/arch/powerpc/include/asm/cputable.h ++++ b/arch/powerpc/include/asm/cputable.h +@@ -175,6 +175,7 @@ extern const char *powerpc_base_platform + #define CPU_FTR_BCTAR LONG_ASM_CONST(0x0100000000000000) + #define CPU_FTR_HAS_PPR LONG_ASM_CONST(0x0200000000000000) + #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) ++#define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000) + + #ifndef __ASSEMBLY__ + +@@ -391,19 +392,20 @@ extern const char *powerpc_base_platform + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_201 | \ + CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA | \ + CPU_FTR_CP_USE_DCBTZ | CPU_FTR_STCX_CHECKS_ADDRESS | \ +- CPU_FTR_HVMODE) ++ CPU_FTR_HVMODE | CPU_FTR_DABRX) + #define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ + CPU_FTR_MMCRA | CPU_FTR_SMT | \ + CPU_FTR_COHERENT_ICACHE | CPU_FTR_PURR | \ +- CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB) ++ CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_DABRX) + #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ + CPU_FTR_MMCRA | CPU_FTR_SMT | \ + CPU_FTR_COHERENT_ICACHE | \ + CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ + CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ +- CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR) ++ CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR | \ ++ CPU_FTR_DABRX) + #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ + CPU_FTR_MMCRA | CPU_FTR_SMT | \ +@@ -412,7 +414,7 @@ extern const char *powerpc_base_platform + CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ + CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ + CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | \ +- CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR) ++ CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX) + #define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ + CPU_FTR_MMCRA | CPU_FTR_SMT | \ +@@ -427,14 +429,15 @@ extern const char *powerpc_base_platform + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ + CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ + CPU_FTR_PAUSE_ZERO | CPU_FTR_CELL_TB_BUG | CPU_FTR_CP_USE_DCBTZ | \ +- CPU_FTR_UNALIGNED_LD_STD) ++ CPU_FTR_UNALIGNED_LD_STD | CPU_FTR_DABRX) + #define CPU_FTRS_PA6T (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ + CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | \ +- CPU_FTR_PURR | CPU_FTR_REAL_LE) ++ CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_DABRX) + #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) + + #define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \ +- CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | CPU_FTR_ICSWX) ++ CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | \ ++ CPU_FTR_ICSWX | CPU_FTR_DABRX ) + + #ifdef __powerpc64__ + #ifdef CONFIG_PPC_BOOK3E +--- a/arch/powerpc/kernel/process.c ++++ b/arch/powerpc/kernel/process.c +@@ -392,7 +392,8 @@ static inline int __set_dabr(unsigned lo + static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) + { + mtspr(SPRN_DABR, dabr); +- mtspr(SPRN_DABRX, dabrx); ++ if (cpu_has_feature(CPU_FTR_DABRX)) ++ mtspr(SPRN_DABRX, dabrx); + return 0; + } + #else diff --git a/queue-3.9/powerpc-perf-fix-deadlock-caused-by-calling-printk-in-pmu-exception.patch b/queue-3.9/powerpc-perf-fix-deadlock-caused-by-calling-printk-in-pmu-exception.patch new file mode 100644 index 00000000000..6a0d92e1c3f --- /dev/null +++ b/queue-3.9/powerpc-perf-fix-deadlock-caused-by-calling-printk-in-pmu-exception.patch @@ -0,0 +1,55 @@ +From 6772faa1ba22eba18d087c2459030a683b65be57 Mon Sep 17 00:00:00 2001 +From: Michael Ellerman +Date: Wed, 5 Jun 2013 17:58:20 +0000 +Subject: powerpc/perf: Fix deadlock caused by calling printk() in PMU exception + +From: Michael Ellerman + +commit 6772faa1ba22eba18d087c2459030a683b65be57 upstream. + +In commit bc09c21 "Fix finding overflowed PMC in interrupt" we added +a printk() to the PMU exception handler. Unfortunately that is not safe. + +The problem is that the PMU exception may run even when interrupts are +soft disabled, aka NMI context. We do this so that we can profile parts +of the kernel that have interrupts soft-disabled. + +But by calling printk() from the exception handler, we can potentially +deadlock in the printk code on logbuf_lock, eg: + + [c00000038ba575c0] c000000000081928 .vprintk_emit+0xa8/0x540 + [c00000038ba576a0] c0000000007bcde8 .printk+0x48/0x58 + [c00000038ba57710] c000000000076504 .perf_event_interrupt+0x2d4/0x490 + [c00000038ba57810] c00000000001f6f8 .performance_monitor_exception+0x48/0x60 + [c00000038ba57880] c0000000000032cc performance_monitor_common+0x14c/0x180 + --- Exception: f01 (Performance Monitor) at c0000000007b25d4 ._raw_spin_lock_irq + +0x64/0xc0 + [c00000038ba57bf0] c00000000007ed90 .devkmsg_read+0xd0/0x5a0 + [c00000038ba57d00] c0000000001c2934 .vfs_read+0xc4/0x1e0 + [c00000038ba57d90] c0000000001c2cd8 .SyS_read+0x58/0xd0 + [c00000038ba57e30] c000000000009d54 syscall_exit+0x0/0x98 + --- Exception: c01 (System Call) at 00001fffffbf6f7c + SP (3ffff6d4de10) is in userspace + +Fix it by making sure we only call printk() when we are not in NMI +context. + +Signed-off-by: Michael Ellerman +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/perf/core-book3s.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/powerpc/perf/core-book3s.c ++++ b/arch/powerpc/perf/core-book3s.c +@@ -1528,7 +1528,7 @@ static void perf_event_interrupt(struct + } + } + } +- if ((!found) && printk_ratelimit()) ++ if (!found && !nmi && printk_ratelimit()) + printk(KERN_WARNING "Can't find PMC that caused IRQ\n"); + + /* diff --git a/queue-3.9/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch b/queue-3.9/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch new file mode 100644 index 00000000000..8029e01f614 --- /dev/null +++ b/queue-3.9/radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch @@ -0,0 +1,395 @@ +From e49f3959a96dc279860af7e86e6dbcfda50580a5 Mon Sep 17 00:00:00 2001 +From: Adis Hamzić +Date: Sun, 2 Jun 2013 16:47:54 +0200 +Subject: radeon: Fix system hang issue when using KMS with older cards + +From: Adis Hamzić + +commit e49f3959a96dc279860af7e86e6dbcfda50580a5 upstream. + +The current radeon driver initialization routines, when using KMS, are written +so that the IRQ installation routine is called before initializing the WB buffer +and the CP rings. With some ASICs, though, the IRQ routine tries to access the +GFX_INDEX ring causing a call to RREG32 with the value of -1 in +radeon_fence_read. This, in turn causes the system to completely hang with some +cards, requiring a hard reset. + +A call stack that can cause such a hang looks like this (using rv515 ASIC for the +example here): + * rv515_init (rv515.c) + * radeon_irq_kms_init (radeon_irq_kms.c) + * drm_irq_install (drm_irq.c) + * radeon_driver_irq_preinstall_kms (radeon_irq_kms.c) + * rs600_irq_process (rs600.c) + * radeon_fence_process - due to SW interrupt (radeon_fence.c) + * radeon_fence_read (radeon_fence.c) + * hang due to RREG32(-1) + +The patch moves the IRQ installation to the card startup routine, after the ring +has been initialized, but before the IRQ has been set. This fixes the issue, but +requires a check to see if the IRQ is already installed, as is the case in the +system resume codepath. +I have tested the patch on three machines using the rv515, the rv770 and the +evergreen ASIC. They worked without issues. + +This seems to be a known issue and has been reported on several bug tracking +sites by various distributions (see links below). Most of reports recommend +booting the system with KMS disabled and then enabling KMS by reloading the +radeon module. For some reason, this was indeed a usable workaround, however, +UMS is now deprecated and disabled by default. + +Bug reports: +https://bugzilla.redhat.com/show_bug.cgi?id=845745 +https://bugs.launchpad.net/ubuntu/+source/linux/+bug/561789 +https://bbs.archlinux.org/viewtopic.php?id=156964 + +Signed-off-by: Adis Hamzić +Signed-off-by: Alex Deucher + +--- + drivers/gpu/drm/radeon/evergreen.c | 10 ++++++---- + drivers/gpu/drm/radeon/ni.c | 10 ++++++---- + drivers/gpu/drm/radeon/r100.c | 9 ++++++--- + drivers/gpu/drm/radeon/r300.c | 9 ++++++--- + drivers/gpu/drm/radeon/r420.c | 10 ++++++---- + drivers/gpu/drm/radeon/r520.c | 9 ++++++--- + drivers/gpu/drm/radeon/r600.c | 10 ++++++---- + drivers/gpu/drm/radeon/rs400.c | 9 ++++++--- + drivers/gpu/drm/radeon/rs600.c | 9 ++++++--- + drivers/gpu/drm/radeon/rs690.c | 9 ++++++--- + drivers/gpu/drm/radeon/rv515.c | 9 ++++++--- + drivers/gpu/drm/radeon/rv770.c | 10 ++++++---- + drivers/gpu/drm/radeon/si.c | 10 ++++++---- + 13 files changed, 78 insertions(+), 45 deletions(-) + +--- a/drivers/gpu/drm/radeon/evergreen.c ++++ b/drivers/gpu/drm/radeon/evergreen.c +@@ -3728,6 +3728,12 @@ static int evergreen_startup(struct rade + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -3876,10 +3882,6 @@ int evergreen_init(struct radeon_device + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; + r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/ni.c ++++ b/drivers/gpu/drm/radeon/ni.c +@@ -1711,6 +1711,12 @@ static int cayman_startup(struct radeon_ + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -1857,10 +1863,6 @@ int cayman_init(struct radeon_device *rd + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + ring->ring_obj = NULL; + r600_ring_init(rdev, ring, 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/r100.c ++++ b/drivers/gpu/drm/radeon/r100.c +@@ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -4024,9 +4030,6 @@ int r100_init(struct radeon_device *rdev + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/r300.c ++++ b/drivers/gpu/drm/radeon/r300.c +@@ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -1516,9 +1522,6 @@ int r300_init(struct radeon_device *rdev + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/r420.c ++++ b/drivers/gpu/drm/radeon/r420.c +@@ -265,6 +265,12 @@ static int r420_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev + if (r) { + return r; + } +- r = radeon_irq_kms_init(rdev); +- if (r) { +- return r; +- } + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) { +--- a/drivers/gpu/drm/radeon/r520.c ++++ b/drivers/gpu/drm/radeon/r520.c +@@ -194,6 +194,12 @@ static int r520_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -297,9 +303,6 @@ int r520_init(struct radeon_device *rdev + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -2940,6 +2940,12 @@ static int r600_startup(struct radeon_de + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -3094,10 +3100,6 @@ int r600_init(struct radeon_device *rdev + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; + r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/rs400.c ++++ b/drivers/gpu/drm/radeon/rs400.c +@@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r100_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -535,9 +541,6 @@ int rs400_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rs600.c ++++ b/drivers/gpu/drm/radeon/rs600.c +@@ -923,6 +923,12 @@ static int rs600_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -1047,9 +1053,6 @@ int rs600_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rs690.c ++++ b/drivers/gpu/drm/radeon/rs690.c +@@ -628,6 +628,12 @@ static int rs690_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -753,9 +759,6 @@ int rs690_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rv515.c ++++ b/drivers/gpu/drm/radeon/rv515.c +@@ -532,6 +532,12 @@ static int rv515_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + rs600_irq_set(rdev); + rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); + /* 1M ring buffer */ +@@ -662,9 +668,6 @@ int rv515_init(struct radeon_device *rde + r = radeon_fence_driver_init(rdev); + if (r) + return r; +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; + /* Memory manager */ + r = radeon_bo_init(rdev); + if (r) +--- a/drivers/gpu/drm/radeon/rv770.c ++++ b/drivers/gpu/drm/radeon/rv770.c +@@ -1041,6 +1041,12 @@ static int rv770_startup(struct radeon_d + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = r600_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -1180,10 +1186,6 @@ int rv770_init(struct radeon_device *rde + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; + r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); + +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -4374,6 +4374,12 @@ static int si_startup(struct radeon_devi + } + + /* Enable IRQ */ ++ if (!rdev->irq.installed) { ++ r = radeon_irq_kms_init(rdev); ++ if (r) ++ return r; ++ } ++ + r = si_irq_init(rdev); + if (r) { + DRM_ERROR("radeon: IH init failed (%d).\n", r); +@@ -4534,10 +4540,6 @@ int si_init(struct radeon_device *rdev) + if (r) + return r; + +- r = radeon_irq_kms_init(rdev); +- if (r) +- return r; +- + ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; + ring->ring_obj = NULL; + r600_ring_init(rdev, ring, 1024 * 1024); diff --git a/queue-3.9/series b/queue-3.9/series index b27201ad471..62582402a7d 100644 --- a/queue-3.9/series +++ b/queue-3.9/series @@ -35,3 +35,13 @@ alsa-hda-via-disable-broken-dynamic-power-control.patch alsa-hda-via-fix-wrongly-cleared-pins-after-suspend-on.patch alsa-hda-allow-setting-automute-automic-hooks-after-parsing.patch alsa-hda-add-keep_eapd_on-flag-to-generic-parser.patch +arm-kirkwood-ts219-fix-crash-by-double-pcie-instantiation.patch +arm-7742-1-topology-export-cpu_topology.patch +arm-7743-1-compressed-head.s-work-around-new-binutils-warning.patch +arm-7747-1-pcpu-ensure-__my_cpu_offset-cannot-be-re-ordered-across-barrier.patch +powerpc-eeh-don-t-check-rtas-token-to-get-pe-addr.patch +powerpc-hw_breakpoints-add-dabrx-cpu-feature-to-fix-32-bit-regression.patch +powerpc-perf-fix-deadlock-caused-by-calling-printk-in-pmu-exception.patch +dmaengine-ste_dma40-fix-pm-runtime-ref-counting.patch +radeon-fix-system-hang-issue-when-using-kms-with-older-cards.patch +drm-radeon-don-t-allow-audio-on-dce6.patch