ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_ipc_sync.h
Go to the documentation of this file.
1
20
21#pragma once
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27#include <stdint.h>
28
29#include "ra8_attributes.h"
30#include "ra8_err.h"
31#include "ra8_ipc_regs.h"
32#include "ra8_ipc_types.h"
33
34/* =============================================================================
35 * Cross-core ordering barrier
36 * =============================================================================
37 */
38
70static inline void ra8_ipc_barrier(void)
71{
72#ifndef RA8_OFF_TARGET
73 __asm__ volatile("dmb 0xF" ::: "memory");
74#endif
75}
76
77/* =============================================================================
78 * Hardware semaphores (IPCSEM0..15)
79 * =============================================================================
80 */
81
107[[nodiscard]] ra8_err_t ra8_ipc_sem_try_take(uint8_t sem_id);
108
129[[nodiscard]] ra8_err_t ra8_ipc_sem_take_timeout(uint8_t sem_id, uint16_t max_spins);
130
150[[nodiscard]] ra8_err_t ra8_ipc_sem_release(uint8_t sem_id);
151
182[[nodiscard]] ra8_err_t ra8_ipc_sem_is_locked(uint8_t sem_id, bool* out_locked);
183
184/* =============================================================================
185 * NMI surface (IPC0NMI* / IPC1NMI*)
186 * =============================================================================
187 */
188
213[[nodiscard]] ra8_err_t ra8_ipc_nmi_send(uint8_t unit);
214
233[[nodiscard]] ra8_err_t ra8_ipc_nmi_clear(uint8_t unit);
234
255[[nodiscard]] ra8_err_t ra8_ipc_nmi_get_status(uint8_t unit, bool* out_pending);
256
280[[nodiscard]] ra8_err_t ra8_ipc_attach_nmi_handler(ra8_ipc_nmi_fn_t fn, void* ctx);
281
303void ra8_ipc_dispatch_nmi(uint8_t unit);
304
305/* =============================================================================
306 * Interrupt path (maskable)
307 * =============================================================================
308 */
309
329[[nodiscard]] ra8_err_t ra8_ipc_attach_handler(ra8_ipc_event_fn_t fn, void* ctx);
330
360[[nodiscard]] ra8_err_t ra8_ipc_attach_event_handler(uint8_t channel,
361 ra8_ipc_irq_event_id_t event_id,
363 void* ctx);
364
391void ra8_ipc_dispatch(uint8_t channel);
392
422[[nodiscard]] ra8_err_t ra8_ipc_install_isr(uint8_t unit, uint8_t priority);
423
443[[nodiscard]] ra8_err_t ra8_ipc_uninstall_isr(uint8_t unit);
444
445/* =============================================================================
446 * Shared-memory ring-buffer protocol primitives
447 * =============================================================================
448 */
449
476[[nodiscard]] ra8_err_t ra8_ipc_ring_init(ra8_ipc_ring_t* ring);
477
504[[nodiscard]] ra8_err_t ra8_ipc_ring_produce(ra8_ipc_ring_t* ring, uint32_t payload);
505
532[[nodiscard]] ra8_err_t ra8_ipc_ring_consume(ra8_ipc_ring_t* ring, uint32_t* out_payload);
533
552[[nodiscard]] ra8_err_t ra8_ipc_ring_is_empty(const ra8_ipc_ring_t* ring, bool* out_empty);
553
572[[nodiscard]] ra8_err_t ra8_ipc_ring_is_full(const ra8_ipc_ring_t* ring, bool* out_full);
573
574#ifdef __cplusplus
575}
576#endif
Annotation-attribute framework macros for ra8-firmware.
#define RA8_ISR_SAFE
The function is callable from interrupt context.
Error Code Definitions for ra8-firmware.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Inter-Processor Communication (IPC) register layout for the RA8D2.
static void ra8_ipc_barrier(void)
Cross-core data-memory barrier for IPC publish + lock ordering.
ra8_err_t ra8_ipc_attach_nmi_handler(ra8_ipc_nmi_fn_t fn, void *ctx)
Attach a callback for inter-processor NMI dispatch.
ra8_err_t ra8_ipc_install_isr(uint8_t unit, uint8_t priority)
Wire the IPC IRQ event into the ISR table.
Definition ra8_ipc.c:804
ra8_err_t ra8_ipc_attach_handler(ra8_ipc_event_fn_t fn, void *ctx)
Attach a single event callback shared across all channels.
Definition ra8_ipc.c:709
ra8_err_t ra8_ipc_ring_consume(ra8_ipc_ring_t *ring, uint32_t *out_payload)
Pop one word from the shared-memory ring (consumer side).
ra8_err_t ra8_ipc_nmi_send(uint8_t unit)
Issue an inter-processor NMI to the peer core.
ra8_err_t ra8_ipc_ring_init(ra8_ipc_ring_t *ring)
Initialise a producer/consumer ring backed by shared SRAM.
ra8_err_t ra8_ipc_ring_is_empty(const ra8_ipc_ring_t *ring, bool *out_empty)
Predicate: ring empty?
void ra8_ipc_dispatch_nmi(uint8_t unit)
Drive the NMI dispatch path for one unit.
ra8_err_t ra8_ipc_nmi_clear(uint8_t unit)
Acknowledge an inter-processor NMI on the local core.
ra8_err_t ra8_ipc_sem_try_take(uint8_t sem_id)
Test-and-set acquire on one IPC hardware semaphore.
ra8_err_t ra8_ipc_uninstall_isr(uint8_t unit)
Tear down a previously installed IPC ISR.
Definition ra8_ipc.c:832
ra8_err_t ra8_ipc_sem_take_timeout(uint8_t sem_id, uint16_t max_spins)
Bounded-spin take on one IPC hardware semaphore.
ra8_err_t ra8_ipc_ring_is_full(const ra8_ipc_ring_t *ring, bool *out_full)
Predicate: ring full?
void ra8_ipc_dispatch(uint8_t channel)
Drive the event callback for one channel.
Definition ra8_ipc.c:733
ra8_err_t ra8_ipc_sem_release(uint8_t sem_id)
Release one IPC hardware semaphore.
ra8_err_t ra8_ipc_nmi_get_status(uint8_t unit, bool *out_pending)
Read NMISTA.NMI for one IPC NMI unit.
ra8_err_t ra8_ipc_sem_is_locked(uint8_t sem_id, bool *out_locked)
Predicate: is the semaphore currently locked?
ra8_err_t ra8_ipc_ring_produce(ra8_ipc_ring_t *ring, uint32_t payload)
Push one word into the shared-memory ring (producer side).
ra8_err_t ra8_ipc_attach_event_handler(uint8_t channel, ra8_ipc_irq_event_id_t event_id, ra8_ipc_irq_fn_t fn, void *ctx)
Attach a callback for a single IRQ event line on a channel.
Definition ra8_ipc.c:716
Inter-Processor Communication (IPC) HAL driver – public types.
void(* ra8_ipc_event_fn_t)(void *ctx, uint8_t channel, uint32_t event_mask, uint32_t message)
IPC event callback signature.
ra8_ipc_irq_event_id_t
Index of an IRQ event line within a channel (0..7).
void(* ra8_ipc_nmi_fn_t)(void *ctx, uint8_t unit)
NMI dispatch callback signature.
void(* ra8_ipc_irq_fn_t)(void *ctx, uint8_t channel, ra8_ipc_irq_event_id_t event_id)
Per-IRQ-event-line callback signature.
Shared-memory ring-buffer descriptor used by the producer / consumer protocol primitives.