1/* 2 * Copyright 2017, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the GNU General Public License version 2. Note that NO WARRANTY is provided. 8 * See "LICENSE_GPLv2.txt" for details. 9 * 10 * @TAG(DATA61_GPL) 11 */ 12 13#pragma once 14 15#define __arch_getl(addr) *((volatile uint32_t*)(addr)) 16#define __arch_getw(addr) *((volatile uint16_t*)(addr)) 17#define __arch_getb(addr) *((volatile uint8_t*)(addr)) 18 19#define __arch_putl(val, addr) *((volatile uint32_t*)(addr)) = val 20#define __arch_putw(val, addr) *((volatile uint16_t*)(addr)) = val 21#define __arch_putb(val, addr) *((volatile uint8_t*)(addr)) = val 22 23//#define __raw_writel(...) writel(__VA_ARGS__) 24//#define __raw_readl(...) readl(__VA_ARGS__) 25 26#define __raw_writeb(v,a) __arch_putb(v,a) 27#define __raw_writew(v,a) __arch_putw(v,a) 28#define __raw_writel(v,a) __arch_putl(v,a) 29 30#define __raw_readb(a) __arch_getb(a) 31#define __raw_readw(a) __arch_getw(a) 32#define __raw_readl(a) __arch_getl(a) 33 34/* 35 * TODO: The kernel offers some more advanced versions of barriers, it might 36 * have some advantages to use them instead of the simple one here. 37 */ 38/* 39#define dmb() asm volatile("dmb" ::: "memory") // For aarch32? 40#define dsb() asm volatile("dsb" ::: "memory") 41#define isb() asm volatile("isb" ::: "memory") 42*/ 43 44#define dmb() asm volatile("dmb sy" ::: "memory") // For aarch64 45#define dsb() asm volatile("dsb sy" ::: "memory") 46#define isb() asm volatile("isb sy" ::: "memory") 47#define __iormb() dmb() 48#define __iowmb() dmb() 49 50#define writeb(v,c) ({ uint8_t __v = v; __iowmb(); __arch_putb(__v,c); __v; }) 51#define writew(v,c) ({ uint16_t __v = v; __iowmb(); __arch_putw(__v,c); __v; }) 52#define writel(v,c) ({ uint32_t __v = v; __iowmb(); __arch_putl(__v,c); __v; }) 53 54#define readb(c) ({ uint8_t __v = __arch_getb(c); __iormb(); __v; }) 55#define readw(c) ({ uint16_t __v = __arch_getw(c); __iormb(); __v; }) 56#define readl(c) ({ uint32_t __v = __arch_getl(c); __iormb(); __v; }) 57 58