blob: 1b9de4b4da0849c081c0ab50f51f40439a6f3818 [file] [log] [blame]
/*
* Copyright (c) 2022 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_RTIO_RTIO_EXECUTOR_CONCURRENT_H_
#define ZEPHYR_INCLUDE_RTIO_RTIO_EXECUTOR_CONCURRENT_H_
#include <zephyr/rtio/rtio.h>
#include <zephyr/kernel.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief RTIO Concurrent Executor
*
* Provides a concurrent executor with a pointer overhead per task and a
* 2 word overhead over the simple executor to know the order of tasks (fifo).
*
* @defgroup rtio_executor_concurrent RTIO concurrent Executor
* @ingroup rtio
* @{
*/
/**
* @brief Submit to the concurrent executor
*
* @param r RTIO context to submit
*
* @retval 0 always succeeds
*/
int rtio_concurrent_submit(struct rtio *r);
/**
* @brief Report a SQE has completed successfully
*
* @param r RTIO context to use
* @param sqe RTIO SQE to report success
* @param result Result of the SQE
*/
void rtio_concurrent_ok(struct rtio *r, const struct rtio_sqe *sqe, int result);
/**
* @brief Report a SQE has completed with error
*
* @param r RTIO context to use
* @param sqe RTIO SQE to report success
* @param result Result of the SQE
*/
void rtio_concurrent_err(struct rtio *r, const struct rtio_sqe *sqe, int result);
/**
* @brief Concurrent Executor
*
* Notably all values are effectively owned by each task with the exception
* of task_in and task_out.
*/
struct rtio_concurrent_executor {
struct rtio_executor ctx;
/* Lock around the queues */
struct k_spinlock lock;
/* Task ring position and count */
uint16_t task_in, task_out, task_mask;
/* First pending sqe to start when a task becomes available */
struct rtio_sqe *pending_sqe;
/* Last sqe seen from the most recent submit */
struct rtio_sqe *last_sqe;
/* Array of task statuses */
uint8_t *task_status;
/* Array of struct rtio_sqe *'s one per task' */
struct rtio_sqe **task_cur;
};
/**
* @cond INTERNAL_HIDDEN
*/
static const struct rtio_executor_api z_rtio_concurrent_api = {
.submit = rtio_concurrent_submit,
.ok = rtio_concurrent_ok,
.err = rtio_concurrent_err
};
/**
* @endcond INTERNAL_HIDDEN
*/
/**
* @brief Statically define and initialie a concurrent executor
*
* @param name Symbol name, must be unique in the context in which its used
* @param concurrency Allowed concurrency (number of concurrent tasks).
*/
#define RTIO_EXECUTOR_CONCURRENT_DEFINE(name, concurrency) \
static struct rtio_sqe *_task_cur_##name[(concurrency)]; \
uint8_t _task_status_##name[(concurrency)]; \
static struct rtio_concurrent_executor name = { \
.ctx = { .api = &z_rtio_concurrent_api }, \
.task_in = 0, \
.task_out = 0, \
.task_mask = (concurrency)-1, \
.pending_sqe = NULL, \
.last_sqe = NULL, \
.task_status = _task_status_##name, \
.task_cur = _task_cur_##name, \
};
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_RTIO_RTIO_EXECUTOR_CONCURRENT_H_ */