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