## openenoc_endpoint_interface_top address map - Absolute Address: 0x0 - Base Offset: 0x0 - Size: 0xC0

Control and status address map for an openENOC Endpoint Interface instance.

|Offset| Identifier | Name | |------|---------------------------|---------------------------| | 0x0 |openenoc_endpoint_interface|openenoc_endpoint_interface| ## openenoc_endpoint_interface register file - Absolute Address: 0x0 - Base Offset: 0x0 - Size: 0xC0

Control and status register file for an openENOC Endpoint Interface instance.

|Offset| Identifier | Name | |------|------------|----------------------------------------| | 0x00 | info | openenoc_endpoint_interface.info | | 0x20 | conf | openenoc_endpoint_interface.conf | | 0x40 | axis_if | openenoc_endpoint_interface.axis_if | | 0x60 |non_oetp_dma|openenoc_endpoint_interface.non_oetp_dma| | 0x80 | irq | openenoc_endpoint_interface.irq | | 0xA0 | peers | openenoc_endpoint_interface.peers | | 0xBC | rmem | openenoc_endpoint_interface.rmem | ### info register - Absolute Address: 0x0 - Base Offset: 0x0 - Size: 0x8

Read-only information register for this openENOC Endpoint Interface instance.

| Bits| Identifier |Access| Reset| Name | |-----|------------------------|------|------|----------------------------------------------------------------| | 31:0| rmem_total_depth | r | 0x1 | openenoc_endpoint_interface.info.rmem_total_depth[31:0] | |42:32| num_of_peers | r | 0x1 | openenoc_endpoint_interface.info.num_of_peers[42:32] | | 43 | peer_dma_supported | r | 0x1 | openenoc_endpoint_interface.info.peer_dma_supported | | 44 | non_oetp_dma_supported | r | 0x1 | openenoc_endpoint_interface.info.non_oetp_dma_supported | | 45 | direct_axis_supported | r | 0x1 | openenoc_endpoint_interface.info.direct_axis_supported | | 46 | rmem_supported | r | 0x1 | openenoc_endpoint_interface.info.rmem_supported | | 47 | irq_supported | r | 0x1 | openenoc_endpoint_interface.info.irq_supported | |63:48|max_dma_frame_size_bytes| r |0x2000|openenoc_endpoint_interface.info.max_dma_frame_size_bytes[63:48]| #### rmem_total_depth field

Total depth of the shared memory region for all remote peers. This field reflects the RMEM_TOTAL_DEPTH parameter value.

#### num_of_peers field

Number of remote peers supported by this openENOC Endpoint Interface instance, from 0 to 2047. This field reflects the NUM_OF_PEERS parameter value.

#### peer_dma_supported field

Indicates whether DMA transfers associated with configured remote peers are supported.

#### non_oetp_dma_supported field

Indicates whether endpoint-level DMA transfers of complete non-oETP Ethernet frames are supported.

#### direct_axis_supported field

Indicates whether direct CSR-driven AXI4-Stream access is supported for non-oETP Ethernet frames.

#### rmem_supported field

Indicates whether the transparent Remote Memory (RMEM) interface is supported.

#### irq_supported field

Indicates whether the endpoint interrupt output and interrupt-control logic are implemented.

#### max_dma_frame_size_bytes field

Synthesis-time maximum Ethernet frame size in bytes, excluding FCS. This field reflects the MAX_RAW_FRAME_SIZE parameter value and bounds raw non-oETP DMA frames. The peer DMA memory-fragment ceiling is 4 * floor((MAX_RAW_FRAME_SIZE - 32) / 4), accounting for the Ethernet header, oETP write metadata, data-word padding and EndOfData. An 8192-byte frame limit permits 8160-byte memory fragments. A value of zero indicates that DMA is not supported.

## conf register file - Absolute Address: 0x20 - Base Offset: 0x20 - Size: 0x20

Configuration register file for this openENOC Endpoint Interface instance.

|Offset| Identifier | Name | |------|---------------------|------------------------------------------------------| | 0x00 | mac_address | openenoc_endpoint_interface.conf.mac_address | | 0x08 | multicast_address | openenoc_endpoint_interface.conf.multicast_address | | 0x10 | non_oetp_control | openenoc_endpoint_interface.conf.non_oetp_control | | 0x14 | rmem_timeout | openenoc_endpoint_interface.conf.rmem_timeout | | 0x18 | dma_timeout | openenoc_endpoint_interface.conf.dma_timeout | | 0x1C |dma_max_fragment_size|openenoc_endpoint_interface.conf.dma_max_fragment_size| ### mac_address register - Absolute Address: 0x20 - Base Offset: 0x0 - Size: 0x8

Local endpoint 48-bit unicast MAC address. The oETP engine uses this address as its source MAC and compares individual-addressed incoming oETP frames against it. The I/G bit in the first MAC octet must be zero. Group-addressed oETP frames are compared against conf.multicast_address instead.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|-----------------------------------------------------------| | 31:0| lo_word | rw | 0x0 | openenoc_endpoint_interface.conf.mac_address.lo_word[31:0]| |47:32| hi_word | rw | 0x0 |openenoc_endpoint_interface.conf.mac_address.hi_word[47:32]| #### lo_word field

Lower 32 bits [31:0] of the 48-bit MAC address.

#### hi_word field

Upper 16 bits [47:32] of the 48-bit MAC address.

### multicast_address register - Absolute Address: 0x28 - Base Offset: 0x8 - Size: 0x8

Local endpoint 48-bit multicast destination MAC address. For an incoming oETP frame whose destination I/G bit is one, the engine accepts the destination only when it exactly matches this address. All slave endpoints in a replication group use the same value. This address is not used as a source MAC. Zero is the reset value and matches no group-addressed destination, disabling oETP group reception. Broadcast is accepted only when this address is all ones. This field does not change the separate non-oETP receive-mode policy.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|-----------------------------------------------------------------| | 31:0| lo_word | rw | 0x0 | openenoc_endpoint_interface.conf.multicast_address.lo_word[31:0]| |47:32| hi_word | rw | 0x0 |openenoc_endpoint_interface.conf.multicast_address.hi_word[47:32]| #### lo_word field

Lower 32 bits [31:0] of the 48-bit multicast MAC address.

#### hi_word field

Upper 16 bits [47:32] of the 48-bit multicast MAC address.

### non_oetp_control register - Absolute Address: 0x30 - Base Offset: 0x10 - Size: 0x4

Receive policy for Ethernet frames that do not carry oETP traffic.

|Bits| Identifier |Access|Reset| Name | |----|------------|------|-----|-------------------------------------------------------------------| | 1:0|receive_mode| rw | 0x1 |openenoc_endpoint_interface.conf.non_oetp_control.receive_mode[1:0]| #### receive_mode field

Receive mode for non-oETP Ethernet frames:

An accepted frame is directed to the non-oETP RX DMA channel when that channel is armed; otherwise it is directed to the CSR AXI4-Stream sink.

### rmem_timeout register - Absolute Address: 0x34 - Base Offset: 0x14 - Size: 0x4

Timeout configuration for transparent RMEM operations.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|----------------------------------------------------------| |31:0| cycles | rw | 0x0 |openenoc_endpoint_interface.conf.rmem_timeout.cycles[31:0]| #### cycles field

Maximum wait for an RMEM response in endpoint clock cycles. Zero disables the timeout and permits an indefinite response wait. Hardware samples this value when it accepts an RMEM operation; subsequent writes apply to later operations. The response timer starts after the complete request frame has been accepted by the Ethernet-facing transmit stream and runs until the complete matching response is received and validated through Ethernet TLAST. RX backpressure counts toward the timeout; remaining local memory completion does not. A valid response completing on the expiry edge takes priority, including a valid ERROR_RSP with its reported cause. Hardware does not retry; timeout handling and retry policy belong to software. Multicast writes do not wait for a response and do not use this response timeout. An RMEM read timeout terminates the access with all-ones read data and read ACK; a write timeout terminates with write ACK. The external-RMEM boundary uses no ERR signals. Failures set error and error_code in the associated peers.entry[].dma register and may generate a separate RMEM_ERROR IRQ event.

### dma_timeout register - Absolute Address: 0x38 - Base Offset: 0x18 - Size: 0x4

Common response timeout for locally initiated unicast peer DMA fragments.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|---------------------------------------------------------| |31:0| cycles | rw | 0x0 |openenoc_endpoint_interface.conf.dma_timeout.cycles[31:0]| #### cycles field

Maximum wait for a response to one peer DMA fragment, in endpoint clock cycles. This value is shared by all peers. Zero disables the timeout and permits an indefinite response wait. Hardware samples this value when the oETP engine accepts the fragment request; later writes apply to later fragments. The response timer starts after the complete request frame has been accepted by the Ethernet-facing transmit stream and runs until the complete matching response is received and validated through Ethernet TLAST, including EndOfData where present. RX backpressure counts toward the timeout; remaining local memory completion does not. A valid response completing on the expiry edge takes priority, including a valid ERROR_RSP with its reported cause. On expiry, hardware aborts the remaining fragments of that DMA transfer and reports error code 8 (timeout) in the peer DMA status. Hardware does not retry; software decides whether to start another transfer. This timeout does not apply to multicast writes, non-oETP DMA, or transparent RMEM operations.

### dma_max_fragment_size register - Absolute Address: 0x3C - Base Offset: 0x1C - Size: 0x4

Common software-selected maximum memory fragment size for locally initiated peer DMA transfers. The synthesis-time frame limit remains fixed.

|Bits|Identifier|Access| Reset| Name | |----|----------|------|------|------------------------------------------------------------------| |31:0| bytes | rw |0x1FE0|openenoc_endpoint_interface.conf.dma_max_fragment_size.bytes[31:0]| #### bytes field

Maximum meaningful memory bytes in one locally initiated DMA fragment, excluding Ethernet/oETP headers, word padding, EndOfData and FCS. The hardware rounds the written value down to a multiple of four before validating it. The effective MFS must be at least four bytes and at most 4 * floor((MAX_RAW_FRAME_SIZE - 32) / 4). With an 8192-byte frame ceiling, the effective range is 4 through 8160 bytes in steps of four, with reset value 8160. For example, 31 selects 28, 7 selects 4, and 8161 through 8163 select 8160. Hardware snapshots the effective value when it accepts the whole peer DMA transfer; later writes apply only to subsequent transfers. The final fragment uses the exact remaining byte length and may be shorter than four bytes. A written value of 0 through 3, or a rounded value above the synthesized ceiling, rejects a new transfer with local error code 1 before issuing any memory or protocol operation. The CSR retains the unrounded written value. This setting does not restrict received peer requests, which use the synthesized fragment ceiling, and does not affect RMEM, direct CSR streams or non-oETP DMA.

## axis_if register file - Absolute Address: 0x40 - Base Offset: 0x40 - Size: 0x1C

Register file for the AXI4-Stream source and sink interfaces.

|Offset|Identifier| Name | |------|----------|------------------------------------------| | 0x00 | source |openenoc_endpoint_interface.axis_if.source| | 0x10 | sink | openenoc_endpoint_interface.axis_if.sink | ## source register file - Absolute Address: 0x40 - Base Offset: 0x0 - Size: 0xC

Register file for the AXI4-Stream source interface.

|Offset|Identifier| Name | |------|----------|--------------------------------------------------| | 0x0 | data | openenoc_endpoint_interface.axis_if.source.data | | 0x4 | control |openenoc_endpoint_interface.axis_if.source.control| | 0x8 | status | openenoc_endpoint_interface.axis_if.source.status| ### data register - Absolute Address: 0x40 - Base Offset: 0x0 - Size: 0x4

Data register for the AXI4-Stream source interface.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|-----------------------------------------------------------| |31:0| tdata | rw | 0x0 |openenoc_endpoint_interface.axis_if.source.data.tdata[31:0]| #### tdata field

32-bit data value for the AXI4-Stream source interface.

### control register - Absolute Address: 0x44 - Base Offset: 0x4 - Size: 0x4

Control register for the AXI4-Stream source interface.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|-------------------------------------------------------------| | 0 | tvalid | rw | 0x0 | openenoc_endpoint_interface.axis_if.source.control.tvalid | | 8 | tlast | rw | 0x0 | openenoc_endpoint_interface.axis_if.source.control.tlast | |19:16| tkeep | rw | 0x0 |openenoc_endpoint_interface.axis_if.source.control.tkeep[3:0]| #### tvalid field

Indicates that the AXI4-Stream source interface has valid data to send. Once asserted by software, the field remains asserted until the transfer is accepted by the destination.

#### tlast field

Indicates the last data word of a frame on the AXI4-Stream source interface.

#### tkeep field

Indicates which byte lanes contain valid data on the AXI4-Stream source interface.

### status register - Absolute Address: 0x48 - Base Offset: 0x8 - Size: 0x4

Status register for the AXI4-Stream source interface.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|--------------------------------------------------------| | 0 | tready | r | 0x0 |openenoc_endpoint_interface.axis_if.source.status.tready| #### tready field

Registered readiness at the input of the direct TX AXI4-Stream register slice. With the non_oetp_direct_tx_complete event disabled, follows downstream backpressure through the slice's registered READY path; CSR acknowledgements and frame boundaries do not force it low. With the event enabled, additionally requires frame admission, which reserves space for the TX completion event. Acceptance of the final word (tlast) into the slice deasserts this field until the next frame receives admission. Writing the first word and setting source.control.tvalid requests admission even while this field is low. The active frame retains its admission decision if event_enable changes. Software must retain data, KEEP and LAST until source.control.tvalid is cleared by hardware, independently of this readiness status.

## sink register file - Absolute Address: 0x50 - Base Offset: 0x10 - Size: 0xC

Register file for the AXI4-Stream sink interface.

|Offset|Identifier| Name | |------|----------|------------------------------------------------| | 0x0 | data | openenoc_endpoint_interface.axis_if.sink.data | | 0x4 | control |openenoc_endpoint_interface.axis_if.sink.control| | 0x8 | status | openenoc_endpoint_interface.axis_if.sink.status| ### data register - Absolute Address: 0x50 - Base Offset: 0x0 - Size: 0x4

Data register for the AXI4-Stream sink interface.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|---------------------------------------------------------| |31:0| tdata | r | — |openenoc_endpoint_interface.axis_if.sink.data.tdata[31:0]| #### tdata field

32-bit data value for the AXI4-Stream sink interface.

### control register - Absolute Address: 0x54 - Base Offset: 0x4 - Size: 0x4

Control register for the AXI4-Stream sink interface.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|-------------------------------------------------------| | 0 | tready | rw | 0x0 |openenoc_endpoint_interface.axis_if.sink.control.tready| #### tready field

Indicates that the AXI4-Stream sink interface is ready to accept a data transfer. Once asserted by software, the field remains asserted until a transfer occurs.

### status register - Absolute Address: 0x58 - Base Offset: 0x8 - Size: 0x4

Status register for the AXI4-Stream sink interface.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|----------------------------------------------------------| | 0 | tvalid | r | — | openenoc_endpoint_interface.axis_if.sink.status.tvalid | | 8 | tlast | r | — | openenoc_endpoint_interface.axis_if.sink.status.tlast | |19:16| tkeep | r | — |openenoc_endpoint_interface.axis_if.sink.status.tkeep[3:0]| #### tvalid field

Indicates that the AXI4-Stream sink interface has valid data to receive.

#### tlast field

Indicates the last data word of a frame on the AXI4-Stream sink interface.

#### tkeep field

Indicates which byte lanes contain valid data on the AXI4-Stream sink interface.

## non_oetp_dma register file - Absolute Address: 0x60 - Base Offset: 0x60 - Size: 0x20

Endpoint-level DMA control and status for complete non-oETP Ethernet frames. Frame data includes the Ethernet header and payload, but excludes the preamble, Start Frame Delimiter (SFD), and Frame Check Sequence (FCS).

|Offset|Identifier| Name | |------|----------|-------------------------------------------| | 0x00 | tx |openenoc_endpoint_interface.non_oetp_dma.tx| | 0x10 | rx |openenoc_endpoint_interface.non_oetp_dma.rx| ## tx register file - Absolute Address: 0x60 - Base Offset: 0x0 - Size: 0x10

Transmit DMA channel for complete non-oETP Ethernet frames.

|Offset| Identifier | Name | |------|------------------|--------------------------------------------------------------| | 0x0 | buffer_address | openenoc_endpoint_interface.non_oetp_dma.tx.buffer_address | | 0x4 | frame_length | openenoc_endpoint_interface.non_oetp_dma.tx.frame_length | | 0x8 | command_status | openenoc_endpoint_interface.non_oetp_dma.tx.command_status | | 0xC |transferred_length|openenoc_endpoint_interface.non_oetp_dma.tx.transferred_length| ### buffer_address register - Absolute Address: 0x60 - Base Offset: 0x0 - Size: 0x4

Local memory address of the non-oETP Ethernet frame to transmit.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|---------------------------------------------------------------------| |31:0| base | rw | 0x0 |openenoc_endpoint_interface.non_oetp_dma.tx.buffer_address.base[31:0]| #### base field

32-bit byte address of the first byte of the transmit buffer.

### frame_length register - Absolute Address: 0x64 - Base Offset: 0x4 - Size: 0x4

Length of the complete non-oETP Ethernet frame to transmit.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|--------------------------------------------------------------------| |31:0| bytes | rw | 0x0 |openenoc_endpoint_interface.non_oetp_dma.tx.frame_length.bytes[31:0]| #### bytes field

Frame length in bytes. Valid non-zero values shall not exceed info.max_dma_frame_size_bytes.

### command_status register - Absolute Address: 0x68 - Base Offset: 0x8 - Size: 0x4

Command and completion status for the non-oETP transmit DMA channel.

| Bits| Identifier |Access|Reset| Name | |-----|------------|------|-----|----------------------------------------------------------------------------| | 8 | request | rw | 0x0 | openenoc_endpoint_interface.non_oetp_dma.tx.command_status.request | | 9 |clear_errors| rw | 0x0 | openenoc_endpoint_interface.non_oetp_dma.tx.command_status.clear_errors | | 16 | idle | r | — | openenoc_endpoint_interface.non_oetp_dma.tx.command_status.idle | | 24 | done | r | — | openenoc_endpoint_interface.non_oetp_dma.tx.command_status.done | | 25 | error | r | — | openenoc_endpoint_interface.non_oetp_dma.tx.command_status.error | |31:28| error_code | r | — |openenoc_endpoint_interface.non_oetp_dma.tx.command_status.error_code[31:28]| #### request field

Writing one requests transmission of the configured frame. The field remains asserted until the DMA engine accepts the request. Hardware clears it upon acceptance; while the channel is busy, a newly asserted request remains pending. Software or an RTL controller shall read the completion status and transferred length of the previous request before asserting this field for the next request.

#### clear_errors field

Writing one clears this channel's error flag and error code. Hardware clears the command after accepting it. The command does not abort an active transfer, clear done or transferred length, or complete an IRQ claim. A new failure takes precedence over a simultaneous clear. Starting or successfully completing a transfer preserves a recorded error.

#### idle field

Indicates that the channel has no accepted transfer in progress. Hardware deasserts this field when a request is accepted and asserts it when the transfer completes.

#### done field

Sticky successful-completion flag. Hardware sets this field after the accepted transfer completes successfully and clears it when the next request is accepted.

#### error field

Sticky error-completion flag. Hardware sets this field when an accepted transfer fails. Only command_status.clear_errors or endpoint reset clears it; starting or successfully completing another transfer preserves a recorded error.

#### error_code field

Sticky error code for the most recent transmit failure:

These errors describe local non-oETP DMA work. Only command_status.clear_errors or endpoint reset clears this field. A new failure replaces the code and takes precedence over a simultaneous clear; successful transfers preserve the previous failure.

### transferred_length register - Absolute Address: 0x6C - Base Offset: 0xC - Size: 0x4

Number of bytes transferred for the most recently accepted transmit request.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|--------------------------------------------------------------------------| |31:0| bytes | r | — |openenoc_endpoint_interface.non_oetp_dma.tx.transferred_length.bytes[31:0]| #### bytes field

Actual number of bytes transferred. Hardware clears this field when the next request is accepted.

## rx register file - Absolute Address: 0x70 - Base Offset: 0x10 - Size: 0x10

Receive DMA channel for complete non-oETP Ethernet frames.

|Offset| Identifier | Name | |------|---------------|-----------------------------------------------------------| | 0x0 | buffer_address| openenoc_endpoint_interface.non_oetp_dma.rx.buffer_address| | 0x4 |buffer_capacity|openenoc_endpoint_interface.non_oetp_dma.rx.buffer_capacity| | 0x8 | command_status| openenoc_endpoint_interface.non_oetp_dma.rx.command_status| | 0xC |received_length|openenoc_endpoint_interface.non_oetp_dma.rx.received_length| ### buffer_address register - Absolute Address: 0x70 - Base Offset: 0x0 - Size: 0x4

Local memory address of the receive buffer for a non-oETP Ethernet frame.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|---------------------------------------------------------------------| |31:0| base | rw | 0x0 |openenoc_endpoint_interface.non_oetp_dma.rx.buffer_address.base[31:0]| #### base field

32-bit byte address of the first byte of the receive buffer.

### buffer_capacity register - Absolute Address: 0x74 - Base Offset: 0x4 - Size: 0x4

Capacity of the receive buffer for one complete non-oETP Ethernet frame.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|-----------------------------------------------------------------------| |31:0| bytes | rw | 0x0 |openenoc_endpoint_interface.non_oetp_dma.rx.buffer_capacity.bytes[31:0]| #### bytes field

Receive-buffer capacity in bytes. Valid non-zero values shall not exceed info.max_dma_frame_size_bytes.

### command_status register - Absolute Address: 0x78 - Base Offset: 0x8 - Size: 0x4

Command and completion status for the non-oETP receive DMA channel.

| Bits| Identifier |Access|Reset| Name | |-----|------------|------|-----|----------------------------------------------------------------------------| | 8 | request | rw | 0x0 | openenoc_endpoint_interface.non_oetp_dma.rx.command_status.request | | 9 |clear_errors| rw | 0x0 | openenoc_endpoint_interface.non_oetp_dma.rx.command_status.clear_errors | | 16 | idle | r | — | openenoc_endpoint_interface.non_oetp_dma.rx.command_status.idle | | 17 | armed | r | — | openenoc_endpoint_interface.non_oetp_dma.rx.command_status.armed | | 24 | done | r | — | openenoc_endpoint_interface.non_oetp_dma.rx.command_status.done | | 25 | error | r | — | openenoc_endpoint_interface.non_oetp_dma.rx.command_status.error | |31:28| error_code | r | — |openenoc_endpoint_interface.non_oetp_dma.rx.command_status.error_code[31:28]| #### request field

Writing one arms reception into the configured buffer. The field remains asserted until the DMA engine accepts the request. Hardware clears it upon acceptance; while the channel is busy, a newly asserted request remains pending. Software or an RTL controller shall read the completion status and received length of the previous request before asserting this field for the next request.

#### clear_errors field

Writing one clears this channel's error flag and error code. Hardware clears the command after accepting it. The command does not abort an active or armed receive, clear done or received length, or complete an IRQ claim. A new failure takes precedence over a simultaneous clear. Starting or successfully completing a transfer preserves a recorded error.

#### idle field

Indicates that the channel has no accepted receive request in progress. After acceptance, the channel may be armed and waiting for an eligible non-oETP frame or may be writing a received frame to memory.

#### armed field

Indicates that the accepted receive request is waiting for an eligible non-oETP Ethernet frame. Hardware sets this field when it accepts a request and clears it when the first beat of the selected frame is accepted by the RX DMA datapath. The frame-routing logic uses this field to select the RX DMA path; otherwise an accepted non-oETP frame is directed to the CSR AXI4-Stream sink.

#### done field

Sticky successful-completion flag. Hardware sets this field after a received frame has been written successfully and clears it when the next request is accepted.

#### error field

Sticky error-completion flag. Hardware sets this field when an accepted receive fails. Only command_status.clear_errors or endpoint reset clears it; starting or successfully completing another receive preserves a recorded error.

#### error_code field

Sticky error code for the most recent receive failure:

Only command_status.clear_errors or endpoint reset clears this field. A new failure replaces the code and takes precedence over a simultaneous clear; successful transfers preserve the previous failure.

### received_length register - Absolute Address: 0x7C - Base Offset: 0xC - Size: 0x4

Length of the most recently received non-oETP Ethernet frame.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|-----------------------------------------------------------------------| |31:0| bytes | r | — |openenoc_endpoint_interface.non_oetp_dma.rx.received_length.bytes[31:0]| #### bytes field

Actual number of frame bytes written to the receive buffer. Hardware clears this field when the next request is accepted.

## irq register file - Absolute Address: 0x80 - Base Offset: 0x80 - Size: 0x14

Endpoint-level interrupt control and claim interface. Interrupt events from peer DMA, non-oETP DMA, direct AXI4-Stream transfers, and RMEM failures are serialized through a shared event FIFO.

|Offset| Identifier | Name | |------|------------|--------------------------------------------| | 0x00 | control | openenoc_endpoint_interface.irq.control | | 0x04 |event_enable|openenoc_endpoint_interface.irq.event_enable| | 0x08 | status | openenoc_endpoint_interface.irq.status | | 0x0C | claim | openenoc_endpoint_interface.irq.claim | | 0x10 | complete | openenoc_endpoint_interface.irq.complete | ### control register - Absolute Address: 0x80 - Base Offset: 0x0 - Size: 0x4

Global interrupt-output control and interrupt-controller maintenance requests.

|Bits| Identifier |Access|Reset| Name | |----|-------------|------|-----|-----------------------------------------------------| | 0 |global_enable| rw | 0x0 |openenoc_endpoint_interface.irq.control.global_enable| | 8 | clear_errors| rw | 0x0 | openenoc_endpoint_interface.irq.control.clear_errors| #### global_enable field

Enables the physical endpoint IRQ output. Clearing this field masks the output but does not prevent enabled events from being queued. Event capture is controlled by irq.event_enable and, for peer DMA, by the selected peer's dma.irq_enable field.

#### clear_errors field

Writing one requests clearing of the sticky irq.status.overflow and irq.status.invalid_complete flags. The field remains asserted until hardware accepts the request and clears it.

### event_enable register - Absolute Address: 0x84 - Base Offset: 0x4 - Size: 0x4

Enables generation of individual endpoint IRQ event classes. These fields control event capture; irq.control.global_enable only masks the physical IRQ output.

|Bits| Identifier |Access|Reset| Name | |----|----------------------------|------|-----|-------------------------------------------------------------------------| | 0 | peer_dma_complete | rw | 0x0 | openenoc_endpoint_interface.irq.event_enable.peer_dma_complete | | 1 | non_oetp_dma_tx_complete | rw | 0x0 | openenoc_endpoint_interface.irq.event_enable.non_oetp_dma_tx_complete | | 2 | non_oetp_dma_rx_complete | rw | 0x0 | openenoc_endpoint_interface.irq.event_enable.non_oetp_dma_rx_complete | | 3 | non_oetp_direct_tx_complete| rw | 0x0 | openenoc_endpoint_interface.irq.event_enable.non_oetp_direct_tx_complete| | 4 |non_oetp_direct_rx_available| rw | 0x0 |openenoc_endpoint_interface.irq.event_enable.non_oetp_direct_rx_available| | 5 | rmem_error | rw | 0x0 | openenoc_endpoint_interface.irq.event_enable.rmem_error | #### peer_dma_complete field

Enables PEER_DMA_COMPLETE events. A peer event is queued only when this field and the selected peer's dma.irq_enable field were both set when the DMA request was accepted. A failed incoming bulk DMA request also generates this event for the peer resolved from the source MAC. For incoming failures, hardware captures the per-peer enable when recording the failure and samples this field at IRQ admission. Successful incoming requests generate no event. CSR error recording and the error response do not wait for IRQ FIFO capacity.

#### non_oetp_dma_tx_complete field

Enables NON_OETP_DMA_TX_COMPLETE events. Hardware samples this field when it accepts a non-oETP transmit DMA request.

#### non_oetp_dma_rx_complete field

Enables NON_OETP_DMA_RX_COMPLETE events. Hardware samples this field when it accepts a non-oETP receive DMA request.

#### non_oetp_direct_tx_complete field

Enables NON_OETP_DIRECT_TX_COMPLETE events. Hardware samples this field when the first beat of a direct transmit frame is accepted from the CSR-facing AXI4-Stream interface. When enabled, the frame start is accepted only after an IRQ FIFO credit has been reserved. The event is generated when the final beat is accepted by the oETP engine.

#### non_oetp_direct_rx_available field

Enables NON_OETP_DIRECT_RX_AVAILABLE events. One event is generated when the first beat of a new direct receive frame becomes valid on the CSR-facing AXI4-Stream interface. When enabled, routing logic does not expose that first TVALID until an IRQ FIFO credit is available, so the event cannot be lost. The event does not depend on TLAST and therefore supports both cut-through and frame-FIFO operation.

#### rmem_error field

Enables RMEM_ERROR events for locally initiated RMEM failures, including timeout and an accepted ERROR_RSP, and failed incoming RMEM requests from a resolved peer. Hardware records the associated peer's dma.error and dma.error_code before exposing the event and terminates the failed RMEM access without waiting for IRQ FIFO capacity. For locally initiated failures the enable is sampled when the failure is recorded; incoming failures sample it at IRQ admission. The bulk DMA per-peer irq_enable does not gate RMEM_ERROR. Successful RMEM accesses generate no event.

### status register - Absolute Address: 0x88 - Base Offset: 0x8 - Size: 0x4

Status of the endpoint IRQ event FIFO and its reservation mechanism.

| Bits| Identifier |Access|Reset| Name | |-----|----------------|------|-----|----------------------------------------------------------| | 0 | claim_pending | r | — | openenoc_endpoint_interface.irq.status.claim_pending | | 1 | credit_full | r | — | openenoc_endpoint_interface.irq.status.credit_full | | 2 | overflow | r | — | openenoc_endpoint_interface.irq.status.overflow | | 3 |invalid_complete| r | — | openenoc_endpoint_interface.irq.status.invalid_complete | | 4 | irq_asserted | r | — | openenoc_endpoint_interface.irq.status.irq_asserted | | 15:8| fifo_level | r | — | openenoc_endpoint_interface.irq.status.fifo_level[7:0] | |23:16| reserved_count | r | — |openenoc_endpoint_interface.irq.status.reserved_count[7:0]| #### claim_pending field

Indicates that at least one valid event is available in irq.claim.

#### credit_full field

Indicates that all event FIFO credits are occupied by queued claims or reserved for admitted operations. While no credit is available, new interrupt-enabled DMA requests are not accepted and the start of an interrupt-enabled direct AXI4-Stream frame is backpressured.

#### overflow field

Sticky internal-error flag indicating that an enabled event could not be retained. Correct credit reservation, admission control, and AXI4-Stream backpressure make this condition unreachable during normal operation. Clear with irq.control.clear_errors.

#### invalid_complete field

Sticky protocol-error flag indicating that irq.complete.valid was accepted while no claim was pending or that the completion token did not match the current claim. No claim is removed on a mismatch. Clear with irq.control.clear_errors.

#### irq_asserted field

Reflects the current value of the physical endpoint IRQ output after application of irq.control.global_enable.

#### fifo_level field

Number of valid claims currently queued in the IRQ event FIFO. Values greater than 255 are reported as 255.

#### reserved_count field

Number of event FIFO credits reserved for admitted DMA operations or direct transmit frames whose events have not yet been queued. Values greater than 255 are reported as 255.

### claim register - Absolute Address: 0x8C - Base Offset: 0xC - Size: 0x4

Read-only view of the event at the head of the IRQ event FIFO. Reading this register has no side effect, and all fields remain stable until a matching irq.complete request removes the claim.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|----------------------------------------------------| | 10:0| peer_idx | r | — |openenoc_endpoint_interface.irq.claim.peer_idx[10:0]| |14:11| source | r | — | openenoc_endpoint_interface.irq.claim.source[3:0] | |30:15| seq | r | — | openenoc_endpoint_interface.irq.claim.seq[15:0] | | 31 | valid | r | — | openenoc_endpoint_interface.irq.claim.valid | #### peer_idx field

Zero-based peer index for a PEER_DMA_COMPLETE or RMEM_ERROR event, in the range 0 through NUM_OF_PEERS-1. The field is not applicable to other event sources and is driven to zero for deterministic readback.

#### source field

IRQ event source:

This field is meaningful only when valid is set.

#### seq field

Monotonically increasing event sequence number, modulo 65536. The sequence number distinguishes otherwise identical claims and protects against stale or repeated completion requests.

#### valid field

Indicates that this register contains the valid event at the head of the IRQ event FIFO. When clear, all other claim fields shall be ignored.

### complete register - Absolute Address: 0x90 - Base Offset: 0x10 - Size: 0x4

Completion request for the current IRQ claim. Software acknowledges an event by copying the complete 32-bit irq.claim value into this register.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|-------------------------------------------------------| | 10:0| peer_idx | rw | 0x0 |openenoc_endpoint_interface.irq.complete.peer_idx[10:0]| |14:11| source | rw | 0x0 | openenoc_endpoint_interface.irq.complete.source[3:0] | |30:15| seq | rw | 0x0 | openenoc_endpoint_interface.irq.complete.seq[15:0] | | 31 | valid | rw | 0x0 | openenoc_endpoint_interface.irq.complete.valid | #### peer_idx field

Peer-index portion of the claim token.

#### source field

Event-source portion of the claim token.

#### seq field

Sequence-number portion of the claim token.

#### valid field

Writing one submits the completion token. The field remains asserted until hardware validates the token and clears it. A matching token removes the current claim and releases its FIFO credit; an invalid token leaves the claim unchanged and sets irq.status.invalid_complete.

## peers register file - Absolute Address: 0xA0 - Base Offset: 0xA0 - Size: 0x1C

Register file for remote peer configuration and memory region information.

|Offset|Identifier| Name | |------|----------|----------------------------------------------------------| | 0x0 | entry[0] |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1]| ## entry register file - Absolute Address: 0xA0 - Base Offset: 0x0 - Size: 0x1C - Array Dimensions: [1] - Array Stride: 0x1C - Total Size: 0x1C

Register file for a single remote peer configuration and memory region information.

|Offset| Identifier | Name | |------|--------------|-------------------------------------------------------------------------| | 0x00 | mac_address | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].mac_address | | 0x08 | rmem_address | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].rmem_address | | 0x0C | local_address| openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].local_address| | 0x10 |remote_address|openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].remote_address| | 0x14 | size | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].size | | 0x18 | dma | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma | ### mac_address register - Absolute Address: 0xA0 - Base Offset: 0x0 - Size: 0x8

Remote peer 48-bit destination MAC address.

| Bits|Identifier|Access|Reset| Name | |-----|----------|------|-----|-------------------------------------------------------------------------------------| | 31:0| lo_word | rw | — | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].mac_address.lo_word[31:0]| |47:32| hi_word | rw | — |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].mac_address.hi_word[47:32]| #### lo_word field

Lower 32 bits [31:0] of the 48-bit MAC address.

#### hi_word field

Upper 16 bits [47:32] of the 48-bit MAC address.

### rmem_address register - Absolute Address: 0xA8 - Base Offset: 0x8 - Size: 0x4

Address offset of the virtual memory region corresponding to the remote peer's memory.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|------------------------------------------------------------------------------------| |31:0| offset | rw | — |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].rmem_address.offset[31:0]| #### offset field

32-bit byte offset of the virtual memory region corresponding to the remote peer's memory. The value shall be aligned to a 32-bit word boundary.

### local_address register - Absolute Address: 0xAC - Base Offset: 0xC - Size: 0x4

Start address of the local memory region for DMA transfers.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|-----------------------------------------------------------------------------------| |31:0| base | rw | — |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].local_address.base[31:0]| #### base field

Word-aligned 32-bit start address of the local memory region for DMA transfers.

### remote_address register - Absolute Address: 0xB0 - Base Offset: 0x10 - Size: 0x4

Start address of the remote peer's memory region.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|------------------------------------------------------------------------------------| |31:0| base | rw | — |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].remote_address.base[31:0]| #### base field

Word-aligned 32-bit start address of the remote peer's memory region.

### size register - Absolute Address: 0xB4 - Base Offset: 0x14 - Size: 0x4

Size of the remote peer's memory region.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|---------------------------------------------------------------------------| |31:0| bytes | rw | — |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].size.bytes[31:0]| #### bytes field

32-bit size of the remote peer's memory region in bytes.

### dma register - Absolute Address: 0xB8 - Base Offset: 0x18 - Size: 0x4

DMA/RMEM configuration and control for the remote peer, with shared sticky error reporting. RMEM and bulk DMA retain separate IRQ event classes.

| Bits| Identifier|Access|Reset| Name | |-----|-----------|------|-----|--------------------------------------------------------------------------------| | 1:0 | mode | rw | — | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.mode[1:0] | | 2 | irq_enable| rw | 0x0 | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.irq_enable | | 8 | request | rw | 0x0 | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.request[8:8] | | 9 |clear_error| rw | 0x0 | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.clear_error | | 16 | idle | r | — | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.idle[16:16] | | 24 | done | r | — | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.done[24:24] | | 25 | error | r | — | openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.error[25:25] | |31:28| error_code| r | — |openenoc_endpoint_interface.peers.entry[0..NUM_OF_PEERS-1].dma.error_code[31:28]| #### mode field

DMA mode and responder access policy for the remote peer:

Consequently, a mirror relationship uses complementary modes: an initiator operating in mirror-to-local mode communicates with a responder entry configured as mirror-to-remote, while an initiator operating in mirror-to-remote mode communicates with a responder entry configured as mirror-to-local.

#### irq_enable field

Enables generation of a PEER_DMA_COMPLETE IRQ event for this peer. Hardware samples this field together with irq.event_enable.peer_dma_complete when it accepts the peer DMA request. Changing the field while a transfer is active does not affect that transfer. Disabling the field does not affect DMA execution or the done, error, and error_code status fields. For a failed incoming bulk DMA request, this field is captured when recording the failure and irq.event_enable.peer_dma_complete is sampled at IRQ admission. The event identifies this peer by the received source MAC. Successful incoming requests generate no event. RMEM errors use their separate irq.event_enable.rmem_error path.

#### request field

Writing one requests a DMA transfer to or from the remote peer, according to dma.mode. The field remains asserted until the DMA engine accepts and snapshots the request. Hardware clears it upon acceptance; while a transfer for this peer is active, a newly asserted request remains pending. Software or an RTL controller shall read the completion status of the previous request before asserting this field for the next request and shall keep the peer configuration stable while this field is asserted.

#### clear_error field

Writing one clears this peer's shared RMEM/DMA error flag and error code. The field remains asserted until hardware accepts and clears the command. It does not abort an active operation, clear done, or complete an IRQ claim. A new failure takes precedence over a simultaneous clear. Starting or successfully completing an operation does not clear a previously recorded error.

#### idle field

Indicates whether this peer has no accepted DMA request in progress. Hardware deasserts this field when a request is accepted and asserts it after all fragments of the requested block have completed.

#### done field

Sticky successful-completion flag for this peer. Hardware sets this field after all fragments of the accepted block transfer complete successfully and clears it when the next request is accepted.

#### error field

Shared sticky RMEM/DMA error flag for this peer. Hardware sets this field when a locally initiated RMEM access or bulk DMA transfer fails, or when servicing an incoming RMEM or bulk DMA request from this peer fails. Received requests are associated by source MAC. An incoming failure records its code before exposing its error response, independently of IRQ enable; it does not change the locally initiated dma.request, idle, or done state. An incomplete incoming DMA data frame records remote stream code 10. Multicast response suppression does not suppress this local error record or an enabled event. Only dma.clear_error or endpoint reset clears a latched error; starting or successfully completing another operation does not clear it. The flag is independent of the IRQ event-enable fields.

#### error_code field

Shared sticky code for the most recent RMEM or bulk DMA failure for this peer:

Codes 1-8 describe errors detected by this endpoint, including malformed responses, local memory failures, and failures while servicing received requests. Codes 9-15 describe failures reported by the responding peer through a valid ERROR_RSP. Code 10 additionally reports an incomplete incoming DMA data frame detected at this endpoint, without requiring an ERROR_RSP first. A missing or incorrect EndOfData uses this same code even when Ethernet padding masks the short data length. A receiver of an incomplete unicast DMA_WRITE_REQ records CSR code 10 but sends ERROR_RSP wire cause 2; multicast writes generate no response. ERROR_RSP carries a 32-bit cause in the range 1-7, which the initiating oETP engine validates and maps to CSR code = 8 + wire code. Values outside 1-7 are invalid response parameters and record local code 1; they must not be truncated or mistaken for local TIMEOUT = 8. The oETP initiator completion channel carries this final CSR encoding for both RMEM and bulk DMA. The responder completion channel reports its cause 1-7 for serialization as ERROR_RSP; cause 2 on an incomplete received bulk write corresponds to receiver CSR code 10. Hardware clears this field only on dma.clear_error or endpoint reset. Successful operations preserve a recorded failure. A new failure replaces the code and takes precedence over a simultaneous clear. A failed streaming transfer may have partially modified memory; error reporting does not provide rollback or an exact count of modified bytes. Software manages buffer synchronization and recovery.

## rmem register file - Absolute Address: 0xBC - Base Offset: 0xBC - Size: 0x4

Virtual memory region for all remote peers, with offsets and sizes defined in the peers regfile.

|Offset|Identifier| Name | |------|----------|------------------------------------------------------------| | 0x0 | word[0] |openenoc_endpoint_interface.rmem.word[0..RMEM_TOTAL_DEPTH-1]| ### word register - Absolute Address: 0xBC - Base Offset: 0x0 - Size: 0x4 - Array Dimensions: [1] - Array Stride: 0x4 - Total Size: 0x4

32-bit word in the virtual memory region.

|Bits|Identifier|Access|Reset| Name | |----|----------|------|-----|-----------------------------------------------------------------------| |31:0| data | rw | — |openenoc_endpoint_interface.rmem.word[0..RMEM_TOTAL_DEPTH-1].data[31:0]| #### data field

Data stored in this virtual memory word.