summaryrefslogtreecommitdiff
path: root/bsp/cvitek/drivers/libraries/mmio.h
blob: 2ef1930a1c1f1e6d9cd9f92f11bff4e67a25cf13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef __MMIO_H__
#define __MMIO_H__
#include <stdint.h>
#include "types.h"

#ifndef ARCH_ARM
#define __raw_readb(a)        (*(volatile unsigned char *)(a))
#define __raw_readw(a)        (*(volatile unsigned short *)(a))
#define __raw_readl(a)        (*(volatile unsigned int *)(a))
#define __raw_readq(a)        (*(volatile unsigned long long *)(a))

#define __raw_writeb(v,a)      (*(volatile unsigned char *)(a) = (v))
#define __raw_writew(v,a)      (*(volatile unsigned short *)(a) = (v))
#define __raw_writel(v,a)      (*(volatile unsigned int *)(a) = (v))
#define __raw_writeq(v,a)      (*(volatile unsigned long long *)(a) = (v))

/*
 * I/O memory access primitives. Reads are ordered relative to any
 * following Normal memory access. Writes are ordered relative to any prior
 * Normal memory access.  The memory barriers here are necessary as RISC-V
 * doesn't define any ordering between the memory space and the I/O space.
 */
#define __io_br()   do {} while (0)
#define __io_ar(v)  __asm__ __volatile__ ("fence i,r" : : : "memory")
#define __io_bw()   __asm__ __volatile__ ("fence w,o" : : : "memory")
//#define __io_aw()   mmiowb_set_pending()
#define __io_aw()   do {} while (0)

#define readb(c)    ({ u8  __v; __io_br(); __v = __raw_readb(c); __io_ar(__v); __v; })
#define readw(c)    ({ u16 __v; __io_br(); __v = __raw_readw(c); __io_ar(__v); __v; })
#define readl(c)    ({ u32 __v; __io_br(); __v = __raw_readl(c); __io_ar(__v); __v; })

#define writeb(v, c)    ({ __io_bw(); __raw_writeb((v), (c)); __io_aw(); })
#define writew(v, c)    ({ __io_bw(); __raw_writew((v), (c)); __io_aw(); })
#define writel(v, c)    ({ __io_bw(); __raw_writel((v), (c)); __io_aw(); })

#ifdef CONFIG_64BIT
#define readq(c)    ({ u64 __v; __io_br(); __v = __raw_readq(c); __io_ar(__v); __v; })
#define writeq(v, c)    ({ __io_bw(); __raw_writeq((v), (c)); __io_aw(); })
#endif // CONFIG_64BIT

#else
#define __raw_readb(a)        (*(volatile unsigned char *)(a))
#define __raw_readw(a)        (*(volatile unsigned short *)(a))
#define __raw_readl(a)        (*(volatile unsigned int *)(a))
#define __raw_readq(a)        (*(volatile unsigned long long *)(a))

#define __raw_writeb(v,a)      (*(volatile unsigned char *)(a) = (v))
#define __raw_writew(v,a)      (*(volatile unsigned short *)(a) = (v))
#define __raw_writel(v,a)      (*(volatile unsigned int *)(a) = (v))
#define __raw_writeq(v,a)      (*(volatile unsigned long long *)(a) = (v))

#define readb(a)        __raw_readb(a)
#define readw(a)        __raw_readw(a)
#define readl(a)        __raw_readl(a)
#define readq(a)        __raw_readq(a)

#define writeb(v, a)        __raw_writeb(v,a)
#define writew(v, a)        __raw_writew(v,a)
#define writel(v, a)        __raw_writel(v,a)
#define writeq(v, a)        __raw_writeq(v,a)

#define cpu_write8(a, v)    writeb(a, v)
#define cpu_write16(a, v)   writew(a, v)
#define cpu_write32(a, v)   writel(a, v)
#endif /* ARCH_ARM */

#define mmio_wr32 mmio_write_32
#define mmio_rd32 mmio_read_32

static inline void mmio_write_8(uintptr_t addr, uint8_t value)
{
    writeb(value, (void *) addr);
}

static inline uint8_t mmio_read_8(uintptr_t addr)
{
    return readb((void *) addr);
}

static inline void mmio_write_16(uintptr_t addr, uint16_t value)
{
    writew(value, (void *) addr);
}

static inline uint16_t mmio_read_16(uintptr_t addr)
{
    return readw((void *) addr);
}

static inline void mmio_write_32(uintptr_t addr, uint32_t value)
{
    writel(value, (void *) addr);
}

static inline uint32_t mmio_read_32(uintptr_t addr)
{
    return readl((void *) addr);
}

static inline void mmio_write_64(uintptr_t addr, uint64_t value)
{
    writeq(value, (void *) addr);
}

static inline uint64_t mmio_read_64(uintptr_t addr)
{
    return readq((void *) addr);
}

static inline void mmio_clrbits_32(uintptr_t addr, uint32_t clear)
{
    writel(readl((void *) addr) & ~clear , (void *) addr);
}

static inline void mmio_setbits_32(uintptr_t addr, uint32_t set)
{
    writel(readl((void *) addr) | set , (void *) addr);
}

static inline void mmio_clrsetbits_32(uintptr_t addr, uint32_t clear,
                      uint32_t set)
{
    writel((readl((void *) addr) & ~clear) | set , (void *) addr);
}

/* from Linux usage */
#define ioremap(a, l)       (a)

#define _reg_read(addr)     mmio_read_32((addr))
#define _reg_write(addr, data)  mmio_write_32((addr), (data))
#define _reg_write_mask(addr, mask, data) mmio_clrsetbits_32(addr, mask, data)

#define ioread8 readb
#define ioread16 readw
#define ioread32 readl
#define ioread64 readq

#define iowrite8 writeb
#define iowrite16 writew
#define iowrite32 writel
#define iowrite64 writeq

#endif /* __MMIO_H__ */