3 #ifndef __DEVICE_MMIO_H__
4 #define __DEVICE_MMIO_H__
11 #define __clrsetbits_impl(bits, addr, clear, set) write##bits(addr, \
12 (read##bits(addr) & ~((uint##bits##_t)(clear))) | (set))
14 #define clrsetbits8(addr, clear, set) __clrsetbits_impl(8, addr, clear, set)
15 #define clrsetbits16(addr, clear, set) __clrsetbits_impl(16, addr, clear, set)
16 #define clrsetbits32(addr, clear, set) __clrsetbits_impl(32, addr, clear, set)
17 #define clrsetbits64(addr, clear, set) __clrsetbits_impl(64, addr, clear, set)
19 #define setbits8(addr, set) clrsetbits8(addr, 0, set)
20 #define setbits16(addr, set) clrsetbits16(addr, 0, set)
21 #define setbits32(addr, set) clrsetbits32(addr, 0, set)
22 #define setbits64(addr, set) clrsetbits64(addr, 0, set)
24 #define clrbits8(addr, clear) clrsetbits8(addr, clear, 0)
25 #define clrbits16(addr, clear) clrsetbits16(addr, clear, 0)
26 #define clrbits32(addr, clear) clrsetbits32(addr, clear, 0)
27 #define clrbits64(addr, clear) clrsetbits64(addr, clear, 0)
36 int fifo_stride,
int fifo_width);
46 void *fifo,
int fifo_stride,
int fifo_width);
55 int fifo_stride,
int fifo_width)
58 fifo_stride, fifo_width);
124 #define DEFINE_BITFIELD(name, high_bit, low_bit) \
125 _Static_assert(high_bit >= low_bit, "invalid bit field range"); \
127 name##_BITFIELD_SHIFT = (low_bit), \
128 name##_BITFIELD_SIZE = (high_bit) - (low_bit) + 1, \
131 #define DEFINE_BIT(name, bit) DEFINE_BITFIELD(name, bit, bit)
133 #define _BF_MASK(name, value) \
134 ((u32)GENMASK(name##_BITFIELD_SHIFT + name##_BITFIELD_SIZE - 1, \
135 name##_BITFIELD_SHIFT))
137 #define _BF_VALUE(name, value) \
138 (((u32)(value) << name##_BITFIELD_SHIFT) & _BF_MASK(name, 0))
140 #define _BF_APPLY1(op, name, value, ...) (op(name, value))
141 #define _BF_APPLY2(op, name, value, ...) ((op(name, value)) | \
142 _BF_APPLY1(op, __VA_ARGS__))
143 #define _BF_APPLY3(op, name, value, ...) ((op(name, value)) | \
144 _BF_APPLY2(op, __VA_ARGS__))
145 #define _BF_APPLY4(op, name, value, ...) ((op(name, value)) | \
146 _BF_APPLY3(op, __VA_ARGS__))
147 #define _BF_APPLY5(op, name, value, ...) ((op(name, value)) | \
148 _BF_APPLY4(op, __VA_ARGS__))
149 #define _BF_APPLY6(op, name, value, ...) ((op(name, value)) | \
150 _BF_APPLY5(op, __VA_ARGS__))
151 #define _BF_APPLY7(op, name, value, ...) ((op(name, value)) | \
152 _BF_APPLY6(op, __VA_ARGS__))
153 #define _BF_APPLY8(op, name, value, ...) ((op(name, value)) | \
154 _BF_APPLY7(op, __VA_ARGS__))
155 #define _BF_APPLY9(op, name, value, ...) ((op(name, value)) | \
156 _BF_APPLY8(op, __VA_ARGS__))
157 #define _BF_APPLY10(op, name, value, ...) ((op(name, value)) | \
158 _BF_APPLY9(op, __VA_ARGS__))
159 #define _BF_APPLY11(op, name, value, ...) ((op(name, value)) | \
160 _BF_APPLY10(op, __VA_ARGS__))
161 #define _BF_APPLY12(op, name, value, ...) ((op(name, value)) | \
162 _BF_APPLY11(op, __VA_ARGS__))
163 #define _BF_APPLY13(op, name, value, ...) ((op(name, value)) | \
164 _BF_APPLY12(op, __VA_ARGS__))
165 #define _BF_APPLY14(op, name, value, ...) ((op(name, value)) | \
166 _BF_APPLY13(op, __VA_ARGS__))
167 #define _BF_APPLY15(op, name, value, ...) ((op(name, value)) | \
168 _BF_APPLY14(op, __VA_ARGS__))
169 #define _BF_APPLY16(op, name, value, ...) ((op(name, value)) | \
170 _BF_APPLY15(op, __VA_ARGS__))
171 #define _BF_APPLYINVALID(...) \
172 _Static_assert(0, "Invalid arguments for {WRITE,SET}*_BITFIELDS")
174 #define _BF_IMPL2(op, addr, \
175 n1, v1, n2, v2, n3, v3, n4, v4, n5, v5, n6, v6, n7, v7, n8, v8, \
176 n9, v9, n10, v10, n11, v11, n12, v12, n13, v13, n14, v14, n15, v15, n16, v16, \
180 _BF_APPLY##NARGS(_BF_MASK, n1, v1, n2, v2, n3, v3, n4, v4, \
181 n5, v5, n6, v6, n7, v7, n8, v8, \
182 n9, v9, n10, v10, n11, v11, n12, v12, \
183 n13, v13, n14, v14, n15, v15, n16, v16), \
184 _BF_APPLY##NARGS(_BF_VALUE, n1, v1, n2, v2, n3, v3, n4, v4, \
185 n5, v5, n6, v6, n7, v7, n8, v8,\
186 n9, v9, n10, v10, n11, v11, n12, v12, \
187 n13, v13, n14, v14, n15, v15, n16, v16))
189 #define _BF_IMPL(op, addr, ...) \
190 _BF_IMPL2(op, addr, __VA_ARGS__, \
191 16, INVALID, 15, INVALID, 14, INVALID, 13, INVALID, \
192 12, INVALID, 11, INVALID, 10, INVALID, 9, INVALID, \
193 8, INVALID, 7, INVALID, 6, INVALID, 5, INVALID, \
194 4, INVALID, 3, INVALID, 2, INVALID, 1, INVALID)
196 #define _WRITE32_BITFIELDS_IMPL(addr, masks, values) write32(addr, values)
198 #define WRITE32_BITFIELDS(addr, ...) \
199 _BF_IMPL(_WRITE32_BITFIELDS_IMPL, addr, __VA_ARGS__)
201 #define SET32_BITFIELDS(addr, ...) \
202 _BF_IMPL(clrsetbits32, addr, __VA_ARGS__)
204 #define EXTRACT_BITFIELD(value, name) \
205 (((value) & _BF_MASK(name, 0)) >> name##_BITFIELD_SHIFT)
207 #define READ32_BITFIELD(addr, name) \
208 EXTRACT_BITFIELD(read32(addr), name)
static void write8(void *addr, uint8_t val)
static void write32(void *addr, uint32_t val)
static uint16_t read16(const void *addr)
void write64(void *addr, uint64_t val)
static uint32_t read32(const void *addr)
uint64_t read64(const void *addr)
static uint8_t read8(const void *addr)
static void write16(void *addr, uint16_t val)
static __always_inline uint64_t read64p(const uintptr_t addr)
static __always_inline void write64p(const uintptr_t addr, const uint64_t value)
static __always_inline void write8p(const uintptr_t addr, const uint8_t value)
void buffer_from_fifo32(void *buffer, size_t size, void *fifo, int fifo_stride, int fifo_width)
static __always_inline void write16p(const uintptr_t addr, const uint16_t value)
void buffer_to_fifo32_prefix(const void *buffer, u32 prefix, int prefsz, size_t size, void *fifo, int fifo_stride, int fifo_width)
static __always_inline uint32_t read32p(const uintptr_t addr)
static __always_inline void write32p(const uintptr_t addr, const uint32_t value)
static __always_inline uint8_t read8p(const uintptr_t addr)
static void buffer_to_fifo32(const void *buffer, size_t size, void *fifo, int fifo_stride, int fifo_width)
static __always_inline uint16_t read16p(const uintptr_t addr)
u8 buffer[C2P_BUFFER_MAXSIZE]
unsigned long long uint64_t