[GIT PULL] arm64 updates for 4.4

From: Catalin Marinas
Date: Wed Nov 04 2015 - 13:50:00 EST


Hi Linus,

These are the main arm64 updates for 4.4. There are a few more conflicts
than usual caused by some reworking under arch/arm64 (the CPU feature
detection, EFI_STUB, relaxed atomics) and an arm64 fix that went in
during 4.3-rc7 and which I haven't pulled into the upstream branch for
arm64. The more complicated fix-up is in arch/arm64/kernel/cpufeature.c
where irqchip/GICv3 changes merged via tip are conflicting with the
arm64 CPU feature detection.

I included the conflict resolution (only the conflicting hunks) and the
end of this email. Please let me know if there are any issues.

The diffstat contains some kernel/irq/ changes that have been pulled
form tip/irq/for-arm as explained in the tag text.

Thanks.


The following changes since commit 049e6dde7e57f0054fdc49102e7ef4830c698b46:

Linux 4.3-rc4 (2015-10-04 16:57:17 +0100)

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux tags/arm64-upstream

for you to fetch changes up to f8f8bdc48851da979c6e0e4808b6031122e4af47:

arm64/efi: fix libstub build under CONFIG_MODVERSIONS (2015-11-02 13:50:17 +0000)

----------------------------------------------------------------
arm64 updates for 4.4:

- "genirq: Introduce generic irq migration for cpu hotunplugged" patch
merged from tip/irq/for-arm to allow the arm64-specific part to be
upstreamed via the arm64 tree

- CPU feature detection reworked to cope with heterogeneous systems
where CPUs may not have exactly the same features. The features
reported by the kernel via internal data structures or ELF_HWCAP are
delayed until all the CPUs are up (and before user space starts)

- Support for 16KB pages, with the additional bonus of a 36-bit VA
space, though the latter only depending on EXPERT

- Implement native {relaxed, acquire, release} atomics for arm64

- New ASID allocation algorithm which avoids IPI on roll-over, together
with TLB invalidation optimisations (using local vs global where
feasible)

- KASan support for arm64

- EFI_STUB clean-up and isolation for the kernel proper (required by
KASan)

- copy_{to,from,in}_user optimisations (sharing the memcpy template)

- perf: moving arm64 to the arm32/64 shared PMU framework

- L1_CACHE_BYTES increased to 128 to accommodate Cavium hardware

- Support for the contiguous PTE hint on kernel mapping (16 consecutive
entries may be able to use a single TLB entry)

- Generic CONFIG_HZ now used on arm64

- defconfig updates

----------------------------------------------------------------
Alexander Kuleshov (1):
arm64/mm: use PAGE_ALIGNED instead of IS_ALIGNED

Alim Akhtar (1):
arm64: defconfig: Enable samsung serial and mmc

Andrey Ryabinin (4):
arm64: introduce VA_START macro - the first kernel virtual address.
arm64: move PGD_SIZE definition to pgalloc.h
arm64: add KASAN support
Documentation/features/KASAN: arm64 supports KASAN now

Ard Biesheuvel (7):
arm64/efi: remove /chosen/linux, uefi-stub-kern-ver DT property
arm64: use ENDPIPROC() to annotate position independent assembler routines
arm64/efi: isolate EFI stub from the kernel proper
arm64: Add page size to the kernel image header
arm64: remove bogus TASK_SIZE_64 check
arm64/efi: move arm64 specific stub C code to libstub
arm64/efi: fix libstub build under CONFIG_MODVERSIONS

Catalin Marinas (6):
Merge branch 'irq/for-arm' of git://git.kernel.org/.../tip/tip
arm64: Fix missing #include in hw_breakpoint.c
Revert "arm64: ioremap: add ioremap_cache macro"
arm64: Minor coding style fixes for kc_offset_to_vaddr and kc_vaddr_to_offset
arm64: Make 36-bit VA depend on EXPERT
Merge branch 'irq/for-arm' of git://git.kernel.org/.../tip/tip

Dave Martin (1):
arm64: Constify hwcap name string arrays

Dietmar Eggemann (1):
ARM64: Enable multi-core scheduler support by default

Feng Kan (2):
arm64: Change memcpy in kernel to use the copy template file
arm64: copy_to-from-in_user optimization using copy template

Jeremy Linton (6):
arm64: Add contiguous page flag shifts and constants
arm64: PTE/PMD contiguous bit definition
arm64: Macros to check/set/unset the contiguous bit
arm64: Default kernel pages should be contiguous
arm64: Make the kernel page dump utility aware of the CONT bit
arm64: Mark kernel page ranges contiguous

Jisheng Zhang (1):
arm64: add cpu_idle tracepoints to arch_cpu_idle

Jungseok Lee (1):
arm64: Synchronise dump_backtrace() with perf callchain

Kefeng Wang (1):
arm64: make Timer Interrupt Frequency selectable

Linus Walleij (1):
ARM64: kasan: print memory assignment

Mark Rutland (8):
arm64: perf: move to shared arm_pmu framework
arm64: perf: add Cortex-A53 support
arm64: perf: add Cortex-A57 support
arm64: dts: juno: describe PMUs separately
MAINTAINERS: update ARM PMU profiling and debugging for arm64
MAINTAINERS: add myself as arm perf reviewer
arm64: Simplify NR_FIX_BTMAPS calculation
arm64: page-align sections for DEBUG_RODATA

Mark Salyzyn (1):
arm64: AArch32 user space PC alignment exception

Robin Murphy (2):
arm64: Fix compat register mappings
arm64: Fix build with CONFIG_ZONE_DMA=n

Suzuki K. Poulose (28):
arm64: Move swapper pagetable definitions
arm64: Handle section maps for swapper/idmap
arm64: Introduce helpers for page table levels
arm64: Calculate size for idmap_pg_dir at compile time
arm64: Handle 4 level page table for swapper
arm64: Clean config usages for page size
arm64: Kconfig: Fix help text about AArch32 support with 64K pages
arm64: Check for selected granule support
arm64: Add 16K page size support
arm64: 36 bit VA
arm64: Make the CPU information more clear
arm64: Delay ELF HWCAP initialisation until all CPUs are up
arm64: Delay cpuinfo_store_boot_cpu
arm64: Move cpu feature detection code
arm64: Move mixed endian support detection
arm64: Move /proc/cpuinfo handling code
arm64: Handle width of a cpuid feature
arm64: Keep track of CPU feature registers
arm64: Consolidate CPU Sanity check to CPU Feature infrastructure
arm64: Read system wide CPUID value
arm64: Cleanup mixed endian support detection
arm64: Refactor check_cpu_capabilities
arm64: Delay cpu feature capability checks
arm64/capabilities: Make use of system wide safe value
arm64/HWCAP: Use system wide safe values
arm64: Move FP/ASIMD hwcap handling to common code
arm64/debug: Make use of the system wide safe value
arm64/kvm: Make use of the system wide safe values

Thomas Gleixner (1):
genirq: Make the cpuhotplug migration code less noisy

Tirumalesh Chalamarla (1):
arm64: Increase the max granular size

Will Deacon (15):
arm64: mm: remove unused cpu_set_idmap_tcr_t0sz function
arm64: proc: de-scope TLBI operation during cold boot
arm64: flush: use local TLB and I-cache invalidation
arm64: mm: rewrite ASID allocator and MM context-switching code
arm64: tlbflush: remove redundant ASID casts to (unsigned long)
arm64: tlbflush: avoid flushing when fullmm == 1
arm64: switch_mm: simplify mm and CPU checks
arm64: mm: kill mm_cpumask usage
arm64: tlb: remove redundant barrier from __flush_tlb_pgtable
arm64: mm: remove dsb from update_mmu_cache
arm64: hw_breakpoint: use target state to determine ABI behaviour
arm64: atomics: implement native {relaxed, acquire, release} atomics
arm64: kasan: fix issues reported by sparse
arm64: cpufeature: declare enable_cpu_capabilities as static
arm64: cachetype: fix definitions of ICACHEF_* flags

Yang Shi (1):
arm64: debug: Fix typo in debug-monitors.c

Yang Yingliang (1):
arm64: fix a migrating irq bug when hotplug cpu

yalin wang (2):
arm64: ioremap: add ioremap_cache macro
arm64: add kc_offset_to_vaddr and kc_vaddr_to_offset macro

Documentation/arm/uefi.txt | 2 -
Documentation/arm64/booting.txt | 7 +-
Documentation/devicetree/bindings/arm/pmu.txt | 2 +
.../features/debug/KASAN/arch-support.txt | 2 +-
MAINTAINERS | 9 +-
arch/arm64/Kconfig | 69 +-
arch/arm64/Kconfig.debug | 2 +-
arch/arm64/Makefile | 7 +
arch/arm64/boot/dts/arm/juno-r1.dts | 18 +-
arch/arm64/boot/dts/arm/juno.dts | 18 +-
arch/arm64/configs/defconfig | 9 +
arch/arm64/include/asm/assembler.h | 11 +
arch/arm64/include/asm/atomic.h | 63 +-
arch/arm64/include/asm/atomic_ll_sc.h | 98 +-
arch/arm64/include/asm/atomic_lse.h | 193 ++--
arch/arm64/include/asm/cache.h | 2 +-
arch/arm64/include/asm/cacheflush.h | 7 +
arch/arm64/include/asm/cachetype.h | 4 +-
arch/arm64/include/asm/cmpxchg.h | 279 +++--
arch/arm64/include/asm/cpu.h | 4 +
arch/arm64/include/asm/cpufeature.h | 91 +-
arch/arm64/include/asm/cputype.h | 15 -
arch/arm64/include/asm/fixmap.h | 7 +-
arch/arm64/include/asm/hw_breakpoint.h | 9 +-
arch/arm64/include/asm/hwcap.h | 8 +
arch/arm64/include/asm/irq.h | 1 -
arch/arm64/include/asm/kasan.h | 38 +
arch/arm64/include/asm/kernel-pgtable.h | 83 ++
arch/arm64/include/asm/memory.h | 6 +-
arch/arm64/include/asm/mmu.h | 15 +-
arch/arm64/include/asm/mmu_context.h | 113 +--
arch/arm64/include/asm/page.h | 27 +-
arch/arm64/include/asm/pgalloc.h | 1 +
arch/arm64/include/asm/pgtable-hwdef.h | 48 +-
arch/arm64/include/asm/pgtable.h | 30 +-
arch/arm64/include/asm/pmu.h | 83 --
arch/arm64/include/asm/processor.h | 2 +-
arch/arm64/include/asm/ptrace.h | 16 +-
arch/arm64/include/asm/string.h | 16 +
arch/arm64/include/asm/sysreg.h | 157 ++-
arch/arm64/include/asm/thread_info.h | 5 +-
arch/arm64/include/asm/tlb.h | 26 +-
arch/arm64/include/asm/tlbflush.h | 18 +-
arch/arm64/kernel/Makefile | 11 +-
arch/arm64/kernel/arm64ksyms.c | 3 +
arch/arm64/kernel/asm-offsets.c | 2 +-
arch/arm64/kernel/cpu_errata.c | 2 +-
arch/arm64/kernel/cpufeature.c | 851 +++++++++++++++-
arch/arm64/kernel/cpuinfo.c | 254 +++--
arch/arm64/kernel/debug-monitors.c | 8 +-
arch/arm64/kernel/efi-entry.S | 10 +-
arch/arm64/kernel/efi.c | 5 +-
arch/arm64/kernel/entry.S | 2 +
arch/arm64/kernel/fpsimd.c | 16 +-
arch/arm64/kernel/head.S | 76 +-
arch/arm64/kernel/hw_breakpoint.c | 19 +-
arch/arm64/kernel/image.h | 38 +-
arch/arm64/kernel/irq.c | 62 --
arch/arm64/kernel/module.c | 16 +-
arch/arm64/kernel/perf_event.c | 1066 ++++----------------
arch/arm64/kernel/process.c | 3 +
arch/arm64/kernel/setup.c | 245 +----
arch/arm64/kernel/smp.c | 22 +-
arch/arm64/kernel/suspend.c | 2 +-
arch/arm64/kernel/traps.c | 15 +-
arch/arm64/kernel/vmlinux.lds.S | 6 +-
arch/arm64/kvm/Kconfig | 3 +
arch/arm64/kvm/reset.c | 2 +-
arch/arm64/kvm/sys_regs.c | 12 +-
arch/arm64/lib/copy_from_user.S | 78 +-
arch/arm64/lib/copy_in_user.S | 67 +-
arch/arm64/lib/copy_template.S | 193 ++++
arch/arm64/lib/copy_to_user.S | 67 +-
arch/arm64/lib/memchr.S | 2 +-
arch/arm64/lib/memcmp.S | 2 +-
arch/arm64/lib/memcpy.S | 184 +---
arch/arm64/lib/memmove.S | 9 +-
arch/arm64/lib/memset.S | 5 +-
arch/arm64/lib/strcmp.S | 2 +-
arch/arm64/lib/strlen.S | 2 +-
arch/arm64/lib/strncmp.S | 2 +-
arch/arm64/mm/Makefile | 3 +
arch/arm64/mm/cache.S | 10 +-
arch/arm64/mm/context.c | 236 +++--
arch/arm64/mm/dump.c | 18 +-
arch/arm64/mm/fault.c | 2 +-
arch/arm64/mm/init.c | 19 +-
arch/arm64/mm/kasan_init.c | 165 +++
arch/arm64/mm/mmu.c | 145 ++-
arch/arm64/mm/pageattr.c | 2 +-
arch/arm64/mm/pgd.c | 2 -
arch/arm64/mm/proc.S | 10 +-
drivers/firmware/efi/Makefile | 8 +
drivers/firmware/efi/libstub/Makefile | 42 +-
.../firmware/efi/libstub/arm64-stub.c | 0
drivers/firmware/efi/libstub/fdt.c | 9 -
drivers/firmware/efi/libstub/string.c | 57 ++
drivers/perf/Kconfig | 2 +-
include/linux/irq.h | 2 +
kernel/irq/Kconfig | 4 +
kernel/irq/Makefile | 1 +
kernel/irq/cpuhotplug.c | 82 ++
scripts/Makefile.kasan | 4 +-
103 files changed, 3386 insertions(+), 2422 deletions(-)
create mode 100644 arch/arm64/include/asm/kasan.h
create mode 100644 arch/arm64/include/asm/kernel-pgtable.h
delete mode 100644 arch/arm64/include/asm/pmu.h
create mode 100644 arch/arm64/lib/copy_template.S
create mode 100644 arch/arm64/mm/kasan_init.c
rename arch/arm64/kernel/efi-stub.c => drivers/firmware/efi/libstub/arm64-stub.c (100%)
create mode 100644 drivers/firmware/efi/libstub/string.c
create mode 100644 kernel/irq/cpuhotplug.c


Conflict resolution with 66ef3493d4bb387f5a83915e33dc893102fd1b43:

-------------8<-------------------------
diff --cc Documentation/arm/uefi.txt
index 7b3fdfe0f7ba,7f1bed8872f3..000000000000
--- a/Documentation/arm/uefi.txt
+++ b/Documentation/arm/uefi.txt
@@@ -58,5 -58,5 +58,3 @@@ linux,uefi-mmap-desc-size | 32-bit | Si
--------------------------------------------------------------------------------
linux,uefi-mmap-desc-ver | 32-bit | Version of the mmap descriptor format.
--------------------------------------------------------------------------------
- linux,uefi-stub-kern-ver | string | Copy of linux_banner from build.
- --------------------------------------------------------------------------------
-
-For verbose debug messages, specify 'uefi_debug' on the kernel command line.
diff --cc arch/arm64/include/asm/atomic.h
index 1e247ac2601a,5e13ad76a249..000000000000
--- a/arch/arm64/include/asm/atomic.h
+++ b/arch/arm64/include/asm/atomic.h
@@@ -54,8 -54,39 +54,39 @@@
#define ATOMIC_INIT(i) { (i) }

#define atomic_read(v) READ_ONCE((v)->counter)
-#define atomic_set(v, i) (((v)->counter) = (i))
+#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
+
+ #define atomic_add_return_relaxed atomic_add_return_relaxed
+ #define atomic_add_return_acquire atomic_add_return_acquire
+ #define atomic_add_return_release atomic_add_return_release
+ #define atomic_add_return atomic_add_return
+
+ #define atomic_inc_return_relaxed(v) atomic_add_return_relaxed(1, (v))
+ #define atomic_inc_return_acquire(v) atomic_add_return_acquire(1, (v))
+ #define atomic_inc_return_release(v) atomic_add_return_release(1, (v))
+ #define atomic_inc_return(v) atomic_add_return(1, (v))
+
+ #define atomic_sub_return_relaxed atomic_sub_return_relaxed
+ #define atomic_sub_return_acquire atomic_sub_return_acquire
+ #define atomic_sub_return_release atomic_sub_return_release
+ #define atomic_sub_return atomic_sub_return
+
+ #define atomic_dec_return_relaxed(v) atomic_sub_return_relaxed(1, (v))
+ #define atomic_dec_return_acquire(v) atomic_sub_return_acquire(1, (v))
+ #define atomic_dec_return_release(v) atomic_sub_return_release(1, (v))
+ #define atomic_dec_return(v) atomic_sub_return(1, (v))
+
+ #define atomic_xchg_relaxed(v, new) xchg_relaxed(&((v)->counter), (new))
+ #define atomic_xchg_acquire(v, new) xchg_acquire(&((v)->counter), (new))
+ #define atomic_xchg_release(v, new) xchg_release(&((v)->counter), (new))
#define atomic_xchg(v, new) xchg(&((v)->counter), (new))
+
+ #define atomic_cmpxchg_relaxed(v, old, new) \
+ cmpxchg_relaxed(&((v)->counter), (old), (new))
+ #define atomic_cmpxchg_acquire(v, old, new) \
+ cmpxchg_acquire(&((v)->counter), (old), (new))
+ #define atomic_cmpxchg_release(v, old, new) \
+ cmpxchg_release(&((v)->counter), (old), (new))
#define atomic_cmpxchg(v, old, new) cmpxchg(&((v)->counter), (old), (new))

#define atomic_inc(v) atomic_add(1, (v))
diff --cc arch/arm64/kernel/cpufeature.c
index 305f30dc9e63,504526fa8129..000000000000
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@@ -33,41 -586,22 +588,37 @@@
return val >= entry->min_field_value;
}

- #define __ID_FEAT_CHK(reg) \
- static bool __maybe_unused \
- has_##reg##_feature(const struct arm64_cpu_capabilities *entry) \
- { \
- u64 val; \
- \
- val = read_cpuid(reg##_el1); \
- return feature_matches(val, entry); \
- }
+ static bool
+ has_cpuid_feature(const struct arm64_cpu_capabilities *entry)
+ {
+ u64 val;

- __ID_FEAT_CHK(id_aa64pfr0);
- __ID_FEAT_CHK(id_aa64mmfr1);
- __ID_FEAT_CHK(id_aa64isar0);
+ val = read_system_reg(entry->sys_reg);
+ return feature_matches(val, entry);
+ }

+static bool has_useable_gicv3_cpuif(const struct arm64_cpu_capabilities *entry)
+{
+ bool has_sre;
+
- if (!has_id_aa64pfr0_feature(entry))
++ if (!has_cpuid_feature(entry))
+ return false;
+
+ has_sre = gic_enable_sre();
+ if (!has_sre)
+ pr_warn_once("%s present but disabled by higher exception level\n",
+ entry->desc);
+
+ return has_sre;
+}
+
static const struct arm64_cpu_capabilities arm64_features[] = {
{
.desc = "GIC system register CPU interface",
.capability = ARM64_HAS_SYSREG_GIC_CPUIF,
- .matches = has_cpuid_feature,
+ .matches = has_useable_gicv3_cpuif,
- .field_pos = 24,
+ .sys_reg = SYS_ID_AA64PFR0_EL1,
+ .field_pos = ID_AA64PFR0_GIC_SHIFT,
.min_field_value = 1,
},
#ifdef CONFIG_ARM64_PAN
diff --cc arch/arm64/kernel/suspend.c
index 44ca4143b013,3c5e4e6dcf68..000000000000
--- a/arch/arm64/kernel/suspend.c
+++ b/arch/arm64/kernel/suspend.c
@@@ -80,21 -80,17 +80,21 @@@ int cpu_suspend(unsigned long arg, int
if (ret == 0) {
/*
* We are resuming from reset with TTBR0_EL1 set to the
- * idmap to enable the MMU; restore the active_mm mappings in
- * TTBR0_EL1 unless the active_mm == &init_mm, in which case
- * the thread entered cpu_suspend with TTBR0_EL1 set to
- * reserved TTBR0 page tables and should be restored as such.
+ * idmap to enable the MMU; set the TTBR0 to the reserved
+ * page tables to prevent speculative TLB allocations, flush
+ * the local tlb and set the default tcr_el1.t0sz so that
+ * the TTBR0 address space set-up is properly restored.
+ * If the current active_mm != &init_mm we entered cpu_suspend
+ * with mappings in TTBR0 that must be restored, so we switch
+ * them back to complete the address space configuration
+ * restoration before returning.
*/
- if (mm == &init_mm)
- cpu_set_reserved_ttbr0();
- else
- cpu_switch_mm(mm->pgd, mm);
-
+ cpu_set_reserved_ttbr0();
- flush_tlb_all();
+ local_flush_tlb_all();
+ cpu_set_default_tcr_t0sz();
+
+ if (mm != &init_mm)
+ cpu_switch_mm(mm->pgd, mm);

/*
* Restore per-cpu offset before any kernel
-------------8<-------------------------

--
Catalin

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/