Commit 9e556dcc authored by Will Deacon's avatar Will Deacon Committed by Zeng Heng
Browse files

arm64: cpufeatures: Add capability for LDAPR instruction

mainline inclusion
from mainline-v5.11-rc1
commit 364a5a8a
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I7LP2Z

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=364a5a8ae8dc2dd457e2fefb4da3f3fd2c0ba8b1



---------------------------

Armv8.3 introduced the LDAPR instruction, which provides weaker memory
ordering semantics than LDARi (RCpc vs RCsc). Generally, we provide an
RCsc implementation when implementing the Linux memory model, but LDAPR
can be used as a useful alternative to dependency ordering, particularly
when the compiler is capable of breaking the dependencies.

Since LDAPR is not available on all CPUs, add a cpufeature to detect it at
runtime and allow the instruction to be used with alternative code
patching.

Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>

conflict:
	arch/arm64/Kconfig
	arch/arm64/include/asm/cpucaps.h
	arch/arm64/kernel/cpufeature.c
Signed-off-by: default avatarZeng Heng <zengheng4@huawei.com>
parent 9675e654
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1737,6 +1737,9 @@ config AS_HAS_PAC
config AS_HAS_CFI_NEGATE_RA_STATE
	def_bool $(as-instr,.cfi_startproc\n.cfi_negate_ra_state\n.cfi_endproc\n)

config AS_HAS_LDAPR
	def_bool $(as-instr,.arch_extension rcpc)

endmenu

menu "ARMv8.4 architectural features"
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@
#define ARM64_WORKAROUND_1742098	67
#define ARM64_HAS_WFXT				68
#define ARM64_WORKAROUND_HISILICON_ERRATUM_162100125	69
#define ARM64_HAS_LDAPR                         70

#define ARM64_NCAPS				80

+10 −0
Original line number Diff line number Diff line
@@ -2285,6 +2285,16 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
		.matches = has_cpuid_feature,
		.min_field_value = ID_AA64ISAR2_WFXT_SUPPORTED,
	},
	{
		.desc = "RCpc load-acquire (LDAPR)",
		.capability = ARM64_HAS_LDAPR,
		.type = ARM64_CPUCAP_SYSTEM_FEATURE,
		.sys_reg = SYS_ID_AA64ISAR1_EL1,
		.sign = FTR_UNSIGNED,
		.field_pos = ID_AA64ISAR1_LRCPC_SHIFT,
		.matches = has_cpuid_feature,
		.min_field_value = 1,
	},
	{},
};