diff options
Diffstat (limited to 'arch/arm64/include/asm/sysreg.h')
| -rw-r--r-- | arch/arm64/include/asm/sysreg.h | 59 | 
1 files changed, 46 insertions, 13 deletions
| diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index 5b267dec6194..3f7b917e8f3a 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -606,6 +606,20 @@  #define ID_AA64PFR1_SSBS_PSTATE_ONLY	1  #define ID_AA64PFR1_SSBS_PSTATE_INSNS	2 +/* id_aa64zfr0 */ +#define ID_AA64ZFR0_SM4_SHIFT		40 +#define ID_AA64ZFR0_SHA3_SHIFT		32 +#define ID_AA64ZFR0_BITPERM_SHIFT	16 +#define ID_AA64ZFR0_AES_SHIFT		4 +#define ID_AA64ZFR0_SVEVER_SHIFT	0 + +#define ID_AA64ZFR0_SM4			0x1 +#define ID_AA64ZFR0_SHA3		0x1 +#define ID_AA64ZFR0_BITPERM		0x1 +#define ID_AA64ZFR0_AES			0x1 +#define ID_AA64ZFR0_AES_PMULL		0x2 +#define ID_AA64ZFR0_SVEVER_SVE2		0x1 +  /* id_aa64mmfr0 */  #define ID_AA64MMFR0_TGRAN4_SHIFT	28  #define ID_AA64MMFR0_TGRAN64_SHIFT	24 @@ -746,20 +760,39 @@  #include <linux/build_bug.h>  #include <linux/types.h> -asm( -"	.irp	num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" -"	.equ	.L__reg_num_x\\num, \\num\n" -"	.endr\n" +#define __DEFINE_MRS_MSR_S_REGNUM				\ +"	.irp	num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30\n" \ +"	.equ	.L__reg_num_x\\num, \\num\n"			\ +"	.endr\n"						\  "	.equ	.L__reg_num_xzr, 31\n" -"\n" -"	.macro	mrs_s, rt, sreg\n" -	__emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt)) + +#define DEFINE_MRS_S						\ +	__DEFINE_MRS_MSR_S_REGNUM				\ +"	.macro	mrs_s, rt, sreg\n"				\ +	__emit_inst(0xd5200000|(\\sreg)|(.L__reg_num_\\rt))	\  "	.endm\n" -"\n" -"	.macro	msr_s, sreg, rt\n" -	__emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt)) + +#define DEFINE_MSR_S						\ +	__DEFINE_MRS_MSR_S_REGNUM				\ +"	.macro	msr_s, sreg, rt\n"				\ +	__emit_inst(0xd5000000|(\\sreg)|(.L__reg_num_\\rt))	\  "	.endm\n" -); + +#define UNDEFINE_MRS_S						\ +"	.purgem	mrs_s\n" + +#define UNDEFINE_MSR_S						\ +"	.purgem	msr_s\n" + +#define __mrs_s(v, r)						\ +	DEFINE_MRS_S						\ +"	mrs_s " v ", " __stringify(r) "\n"			\ +	UNDEFINE_MRS_S + +#define __msr_s(r, v)						\ +	DEFINE_MSR_S						\ +"	msr_s " __stringify(r) ", " v "\n"			\ +	UNDEFINE_MSR_S  /*   * Unlike read_cpuid, calls to read_sysreg are never expected to be @@ -787,13 +820,13 @@ asm(   */  #define read_sysreg_s(r) ({						\  	u64 __val;							\ -	asm volatile("mrs_s %0, " __stringify(r) : "=r" (__val));	\ +	asm volatile(__mrs_s("%0", r) : "=r" (__val));			\  	__val;								\  })  #define write_sysreg_s(v, r) do {					\  	u64 __val = (u64)(v);						\ -	asm volatile("msr_s " __stringify(r) ", %x0" : : "rZ" (__val));	\ +	asm volatile(__msr_s(r, "%x0") : : "rZ" (__val));		\  } while (0)  /* |