Class ToHostBuffer

Inheritance Relationships

Derived Types

Class Documentation

class ToHostBuffer

Abstract class representing a ToHost DMA buffer. The elinks enabled for the corresponding DMA buffers are read from the device in the constructors.

Subclassed by FileToHostBuffer, FlxToHostBuffer

Public Functions

ToHostBuffer(int dmaid, std::shared_ptr<Device> d)
inline void irq_data_enable()

enable on_data interrupt for this DMA buffer.

inline void irq_data_disable()

disable on_data interrupt for this DMA buffer.

inline void irq_busy_enable()

enable busy interrupt for this DMA buffer.

inline void irq_busy_disable()

disable busy interrupt for this DMA buffer.

inline std::shared_ptr<Device> get_device()
Returns:

a shared pointer to the device serving this DMA buffer.

inline int get_dmaid() const
Returns:

identifying number of this DMA buffer.

inline std::vector<Elink> get_elinks()
Returns:

read e-links enabled for this DMA buffer.

Parameters:

t -- the e-link type, determined from the encoding.

Returns:

read e-links enabled for this DMA buffer of a given type.

Parameters:

t -- the e-link type, determined from the encoding.

Returns:

fraction of e-links enabled for this DMA buffer of a given type.

virtual void allocate_buffer(size_t size, const std::string &name, bool vmem, bool free_previous_cmem = true) = 0

fraction of e-links enabled for this DMA buffer of a given type.

Parameters:
  • name -- of the buffers passed to the CMEM driver.

  • vmem -- if true, do not use CMEM but malloc a buffer in memory.

  • free_previous_cmem -- if true, re-claim a buffer with the same name if present and not locked.

virtual void dma_start_continuous() = 0

inform the FELIX card of the allocated buffer, to be used as a circular DMA buffer.

virtual void dma_wait_for_data_irq() = 0

wait for an on-data MSI-X interrupt.

virtual size_t dma_bytes_available() = 0
Returns:

number of bytes written by firmware, to be read by software.

virtual size_t dma_bytes_available_nowrap() = 0
Returns:

number of bytes written by firmware up to the end of the buffer, to be read by software.

virtual bool dma_is_full() = 0
Returns:

true if the DMA buffer is full.

virtual uint64_t dma_get_write_ptr() = 0
Returns:

address in virtual memory of write pointer (moved by firmware).

virtual uint64_t dma_get_read_ptr() = 0
Returns:

address in virtual memory of read pointer (moved by software).

virtual void dma_set_read_ptr_vaddr(uint64_t v_addr) = 0

set a new read pointer.

software uses the virtual addresses, firmware uses the physical ones.

Parameters:

v_addr -- virtual address of new read pointer.

virtual void dma_set_read_ptr_paddr(uint64_t p_addr) = 0

set a new read pointer.

software uses the virtual addresses, firmware uses the physical ones.

Parameters:

p_addr -- physical address of new read pointer.

virtual uint64_t dma_get_read_offset() = 0
Returns:

read pointer offset with respect to the start of buffer.

virtual uint64_t dma_get_write_offset() = 0
Returns:

write pointer offset with respect to the start of buffer.

virtual void dma_advance_read_ptr(size_t bytes) = 0

advance read pointer.

Parameters:

bytes -- number of bytes processed by software.

inline uint64_t dma_get_vaddr()
Returns:

virtual address of start of buffer.

inline size_t dma_get_size()
Returns:

buffer size.

uint32_t reader_register(bool zc_flag)

register a new reader to this DMA buffer.

Parameters:

zc_flag -- true if the reader uses zero-copy.

Returns:

reader identifier.

bool reader_is_data_available(uint32_t reader_id)
Parameters:

reader_id -- reader identifier.

Returns:

whether there are data in the DMA buffer for this reader to read.

size_t reader_get_available_bytes(uint32_t reader_id)
Parameters:

reader_id -- reader identifier.

Returns:

bytes available for reading for the given reader.

std::span<Block> reader_get_available_blocks(uint32_t reader_id)
Parameters:

reader_id -- reader identifier.

Returns:

blocks to be read by the given reader.

void reader_advance_read_ptr(uint32_t reader_id, uint32_t read_bytes, uint32_t sent_bytes)

advance the DMA buffer read pointer according to the readers' progress

single synchronisation point of the different ToHostReaders.

Parameters:
  • reader_id -- reader identifier.

  • read_bytes -- bytes read by the reader.

  • reader_id -- bytes sent by the reader (sent != read only in zero-copy mode).

inline bool has_zero_copy_reader() const
Returns:

whether a zero-copy reader is present among those registered to this buffer.

inline void set_zero_copy_reader()

set flag for the presence of a zero-copy reader.

inline void stop()

stop reading operations.

inline bool is_stopped() const
Returns:

whether read operations have been stopped.

uint32_t dma_get_free_MB()
Returns:

free space in the buffer in MB.

inline void dma_increase_irq_counter()

increase the on-data interrupt counter.

inline uint64_t dma_get_irq_counter() const
Returns:

the number of on-data interrupts.

Protected Functions

inline size_t dma_compute_bytes_to_read(uint64_t rd_ptr, uint64_t wr_ptr, bool even)

Protected Attributes

int m_dmaid
std::shared_ptr<Device> m_device
unsigned int m_block_size
int m_irq_on_data
uint64_t m_irq_counter
size_t m_size
bool m_stop_flag
bool m_has_zero_copy_reader
size_t m_min_bytes_sent
std::mutex m_mutex
std::unique_ptr<DmaBuffer> m_buffer
std::vector<uint64_t> m_bytes_read
std::vector<uint64_t> m_bytes_sent