12edfe428SAndrew Jones #ifndef _ASMARM_PROCESSOR_H_ 22edfe428SAndrew Jones #define _ASMARM_PROCESSOR_H_ 32edfe428SAndrew Jones /* 42edfe428SAndrew Jones * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com> 52edfe428SAndrew Jones * 62edfe428SAndrew Jones * This work is licensed under the terms of the GNU LGPL, version 2. 72edfe428SAndrew Jones */ 88cca5668SAndrew Jones #include <asm/ptrace.h> 992fca209SWei Huang #include <asm/sysreg.h> 10a5875fd4SAndrew Jones #include <asm/barrier.h> 112edfe428SAndrew Jones 12*410b3bf0SAlexandru Elisei #define CTR_DMINLINE_SHIFT 16 13*410b3bf0SAlexandru Elisei #define CTR_DMINLINE_MASK (0xf << 16) 14*410b3bf0SAlexandru Elisei #define CTR_DMINLINE(x) \ 15*410b3bf0SAlexandru Elisei (((x) & CTR_DMINLINE_MASK) >> CTR_DMINLINE_SHIFT) 16*410b3bf0SAlexandru Elisei 172edfe428SAndrew Jones enum vector { 182edfe428SAndrew Jones EXCPTN_RST, 192edfe428SAndrew Jones EXCPTN_UND, 202edfe428SAndrew Jones EXCPTN_SVC, 212edfe428SAndrew Jones EXCPTN_PABT, 222edfe428SAndrew Jones EXCPTN_DABT, 232edfe428SAndrew Jones EXCPTN_ADDREXCPTN, 242edfe428SAndrew Jones EXCPTN_IRQ, 252edfe428SAndrew Jones EXCPTN_FIQ, 262edfe428SAndrew Jones EXCPTN_MAX, 272edfe428SAndrew Jones }; 282edfe428SAndrew Jones 292edfe428SAndrew Jones typedef void (*exception_fn)(struct pt_regs *); 302edfe428SAndrew Jones extern void install_exception_handler(enum vector v, exception_fn fn); 312edfe428SAndrew Jones 322edfe428SAndrew Jones extern void show_regs(struct pt_regs *regs); 332edfe428SAndrew Jones 342edfe428SAndrew Jones static inline unsigned long current_cpsr(void) 352edfe428SAndrew Jones { 362edfe428SAndrew Jones unsigned long cpsr; 372edfe428SAndrew Jones asm volatile("mrs %0, cpsr" : "=r" (cpsr)); 382edfe428SAndrew Jones return cpsr; 392edfe428SAndrew Jones } 402edfe428SAndrew Jones 412edfe428SAndrew Jones #define current_mode() (current_cpsr() & MODE_MASK) 422edfe428SAndrew Jones 43990e5425SAndrew Jones static inline void local_irq_enable(void) 44990e5425SAndrew Jones { 45990e5425SAndrew Jones asm volatile("cpsie i" : : : "memory", "cc"); 46990e5425SAndrew Jones } 47990e5425SAndrew Jones 48990e5425SAndrew Jones static inline void local_irq_disable(void) 49990e5425SAndrew Jones { 50990e5425SAndrew Jones asm volatile("cpsid i" : : : "memory", "cc"); 51990e5425SAndrew Jones } 52990e5425SAndrew Jones 5392fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5) 54da905c9dSAndrew Jones static inline uint64_t get_mpidr(void) 55f6d10793SAndrew Jones { 5692fca209SWei Huang return read_sysreg(MPIDR); 57f6d10793SAndrew Jones } 58f6d10793SAndrew Jones 59d9729025SAndrew Jones #define MPIDR_HWID_BITMASK 0xffffff 60d9729025SAndrew Jones extern int mpidr_to_cpu(uint64_t mpidr); 61d9729025SAndrew Jones 62d9729025SAndrew Jones #define MPIDR_LEVEL_SHIFT(level) \ 63d9729025SAndrew Jones (((1 << level) >> 1) << 3) 64d9729025SAndrew Jones #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ 65d9729025SAndrew Jones ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff) 66f6d10793SAndrew Jones 672edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 68f6d10793SAndrew Jones extern bool is_user(void); 692edfe428SAndrew Jones 70a5875fd4SAndrew Jones #define CNTVCT __ACCESS_CP15_64(1, c14) 71a5875fd4SAndrew Jones #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0) 72*410b3bf0SAlexandru Elisei #define CTR __ACCESS_CP15(c0, 0, c0, 1) 73a5875fd4SAndrew Jones 74a5875fd4SAndrew Jones static inline u64 get_cntvct(void) 75a5875fd4SAndrew Jones { 76a5875fd4SAndrew Jones isb(); 77a5875fd4SAndrew Jones return read_sysreg(CNTVCT); 78a5875fd4SAndrew Jones } 79a5875fd4SAndrew Jones 80a5875fd4SAndrew Jones static inline u32 get_cntfrq(void) 81a5875fd4SAndrew Jones { 82a5875fd4SAndrew Jones return read_sysreg(CNTFRQ); 83a5875fd4SAndrew Jones } 84a5875fd4SAndrew Jones 85*410b3bf0SAlexandru Elisei static inline u32 get_ctr(void) 86*410b3bf0SAlexandru Elisei { 87*410b3bf0SAlexandru Elisei return read_sysreg(CTR); 88*410b3bf0SAlexandru Elisei } 89*410b3bf0SAlexandru Elisei 90*410b3bf0SAlexandru Elisei extern u32 dcache_line_size; 91*410b3bf0SAlexandru Elisei 922edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */ 93