--- /dev/null
+From 2a6dcb2b5f3e21592ca8dfa198dcce7bec09b020 Mon Sep 17 00:00:00 2001
+From: James Morse <james.morse@arm.com>
+Date: Tue, 18 Oct 2016 11:27:46 +0100
+Subject: arm64: cpufeature: Schedule enable() calls instead of calling them via IPI
+
+From: James Morse <james.morse@arm.com>
+
+commit 2a6dcb2b5f3e21592ca8dfa198dcce7bec09b020 upstream.
+
+The enable() call for a cpufeature/errata is called using on_each_cpu().
+This issues a cross-call IPI to get the work done. Implicitly, this
+stashes the running PSTATE in SPSR when the CPU receives the IPI, and
+restores it when we return. This means an enable() call can never modify
+PSTATE.
+
+To allow PAN to do this, change the on_each_cpu() call to use
+stop_machine(). This schedules the work on each CPU which allows
+us to modify PSTATE.
+
+This involves changing the protype of all the enable() functions.
+
+enable_cpu_capabilities() is called during boot and enables the feature
+on all online CPUs. This path now uses stop_machine(). CPU features for
+hotplug'd CPUs are enabled by verify_local_cpu_features() which only
+acts on the local CPU, and can already modify the running PSTATE as it
+is called from secondary_start_kernel().
+
+Reported-by: Tony Thompson <anthony.thompson@arm.com>
+Reported-by: Vladimir Murzin <vladimir.murzin@arm.com>
+Signed-off-by: James Morse <james.morse@arm.com>
+Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
+Signed-off-by: Will Deacon <will.deacon@arm.com>
+[Removed enable() hunks for features/errata v4.4. doesn't have. Changed
+ caps->enable arg in enable_cpu_capabilities()]
+Signed-off-by: James Morse <james.morse@arm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm64/include/asm/cpufeature.h | 2 +-
+ arch/arm64/include/asm/processor.h | 2 +-
+ arch/arm64/kernel/cpufeature.c | 10 +++++++++-
+ arch/arm64/mm/fault.c | 3 ++-
+ 4 files changed, 13 insertions(+), 4 deletions(-)
+
+--- a/arch/arm64/include/asm/cpufeature.h
++++ b/arch/arm64/include/asm/cpufeature.h
+@@ -77,7 +77,7 @@ struct arm64_cpu_capabilities {
+ const char *desc;
+ u16 capability;
+ bool (*matches)(const struct arm64_cpu_capabilities *);
+- void (*enable)(void *); /* Called on all active CPUs */
++ int (*enable)(void *); /* Called on all active CPUs */
+ union {
+ struct { /* To be used for erratum handling only */
+ u32 midr_model;
+--- a/arch/arm64/include/asm/processor.h
++++ b/arch/arm64/include/asm/processor.h
+@@ -186,6 +186,6 @@ static inline void spin_lock_prefetch(co
+
+ #endif
+
+-void cpu_enable_pan(void *__unused);
++int cpu_enable_pan(void *__unused);
+
+ #endif /* __ASM_PROCESSOR_H */
+--- a/arch/arm64/kernel/cpufeature.c
++++ b/arch/arm64/kernel/cpufeature.c
+@@ -19,7 +19,9 @@
+ #define pr_fmt(fmt) "CPU features: " fmt
+
+ #include <linux/bsearch.h>
++#include <linux/cpumask.h>
+ #include <linux/sort.h>
++#include <linux/stop_machine.h>
+ #include <linux/types.h>
+ #include <asm/cpu.h>
+ #include <asm/cpufeature.h>
+@@ -764,7 +766,13 @@ static void enable_cpu_capabilities(cons
+
+ for (i = 0; caps[i].desc; i++)
+ if (caps[i].enable && cpus_have_cap(caps[i].capability))
+- on_each_cpu(caps[i].enable, NULL, true);
++ /*
++ * Use stop_machine() as it schedules the work allowing
++ * us to modify PSTATE, instead of on_each_cpu() which
++ * uses an IPI, giving us a PSTATE that disappears when
++ * we return.
++ */
++ stop_machine(caps[i].enable, NULL, cpu_online_mask);
+ }
+
+ #ifdef CONFIG_HOTPLUG_CPU
+--- a/arch/arm64/mm/fault.c
++++ b/arch/arm64/mm/fault.c
+@@ -606,8 +606,9 @@ asmlinkage int __exception do_debug_exce
+ }
+
+ #ifdef CONFIG_ARM64_PAN
+-void cpu_enable_pan(void *__unused)
++int cpu_enable_pan(void *__unused)
+ {
+ config_sctlr_el1(SCTLR_EL1_SPAN, 0);
++ return 0;
+ }
+ #endif /* CONFIG_ARM64_PAN */
--- /dev/null
+From 7209c868600bd8926e37c10b9aae83124ccc1dd8 Mon Sep 17 00:00:00 2001
+From: James Morse <james.morse@arm.com>
+Date: Tue, 18 Oct 2016 11:27:47 +0100
+Subject: arm64: mm: Set PSTATE.PAN from the cpu_enable_pan() call
+
+From: James Morse <james.morse@arm.com>
+
+commit 7209c868600bd8926e37c10b9aae83124ccc1dd8 upstream.
+
+Commit 338d4f49d6f7 ("arm64: kernel: Add support for Privileged Access
+Never") enabled PAN by enabling the 'SPAN' feature-bit in SCTLR_EL1.
+This means the PSTATE.PAN bit won't be set until the next return to the
+kernel from userspace. On a preemptible kernel we may schedule work that
+accesses userspace on a CPU before it has done this.
+
+Now that cpufeature enable() calls are scheduled via stop_machine(), we
+can set PSTATE.PAN from the cpu_enable_pan() call.
+
+Add WARN_ON_ONCE(in_interrupt()) to check the PSTATE value we updated
+is not immediately discarded.
+
+Reported-by: Tony Thompson <anthony.thompson@arm.com>
+Reported-by: Vladimir Murzin <vladimir.murzin@arm.com>
+Signed-off-by: James Morse <james.morse@arm.com>
+[will: fixed typo in comment]
+Signed-off-by: Will Deacon <will.deacon@arm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm64/mm/fault.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/arch/arm64/mm/fault.c
++++ b/arch/arm64/mm/fault.c
+@@ -29,7 +29,9 @@
+ #include <linux/sched.h>
+ #include <linux/highmem.h>
+ #include <linux/perf_event.h>
++#include <linux/preempt.h>
+
++#include <asm/bug.h>
+ #include <asm/cpufeature.h>
+ #include <asm/exception.h>
+ #include <asm/debug-monitors.h>
+@@ -608,7 +610,14 @@ asmlinkage int __exception do_debug_exce
+ #ifdef CONFIG_ARM64_PAN
+ int cpu_enable_pan(void *__unused)
+ {
++ /*
++ * We modify PSTATE. This won't work from irq context as the PSTATE
++ * is discarded once we return from the exception.
++ */
++ WARN_ON_ONCE(in_interrupt());
++
+ config_sctlr_el1(SCTLR_EL1_SPAN, 0);
++ asm(SET_PSTATE_PAN(1));
+ return 0;
+ }
+ #endif /* CONFIG_ARM64_PAN */
--- /dev/null
+From d08544127d9fb4505635e3cb6871fd50a42947bd Mon Sep 17 00:00:00 2001
+From: James Morse <james.morse@arm.com>
+Date: Tue, 18 Oct 2016 11:27:48 +0100
+Subject: arm64: suspend: Reconfigure PSTATE after resume from idle
+
+From: James Morse <james.morse@arm.com>
+
+commit d08544127d9fb4505635e3cb6871fd50a42947bd upstream.
+
+The suspend/resume path in kernel/sleep.S, as used by cpu-idle, does not
+save/restore PSTATE. As a result of this cpufeatures that were detected
+and have bits in PSTATE get lost when we resume from idle.
+
+UAO gets set appropriately on the next context switch. PAN will be
+re-enabled next time we return from user-space, but on a preemptible
+kernel we may run work accessing user space before this point.
+
+Add code to re-enable theses two features in __cpu_suspend_exit().
+We re-use uao_thread_switch() passing current.
+
+Signed-off-by: James Morse <james.morse@arm.com>
+Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Signed-off-by: Will Deacon <will.deacon@arm.com>
+[Removed UAO hooks and commit-message references: this feature is not
+ present in v4.4]
+Signed-off-by: James Morse <james.morse@arm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm64/kernel/suspend.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/arch/arm64/kernel/suspend.c
++++ b/arch/arm64/kernel/suspend.c
+@@ -1,7 +1,9 @@
+ #include <linux/ftrace.h>
+ #include <linux/percpu.h>
+ #include <linux/slab.h>
++#include <asm/alternative.h>
+ #include <asm/cacheflush.h>
++#include <asm/cpufeature.h>
+ #include <asm/debug-monitors.h>
+ #include <asm/pgtable.h>
+ #include <asm/memory.h>
+@@ -111,6 +113,13 @@ int cpu_suspend(unsigned long arg, int (
+ set_my_cpu_offset(per_cpu_offset(smp_processor_id()));
+
+ /*
++ * PSTATE was not saved over suspend/resume, re-enable any
++ * detected features that might not have been set correctly.
++ */
++ asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN,
++ CONFIG_ARM64_PAN));
++
++ /*
+ * Restore HW breakpoint registers to sane values
+ * before debug exceptions are possibly reenabled
+ * through local_dbg_restore.
pci-set-read-completion-boundary-to-128-iff-root-port-supports-it-_hpx.patch
mwifiex-printk-overflow-with-32-byte-ssids.patch
pwm-fix-device-reference-leak.patch
+arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch
+arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch
+arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch