1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <util.h>
10
11/* See idle_thread for an explanation as to why FORCE_INLINE is required here. */
12static inline void FORCE_INLINE wfi(void)
13{
14    asm volatile("wfi" ::: "memory");
15}
16
17static inline void dsb(void)
18{
19    asm volatile("dsb" ::: "memory");
20}
21
22static inline void dmb(void)
23{
24    asm volatile("dmb" ::: "memory");
25}
26
27static inline void isb(void)
28{
29    asm volatile("isb" ::: "memory");
30}
31
32void lockTLBEntryCritical(unsigned int addr, unsigned int x, unsigned int y);
33
34#define MRC(cpreg, v)  asm volatile("mrc  " cpreg :  "=r"(v))
35#define MRRC(cpreg, v) asm volatile("mrrc " cpreg :  "=r"(v))
36#define MCR(cpreg, v)                               \
37    do {                                            \
38        word_t _v = v;                            \
39        asm volatile("mcr  " cpreg :: "r" (_v));    \
40    }while(0)
41#define MCRR(cpreg, v)                              \
42    do {                                            \
43        uint64_t _v = v;                            \
44        asm volatile("mcrr " cpreg :: "r" (_v));    \
45    }while(0)
46
47#define SYSTEM_WRITE_WORD(reg, v) MCR(reg, v)
48#define SYSTEM_READ_WORD(reg, v)  MRC(reg, v)
49#define SYSTEM_WRITE_64(reg, v)  MCRR(reg, v)
50#define SYSTEM_READ_64(reg, v)   MRRC(reg, v)
51