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 12410b3bf0SAlexandru Elisei #define CTR_DMINLINE_SHIFT 16 13410b3bf0SAlexandru Elisei #define CTR_DMINLINE_MASK (0xf << 16) 14410b3bf0SAlexandru Elisei #define CTR_DMINLINE(x) \ 15410b3bf0SAlexandru Elisei (((x) & CTR_DMINLINE_MASK) >> CTR_DMINLINE_SHIFT) 16410b3bf0SAlexandru 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 2925f66327SEric Auger typedef void (*irq_handler_fn)(struct pt_regs *regs); 302edfe428SAndrew Jones typedef void (*exception_fn)(struct pt_regs *); 3125f66327SEric Auger 322edfe428SAndrew Jones extern void install_exception_handler(enum vector v, exception_fn fn); 332edfe428SAndrew Jones 342edfe428SAndrew Jones extern void show_regs(struct pt_regs *regs); 352edfe428SAndrew Jones 362edfe428SAndrew Jones static inline unsigned long current_cpsr(void) 372edfe428SAndrew Jones { 382edfe428SAndrew Jones unsigned long cpsr; 392edfe428SAndrew Jones asm volatile("mrs %0, cpsr" : "=r" (cpsr)); 402edfe428SAndrew Jones return cpsr; 412edfe428SAndrew Jones } 422edfe428SAndrew Jones 432edfe428SAndrew Jones #define current_mode() (current_cpsr() & MODE_MASK) 442edfe428SAndrew Jones 45990e5425SAndrew Jones static inline void local_irq_enable(void) 46990e5425SAndrew Jones { 47990e5425SAndrew Jones asm volatile("cpsie i" : : : "memory", "cc"); 48990e5425SAndrew Jones } 49990e5425SAndrew Jones 50990e5425SAndrew Jones static inline void local_irq_disable(void) 51990e5425SAndrew Jones { 52990e5425SAndrew Jones asm volatile("cpsid i" : : : "memory", "cc"); 53990e5425SAndrew Jones } 54990e5425SAndrew Jones 5592fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5) 56da905c9dSAndrew Jones static inline uint64_t get_mpidr(void) 57f6d10793SAndrew Jones { 5892fca209SWei Huang return read_sysreg(MPIDR); 59f6d10793SAndrew Jones } 60f6d10793SAndrew Jones 61d9729025SAndrew Jones #define MPIDR_HWID_BITMASK 0xffffff 62d9729025SAndrew Jones extern int mpidr_to_cpu(uint64_t mpidr); 63d9729025SAndrew Jones 64d9729025SAndrew Jones #define MPIDR_LEVEL_SHIFT(level) \ 65d9729025SAndrew Jones (((1 << level) >> 1) << 3) 66d9729025SAndrew Jones #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ 67d9729025SAndrew Jones ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff) 68f6d10793SAndrew Jones 692edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 70*0917dc65SNikos Nikoleris extern bool __mmu_enabled(void); 71f6d10793SAndrew Jones extern bool is_user(void); 722edfe428SAndrew Jones 73a5875fd4SAndrew Jones #define CNTVCT __ACCESS_CP15_64(1, c14) 74a5875fd4SAndrew Jones #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0) 75410b3bf0SAlexandru Elisei #define CTR __ACCESS_CP15(c0, 0, c0, 1) 76*0917dc65SNikos Nikoleris #define SCTRL __ACCESS_CP15(c1, 0, c0, 0) 77a5875fd4SAndrew Jones 78a5875fd4SAndrew Jones static inline u64 get_cntvct(void) 79a5875fd4SAndrew Jones { 80a5875fd4SAndrew Jones isb(); 81a5875fd4SAndrew Jones return read_sysreg(CNTVCT); 82a5875fd4SAndrew Jones } 83a5875fd4SAndrew Jones 84a5875fd4SAndrew Jones static inline u32 get_cntfrq(void) 85a5875fd4SAndrew Jones { 86a5875fd4SAndrew Jones return read_sysreg(CNTFRQ); 87a5875fd4SAndrew Jones } 88a5875fd4SAndrew Jones 89410b3bf0SAlexandru Elisei static inline u32 get_ctr(void) 90410b3bf0SAlexandru Elisei { 91410b3bf0SAlexandru Elisei return read_sysreg(CTR); 92410b3bf0SAlexandru Elisei } 93410b3bf0SAlexandru Elisei 94956e3800SAndrew Jones extern unsigned long dcache_line_size; 95410b3bf0SAlexandru Elisei 962edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */ 97