libmetal
Loading...
Searching...
No Matches
Data Structures | Macros | Functions
IO Interfaces

Data Structures

struct  metal_io_ops
 
struct  metal_io_region
 

Macros

#define metal_io_read8_explicit(_io, _ofs, _order)    metal_io_read((_io), (_ofs), (_order), 1)
 
#define metal_io_read8(_io, _ofs)    metal_io_read((_io), (_ofs), memory_order_seq_cst, 1)
 
#define metal_io_write8_explicit(_io, _ofs, _val, _order)    metal_io_write((_io), (_ofs), (_val), (_order), 1)
 
#define metal_io_write8(_io, _ofs, _val)    metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 1)
 
#define metal_io_read16_explicit(_io, _ofs, _order)    metal_io_read((_io), (_ofs), (_order), 2)
 
#define metal_io_read16(_io, _ofs)    metal_io_read((_io), (_ofs), memory_order_seq_cst, 2)
 
#define metal_io_write16_explicit(_io, _ofs, _val, _order)    metal_io_write((_io), (_ofs), (_val), (_order), 2)
 
#define metal_io_write16(_io, _ofs, _val)    metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 2)
 
#define metal_io_read32_explicit(_io, _ofs, _order)    metal_io_read((_io), (_ofs), (_order), 4)
 
#define metal_io_read32(_io, _ofs)    metal_io_read((_io), (_ofs), memory_order_seq_cst, 4)
 
#define metal_io_write32_explicit(_io, _ofs, _val, _order)    metal_io_write((_io), (_ofs), (_val), (_order), 4)
 
#define metal_io_write32(_io, _ofs, _val)    metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 4)
 
#define metal_io_read64_explicit(_io, _ofs, _order)    metal_io_read((_io), (_ofs), (_order), 8)
 
#define metal_io_read64(_io, _ofs)    metal_io_read((_io), (_ofs), memory_order_seq_cst, 8)
 
#define metal_io_write64_explicit(_io, _ofs, _val, _order)    metal_io_write((_io), (_ofs), (_val), (_order), 8)
 
#define metal_io_write64(_io, _ofs, _val)    metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 8)
 

Functions

void metal_io_init (struct metal_io_region *io, void *virt, const metal_phys_addr_t *physmap, size_t size, unsigned int page_shift, unsigned int mem_flags, const struct metal_io_ops *ops)
 Open a libmetal I/O region.
 
static void metal_io_finish (struct metal_io_region *io)
 Close a libmetal shared memory segment.
 
static size_t metal_io_region_size (struct metal_io_region *io)
 Get size of I/O region.
 
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.
 
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.
 
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.
 
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.
 
static void * metal_io_phys_to_virt (struct metal_io_region *io, metal_phys_addr_t phys)
 Convert a physical address to virtual address.
 
static metal_phys_addr_t metal_io_virt_to_phys (struct metal_io_region *io, void *virt)
 Convert a virtual address to physical address.
 
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.
 
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.
 
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.
 
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.
 
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.
 

Detailed Description

Macro Definition Documentation

◆ metal_io_read16

#define metal_io_read16 (   _io,
  _ofs 
)     metal_io_read((_io), (_ofs), memory_order_seq_cst, 2)

◆ metal_io_read16_explicit

#define metal_io_read16_explicit (   _io,
  _ofs,
  _order 
)     metal_io_read((_io), (_ofs), (_order), 2)

◆ metal_io_read32

#define metal_io_read32 (   _io,
  _ofs 
)     metal_io_read((_io), (_ofs), memory_order_seq_cst, 4)

◆ metal_io_read32_explicit

#define metal_io_read32_explicit (   _io,
  _ofs,
  _order 
)     metal_io_read((_io), (_ofs), (_order), 4)

◆ metal_io_read64

#define metal_io_read64 (   _io,
  _ofs 
)     metal_io_read((_io), (_ofs), memory_order_seq_cst, 8)

◆ metal_io_read64_explicit

#define metal_io_read64_explicit (   _io,
  _ofs,
  _order 
)     metal_io_read((_io), (_ofs), (_order), 8)

◆ metal_io_read8

#define metal_io_read8 (   _io,
  _ofs 
)     metal_io_read((_io), (_ofs), memory_order_seq_cst, 1)

◆ metal_io_read8_explicit

#define metal_io_read8_explicit (   _io,
  _ofs,
  _order 
)     metal_io_read((_io), (_ofs), (_order), 1)

◆ metal_io_write16

#define metal_io_write16 (   _io,
  _ofs,
  _val 
)     metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 2)

◆ metal_io_write16_explicit

#define metal_io_write16_explicit (   _io,
  _ofs,
  _val,
  _order 
)     metal_io_write((_io), (_ofs), (_val), (_order), 2)

◆ metal_io_write32

#define metal_io_write32 (   _io,
  _ofs,
  _val 
)     metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 4)

◆ metal_io_write32_explicit

#define metal_io_write32_explicit (   _io,
  _ofs,
  _val,
  _order 
)     metal_io_write((_io), (_ofs), (_val), (_order), 4)

◆ metal_io_write64

#define metal_io_write64 (   _io,
  _ofs,
  _val 
)     metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 8)

◆ metal_io_write64_explicit

#define metal_io_write64_explicit (   _io,
  _ofs,
  _val,
  _order 
)     metal_io_write((_io), (_ofs), (_val), (_order), 8)

◆ metal_io_write8

#define metal_io_write8 (   _io,
  _ofs,
  _val 
)     metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 1)

◆ metal_io_write8_explicit

#define metal_io_write8_explicit (   _io,
  _ofs,
  _val,
  _order 
)     metal_io_write((_io), (_ofs), (_val), (_order), 1)

Function Documentation

◆ metal_io_block_read()

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.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into I/O region.
[in]dstdestination to store the read data.
[in]lenlength in bytes to read.
Returns
On success, number of bytes read. On failure, negative value

◆ metal_io_block_set()

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.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into I/O region.
[in]valuevalue to fill into the block
[in]lenlength in bytes to fill.
Returns
On success, number of bytes filled. On failure, negative value

◆ metal_io_block_write()

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.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into I/O region.
[in]srcsource to write.
[in]lenlength in bytes to write.
Returns
On success, number of bytes written. On failure, negative value

◆ metal_io_finish()

static void metal_io_finish ( struct metal_io_region io)
inlinestatic

Close a libmetal shared memory segment.

Parameters
[in]ioI/O region handle.

◆ metal_io_init()

void metal_io_init ( struct metal_io_region io,
void *  virt,
const metal_phys_addr_t physmap,
size_t  size,
unsigned int  page_shift,
unsigned int  mem_flags,
const struct metal_io_ops ops 
)

Open a libmetal I/O region.

Parameters
[in,out]ioI/O region handle.
[in]virtVirtual address of region.
[in]physmapArray of physical addresses per page.
[in]sizeSize of region.
[in]page_shiftLog2 of page size (-1 for single page).
[in]mem_flagsMemory flags
[in]opsops

◆ metal_io_phys()

static metal_phys_addr_t metal_io_phys ( struct metal_io_region io,
unsigned long  offset 
)
inlinestatic

Get physical address for a given offset into the I/O region.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into shared memory segment.
Returns
METAL_BAD_PHYS if offset is out of range, or physical address of offset.

◆ metal_io_phys_to_offset()

static unsigned long metal_io_phys_to_offset ( struct metal_io_region io,
metal_phys_addr_t  phys 
)
inlinestatic

Convert a physical address to offset within I/O region.

Parameters
[in]ioI/O region handle.
[in]physPhysical address within segment.
Returns
METAL_BAD_OFFSET if out of range, or offset.

◆ metal_io_phys_to_virt()

static void * metal_io_phys_to_virt ( struct metal_io_region io,
metal_phys_addr_t  phys 
)
inlinestatic

Convert a physical address to virtual address.

Parameters
[in]ioShared memory segment handle.
[in]physPhysical address within segment.
Returns
NULL if out of range, or corresponding virtual address.

◆ metal_io_read()

static uint64_t metal_io_read ( struct metal_io_region io,
unsigned long  offset,
memory_order  order,
int  width 
)
inlinestatic

Read a value from an I/O region.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into I/O region.
[in]orderMemory ordering.
[in]widthWidth in bytes of datatype to read. This must be 1, 2, 4, or 8, and a compile time constant for this function to inline cleanly.
Returns
Value.

◆ metal_io_region_size()

static size_t metal_io_region_size ( struct metal_io_region io)
inlinestatic

Get size of I/O region.

Parameters
[in]ioI/O region handle.
Returns
Size of I/O region.

◆ metal_io_virt()

static void * metal_io_virt ( struct metal_io_region io,
unsigned long  offset 
)
inlinestatic

Get virtual address for a given offset into the I/O region.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into shared memory segment.
Returns
NULL if offset is out of range, or pointer to offset.

◆ metal_io_virt_to_offset()

static unsigned long metal_io_virt_to_offset ( struct metal_io_region io,
void *  virt 
)
inlinestatic

Convert a virtual address to offset within I/O region.

Parameters
[in]ioI/O region handle.
[in]virtVirtual address within segment.
Returns
METAL_BAD_OFFSET if out of range, or offset.

◆ metal_io_virt_to_phys()

static metal_phys_addr_t metal_io_virt_to_phys ( struct metal_io_region io,
void *  virt 
)
inlinestatic

Convert a virtual address to physical address.

Parameters
[in]ioShared memory segment handle.
[in]virtVirtual address within segment.
Returns
METAL_BAD_PHYS if out of range, or corresponding physical address.

◆ metal_io_write()

static void metal_io_write ( struct metal_io_region io,
unsigned long  offset,
uint64_t  value,
memory_order  order,
int  width 
)
inlinestatic

Write a value into an I/O region.

Parameters
[in]ioI/O region handle.
[in]offsetOffset into I/O region.
[in]valueValue to write.
[in]orderMemory ordering.
[in]widthWidth in bytes of datatype to read. This must be 1, 2, 4, or 8, and a compile time constant for this function to inline cleanly.