UPSTREAM: arm64: Add macros to read/write system registers
Rather than crafting custom macros for reading/writing each system register provide generics accessors, read_sysreg and write_sysreg, for this purpose. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Cc: Suzuki Poulose <suzuki.poulose@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Change-Id: I1d6cf948bc6660dfd096ff5a18eba682941098c1 (cherry picked from commit 3600c2fdc09a43a30909743569e35a29121602ed) Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
This commit is contained in:
parent
e5ef8437e3
commit
d5f46e4b24
1 changed files with 21 additions and 0 deletions
|
@ -20,6 +20,8 @@
|
||||||
#ifndef __ASM_SYSREG_H
|
#ifndef __ASM_SYSREG_H
|
||||||
#define __ASM_SYSREG_H
|
#define __ASM_SYSREG_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include <asm/opcodes.h>
|
#include <asm/opcodes.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -215,6 +217,8 @@
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
asm(
|
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"
|
" .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"
|
" .equ .L__reg_num_x\\num, \\num\n"
|
||||||
|
@ -239,6 +243,23 @@ static inline void config_sctlr_el1(u32 clear, u32 set)
|
||||||
val |= set;
|
val |= set;
|
||||||
asm volatile("msr sctlr_el1, %0" : : "r" (val));
|
asm volatile("msr sctlr_el1, %0" : : "r" (val));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unlike read_cpuid, calls to read_sysreg are never expected to be
|
||||||
|
* optimized away or replaced with synthetic values.
|
||||||
|
*/
|
||||||
|
#define read_sysreg(r) ({ \
|
||||||
|
u64 __val; \
|
||||||
|
asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \
|
||||||
|
__val; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define write_sysreg(v, r) do { \
|
||||||
|
u64 __val = (u64)v; \
|
||||||
|
asm volatile("msr " __stringify(r) ", %0" \
|
||||||
|
: : "r" (__val)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_SYSREG_H */
|
#endif /* __ASM_SYSREG_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue