32#ifndef ZEPHYR_INCLUDE_RTIO_RTIO_H_
33#define ZEPHYR_INCLUDE_RTIO_RTIO_H_
73#define RTIO_PRIO_LOW 0U
78#define RTIO_PRIO_NORM 127U
83#define RTIO_PRIO_HIGH 255U
100#define RTIO_SQE_CHAINED BIT(0)
143 struct rtio_spsc _spsc;
162 struct rtio_spsc _spsc;
231#ifdef CONFIG_RTIO_SUBMIT_SEM
235 struct k_sem *submit_sem;
240#ifdef CONFIG_RTIO_CONSUME_SEM
245 struct k_sem *consume_sem;
299 struct rtio_spsc _spsc;
382#define RTIO_SQ_DEFINE(name, len) \
383 static RTIO_SPSC_DEFINE(name, struct rtio_sqe, len)
391#define RTIO_CQ_DEFINE(name, len) \
392 static RTIO_SPSC_DEFINE(name, struct rtio_cqe, len)
402#define RTIO_DEFINE(name, exec, sq_sz, cq_sz) \
403 IF_ENABLED(CONFIG_RTIO_SUBMIT_SEM, (K_SEM_DEFINE(_submit_sem_##name, 0, K_SEM_MAX_LIMIT))) \
404 IF_ENABLED(CONFIG_RTIO_CONSUME_SEM, (K_SEM_DEFINE(_consume_sem_##name, 0, 1))) \
405 RTIO_SQ_DEFINE(_sq_##name, sq_sz); \
406 RTIO_CQ_DEFINE(_cq_##name, cq_sz); \
407 static struct rtio name = { \
408 .executor = (exec), \
409 .xcqcnt = ATOMIC_INIT(0), \
410 IF_ENABLED(CONFIG_RTIO_SUBMIT_SEM, (.submit_sem = &_submit_sem_##name,)) \
411 IF_ENABLED(CONFIG_RTIO_SUBMIT_SEM, (.submit_count = 0,)) \
412 IF_ENABLED(CONFIG_RTIO_CONSUME_SEM, (.consume_sem = &_consume_sem_##name,)) \
413 .sq = (struct rtio_sq *const)&_sq_##name, \
414 .cq = (struct rtio_cq *const)&_cq_##name, \
456 __ASSERT(
r->executor != NULL,
"expected rtio submit context to have an executor");
458#ifdef CONFIG_RTIO_SUBMIT_SEM
461 if (wait_count > 0) {
463 "expected rtio submit with wait count to be called from a thread");
466 r->submit_count = wait_count;
476 res =
r->executor->api->submit(
r);
484#ifdef CONFIG_RTIO_SUBMIT_SEM
486 if (wait_count > 0) {
489 "semaphore was reset or timed out while waiting on completions!");
493#ifdef CONFIG_BOARD_NATIVE_POSIX
535#ifdef CONFIG_RTIO_CONSUME_SEM
540 while (cqe == NULL) {
543#ifdef CONFIG_RTIO_CONSUME_SEM
564 r->executor->api->ok(
r, sqe,
result);
578 r->executor->api->err(
r, sqe,
result);
602#ifdef CONFIG_RTIO_SUBMIT_SEM
603 if (
r->submit_count > 0) {
605 if (
r->submit_count == 0) {
610#ifdef CONFIG_RTIO_CONSUME_SEM
workaround assembler barfing for ST r
Definition: asm-macro-32-bit-gnu.h:24
long atomic_t
Definition: atomic.h:22
atomic_val_t atomic_inc(atomic_t *target)
struct result result[2]
Definition: errno.c:42
#define K_FOREVER
Generate infinite timeout delay.
Definition: kernel.h:1236
bool k_is_in_isr(void)
Determine if code is running at interrupt level.
static void rtio_sqe_ok(struct rtio *r, const struct rtio_sqe *sqe, int result)
Inform the executor of a submission completion with success.
Definition: rtio.h:562
static void rtio_sqe_err(struct rtio *r, const struct rtio_sqe *sqe, int result)
Inform the executor of a submissions completion with error.
Definition: rtio.h:576
static int rtio_submit(struct rtio *r, uint32_t wait_count)
Submit I/O requests to the underlying executor.
Definition: rtio.h:452
static void rtio_sqe_prep_read(struct rtio_sqe *sqe, struct rtio_iodev *iodev, int8_t prio, uint8_t *buf, uint32_t len, void *userdata)
Prepare a read op submission.
Definition: rtio.h:343
static void rtio_cqe_submit(struct rtio *r, int result, void *userdata)
Definition: rtio.h:591
#define RTIO_OP_TX
Definition: rtio.h:326
static void rtio_sqe_prep_nop(struct rtio_sqe *sqe, struct rtio_iodev *iodev, void *userdata)
Prepare a nop (no op) submission.
Definition: rtio.h:331
static void rtio_iodev_submit(const struct rtio_sqe *sqe, struct rtio *r)
Perform a submitted operation with an iodev.
Definition: rtio.h:431
static void rtio_set_executor(struct rtio *r, struct rtio_executor *exc)
Set the executor of the rtio context.
Definition: rtio.h:420
static void rtio_sqe_prep_write(struct rtio_sqe *sqe, struct rtio_iodev *iodev, int8_t prio, uint8_t *buf, uint32_t len, void *userdata)
Prepare a write op submission.
Definition: rtio.h:361
#define RTIO_OP_NOP
Definition: rtio.h:320
static struct rtio_cqe * rtio_cqe_consume(struct rtio *r)
Consume a single completion queue event if available.
Definition: rtio.h:515
static struct rtio_cqe * rtio_cqe_consume_block(struct rtio *r)
Wait for and consume a single completion queue event.
Definition: rtio.h:530
#define RTIO_OP_RX
Definition: rtio.h:323
#define rtio_spsc_consume(spsc)
Consume an element from the spsc.
Definition: rtio_spsc.h:203
#define rtio_spsc_acquire(spsc)
Acquire an element to produce from the SPSC.
Definition: rtio_spsc.h:154
#define rtio_spsc_consumable(spsc)
Count of consumables in spsc.
Definition: rtio_spsc.h:231
#define rtio_spsc_produce_all(spsc)
Produce all previously acquired elements to the SPSC.
Definition: rtio_spsc.h:187
#define rtio_spsc_produce(spsc)
Produce one previously acquired element to the SPSC.
Definition: rtio_spsc.h:171
void k_sem_reset(struct k_sem *sem)
Resets a semaphore's count to zero.
void k_sem_give(struct k_sem *sem)
Give a semaphore.
int k_sem_take(struct k_sem *sem, k_timeout_t timeout)
Take a semaphore.
void k_yield(void)
Yield the current thread.
void k_busy_wait(uint32_t usec_to_wait)
Cause the current thread to busy wait.
A lock-free and type safe power of 2 fixed sized single producer single consumer (SPSC) queue using a...
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
__INT8_TYPE__ int8_t
Definition: stdint.h:72
Completion queue.
Definition: rtio.h:161
struct rtio_cqe buffer[]
Definition: rtio.h:163
A completion queue event.
Definition: rtio.h:150
void * userdata
Definition: rtio.h:152
int32_t result
Definition: rtio.h:151
void(* err)(struct rtio *r, const struct rtio_sqe *sqe, int result)
SQE fails to complete.
Definition: rtio.h:187
int(* submit)(struct rtio *r)
Submit the request queue to executor.
Definition: rtio.h:177
void(* ok)(struct rtio *r, const struct rtio_sqe *sqe, int result)
SQE completes successfully.
Definition: rtio.h:182
An executor does the work of executing the submissions.
Definition: rtio.h:210
const struct rtio_executor_api * api
Definition: rtio.h:211
API that an RTIO IO device should implement.
Definition: rtio.h:263
void(* submit)(const struct rtio_sqe *sqe, struct rtio *r)
Submission function for a request to the iodev.
Definition: rtio.h:271
IO device submission queue.
Definition: rtio.h:298
struct rtio_iodev_sqe buffer[]
Definition: rtio.h:300
struct rtio * r
Definition: rtio.h:290
const struct rtio_sqe * sqe
Definition: rtio.h:289
An IO device with a function table for submitting requests.
Definition: rtio.h:310
const struct rtio_iodev_api * api
Definition: rtio.h:312
struct rtio_iodev_sq * iodev_sq
Definition: rtio.h:315
Submission queue.
Definition: rtio.h:142
struct rtio_sqe buffer[]
Definition: rtio.h:144
A submission queue event.
Definition: rtio.h:109
void * userdata
Definition: rtio.h:125
uint8_t op
Definition: rtio.h:110
struct rtio_iodev * iodev
Definition: rtio.h:116
uint8_t prio
Definition: rtio.h:112
uint8_t * buf
Definition: rtio.h:131
uint32_t buf_len
Definition: rtio.h:129
uint16_t flags
Definition: rtio.h:114
An RTIO queue pair that both the kernel and application work with.
Definition: rtio.h:222
struct rtio_cq * cq
Definition: rtio.h:257
struct rtio_executor * executor
Definition: rtio.h:228
struct rtio_sq * sq
Definition: rtio.h:254
atomic_t xcqcnt
Definition: rtio.h:251