48static const char*
s_tag =
"NPU";
63typedef enum : uint16_t {
64 k_ra8_npu_mstp_reg_shift = 8U,
65 k_ra8_npu_mstp_bit = 16U,
80typedef enum : uint32_t {
81 k_ra8_npu_reset_poll_iters = 100000U,
82 k_ra8_npu_job_poll_iters = 2000000U,
95typedef enum : uint8_t {
96 k_ra8_npu_addr_hi_shift = 32U,
110typedef enum : uint32_t {
111 k_ra8_npu_status_fault_mask =
135static bool s_npu_initialized =
false;
144static bool s_npu_job_submitted =
false;
157typedef enum : uint8_t {
158 k_ra8_npu_irq_idle = 0U,
159 k_ra8_npu_irq_armed = 1U,
160 k_ra8_npu_irq_done = 2U,
161 k_ra8_npu_irq_fault = 3U,
162} ra8_npu_irq_state_t;
172static volatile ra8_npu_irq_state_t s_npu_irq_state = k_ra8_npu_irq_idle;
193static inline void internal_npu_wait_for_irq(
void)
196 __asm__
volatile(
"wfi");
219static ra8_err_t internal_npu_apply_reset(
void)
224 for (uint32_t i = 0U; i < k_ra8_npu_reset_poll_iters; i++) {
257 const uint32_t lo_off =
262 *
ra8_npu_reg(hi_off) = (uint32_t)(base >> k_ra8_npu_addr_hi_shift);
269 const ra8_err_t rst = internal_npu_apply_reset();
271 s_npu_initialized =
true;
272 s_npu_job_submitted =
false;
273 s_npu_irq_state = k_ra8_npu_irq_idle;
283 s_npu_initialized =
false;
284 s_npu_job_submitted =
false;
285 s_npu_irq_state = k_ra8_npu_irq_idle;
292 const ra8_err_t rst = internal_npu_apply_reset();
294 s_npu_job_submitted =
false;
295 s_npu_irq_state = k_ra8_npu_irq_idle;
321 const uint64_t qbase = (uint64_t)(uintptr_t)job->
cmd_stream;
330 s_npu_job_submitted =
true;
337 if (!s_npu_job_submitted) {
356 out->
fault = (raw & (uint32_t)k_ra8_npu_status_fault_mask) != 0U;
366 if ((raw & (uint32_t)k_ra8_npu_status_fault_mask) != 0U) {
377 for (uint32_t i = 0U; i < k_ra8_npu_job_poll_iters; i++) {
399 if (!s_npu_job_submitted) {
403 s_npu_irq_state = k_ra8_npu_irq_armed;
416 s_npu_irq_state = k_ra8_npu_irq_fault;
418 s_npu_irq_state = k_ra8_npu_irq_done;
430 if (s_npu_irq_state == k_ra8_npu_irq_idle) {
434 for (uint32_t i = 0U; i < k_ra8_npu_job_poll_iters; i++) {
435 const ra8_npu_irq_state_t state = s_npu_irq_state;
436 if (state == k_ra8_npu_irq_done) {
439 if (state == k_ra8_npu_irq_fault) {
443 internal_npu_wait_for_irq();
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_ISR_SAFE
The function is callable from interrupt context.
#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_VALIDATE_INIT(initialized, tag, message)
Precondition: module must be initialized.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Compile-time device selection for the RA8 multi-chip build (RA8D2 / RA8P1).
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
@ k_ra8_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_hw_error
Generic hardware fault detected (error flag set, fault interrupt).
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info(tag, message)
RA8 log info.
#define ra8_log_error(tag, message)
RA8 log error.
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_enable(ra8_mstp_t id)
Reference-counted "ungate this peripheral" request.
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
ra8_mstp_t
Packed (reg << 8) | bit module-stop identifier.
@ k_ra8_mstp_reg_a
RA8 mstp register a.
int ra8_npu_not_on_this_device_t
Arm Ethos-U55 NPU command/queue driver foundation (RA8P1-only).
ra8_err_t ra8_npu_clear_irq(void)
Acknowledge (clear) a raised NPU interrupt.
ra8_err_t ra8_npu_read_status(ra8_npu_status_t *out)
Read and decode the NPU_STATUS register.
ra8_err_t ra8_npu_poll(bool *out_done)
Non-blocking completion / fault poll of a running job.
ra8_err_t ra8_npu_submit(const ra8_npu_job_t *job)
Program the command queue and tensor region base pointers for a job.
ra8_err_t ra8_npu_wait_irq(void)
Block on the NPU interrupt until the armed job completes or faults.
ra8_err_t ra8_npu_irq_arm(void)
Arm the interrupt-driven completion latch for the submitted job.
void ra8_npu_irq_handler(void *ctx)
NPU interrupt service routine: latch completion / fault, ack the IRQ.
ra8_err_t ra8_npu_run(void)
Kick the currently-submitted job (transition the NPU to running).
ra8_err_t ra8_npu_reset(void)
Soft-reset an already-initialized NPU.
ra8_err_t ra8_npu_deinit(void)
Gate the NPU back into module-stop.
ra8_err_t ra8_npu_read_id(uint32_t *out_id)
Read the Ethos-U55 NPU_ID (architecture / product revision) register.
ra8_err_t ra8_npu_init(void)
Bring the NPU out of module-stop and soft-reset it.
ra8_err_t ra8_npu_wait(void)
Bounded busy-wait until the running job completes or faults.
Arm Ethos-U55 NPU register window on the Renesas RA8P1 (RA8P1-only).
static volatile uint32_t * ra8_npu_reg(uint32_t byte_off)
Compute a volatile pointer to an NPU register by byte offset.
ra8_npu_region_idx_t
Base-pointer region indices (Ethos-U55 has eight AXI region bases).
@ k_ra8_npu_region_count
Number of BASEPn region base-pointer pairs.
@ k_ra8_npu_status_cmd_parse_bit
Command-stream parse error.
@ k_ra8_npu_status_ecc_fault_bit
Internal SRAM ECC fault.
@ k_ra8_npu_status_cmd_end_bit
Command stream fully consumed.
@ k_ra8_npu_status_state_bit
1 = running, 0 = stopped.
@ k_ra8_npu_status_irq_raised_bit
IRQ asserted by the NPU.
@ k_ra8_npu_status_bus_error_bit
AXI bus error latched.
@ k_ra8_npu_status_wd_fault_bit
Weight-decoder fault.
@ k_ra8_npu_status_reset_bit
Reset in progress.
@ k_ra8_npu_off_basep0_lo
BASEP0 bits [31:0] (region 0 base).
@ k_ra8_npu_off_qsize
QSIZE (cmd-stream length in bytes).
@ k_ra8_npu_off_id
NPU_ID (Arm Ethos-U arch id/revision).
@ k_ra8_npu_off_qbase_lo
QBASE bits [31:0] (cmd-stream address).
@ k_ra8_npu_off_cmd
NPU_CMD (run / clear-irq / q-enables).
@ k_ra8_npu_off_status
NPU_STATUS (state + fault flags, RO).
@ k_ra8_npu_off_qbase_hi
QBASE bits [63:32].
@ k_ra8_npu_off_reset
NPU_RESET (software reset request).
@ k_ra8_npu_cmd_clear_irq_bit
clear_irq (write 1 to acknowledge IRQ).
@ k_ra8_npu_cmd_run_bit
transition_to_running_state (start job).
@ k_ra8_npu_basep_stride_bytes
Bytes between BASEPn pairs (lo+hi).
@ k_ra8_npu_reg_hi_offset
Low->high word gap in a 64-bit reg.
One Ethos-U55 inference job: a command stream plus its tensor arenas.
uint8_t region_count
Number of region_base[] entries in use.
uint32_t cmd_stream_bytes
Command stream length in bytes (> 0).
uint64_t region_base[k_ra8_npu_region_count]
AXI base of each BASEPn arena.
const void * cmd_stream
Vela command stream base in SRAM.
Decoded snapshot of the NPU_STATUS register.
bool fault
Any bus / parse / weight-decoder / ECC fault bit.
uint32_t raw
Verbatim NPU_STATUS register value.
bool running
STATUS.state: NPU is executing a command stream.
bool irq_raised
STATUS.irq_raised: an interrupt is pending.
bool cmd_end
STATUS.cmd_end: command stream fully consumed.