Line data Source code
1 0 : /*
2 : * Copyright (c) 2024 Intel Corporation
3 : * Copyright (c) 2024 Meta Platforms
4 : *
5 : * SPDX-License-Identifier: Apache-2.0
6 : */
7 :
8 : #ifndef ZEPHYR_DRIVERS_I3C_RTIO_H_
9 : #define ZEPHYR_DRIVERS_I3C_RTIO_H_
10 :
11 : #include <zephyr/kernel.h>
12 : #include <zephyr/drivers/i3c.h>
13 : #include <zephyr/rtio/rtio.h>
14 :
15 : #ifdef __cplusplus
16 : extern "C" {
17 : #endif
18 :
19 : /**
20 : * @brief Driver context for implementing i3c with rtio
21 : */
22 1 : struct i3c_rtio {
23 0 : struct k_sem lock;
24 0 : struct k_spinlock slock;
25 0 : struct rtio *r;
26 0 : struct mpsc io_q;
27 0 : struct rtio_iodev iodev;
28 0 : struct rtio_iodev_sqe *txn_head;
29 0 : struct rtio_iodev_sqe *txn_curr;
30 0 : struct i3c_device_desc *i3c_desc;
31 : };
32 :
33 : /**
34 : * @brief Statically define an i3c_rtio context
35 : *
36 : * @param _name Symbolic name of the context
37 : * @param _sq_sz Submission queue entry pool size
38 : * @param _cq_sz Completion queue entry pool size
39 : */
40 1 : #define I3C_RTIO_DEFINE(_name, _sq_sz, _cq_sz) \
41 : RTIO_DEFINE(CONCAT(_name, _r), _sq_sz, _cq_sz); \
42 : static struct i3c_rtio _name = { \
43 : .r = &CONCAT(_name, _r), \
44 : };
45 :
46 : /**
47 : * @brief Copy an array of i3c_msgs to rtio submissions and a transaction
48 : *
49 : * @retval sqe Last sqe setup in the copy
50 : * @retval NULL Not enough memory to copy the transaction
51 : */
52 1 : struct rtio_sqe *i3c_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct i3c_msg *msgs,
53 : uint8_t num_msgs);
54 :
55 : /**
56 : * @brief Initialize an i3c rtio context
57 : *
58 : * @param ctx I3C RTIO driver context
59 : */
60 1 : void i3c_rtio_init(struct i3c_rtio *ctx);
61 :
62 : /**
63 : * @brief Signal that the current (ctx->txn_curr) submission has been completed
64 : *
65 : * @param ctx I3C RTIO driver context
66 : * @param status Completion status, negative values are errors
67 : *
68 : * @retval true Next submission is ready to start
69 : * @retval false No more submissions to work on
70 : */
71 1 : bool i3c_rtio_complete(struct i3c_rtio *ctx, int status);
72 :
73 : /**
74 : * @brief Submit, atomically, a submission to work on at some point
75 : *
76 : * @retval true Next submission is ready to start
77 : * @retval false No new submission to start or submissions are in progress already
78 : */
79 1 : bool i3c_rtio_submit(struct i3c_rtio *ctx, struct rtio_iodev_sqe *iodev_sqe);
80 :
81 : /**
82 : * @brief Configure the I3C bus controller
83 : *
84 : * Provides a compatible API for the existing i3c_configure API, and blocks the
85 : * caller until the transfer completes.
86 : *
87 : * See i3c_configure().
88 : */
89 1 : int i3c_rtio_configure(struct i3c_rtio *ctx, enum i3c_config_type type, void *config);
90 :
91 : /**
92 : * @brief Transfer i3c messages in a blocking call
93 : *
94 : * Provides a compatible API for the existing i3c_transfer API, and blocks the caller
95 : * until the transfer completes.
96 : *
97 : * See i3c_transfer().
98 : */
99 1 : int i3c_rtio_transfer(struct i3c_rtio *ctx, struct i3c_msg *msgs, uint8_t num_msgs,
100 : struct i3c_device_desc *desc);
101 :
102 : /**
103 : * @brief Perform an I3C bus recovery in a blocking call
104 : *
105 : * Provides a compatible API for the existing i3c_recover API, and blocks the caller
106 : * until the process completes.
107 : *
108 : * See i3c_recover().
109 : */
110 1 : int i3c_rtio_recover(struct i3c_rtio *ctx);
111 :
112 : /**
113 : * @brief Perform an I3C CCC in a blocking call
114 : *
115 : * Provides a compatible API for the existing i3c_do_ccc API, and blocks the caller
116 : * until the process completes.
117 : *
118 : * See i3c_do_ccc().
119 : */
120 1 : int i3c_rtio_ccc(struct i3c_rtio *ctx, struct i3c_ccc_payload *payload);
121 :
122 : #ifdef __cplusplus
123 : }
124 : #endif
125 :
126 : #endif /* ZEPHYR_DRVIERS_I3C_RTIO_H_ */
|