You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 updates from Catalin Marinas: - kdump support, including two necessary memblock additions: memblock_clear_nomap() and memblock_cap_memory_range() - ARMv8.3 HWCAP bits for JavaScript conversion instructions, complex numbers and weaker release consistency - arm64 ACPI platform MSI support - arm perf updates: ACPI PMU support, L3 cache PMU in some Qualcomm SoCs, Cortex-A53 L2 cache events and DTLB refills, MAINTAINERS update for DT perf bindings - architected timer errata framework (the arch/arm64 changes only) - support for DMA_ATTR_FORCE_CONTIGUOUS in the arm64 iommu DMA API - arm64 KVM refactoring to use common system register definitions - remove support for ASID-tagged VIVT I-cache (no ARMv8 implementation using it and deprecated in the architecture) together with some I-cache handling clean-up - PE/COFF EFI header clean-up/hardening - define BUG() instruction without CONFIG_BUG * tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (92 commits) arm64: Fix the DMA mmap and get_sgtable API with DMA_ATTR_FORCE_CONTIGUOUS arm64: Print DT machine model in setup_machine_fdt() arm64: pmu: Wire-up Cortex A53 L2 cache events and DTLB refills arm64: module: split core and init PLT sections arm64: pmuv3: handle pmuv3+ arm64: Add CNTFRQ_EL0 trap handler arm64: Silence spurious kbuild warning on menuconfig arm64: pmuv3: use arm_pmu ACPI framework arm64: pmuv3: handle !PMUv3 when probing drivers/perf: arm_pmu: add ACPI framework arm64: add function to get a cpu's MADT GICC table drivers/perf: arm_pmu: split out platform device probe logic drivers/perf: arm_pmu: move irq request/free into probe drivers/perf: arm_pmu: split cpu-local irq request/free drivers/perf: arm_pmu: rename irq request/free functions drivers/perf: arm_pmu: handle no platform_device drivers/perf: arm_pmu: simplify cpu_pmu_request_irqs() drivers/perf: arm_pmu: factor out pmu registration drivers/perf: arm_pmu: fold init into alloc drivers/perf: arm_pmu: define armpmu_init_fn ...
This commit is contained in:
@@ -169,6 +169,18 @@ infrastructure:
|
|||||||
as available on the CPU where it is fetched and is not a system
|
as available on the CPU where it is fetched and is not a system
|
||||||
wide safe value.
|
wide safe value.
|
||||||
|
|
||||||
|
4) ID_AA64ISAR1_EL1 - Instruction set attribute register 1
|
||||||
|
|
||||||
|
x--------------------------------------------------x
|
||||||
|
| Name | bits | visible |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| LRCPC | [23-20] | y |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| FCMA | [19-16] | y |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| JSCVT | [15-12] | y |
|
||||||
|
x--------------------------------------------------x
|
||||||
|
|
||||||
Appendix I: Example
|
Appendix I: Example
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -52,3 +52,48 @@ This property is set (currently only on PowerPC, and only needed on
|
|||||||
book3e) by some versions of kexec-tools to tell the new kernel that it
|
book3e) by some versions of kexec-tools to tell the new kernel that it
|
||||||
is being booted by kexec, as the booting environment may differ (e.g.
|
is being booted by kexec, as the booting environment may differ (e.g.
|
||||||
a different secondary CPU release mechanism)
|
a different secondary CPU release mechanism)
|
||||||
|
|
||||||
|
linux,usable-memory-range
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
This property (arm64 only) holds a base address and size, describing a
|
||||||
|
limited region in which memory may be considered available for use by
|
||||||
|
the kernel. Memory outside of this range is not available for use.
|
||||||
|
|
||||||
|
This property describes a limitation: memory within this range is only
|
||||||
|
valid when also described through another mechanism that the kernel
|
||||||
|
would otherwise use to determine available memory (e.g. memory nodes
|
||||||
|
or the EFI memory map). Valid memory may be sparse within the range.
|
||||||
|
e.g.
|
||||||
|
|
||||||
|
/ {
|
||||||
|
chosen {
|
||||||
|
linux,usable-memory-range = <0x9 0xf0000000 0x0 0x10000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
The main usage is for crash dump kernel to identify its own usable
|
||||||
|
memory and exclude, at its boot time, any other memory areas that are
|
||||||
|
part of the panicked kernel's memory.
|
||||||
|
|
||||||
|
While this property does not represent a real hardware, the address
|
||||||
|
and the size are expressed in #address-cells and #size-cells,
|
||||||
|
respectively, of the root node.
|
||||||
|
|
||||||
|
linux,elfcorehdr
|
||||||
|
----------------
|
||||||
|
|
||||||
|
This property (currently used only on arm64) holds the memory range,
|
||||||
|
the address and the size, of the elf core header which mainly describes
|
||||||
|
the panicked kernel's memory layout as PT_LOAD segments of elf format.
|
||||||
|
e.g.
|
||||||
|
|
||||||
|
/ {
|
||||||
|
chosen {
|
||||||
|
linux,elfcorehdr = <0x9 0xfffff000 0x0 0x800>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
While this property does not represent a real hardware, the address
|
||||||
|
and the size are expressed in #address-cells and #size-cells,
|
||||||
|
respectively, of the root node.
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ memory image to a dump file on the local disk, or across the network to
|
|||||||
a remote system.
|
a remote system.
|
||||||
|
|
||||||
Kdump and kexec are currently supported on the x86, x86_64, ppc64, ia64,
|
Kdump and kexec are currently supported on the x86, x86_64, ppc64, ia64,
|
||||||
s390x and arm architectures.
|
s390x, arm and arm64 architectures.
|
||||||
|
|
||||||
When the system kernel boots, it reserves a small section of memory for
|
When the system kernel boots, it reserves a small section of memory for
|
||||||
the dump-capture kernel. This ensures that ongoing Direct Memory Access
|
the dump-capture kernel. This ensures that ongoing Direct Memory Access
|
||||||
@@ -249,6 +249,13 @@ Dump-capture kernel config options (Arch Dependent, arm)
|
|||||||
|
|
||||||
AUTO_ZRELADDR=y
|
AUTO_ZRELADDR=y
|
||||||
|
|
||||||
|
Dump-capture kernel config options (Arch Dependent, arm64)
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
- Please note that kvm of the dump-capture kernel will not be enabled
|
||||||
|
on non-VHE systems even if it is configured. This is because the CPU
|
||||||
|
will not be reset to EL2 on panic.
|
||||||
|
|
||||||
Extended crashkernel syntax
|
Extended crashkernel syntax
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
@@ -305,6 +312,8 @@ Boot into System Kernel
|
|||||||
kernel will automatically locate the crash kernel image within the
|
kernel will automatically locate the crash kernel image within the
|
||||||
first 512MB of RAM if X is not given.
|
first 512MB of RAM if X is not given.
|
||||||
|
|
||||||
|
On arm64, use "crashkernel=Y[@X]". Note that the start address of
|
||||||
|
the kernel, X if explicitly specified, must be aligned to 2MiB (0x200000).
|
||||||
|
|
||||||
Load the Dump-capture Kernel
|
Load the Dump-capture Kernel
|
||||||
============================
|
============================
|
||||||
@@ -327,6 +336,8 @@ For s390x:
|
|||||||
- Use image or bzImage
|
- Use image or bzImage
|
||||||
For arm:
|
For arm:
|
||||||
- Use zImage
|
- Use zImage
|
||||||
|
For arm64:
|
||||||
|
- Use vmlinux or Image
|
||||||
|
|
||||||
If you are using a uncompressed vmlinux image then use following command
|
If you are using a uncompressed vmlinux image then use following command
|
||||||
to load dump-capture kernel.
|
to load dump-capture kernel.
|
||||||
@@ -370,6 +381,9 @@ For s390x:
|
|||||||
For arm:
|
For arm:
|
||||||
"1 maxcpus=1 reset_devices"
|
"1 maxcpus=1 reset_devices"
|
||||||
|
|
||||||
|
For arm64:
|
||||||
|
"1 maxcpus=1 reset_devices"
|
||||||
|
|
||||||
Notes on loading the dump-capture kernel:
|
Notes on loading the dump-capture kernel:
|
||||||
|
|
||||||
* By default, the ELF headers are stored in ELF64 format to support
|
* By default, the ELF headers are stored in ELF64 format to support
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
Qualcomm Datacenter Technologies L3 Cache Performance Monitoring Unit (PMU)
|
||||||
|
===========================================================================
|
||||||
|
|
||||||
|
This driver supports the L3 cache PMUs found in Qualcomm Datacenter Technologies
|
||||||
|
Centriq SoCs. The L3 cache on these SOCs is composed of multiple slices, shared
|
||||||
|
by all cores within a socket. Each slice is exposed as a separate uncore perf
|
||||||
|
PMU with device name l3cache_<socket>_<instance>. User space is responsible
|
||||||
|
for aggregating across slices.
|
||||||
|
|
||||||
|
The driver provides a description of its available events and configuration
|
||||||
|
options in sysfs, see /sys/devices/l3cache*. Given that these are uncore PMUs
|
||||||
|
the driver also exposes a "cpumask" sysfs attribute which contains a mask
|
||||||
|
consisting of one CPU per socket which will be used to handle all the PMU
|
||||||
|
events on that socket.
|
||||||
|
|
||||||
|
The hardware implements 32bit event counters and has a flat 8bit event space
|
||||||
|
exposed via the "event" format attribute. In addition to the 32bit physical
|
||||||
|
counters the driver supports virtual 64bit hardware counters by using hardware
|
||||||
|
counter chaining. This feature is exposed via the "lc" (long counter) format
|
||||||
|
flag. E.g.:
|
||||||
|
|
||||||
|
perf stat -e l3cache_0_0/read-miss,lc/
|
||||||
|
|
||||||
|
Given that these are uncore PMUs the driver does not support sampling, therefore
|
||||||
|
"perf record" will not work. Per-task perf sessions are not supported.
|
||||||
@@ -983,6 +983,7 @@ F: arch/arm*/include/asm/perf_event.h
|
|||||||
F: drivers/perf/*
|
F: drivers/perf/*
|
||||||
F: include/linux/perf/arm_pmu.h
|
F: include/linux/perf/arm_pmu.h
|
||||||
F: Documentation/devicetree/bindings/arm/pmu.txt
|
F: Documentation/devicetree/bindings/arm/pmu.txt
|
||||||
|
F: Documentation/devicetree/bindings/perf/
|
||||||
|
|
||||||
ARM PORT
|
ARM PORT
|
||||||
M: Russell King <linux@armlinux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
|
|||||||
@@ -736,6 +736,17 @@ config KEXEC
|
|||||||
but it is independent of the system firmware. And like a reboot
|
but it is independent of the system firmware. And like a reboot
|
||||||
you can start any kernel with it, not just Linux.
|
you can start any kernel with it, not just Linux.
|
||||||
|
|
||||||
|
config CRASH_DUMP
|
||||||
|
bool "Build kdump crash kernel"
|
||||||
|
help
|
||||||
|
Generate crash dump after being started by kexec. This should
|
||||||
|
be normally only set in special crash dump kernels which are
|
||||||
|
loaded in the main kernel with kexec-tools into a specially
|
||||||
|
reserved region and then later executed after a crash by
|
||||||
|
kdump/kexec.
|
||||||
|
|
||||||
|
For more details see Documentation/kdump/kdump.txt
|
||||||
|
|
||||||
config XEN_DOM0
|
config XEN_DOM0
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on XEN
|
depends on XEN
|
||||||
|
|||||||
@@ -92,6 +92,10 @@ config DEBUG_EFI
|
|||||||
the kernel that are only useful when using a debug build of the
|
the kernel that are only useful when using a debug build of the
|
||||||
UEFI firmware
|
UEFI firmware
|
||||||
|
|
||||||
|
config ARM64_RELOC_TEST
|
||||||
|
depends on m
|
||||||
|
tristate "Relocation testing module"
|
||||||
|
|
||||||
source "drivers/hwtracing/coresight/Kconfig"
|
source "drivers/hwtracing/coresight/Kconfig"
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|||||||
+3
-1
@@ -37,10 +37,12 @@ $(warning LSE atomics not supported by binutils)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_ARM64), y)
|
||||||
brokengasinst := $(call as-instr,1:\n.inst 0\n.rept . - 1b\n\nnop\n.endr\n,,-DCONFIG_BROKEN_GAS_INST=1)
|
brokengasinst := $(call as-instr,1:\n.inst 0\n.rept . - 1b\n\nnop\n.endr\n,,-DCONFIG_BROKEN_GAS_INST=1)
|
||||||
|
|
||||||
ifneq ($(brokengasinst),)
|
ifneq ($(brokengasinst),)
|
||||||
$(warning Detected assembler with broken .inst; disassembly will be unreliable)
|
$(warning Detected assembler with broken .inst; disassembly will be unreliable)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr) $(brokengasinst)
|
KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr) $(brokengasinst)
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ CONFIG_CMA=y
|
|||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
CONFIG_XEN=y
|
CONFIG_XEN=y
|
||||||
CONFIG_KEXEC=y
|
CONFIG_KEXEC=y
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||||
CONFIG_COMPAT=y
|
CONFIG_COMPAT=y
|
||||||
CONFIG_CPU_IDLE=y
|
CONFIG_CPU_IDLE=y
|
||||||
|
|||||||
@@ -85,6 +85,8 @@ static inline bool acpi_has_cpu_in_madt(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct acpi_madt_generic_interrupt *acpi_cpu_get_madt_gicc(int cpu);
|
||||||
|
|
||||||
static inline void arch_fix_phys_package_id(int num, u32 slot) { }
|
static inline void arch_fix_phys_package_id(int num, u32 slot) { }
|
||||||
void __init acpi_init_cpus(void);
|
void __init acpi_init_cpus(void);
|
||||||
|
|
||||||
|
|||||||
@@ -20,69 +20,14 @@
|
|||||||
|
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
|
|
||||||
#define ICC_EOIR1_EL1 sys_reg(3, 0, 12, 12, 1)
|
|
||||||
#define ICC_DIR_EL1 sys_reg(3, 0, 12, 11, 1)
|
|
||||||
#define ICC_IAR1_EL1 sys_reg(3, 0, 12, 12, 0)
|
|
||||||
#define ICC_SGI1R_EL1 sys_reg(3, 0, 12, 11, 5)
|
|
||||||
#define ICC_PMR_EL1 sys_reg(3, 0, 4, 6, 0)
|
|
||||||
#define ICC_CTLR_EL1 sys_reg(3, 0, 12, 12, 4)
|
|
||||||
#define ICC_SRE_EL1 sys_reg(3, 0, 12, 12, 5)
|
|
||||||
#define ICC_GRPEN1_EL1 sys_reg(3, 0, 12, 12, 7)
|
|
||||||
#define ICC_BPR1_EL1 sys_reg(3, 0, 12, 12, 3)
|
|
||||||
|
|
||||||
#define ICC_SRE_EL2 sys_reg(3, 4, 12, 9, 5)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* System register definitions
|
|
||||||
*/
|
|
||||||
#define ICH_VSEIR_EL2 sys_reg(3, 4, 12, 9, 4)
|
|
||||||
#define ICH_HCR_EL2 sys_reg(3, 4, 12, 11, 0)
|
|
||||||
#define ICH_VTR_EL2 sys_reg(3, 4, 12, 11, 1)
|
|
||||||
#define ICH_MISR_EL2 sys_reg(3, 4, 12, 11, 2)
|
|
||||||
#define ICH_EISR_EL2 sys_reg(3, 4, 12, 11, 3)
|
|
||||||
#define ICH_ELSR_EL2 sys_reg(3, 4, 12, 11, 5)
|
|
||||||
#define ICH_VMCR_EL2 sys_reg(3, 4, 12, 11, 7)
|
|
||||||
|
|
||||||
#define __LR0_EL2(x) sys_reg(3, 4, 12, 12, x)
|
|
||||||
#define __LR8_EL2(x) sys_reg(3, 4, 12, 13, x)
|
|
||||||
|
|
||||||
#define ICH_LR0_EL2 __LR0_EL2(0)
|
|
||||||
#define ICH_LR1_EL2 __LR0_EL2(1)
|
|
||||||
#define ICH_LR2_EL2 __LR0_EL2(2)
|
|
||||||
#define ICH_LR3_EL2 __LR0_EL2(3)
|
|
||||||
#define ICH_LR4_EL2 __LR0_EL2(4)
|
|
||||||
#define ICH_LR5_EL2 __LR0_EL2(5)
|
|
||||||
#define ICH_LR6_EL2 __LR0_EL2(6)
|
|
||||||
#define ICH_LR7_EL2 __LR0_EL2(7)
|
|
||||||
#define ICH_LR8_EL2 __LR8_EL2(0)
|
|
||||||
#define ICH_LR9_EL2 __LR8_EL2(1)
|
|
||||||
#define ICH_LR10_EL2 __LR8_EL2(2)
|
|
||||||
#define ICH_LR11_EL2 __LR8_EL2(3)
|
|
||||||
#define ICH_LR12_EL2 __LR8_EL2(4)
|
|
||||||
#define ICH_LR13_EL2 __LR8_EL2(5)
|
|
||||||
#define ICH_LR14_EL2 __LR8_EL2(6)
|
|
||||||
#define ICH_LR15_EL2 __LR8_EL2(7)
|
|
||||||
|
|
||||||
#define __AP0Rx_EL2(x) sys_reg(3, 4, 12, 8, x)
|
|
||||||
#define ICH_AP0R0_EL2 __AP0Rx_EL2(0)
|
|
||||||
#define ICH_AP0R1_EL2 __AP0Rx_EL2(1)
|
|
||||||
#define ICH_AP0R2_EL2 __AP0Rx_EL2(2)
|
|
||||||
#define ICH_AP0R3_EL2 __AP0Rx_EL2(3)
|
|
||||||
|
|
||||||
#define __AP1Rx_EL2(x) sys_reg(3, 4, 12, 9, x)
|
|
||||||
#define ICH_AP1R0_EL2 __AP1Rx_EL2(0)
|
|
||||||
#define ICH_AP1R1_EL2 __AP1Rx_EL2(1)
|
|
||||||
#define ICH_AP1R2_EL2 __AP1Rx_EL2(2)
|
|
||||||
#define ICH_AP1R3_EL2 __AP1Rx_EL2(3)
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
#include <asm/barrier.h>
|
#include <asm/barrier.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
#define read_gicreg read_sysreg_s
|
#define read_gicreg(r) read_sysreg_s(SYS_ ## r)
|
||||||
#define write_gicreg write_sysreg_s
|
#define write_gicreg(v, r) write_sysreg_s(v, SYS_ ## r)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Low-level accessors
|
* Low-level accessors
|
||||||
@@ -93,13 +38,13 @@
|
|||||||
|
|
||||||
static inline void gic_write_eoir(u32 irq)
|
static inline void gic_write_eoir(u32 irq)
|
||||||
{
|
{
|
||||||
write_sysreg_s(irq, ICC_EOIR1_EL1);
|
write_sysreg_s(irq, SYS_ICC_EOIR1_EL1);
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_dir(u32 irq)
|
static inline void gic_write_dir(u32 irq)
|
||||||
{
|
{
|
||||||
write_sysreg_s(irq, ICC_DIR_EL1);
|
write_sysreg_s(irq, SYS_ICC_DIR_EL1);
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +52,7 @@ static inline u64 gic_read_iar_common(void)
|
|||||||
{
|
{
|
||||||
u64 irqstat;
|
u64 irqstat;
|
||||||
|
|
||||||
irqstat = read_sysreg_s(ICC_IAR1_EL1);
|
irqstat = read_sysreg_s(SYS_ICC_IAR1_EL1);
|
||||||
dsb(sy);
|
dsb(sy);
|
||||||
return irqstat;
|
return irqstat;
|
||||||
}
|
}
|
||||||
@@ -124,7 +69,7 @@ static inline u64 gic_read_iar_cavium_thunderx(void)
|
|||||||
u64 irqstat;
|
u64 irqstat;
|
||||||
|
|
||||||
nops(8);
|
nops(8);
|
||||||
irqstat = read_sysreg_s(ICC_IAR1_EL1);
|
irqstat = read_sysreg_s(SYS_ICC_IAR1_EL1);
|
||||||
nops(4);
|
nops(4);
|
||||||
mb();
|
mb();
|
||||||
|
|
||||||
@@ -133,40 +78,40 @@ static inline u64 gic_read_iar_cavium_thunderx(void)
|
|||||||
|
|
||||||
static inline void gic_write_pmr(u32 val)
|
static inline void gic_write_pmr(u32 val)
|
||||||
{
|
{
|
||||||
write_sysreg_s(val, ICC_PMR_EL1);
|
write_sysreg_s(val, SYS_ICC_PMR_EL1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_ctlr(u32 val)
|
static inline void gic_write_ctlr(u32 val)
|
||||||
{
|
{
|
||||||
write_sysreg_s(val, ICC_CTLR_EL1);
|
write_sysreg_s(val, SYS_ICC_CTLR_EL1);
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_grpen1(u32 val)
|
static inline void gic_write_grpen1(u32 val)
|
||||||
{
|
{
|
||||||
write_sysreg_s(val, ICC_GRPEN1_EL1);
|
write_sysreg_s(val, SYS_ICC_GRPEN1_EL1);
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_sgi1r(u64 val)
|
static inline void gic_write_sgi1r(u64 val)
|
||||||
{
|
{
|
||||||
write_sysreg_s(val, ICC_SGI1R_EL1);
|
write_sysreg_s(val, SYS_ICC_SGI1R_EL1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 gic_read_sre(void)
|
static inline u32 gic_read_sre(void)
|
||||||
{
|
{
|
||||||
return read_sysreg_s(ICC_SRE_EL1);
|
return read_sysreg_s(SYS_ICC_SRE_EL1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_sre(u32 val)
|
static inline void gic_write_sre(u32 val)
|
||||||
{
|
{
|
||||||
write_sysreg_s(val, ICC_SRE_EL1);
|
write_sysreg_s(val, SYS_ICC_SRE_EL1);
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gic_write_bpr1(u32 val)
|
static inline void gic_write_bpr1(u32 val)
|
||||||
{
|
{
|
||||||
asm volatile("msr_s " __stringify(ICC_BPR1_EL1) ", %0" : : "r" (val));
|
write_sysreg_s(val, SYS_ICC_BPR1_EL1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define gic_read_typer(c) readq_relaxed(c)
|
#define gic_read_typer(c) readq_relaxed(c)
|
||||||
|
|||||||
@@ -20,9 +20,6 @@
|
|||||||
|
|
||||||
#include <asm/brk-imm.h>
|
#include <asm/brk-imm.h>
|
||||||
|
|
||||||
#ifdef CONFIG_GENERIC_BUG
|
|
||||||
#define HAVE_ARCH_BUG
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||||
#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
|
#define _BUGVERBOSE_LOCATION(file, line) __BUGVERBOSE_LOCATION(file, line)
|
||||||
#define __BUGVERBOSE_LOCATION(file, line) \
|
#define __BUGVERBOSE_LOCATION(file, line) \
|
||||||
@@ -36,28 +33,35 @@
|
|||||||
#define _BUGVERBOSE_LOCATION(file, line)
|
#define _BUGVERBOSE_LOCATION(file, line)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _BUG_FLAGS(flags) __BUG_FLAGS(flags)
|
#ifdef CONFIG_GENERIC_BUG
|
||||||
|
|
||||||
#define __BUG_FLAGS(flags) asm volatile ( \
|
#define __BUG_ENTRY(flags) \
|
||||||
".pushsection __bug_table,\"a\"\n\t" \
|
".pushsection __bug_table,\"a\"\n\t" \
|
||||||
".align 2\n\t" \
|
".align 2\n\t" \
|
||||||
"0: .long 1f - 0b\n\t" \
|
"0: .long 1f - 0b\n\t" \
|
||||||
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
||||||
".short " #flags "\n\t" \
|
".short " #flags "\n\t" \
|
||||||
".popsection\n" \
|
".popsection\n" \
|
||||||
\
|
"1: "
|
||||||
"1: brk %[imm]" \
|
#else
|
||||||
:: [imm] "i" (BUG_BRK_IMM) \
|
#define __BUG_ENTRY(flags) ""
|
||||||
)
|
#endif
|
||||||
|
|
||||||
#define BUG() do { \
|
#define __BUG_FLAGS(flags) \
|
||||||
_BUG_FLAGS(0); \
|
asm volatile ( \
|
||||||
unreachable(); \
|
__BUG_ENTRY(flags) \
|
||||||
|
"brk %[imm]" :: [imm] "i" (BUG_BRK_IMM) \
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#define BUG() do { \
|
||||||
|
__BUG_FLAGS(0); \
|
||||||
|
unreachable(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define __WARN_FLAGS(flags) _BUG_FLAGS(BUGFLAG_WARNING|(flags))
|
#define __WARN_FLAGS(flags) __BUG_FLAGS(BUGFLAG_WARNING|(flags))
|
||||||
|
|
||||||
#endif /* ! CONFIG_GENERIC_BUG */
|
#define HAVE_ARCH_BUG
|
||||||
|
|
||||||
#include <asm-generic/bug.h>
|
#include <asm-generic/bug.h>
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,18 @@
|
|||||||
#ifndef __ASM_CACHE_H
|
#ifndef __ASM_CACHE_H
|
||||||
#define __ASM_CACHE_H
|
#define __ASM_CACHE_H
|
||||||
|
|
||||||
#include <asm/cachetype.h>
|
#include <asm/cputype.h>
|
||||||
|
|
||||||
|
#define CTR_L1IP_SHIFT 14
|
||||||
|
#define CTR_L1IP_MASK 3
|
||||||
|
#define CTR_CWG_SHIFT 24
|
||||||
|
#define CTR_CWG_MASK 15
|
||||||
|
|
||||||
|
#define CTR_L1IP(ctr) (((ctr) >> CTR_L1IP_SHIFT) & CTR_L1IP_MASK)
|
||||||
|
|
||||||
|
#define ICACHE_POLICY_VPIPT 0
|
||||||
|
#define ICACHE_POLICY_VIPT 2
|
||||||
|
#define ICACHE_POLICY_PIPT 3
|
||||||
|
|
||||||
#define L1_CACHE_SHIFT 7
|
#define L1_CACHE_SHIFT 7
|
||||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||||
@@ -32,6 +43,31 @@
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <linux/bitops.h>
|
||||||
|
|
||||||
|
#define ICACHEF_ALIASING 0
|
||||||
|
#define ICACHEF_VPIPT 1
|
||||||
|
extern unsigned long __icache_flags;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Whilst the D-side always behaves as PIPT on AArch64, aliasing is
|
||||||
|
* permitted in the I-cache.
|
||||||
|
*/
|
||||||
|
static inline int icache_is_aliasing(void)
|
||||||
|
{
|
||||||
|
return test_bit(ICACHEF_ALIASING, &__icache_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int icache_is_vpipt(void)
|
||||||
|
{
|
||||||
|
return test_bit(ICACHEF_VPIPT, &__icache_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 cache_type_cwg(void)
|
||||||
|
{
|
||||||
|
return (read_cpuid_cachetype() >> CTR_CWG_SHIFT) & CTR_CWG_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
static inline int cache_line_size(void)
|
static inline int cache_line_size(void)
|
||||||
|
|||||||
@@ -154,5 +154,6 @@ int set_memory_ro(unsigned long addr, int numpages);
|
|||||||
int set_memory_rw(unsigned long addr, int numpages);
|
int set_memory_rw(unsigned long addr, int numpages);
|
||||||
int set_memory_x(unsigned long addr, int numpages);
|
int set_memory_x(unsigned long addr, int numpages);
|
||||||
int set_memory_nx(unsigned long addr, int numpages);
|
int set_memory_nx(unsigned long addr, int numpages);
|
||||||
|
int set_memory_valid(unsigned long addr, unsigned long size, int enable);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2012 ARM Ltd.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef __ASM_CACHETYPE_H
|
|
||||||
#define __ASM_CACHETYPE_H
|
|
||||||
|
|
||||||
#include <asm/cputype.h>
|
|
||||||
|
|
||||||
#define CTR_L1IP_SHIFT 14
|
|
||||||
#define CTR_L1IP_MASK 3
|
|
||||||
#define CTR_CWG_SHIFT 24
|
|
||||||
#define CTR_CWG_MASK 15
|
|
||||||
|
|
||||||
#define ICACHE_POLICY_RESERVED 0
|
|
||||||
#define ICACHE_POLICY_AIVIVT 1
|
|
||||||
#define ICACHE_POLICY_VIPT 2
|
|
||||||
#define ICACHE_POLICY_PIPT 3
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
|
||||||
|
|
||||||
#define CTR_L1IP(ctr) (((ctr) >> CTR_L1IP_SHIFT) & CTR_L1IP_MASK)
|
|
||||||
|
|
||||||
#define ICACHEF_ALIASING 0
|
|
||||||
#define ICACHEF_AIVIVT 1
|
|
||||||
|
|
||||||
extern unsigned long __icache_flags;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NumSets, bits[27:13] - (Number of sets in cache) - 1
|
|
||||||
* Associativity, bits[12:3] - (Associativity of cache) - 1
|
|
||||||
* LineSize, bits[2:0] - (Log2(Number of words in cache line)) - 2
|
|
||||||
*/
|
|
||||||
#define CCSIDR_EL1_WRITE_THROUGH BIT(31)
|
|
||||||
#define CCSIDR_EL1_WRITE_BACK BIT(30)
|
|
||||||
#define CCSIDR_EL1_READ_ALLOCATE BIT(29)
|
|
||||||
#define CCSIDR_EL1_WRITE_ALLOCATE BIT(28)
|
|
||||||
#define CCSIDR_EL1_LINESIZE_MASK 0x7
|
|
||||||
#define CCSIDR_EL1_LINESIZE(x) ((x) & CCSIDR_EL1_LINESIZE_MASK)
|
|
||||||
#define CCSIDR_EL1_ASSOCIATIVITY_SHIFT 3
|
|
||||||
#define CCSIDR_EL1_ASSOCIATIVITY_MASK 0x3ff
|
|
||||||
#define CCSIDR_EL1_ASSOCIATIVITY(x) \
|
|
||||||
(((x) >> CCSIDR_EL1_ASSOCIATIVITY_SHIFT) & CCSIDR_EL1_ASSOCIATIVITY_MASK)
|
|
||||||
#define CCSIDR_EL1_NUMSETS_SHIFT 13
|
|
||||||
#define CCSIDR_EL1_NUMSETS_MASK 0x7fff
|
|
||||||
#define CCSIDR_EL1_NUMSETS(x) \
|
|
||||||
(((x) >> CCSIDR_EL1_NUMSETS_SHIFT) & CCSIDR_EL1_NUMSETS_MASK)
|
|
||||||
|
|
||||||
#define CACHE_LINESIZE(x) (16 << CCSIDR_EL1_LINESIZE(x))
|
|
||||||
#define CACHE_NUMSETS(x) (CCSIDR_EL1_NUMSETS(x) + 1)
|
|
||||||
#define CACHE_ASSOCIATIVITY(x) (CCSIDR_EL1_ASSOCIATIVITY(x) + 1)
|
|
||||||
|
|
||||||
extern u64 __attribute_const__ cache_get_ccsidr(u64 csselr);
|
|
||||||
|
|
||||||
/* Helpers for Level 1 Instruction cache csselr = 1L */
|
|
||||||
static inline int icache_get_linesize(void)
|
|
||||||
{
|
|
||||||
return CACHE_LINESIZE(cache_get_ccsidr(1L));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int icache_get_numsets(void)
|
|
||||||
{
|
|
||||||
return CACHE_NUMSETS(cache_get_ccsidr(1L));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Whilst the D-side always behaves as PIPT on AArch64, aliasing is
|
|
||||||
* permitted in the I-cache.
|
|
||||||
*/
|
|
||||||
static inline int icache_is_aliasing(void)
|
|
||||||
{
|
|
||||||
return test_bit(ICACHEF_ALIASING, &__icache_flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int icache_is_aivivt(void)
|
|
||||||
{
|
|
||||||
return test_bit(ICACHEF_AIVIVT, &__icache_flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 cache_type_cwg(void)
|
|
||||||
{
|
|
||||||
return (read_cpuid_cachetype() >> CTR_CWG_SHIFT) & CTR_CWG_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
|
||||||
|
|
||||||
#endif /* __ASM_CACHETYPE_H */
|
|
||||||
@@ -226,7 +226,7 @@ void update_cpu_errata_workarounds(void);
|
|||||||
void __init enable_errata_workarounds(void);
|
void __init enable_errata_workarounds(void);
|
||||||
void verify_local_cpu_errata_workarounds(void);
|
void verify_local_cpu_errata_workarounds(void);
|
||||||
|
|
||||||
u64 read_system_reg(u32 id);
|
u64 read_sanitised_ftr_reg(u32 id);
|
||||||
|
|
||||||
static inline bool cpu_supports_mixed_endian_el0(void)
|
static inline bool cpu_supports_mixed_endian_el0(void)
|
||||||
{
|
{
|
||||||
@@ -240,7 +240,7 @@ static inline bool system_supports_32bit_el0(void)
|
|||||||
|
|
||||||
static inline bool system_supports_mixed_endian_el0(void)
|
static inline bool system_supports_mixed_endian_el0(void)
|
||||||
{
|
{
|
||||||
return id_aa64mmfr0_mixed_endian_el0(read_system_reg(SYS_ID_AA64MMFR0_EL1));
|
return id_aa64mmfr0_mixed_endian_el0(read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool system_supports_fpsimd(void)
|
static inline bool system_supports_fpsimd(void)
|
||||||
|
|||||||
@@ -177,6 +177,10 @@
|
|||||||
|
|
||||||
#define ESR_ELx_SYS64_ISS_SYS_CNTVCT (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 2, 14, 0) | \
|
#define ESR_ELx_SYS64_ISS_SYS_CNTVCT (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 2, 14, 0) | \
|
||||||
ESR_ELx_SYS64_ISS_DIR_READ)
|
ESR_ELx_SYS64_ISS_DIR_READ)
|
||||||
|
|
||||||
|
#define ESR_ELx_SYS64_ISS_SYS_CNTFRQ (ESR_ELx_SYS64_ISS_SYS_VAL(3, 3, 0, 14, 0) | \
|
||||||
|
ESR_ELx_SYS64_ISS_DIR_READ)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#include <linux/threads.h>
|
#include <linux/threads.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
|
||||||
#define NR_IPI 6
|
#define NR_IPI 7
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int __softirq_pending;
|
unsigned int __softirq_pending;
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ static inline void ptrace_hw_copy_thread(struct task_struct *task)
|
|||||||
/* Determine number of BRP registers available. */
|
/* Determine number of BRP registers available. */
|
||||||
static inline int get_num_brps(void)
|
static inline int get_num_brps(void)
|
||||||
{
|
{
|
||||||
u64 dfr0 = read_system_reg(SYS_ID_AA64DFR0_EL1);
|
u64 dfr0 = read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1);
|
||||||
return 1 +
|
return 1 +
|
||||||
cpuid_feature_extract_unsigned_field(dfr0,
|
cpuid_feature_extract_unsigned_field(dfr0,
|
||||||
ID_AA64DFR0_BRPS_SHIFT);
|
ID_AA64DFR0_BRPS_SHIFT);
|
||||||
@@ -158,7 +158,7 @@ static inline int get_num_brps(void)
|
|||||||
/* Determine number of WRP registers available. */
|
/* Determine number of WRP registers available. */
|
||||||
static inline int get_num_wrps(void)
|
static inline int get_num_wrps(void)
|
||||||
{
|
{
|
||||||
u64 dfr0 = read_system_reg(SYS_ID_AA64DFR0_EL1);
|
u64 dfr0 = read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1);
|
||||||
return 1 +
|
return 1 +
|
||||||
cpuid_feature_extract_unsigned_field(dfr0,
|
cpuid_feature_extract_unsigned_field(dfr0,
|
||||||
ID_AA64DFR0_WRPS_SHIFT);
|
ID_AA64DFR0_WRPS_SHIFT);
|
||||||
|
|||||||
@@ -40,9 +40,59 @@
|
|||||||
static inline void crash_setup_regs(struct pt_regs *newregs,
|
static inline void crash_setup_regs(struct pt_regs *newregs,
|
||||||
struct pt_regs *oldregs)
|
struct pt_regs *oldregs)
|
||||||
{
|
{
|
||||||
/* Empty routine needed to avoid build errors. */
|
if (oldregs) {
|
||||||
|
memcpy(newregs, oldregs, sizeof(*newregs));
|
||||||
|
} else {
|
||||||
|
u64 tmp1, tmp2;
|
||||||
|
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"stp x0, x1, [%2, #16 * 0]\n"
|
||||||
|
"stp x2, x3, [%2, #16 * 1]\n"
|
||||||
|
"stp x4, x5, [%2, #16 * 2]\n"
|
||||||
|
"stp x6, x7, [%2, #16 * 3]\n"
|
||||||
|
"stp x8, x9, [%2, #16 * 4]\n"
|
||||||
|
"stp x10, x11, [%2, #16 * 5]\n"
|
||||||
|
"stp x12, x13, [%2, #16 * 6]\n"
|
||||||
|
"stp x14, x15, [%2, #16 * 7]\n"
|
||||||
|
"stp x16, x17, [%2, #16 * 8]\n"
|
||||||
|
"stp x18, x19, [%2, #16 * 9]\n"
|
||||||
|
"stp x20, x21, [%2, #16 * 10]\n"
|
||||||
|
"stp x22, x23, [%2, #16 * 11]\n"
|
||||||
|
"stp x24, x25, [%2, #16 * 12]\n"
|
||||||
|
"stp x26, x27, [%2, #16 * 13]\n"
|
||||||
|
"stp x28, x29, [%2, #16 * 14]\n"
|
||||||
|
"mov %0, sp\n"
|
||||||
|
"stp x30, %0, [%2, #16 * 15]\n"
|
||||||
|
|
||||||
|
"/* faked current PSTATE */\n"
|
||||||
|
"mrs %0, CurrentEL\n"
|
||||||
|
"mrs %1, SPSEL\n"
|
||||||
|
"orr %0, %0, %1\n"
|
||||||
|
"mrs %1, DAIF\n"
|
||||||
|
"orr %0, %0, %1\n"
|
||||||
|
"mrs %1, NZCV\n"
|
||||||
|
"orr %0, %0, %1\n"
|
||||||
|
/* pc */
|
||||||
|
"adr %1, 1f\n"
|
||||||
|
"1:\n"
|
||||||
|
"stp %1, %0, [%2, #16 * 16]\n"
|
||||||
|
: "=&r" (tmp1), "=&r" (tmp2)
|
||||||
|
: "r" (newregs)
|
||||||
|
: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_KEXEC_CORE) && defined(CONFIG_HIBERNATION)
|
||||||
|
extern bool crash_is_nosave(unsigned long pfn);
|
||||||
|
extern void crash_prepare_suspend(void);
|
||||||
|
extern void crash_post_resume(void);
|
||||||
|
#else
|
||||||
|
static inline bool crash_is_nosave(unsigned long pfn) {return false; }
|
||||||
|
static inline void crash_prepare_suspend(void) {}
|
||||||
|
static inline void crash_post_resume(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user