1/* 2 * Copyright 2022, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _FBSD_MACHINE_GENERIC_BUS_H_ 6#define _FBSD_MACHINE_GENERIC_BUS_H_ 7 8 9#include <machine/_bus.h> 10 11 12#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) 13 14#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFFUL 15#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFFUL 16#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFFUL 17#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFFUL 18 19#define BUS_SPACE_MAXADDR 0xFFFFFFFFFFFFFFFFUL 20#define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFFUL 21 22#define BUS_SPACE_INVALID_DATA (~0) 23#define BUS_SPACE_UNRESTRICTED (~0) 24 25 26static __inline u_int8_t 27bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle, 28 bus_size_t offset) 29{ 30 if (tag != BUS_SPACE_TAG_MEM) 31 return BUS_SPACE_INVALID_DATA; 32 return (*(volatile u_int8_t *)(handle + offset)); 33} 34 35 36static __inline u_int16_t 37bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle, 38 bus_size_t offset) 39{ 40 if (tag != BUS_SPACE_TAG_MEM) 41 return BUS_SPACE_INVALID_DATA; 42 return (*(volatile u_int16_t *)(handle + offset)); 43} 44 45 46static __inline u_int32_t 47bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle, 48 bus_size_t offset) 49{ 50 if (tag != BUS_SPACE_TAG_MEM) 51 return BUS_SPACE_INVALID_DATA; 52 return (*(volatile u_int32_t *)(handle + offset)); 53} 54 55 56static __inline uint64_t 57bus_space_read_8(bus_space_tag_t tag, bus_space_handle_t handle, 58 bus_size_t offset) 59{ 60 if (tag != BUS_SPACE_TAG_MEM) 61 return BUS_SPACE_INVALID_DATA; 62 return (*(volatile uint64_t *)(handle + offset)); 63} 64 65 66static __inline void 67bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, 68 bus_size_t offset, u_int8_t value) 69{ 70 if (tag != BUS_SPACE_TAG_MEM) 71 return; 72 *(volatile u_int8_t *)(bsh + offset) = value; 73} 74 75 76static __inline void 77bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh, 78 bus_size_t offset, u_int16_t value) 79{ 80 if (tag != BUS_SPACE_TAG_MEM) 81 return; 82 *(volatile u_int16_t *)(bsh + offset) = value; 83} 84 85 86static __inline void 87bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh, 88 bus_size_t offset, u_int32_t value) 89{ 90 if (tag != BUS_SPACE_TAG_MEM) 91 return; 92 *(volatile u_int32_t *)(bsh + offset) = value; 93} 94 95 96static __inline void 97bus_space_write_8(bus_space_tag_t tag, bus_space_handle_t bsh, 98 bus_size_t offset, uint64_t value) 99{ 100 if (tag != BUS_SPACE_TAG_MEM) 101 return; 102 *(volatile uint64_t *)(bsh + offset) = value; 103} 104 105 106static __inline void 107bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 108 bus_size_t offset, u_int8_t *addr, size_t count) 109{ 110 for (; count > 0; offset += 1, addr++, count--) 111 *addr = bus_space_read_1(tag, bsh, offset); 112} 113 114 115static __inline void 116bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 117 bus_size_t offset, u_int16_t *addr, size_t count) 118{ 119 for (; count > 0; offset += 2, addr++, count--) 120 *addr = bus_space_read_2(tag, bsh, offset); 121} 122 123 124static __inline void 125bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 126 bus_size_t offset, u_int32_t *addr, size_t count) 127{ 128 for (; count > 0; offset += 4, addr++, count--) 129 *addr = bus_space_read_4(tag, bsh, offset); 130} 131 132 133static __inline void 134bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, 135 bus_size_t offset, const u_int8_t *addr, size_t count) 136{ 137 for (; count > 0; addr++, count--) 138 bus_space_write_1(tag, bsh, offset, *addr); 139} 140 141 142static __inline void 143bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, 144 bus_size_t offset, const u_int16_t *addr, size_t count) 145{ 146 for (; count > 0; addr++, count--) 147 bus_space_write_2(tag, bsh, offset, *addr); 148} 149 150 151static __inline void 152bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, 153 bus_size_t offset, const u_int32_t *addr, size_t count) 154{ 155 for (; count > 0; addr++, count--) 156 bus_space_write_4(tag, bsh, offset, *addr); 157} 158 159 160static __inline void 161bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 162 bus_size_t offset, const u_int8_t *addr, size_t count) 163{ 164 for (; count > 0; offset += 1, addr++, count--) 165 bus_space_write_1(tag, bsh, offset, *addr); 166} 167 168 169static __inline void 170bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 171 bus_size_t offset, const u_int16_t *addr, size_t count) 172{ 173 for (; count > 0; offset += 2, addr++, count--) 174 bus_space_write_2(tag, bsh, offset, *addr); 175} 176 177 178static __inline void 179bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 180 bus_size_t offset, const u_int32_t *addr, size_t count) 181{ 182 for (; count > 0; offset += 4, addr++, count--) 183 bus_space_write_4(tag, bsh, offset, *addr); 184} 185 186 187static __inline void 188bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, 189 bus_size_t offset, u_int8_t value, size_t count) 190{ 191 for (; count > 0; count--) 192 bus_space_write_1(tag, bsh, offset, value); 193} 194 195 196static __inline void 197bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, 198 bus_size_t offset, u_int16_t value, size_t count) 199{ 200 for (; count > 0; count--) 201 bus_space_write_2(tag, bsh, offset, value); 202} 203 204 205static __inline void 206bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, 207 bus_size_t offset, u_int32_t value, size_t count) 208{ 209 for (; count > 0; count--) 210 bus_space_write_4(tag, bsh, offset, value); 211} 212 213 214#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ 215#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ 216 217 218static __inline void 219bus_space_barrier(bus_space_tag_t tag __unused, bus_space_handle_t bsh __unused, 220 bus_size_t offset __unused, bus_size_t len __unused, int flags) 221{ 222 __compiler_membar(); 223} 224 225 226#include <machine/bus_dma.h> 227 228/* Assume stream accesses are the same as normal accesses. */ 229#define bus_space_read_stream_1(t, h, o) bus_space_read_1((t), (h), (o)) 230#define bus_space_read_stream_2(t, h, o) bus_space_read_2((t), (h), (o)) 231#define bus_space_read_stream_4(t, h, o) bus_space_read_4((t), (h), (o)) 232 233#define bus_space_read_multi_stream_1(t, h, o, a, c) \ 234 bus_space_read_multi_1((t), (h), (o), (a), (c)) 235#define bus_space_read_multi_stream_2(t, h, o, a, c) \ 236 bus_space_read_multi_2((t), (h), (o), (a), (c)) 237#define bus_space_read_multi_stream_4(t, h, o, a, c) \ 238 bus_space_read_multi_4((t), (h), (o), (a), (c)) 239 240#define bus_space_write_stream_1(t, h, o, v) \ 241 bus_space_write_1((t), (h), (o), (v)) 242#define bus_space_write_stream_2(t, h, o, v) \ 243 bus_space_write_2((t), (h), (o), (v)) 244#define bus_space_write_stream_4(t, h, o, v) \ 245 bus_space_write_4((t), (h), (o), (v)) 246 247#define bus_space_write_multi_stream_1(t, h, o, a, c) \ 248 bus_space_write_multi_1((t), (h), (o), (a), (c)) 249#define bus_space_write_multi_stream_2(t, h, o, a, c) \ 250 bus_space_write_multi_2((t), (h), (o), (a), (c)) 251#define bus_space_write_multi_stream_4(t, h, o, a, c) \ 252 bus_space_write_multi_4((t), (h), (o), (a), (c)) 253 254#define bus_space_set_multi_stream_1(t, h, o, v, c) \ 255 bus_space_set_multi_1((t), (h), (o), (v), (c)) 256#define bus_space_set_multi_stream_2(t, h, o, v, c) \ 257 bus_space_set_multi_2((t), (h), (o), (v), (c)) 258#define bus_space_set_multi_stream_4(t, h, o, v, c) \ 259 bus_space_set_multi_4((t), (h), (o), (v), (c)) 260 261#define bus_space_read_region_stream_1(t, h, o, a, c) \ 262 bus_space_read_region_1((t), (h), (o), (a), (c)) 263#define bus_space_read_region_stream_2(t, h, o, a, c) \ 264 bus_space_read_region_2((t), (h), (o), (a), (c)) 265#define bus_space_read_region_stream_4(t, h, o, a, c) \ 266 bus_space_read_region_4((t), (h), (o), (a), (c)) 267 268#define bus_space_write_region_stream_1(t, h, o, a, c) \ 269 bus_space_write_region_1((t), (h), (o), (a), (c)) 270#define bus_space_write_region_stream_2(t, h, o, a, c) \ 271 bus_space_write_region_2((t), (h), (o), (a), (c)) 272#define bus_space_write_region_stream_4(t, h, o, a, c) \ 273 bus_space_write_region_4((t), (h), (o), (a), (c)) 274 275#define bus_space_set_region_stream_1(t, h, o, v, c) \ 276 bus_space_set_region_1((t), (h), (o), (v), (c)) 277#define bus_space_set_region_stream_2(t, h, o, v, c) \ 278 bus_space_set_region_2((t), (h), (o), (v), (c)) 279#define bus_space_set_region_stream_4(t, h, o, v, c) \ 280 bus_space_set_region_4((t), (h), (o), (v), (c)) 281 282#define bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \ 283 bus_space_copy_region_1((t), (h1), (o1), (h2), (o2), (c)) 284#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ 285 bus_space_copy_region_2((t), (h1), (o1), (h2), (o2), (c)) 286#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ 287 bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c)) 288 289 290#endif /* _FBSD_MACHINE_GENERIC_BUS_H_ */ 291