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
122edfe428SAndrew Jones enum vector {
132edfe428SAndrew Jones EXCPTN_RST,
142edfe428SAndrew Jones EXCPTN_UND,
152edfe428SAndrew Jones EXCPTN_SVC,
162edfe428SAndrew Jones EXCPTN_PABT,
172edfe428SAndrew Jones EXCPTN_DABT,
182edfe428SAndrew Jones EXCPTN_ADDREXCPTN,
192edfe428SAndrew Jones EXCPTN_IRQ,
202edfe428SAndrew Jones EXCPTN_FIQ,
212edfe428SAndrew Jones EXCPTN_MAX,
222edfe428SAndrew Jones };
232edfe428SAndrew Jones
2425f66327SEric Auger typedef void (*irq_handler_fn)(struct pt_regs *regs);
252edfe428SAndrew Jones typedef void (*exception_fn)(struct pt_regs *);
2625f66327SEric Auger
272edfe428SAndrew Jones extern void install_exception_handler(enum vector v, exception_fn fn);
282edfe428SAndrew Jones
292edfe428SAndrew Jones extern void show_regs(struct pt_regs *regs);
302edfe428SAndrew Jones
current_cpsr(void)312edfe428SAndrew Jones static inline unsigned long current_cpsr(void)
322edfe428SAndrew Jones {
332edfe428SAndrew Jones unsigned long cpsr;
342edfe428SAndrew Jones asm volatile("mrs %0, cpsr" : "=r" (cpsr));
352edfe428SAndrew Jones return cpsr;
362edfe428SAndrew Jones }
372edfe428SAndrew Jones
382edfe428SAndrew Jones #define current_mode() (current_cpsr() & MODE_MASK)
392edfe428SAndrew Jones
local_irq_enable(void)40990e5425SAndrew Jones static inline void local_irq_enable(void)
41990e5425SAndrew Jones {
42990e5425SAndrew Jones asm volatile("cpsie i" : : : "memory", "cc");
43990e5425SAndrew Jones }
44990e5425SAndrew Jones
local_irq_disable(void)45990e5425SAndrew Jones static inline void local_irq_disable(void)
46990e5425SAndrew Jones {
47990e5425SAndrew Jones asm volatile("cpsid i" : : : "memory", "cc");
48990e5425SAndrew Jones }
49990e5425SAndrew Jones
5092fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5)
get_mpidr(void)51da905c9dSAndrew Jones static inline uint64_t get_mpidr(void)
52f6d10793SAndrew Jones {
5392fca209SWei Huang return read_sysreg(MPIDR);
54f6d10793SAndrew Jones }
55f6d10793SAndrew Jones
56d9729025SAndrew Jones #define MPIDR_HWID_BITMASK 0xffffff
57d9729025SAndrew Jones extern int mpidr_to_cpu(uint64_t mpidr);
58d9729025SAndrew Jones
59d9729025SAndrew Jones #define MPIDR_LEVEL_SHIFT(level) \
60d9729025SAndrew Jones (((1 << level) >> 1) << 3)
61d9729025SAndrew Jones #define MPIDR_AFFINITY_LEVEL(mpidr, level) \
62d9729025SAndrew Jones ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff)
63f6d10793SAndrew Jones
642edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
65*0917dc65SNikos Nikoleris extern bool __mmu_enabled(void);
66f6d10793SAndrew Jones extern bool is_user(void);
672edfe428SAndrew Jones
68a5875fd4SAndrew Jones #define CNTVCT __ACCESS_CP15_64(1, c14)
69a5875fd4SAndrew Jones #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0)
70410b3bf0SAlexandru Elisei #define CTR __ACCESS_CP15(c0, 0, c0, 1)
71*0917dc65SNikos Nikoleris #define SCTRL __ACCESS_CP15(c1, 0, c0, 0)
72a5875fd4SAndrew Jones
get_cntvct(void)73a5875fd4SAndrew Jones static inline u64 get_cntvct(void)
74a5875fd4SAndrew Jones {
75a5875fd4SAndrew Jones isb();
76a5875fd4SAndrew Jones return read_sysreg(CNTVCT);
77a5875fd4SAndrew Jones }
78a5875fd4SAndrew Jones
get_cntfrq(void)79a5875fd4SAndrew Jones static inline u32 get_cntfrq(void)
80a5875fd4SAndrew Jones {
81a5875fd4SAndrew Jones return read_sysreg(CNTFRQ);
82a5875fd4SAndrew Jones }
83a5875fd4SAndrew Jones
get_ctr(void)84410b3bf0SAlexandru Elisei static inline u32 get_ctr(void)
85410b3bf0SAlexandru Elisei {
86410b3bf0SAlexandru Elisei return read_sysreg(CTR);
87410b3bf0SAlexandru Elisei }
88410b3bf0SAlexandru Elisei
892edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */
90