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