34static const char*
s_tag =
"ETHGWC";
57 k_ra8_ds_low_mask = 0xFFU,
58 k_ra8_ds_high_shift = 8U,
59 k_ra8_ds_high_mask = 0xFU,
61 return ((uint32_t)desc->
ds_l & k_ra8_ds_low_mask) |
62 (((uint32_t)desc->
ds_h & k_ra8_ds_high_mask) << k_ra8_ds_high_shift);
101 uint32_t out_capacity,
107 if (buf ==
nullptr || frame_ds > out_capacity) {
110 (void)
memcpy(out_frame, buf, (
size_t)frame_ds);
113 k_ra8_ds_byte_mask = 0xFFU,
114 k_ra8_ds_high_shift = 8U,
115 k_ra8_ds_high_mask = 0xFU,
117 desc->
ds_l = (uint8_t)(slot_bytes & k_ra8_ds_byte_mask);
118 desc->
ds_h = (uint8_t)((slot_bytes >> k_ra8_ds_high_shift) & k_ra8_ds_high_mask);
163 k_tx_ext_min_depth = 2U,
164 k_tx_ext_max_bytes = 2048U,
165 k_ds_low_mask = 0xFFU,
166 k_ds_high_shift = 8U,
167 k_ds_high_mask = 0xFU,
169 if (depth < k_tx_ext_min_depth) {
172 if (slot_bytes > k_tx_ext_max_bytes) {
176 k_ptr_hi_shift = 32U,
177 k_ptr_hi_mask = 0xFFULL,
179 for (uint32_t i = 0U; i < (depth - 1U); ++i) {
182 chain[i].
ds_l = (uint8_t)(slot_bytes & k_ds_low_mask);
183 chain[i].
ds_h = (uint8_t)((slot_bytes >> k_ds_high_shift) & k_ds_high_mask);
184 const uintptr_t buf = (uintptr_t)pool + ((uintptr_t)i * (uintptr_t)slot_bytes);
185 chain[i].
ptr_h = (uint8_t)(((uint64_t)buf >> k_ptr_hi_shift) & (uint64_t)k_ptr_hi_mask);
186 chain[i].
ptr_l = (uint32_t)buf;
190 const uintptr_t head = (uintptr_t)&chain[0];
191 term->
ptr_h = (uint8_t)(((uint64_t)head >> k_ptr_hi_shift) & (uint64_t)k_ptr_hi_mask);
192 term->
ptr_l = (uint32_t)head;
229 k_ptr_hi_shift = 32U,
230 k_ptr_hi_mask = 0xFFULL,
232 const uintptr_t head = (uintptr_t)&chain[0];
233 term->
ptr_h = (uint8_t)(((uint64_t)head >> k_ptr_hi_shift) & (uint64_t)k_ptr_hi_mask);
234 term->
ptr_l = (uint32_t)head;
310 .stop_on_last =
false,
317 .stop_on_last =
false,
478 uint32_t queue_index,
514 const uint32_t dv = (uint32_t)1U << (uint32_t)mac_port;
548#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
549 if (ra8_fake_mmio_wait_eval(&state->
tx_chain[0],
614 k_ds_low_mask = 0xFFU,
615 k_ds_high_shift = 8U,
616 k_ds_high_mask = 0xFU,
620 d->
ds_l = (uint8_t)(len & k_ds_low_mask);
621 d->
ds_h = (uint8_t)((len >> k_ds_high_shift) & k_ds_high_mask);
671 uint32_t out_capacity,
724 uint32_t out_capacity,
732 if (out_capacity == 0U) {
739 *head_idx % (ring_depth - 1U),
749 *head_idx = (slot + 1U) % (ring_depth - 1U);
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_no_data
No application data available (e.g.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
volatile uint32_t g_ra8_eth_gwca_pre_step
Bench-side debug trail bumped inside internal_default_open_pre.
volatile uint32_t g_ra8_eth_gwca_open_step
Bench-side debug trail bumped by ra8_eth_gwca_default_open.
Ethernet CPU Agent (GWCA) driver.
ra8_err_t ra8_eth_gwca_bring_up(ra8_gwca_basic_descriptor_t *linkfix_table, uint32_t entry_count)
Bring the GWCA from RESET state up to OPERATION with a fresh LINKFIX table.
ra8_err_t ra8_eth_gwca_kick_tx(uint32_t queue_index)
Kick a TX queue – request the chip to start transmitting.
ra8_err_t ra8_eth_gwca_init_ring(ra8_gwca_basic_descriptor_t *chain, uint32_t ring_depth, uint32_t slot_bytes)
Initialise a descriptor chain as a ring of FEMPTY slots.
ra8_err_t ra8_eth_gwca_find_slot(const ra8_gwca_basic_descriptor_t *chain, uint32_t ring_depth, ra8_gwdcc_dt_t match_dt, uint32_t start_idx, uint32_t *out_index)
Find the next FEMPTY slot in a descriptor ring.
ra8_err_t ra8_eth_gwca_init(void)
Initialise GWCA.
ra8_err_t ra8_eth_gwca_set_operation_mode(ra8_gwmc_opc_t mode)
Transition the GWCA / ESWM state machine to a new OPC mode.
ra8_err_t ra8_eth_gwca_reload_queue(uint32_t queue_index)
Reload (arm) a descriptor queue by pulsing GWDCC[i].BALR.
ra8_err_t ra8_eth_gwca_configure_queue(ra8_gwca_basic_descriptor_t *linkfix_table, uint32_t queue_index, const ra8_eth_gwca_queue_cfg_t *cfg)
Wire a per-queue config into GWDCC[i] and the matching LINKFIX entry.
ra8_err_t ra8_eth_gwca_attach_buffers(ra8_gwca_basic_descriptor_t *chain, uint32_t ring_depth, uint32_t slot_bytes, uint8_t *pool)
Walk a ring and attach per-slot buffers from a static pool.
static void internal_rearm_queue_if_disabled(ra8_gwca_basic_descriptor_t *chain, uint32_t ring_depth, uint32_t queue_index, uint32_t *cursor)
Re-arm a descriptor queue if the GWCA has disabled it.
static uint32_t internal_decode_ds(const ra8_gwca_basic_descriptor_t *desc)
Reconstruct the 12-bit DS (descriptor size) field from a basic descriptor.
ra8_err_t ra8_eth_gwca_default_open(ra8_eth_gwca_default_state_t *state)
One-call GWCA bring-up for the default-state API.
static ra8_err_t internal_default_open_rings(ra8_eth_gwca_default_state_t *state)
Set up the RX + TX descriptor rings for the default-state API.
static ra8_err_t internal_drain_rx_slot(ra8_gwca_basic_descriptor_t *desc, uint8_t *out_frame, uint32_t out_capacity, uint32_t slot_bytes, uint32_t *out_len)
Copy out a filled RX slot and reset it to FEMPTY.
static ra8_err_t internal_default_open_queues(ra8_eth_gwca_default_state_t *state)
Program the RX + TX per-queue cfgs for the default-state API.
ra8_err_t ra8_eth_gwca_rx_frame(ra8_gwca_basic_descriptor_t *chain, uint32_t ring_depth, uint32_t *head_idx, uint8_t *out_frame, uint32_t out_capacity, uint32_t slot_bytes, uint32_t *out_len)
Dequeue one frame from an RX queue's descriptor ring.
ra8_err_t ra8_eth_gwca_default_recv(ra8_eth_gwca_default_state_t *state, uint8_t *out_frame, uint32_t out_capacity, uint32_t *out_len)
One-call RX: dequeue next frame.
static ra8_err_t internal_default_open_pre(ra8_eth_gwca_default_state_t *state)
Walk the bring-up sub-sequence (init/rings/bring_up/-> CONFIG).
static uint32_t internal_tx_info1_hi(uint8_t mac_port)
Compose the INFO1_hi word of a TX extended descriptor.
static void internal_tx_ext_rearm(ra8_gwca_ext_descriptor_t *chain, uint32_t depth, uint32_t queue_index)
Re-arm the extended TX queue if the GWCA has disabled it.
ra8_err_t ra8_eth_gwca_default_send(ra8_eth_gwca_default_state_t *state, const uint8_t *frame, uint32_t len)
One-call TX: enqueue an extended descriptor into slot 0 + kick.
static ra8_err_t internal_wait_tx0_done(ra8_eth_gwca_default_state_t *state)
Block until the GWCA writes TX slot 0 back (FSINGLE -> FEMPTY).
static ra8_err_t internal_tx_ext_init(ra8_gwca_ext_descriptor_t *chain, uint32_t depth, uint32_t slot_bytes, const uint8_t *pool)
Initialise the extended (16-byte) TX descriptor chain.
Cross-TU shared surface for the ra8_eth_gwca driver split.
@ k_ra8_eth_gwca_tx_done_spin
TX descriptor write-back poll budget.
uint8_t * priv_ra8_eth_gwca_decode_ptr(const ra8_gwca_basic_descriptor_t *desc)
Decode a descriptor's 40-bit PTR back to a host pointer.
void priv_ra8_eth_gwca_set_linkfix_entry(ra8_gwca_basic_descriptor_t *entry, const void *chain_head)
Promote a LINKFIX entry from LEMPTY to LINKFIX with chain-head PTR.
@ k_ra8_eth_gwca_step_fail_2
RA8 Ethernet gwca step fail 2.
@ k_ra8_eth_gwca_step_ok_3
RA8 Ethernet gwca step ok 3.
@ k_ra8_eth_gwca_step_fail_4
RA8 Ethernet gwca step fail 4.
@ k_ra8_eth_gwca_step_ok_2
RA8 Ethernet gwca step ok 2.
@ k_ra8_eth_gwca_step_fail_1
RA8 Ethernet gwca step fail 1.
@ k_ra8_eth_gwca_step_ok_4
RA8 Ethernet gwca step ok 4.
@ k_ra8_eth_gwca_step_fail_3
RA8 Ethernet gwca step fail 3.
@ k_ra8_eth_gwca_step_ok_1
RA8 Ethernet gwca step ok 1.
Ethernet controller base addresses for the Renesas RA8D2.
@ k_ra8_gwdcc_dt_fsingle
FSINGLE – single-fragment frame.
@ k_ra8_gwdcc_dt_link
LINK – chain continuation.
@ k_ra8_gwdcc_dt_fempty
FEMPTY – empty, full frame slot.
@ k_ra8_gwdcc_dt_lempty
LEMPTY – queue disabled.
@ k_ra8_gwmc_opc_config
CR: Config request – LINKFIX writable here.
@ k_ra8_gwmc_opc_operation
OR: Operation request – frames flow.
@ k_ra8_gwca_info1_tx_dv_shift
info1_hi: DV[6:0] field shift.
@ k_ra8_gwca_info1_tx_dv_mask
info1_hi: DV[6:0] field mask.
@ k_ra8_gwca_info1_tx_fmt_direct
info1_lo: FMT = direct descriptor.
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.
Bounded wait-flag primitives for RA8D2 HAL drivers.
Shared CPU-intrinsic seam for the HAL drivers (host/target split).
static void ra8_hw_dsb(void)
Data Synchronisation Barrier (full system).
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_error(tag, message)
RA8 log error.
State block for ra8_eth_gwca_default_open / _send / _recv.
uint32_t rx_slot_bytes
RX slot bytes.
ra8_gwca_basic_descriptor_t * rx_chain
RX descriptor chain (FEMPTY ring of rx_depth entries).
uint32_t rx_depth
RX depth.
uint8_t * rx_pool
RX pool.
uint32_t linkfix_count
Number of LINKFIX entries.
uint32_t tx_queue_index
TX queue index.
uint32_t tx_depth
TX depth.
uint32_t tx_slot_bytes
TX slot bytes.
ra8_gwca_ext_descriptor_t * tx_chain
TX descriptor chain – 16-byte EXTENDED descriptors (EDE = 1).
uint8_t * tx_pool
TX pool.
uint32_t tx_tail
Round-robin write cursor.
ra8_gwca_basic_descriptor_t * linkfix_table
LINKFIX table covering at least 2 queues (RX + TX).
uint32_t rx_queue_index
LINKFIX entry + GWDCC[i] index.
uint8_t mac_port
MAC port (0..3) that frames are sourced from / sent to.
uint32_t rx_head
Round-robin read cursor.
Per-queue configuration descriptor for ra8_eth_gwca_configure_queue.
8-byte basic descriptor (HUM Ch 34.5.1.2 "General Formats").
volatile uint8_t dt
20..23 Descriptor type (ra8_gwdcc_dt_t).
volatile uint8_t ds_h
8..11 Descriptor size (high nibble).
volatile uint8_t ds_l
0..7 Descriptor size (low byte).
16-byte extended descriptor (HUM Ch 34.5.1.2 "Extended descriptor", GWDCCi.ETS == 0 && GWDCCi....
volatile uint8_t ptr_h
24..31 Pointer high byte (PTR[39:32]).
volatile uint8_t ds_l
0..7 Descriptor size (low byte).
volatile uint32_t info1_lo
64..95 INFO1[31:0].
volatile uint32_t info1_hi
96..127 INFO1[63:32].
volatile uint8_t dt
20..23 Descriptor type (ra8_gwdcc_dt_t).
volatile uint8_t ds_h
8..11 Descriptor size (high nibble).
volatile uint32_t ptr_l
32..63 Pointer low 32 bits.