Go to the documentation of this file.
12 #ifndef __METAL_IO__H__
13 #define __METAL_IO__H__
19 #include <metal/assert.h>
20 #include <metal/compiler.h>
21 #include <metal/atomic.h>
22 #include <metal/sys.h>
23 #include <metal/cpu.h>
33 #define NO_ATOMIC_64_SUPPORT
95 unsigned page_shift,
unsigned int mem_flags,
106 memset(io, 0,
sizeof(*io));
130 ? (uint8_t *)io->
virt + offset
140 static inline unsigned long
143 size_t offset = (uint8_t *)virt - (uint8_t *)io->
virt;
158 sizeof(offset) * CHAR_BIT ?
160 return (io->
physmap != NULL && offset <= io->size
171 static inline unsigned long
174 unsigned long offset =
181 }
while (offset < io->size);
220 static inline uint64_t
227 return (*io->
ops.
read)(io, offset, order, width);
237 #ifndef NO_ATOMIC_64_SUPPORT
263 (*io->
ops.
write)(io, offset, value, order, width);
273 #ifndef NO_ATOMIC_64_SUPPORT
282 #define metal_io_read8_explicit(_io, _ofs, _order) \
283 metal_io_read((_io), (_ofs), (_order), 1)
284 #define metal_io_read8(_io, _ofs) \
285 metal_io_read((_io), (_ofs), memory_order_seq_cst, 1)
286 #define metal_io_write8_explicit(_io, _ofs, _val, _order) \
287 metal_io_write((_io), (_ofs), (_val), (_order), 1)
288 #define metal_io_write8(_io, _ofs, _val) \
289 metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 1)
291 #define metal_io_read16_explicit(_io, _ofs, _order) \
292 metal_io_read((_io), (_ofs), (_order), 2)
293 #define metal_io_read16(_io, _ofs) \
294 metal_io_read((_io), (_ofs), memory_order_seq_cst, 2)
295 #define metal_io_write16_explicit(_io, _ofs, _val, _order) \
296 metal_io_write((_io), (_ofs), (_val), (_order), 2)
297 #define metal_io_write16(_io, _ofs, _val) \
298 metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 2)
300 #define metal_io_read32_explicit(_io, _ofs, _order) \
301 metal_io_read((_io), (_ofs), (_order), 4)
302 #define metal_io_read32(_io, _ofs) \
303 metal_io_read((_io), (_ofs), memory_order_seq_cst, 4)
304 #define metal_io_write32_explicit(_io, _ofs, _val, _order) \
305 metal_io_write((_io), (_ofs), (_val), (_order), 4)
306 #define metal_io_write32(_io, _ofs, _val) \
307 metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 4)
309 #define metal_io_read64_explicit(_io, _ofs, _order) \
310 metal_io_read((_io), (_ofs), (_order), 8)
311 #define metal_io_read64(_io, _ofs) \
312 metal_io_read((_io), (_ofs), memory_order_seq_cst, 8)
313 #define metal_io_write64_explicit(_io, _ofs, _val, _order) \
314 metal_io_write((_io), (_ofs), (_val), (_order), 8)
315 #define metal_io_write64(_io, _ofs, _val) \
316 metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 8)
349 unsigned char value,
int len);
351 #include <metal/system/@PROJECT_SYSTEM@/io.h>
static unsigned long metal_io_virt_to_offset(struct metal_io_region *io, void *virt)
Convert a virtual address to offset within I/O region.
Definition: io.h:141
unsigned char atomic_uchar
Definition: atomic.h:21
#define atomic_store_explicit(OBJ, VAL, MO)
Definition: atomic.h:57
static metal_phys_addr_t metal_io_phys(struct metal_io_region *io, unsigned long offset)
Get physical address for a given offset into the I/O region.
Definition: io.h:155
static void * metal_io_virt(struct metal_io_region *io, unsigned long offset)
Get virtual address for a given offset into the I/O region.
Definition: io.h:127
static metal_phys_addr_t metal_io_virt_to_phys(struct metal_io_region *io, void *virt)
Convert a virtual address to physical address.
Definition: io.h:205
#define atomic_load_explicit(OBJ, MO)
Definition: atomic.h:61
static size_t metal_io_region_size(struct metal_io_region *io)
Get size of I/O region.
Definition: io.h:115
unsigned short atomic_ushort
Definition: atomic.h:23
unsigned int atomic_uint
Definition: atomic.h:25
#define metal_assert(cond)
Assertion macro.
Definition: assert.h:21
int metal_io_block_write(struct metal_io_region *io, unsigned long offset, const void *restrict src, int len)
Write a block into an I/O region.
Definition: io.c:69
static void * metal_io_phys_to_virt(struct metal_io_region *io, metal_phys_addr_t phys)
Convert a physical address to virtual address.
Definition: io.h:192
static unsigned long metal_io_phys_to_offset(struct metal_io_region *io, metal_phys_addr_t phys)
Convert a physical address to offset within I/O region.
Definition: io.h:172
#define METAL_BAD_VA
Definition: sys.h:41
int metal_io_block_read(struct metal_io_region *io, unsigned long offset, void *restrict dst, int len)
Read a block from an I/O region.
Definition: io.c:33
#define METAL_BAD_OFFSET
Definition: sys.h:35
static uint64_t metal_processor_io_read64(void *ptr, memory_order order)
Definition: cpu.h:31
unsigned long atomic_ulong
Definition: atomic.h:27
static void metal_io_write(struct metal_io_region *io, unsigned long offset, uint64_t value, memory_order order, int width)
Write a value into an I/O region.
Definition: io.h:258
unsigned long long atomic_ullong
Definition: atomic.h:29
memory_order
Definition: atomic.h:34
void metal_io_init(struct metal_io_region *io, void *virt, const metal_phys_addr_t *physmap, size_t size, unsigned page_shift, unsigned int mem_flags, const struct metal_io_ops *ops)
Open a libmetal I/O region.
Definition: io.c:12
static void metal_processor_io_write64(void *ptr, uint64_t value, memory_order order)
Definition: cpu.h:20
#define restrict
Definition: compiler.h:19
int metal_io_block_set(struct metal_io_region *io, unsigned long offset, unsigned char value, int len)
fill a block of an I/O region.
Definition: io.c:105
static uint64_t metal_io_read(struct metal_io_region *io, unsigned long offset, memory_order order, int width)
Read a value from an I/O region.
Definition: io.h:221
unsigned long metal_phys_addr_t
Definition: sys.h:29
static void metal_io_finish(struct metal_io_region *io)
Close a libmetal shared memory segment.
Definition: io.h:102
#define METAL_BAD_PHYS
Definition: sys.h:38