@@ -52,9 +52,6 @@ extern "C" {
5252 * @}
5353 */
5454
55-
56- struct rtio_iodev ;
57-
5855/**
5956 * @brief RTIO API
6057 * @defgroup rtio_api RTIO API
@@ -121,6 +118,23 @@ struct rtio_iodev;
121118 * @}
122119 */
123120
121+ /** @cond ignore */
122+ struct rtio ;
123+ struct rtio_cqe ;
124+ struct rtio_sqe ;
125+ struct rtio_iodev ;
126+ struct rtio_iodev_sqe ;
127+ /** @endcond */
128+
129+ /**
130+ * @typedef rtio_callback_t
131+ * @brief Callback signature for RTIO_OP_CALLBACK
132+ * @param r RTIO context being used with the callback
133+ * @param sqe Submission for the callback op
134+ * @param arg0 Argument option as part of the sqe
135+ */
136+ typedef void (* rtio_callback_t )(struct rtio * r , const struct rtio_sqe * sqe , void * arg0 );
137+
124138/**
125139 * @brief A submission queue event
126140 */
@@ -147,7 +161,6 @@ struct rtio_sqe {
147161 /** OP_TX, OP_RX */
148162 struct {
149163 uint32_t buf_len ; /**< Length of buffer */
150-
151164 uint8_t * buf ; /**< Buffer to use*/
152165 };
153166
@@ -159,12 +172,19 @@ struct rtio_sqe {
159172
160173 /** OP_CALLBACK */
161174 struct {
162- void ( * callback )( struct rtio * r , struct rtio_sqe * sqe , void * arg0 ) ;
163- void * arg0 ;
175+ rtio_callback_t callback ;
176+ void * arg0 ; /**< Last argument given to callback */
164177 };
165178 };
166179};
167180
181+
182+ /** @cond ignore */
183+ /* Ensure the rtio_sqe never grows beyond a common cacheline size of 64 bytes */
184+ BUILD_ASSERT (sizeof (struct rtio_sqe ) <= 64 );
185+ /** @endcond */
186+
187+
168188/**
169189 * @brief Submission queue
170190 *
@@ -195,8 +215,6 @@ struct rtio_cq {
195215 struct rtio_cqe buffer [];
196216};
197217
198- struct rtio ;
199- struct rtio_iodev_sqe ;
200218
201219struct rtio_executor_api {
202220 /**
@@ -341,11 +359,12 @@ struct rtio_iodev {
341359/** An operation that transmits (writes) */
342360#define RTIO_OP_TX (RTIO_OP_RX+1)
343361
344- /** An operation that transmits tiny writes */
362+ /** An operation that transmits tiny writes by copying the data to write */
345363#define RTIO_OP_TINY_TX (RTIO_OP_TX+1)
346364
347- /** An operation that does some small functional work */
348- #define RTIO_OP_FUNC (RTIO_OP_TINY_TX+1)
365+ /** An operation that calls a given function (callback) */
366+ #define RTIO_OP_CALLBACK (RTIO_OP_TINY_TX+1)
367+
349368
350369
351370/**
@@ -427,6 +446,28 @@ static inline void rtio_sqe_prep_tiny_write(struct rtio_sqe *sqe,
427446 sqe -> userdata = userdata ;
428447}
429448
449+ /**
450+ * @brief Prepare a callback op submission
451+ *
452+ * A somewhat special operation in that it may only be done in kernel mode.
453+ *
454+ * Used where general purpose logic is required in a queue of io operations to do
455+ * transforms or logic.
456+ */
457+ static inline void rtio_sqe_prep_callback (struct rtio_sqe * sqe ,
458+ rtio_callback_t callback ,
459+ void * arg0 ,
460+ void * userdata )
461+ {
462+ sqe -> op = RTIO_OP_CALLBACK ;
463+ sqe -> prio = 0 ;
464+ sqe -> flags = 0 ;
465+ sqe -> iodev = NULL ;
466+ sqe -> callback = callback ;
467+ sqe -> arg0 = arg0 ;
468+ sqe -> userdata = userdata ;
469+ }
470+
430471/**
431472 * @brief Statically define and initialize a fixed length submission queue.
432473 *
0 commit comments