1 /*
2  * Copyright 2022 Intel Corporation
3  * Copyright 2023 Meta Platforms, Inc. and its affiliates
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #ifndef ZEPHYR_INCLUDE_DRIVERS_I3C_CCC_H_
9 #define ZEPHYR_INCLUDE_DRIVERS_I3C_CCC_H_
10 
11 /**
12  * @brief I3C Common Command Codes
13  * @defgroup i3c_ccc I3C Common Command Codes
14  * @ingroup i3c_interface
15  * @{
16  */
17 
18 #include <stdint.h>
19 
20 #include <zephyr/device.h>
21 #include <zephyr/toolchain.h>
22 #include <zephyr/sys/util.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /** Maximum CCC ID for broadcast */
29 #define I3C_CCC_BROADCAST_MAX_ID		0x7FU
30 
31 /**
32  * Enable Events Command
33  *
34  * @param broadcast True if broadcast, false if direct.
35  */
36 #define I3C_CCC_ENEC(broadcast)			((broadcast) ? 0x00U : 0x80U)
37 
38 /**
39  * Disable Events Command
40  *
41  * @param broadcast True if broadcast, false if direct.
42  */
43 #define I3C_CCC_DISEC(broadcast)		((broadcast) ? 0x01U : 0x81U)
44 
45 /**
46  * Enter Activity State
47  *
48  * @param as Desired activity state
49  * @param broadcast True if broadcast, false if direct.
50  */
51 #define I3C_CCC_ENTAS(as, broadcast)		(((broadcast) ? 0x02U : 0x82U) + (as))
52 
53 /**
54  * Enter Activity State 0
55  *
56  * @param broadcast True if broadcast, false if direct.
57  */
58 #define I3C_CCC_ENTAS0(broadcast)		I3C_CCC_ENTAS(0, broadcast)
59 
60 /**
61  * Enter Activity State 1
62  *
63  * @param broadcast True if broadcast, false if direct.
64  */
65 #define I3C_CCC_ENTAS1(broadcast)		I3C_CCC_ENTAS(1, broadcast)
66 
67 /**
68  * Enter Activity State 2
69  *
70  * @param broadcast True if broadcast, false if direct.
71  */
72 #define I3C_CCC_ENTAS2(broadcast)		I3C_CCC_ENTAS(2, broadcast)
73 
74 /**
75  * Enter Activity State 3
76  *
77  * @param broadcast True if broadcast, false if direct.
78  */
79 #define I3C_CCC_ENTAS3(broadcast)		I3C_CCC_ENTAS(3, broadcast)
80 
81 /** Reset Dynamic Address Assignment (Broadcast) */
82 #define I3C_CCC_RSTDAA				0x06U
83 
84 /** Enter Dynamic Address Assignment (Broadcast) */
85 #define I3C_CCC_ENTDAA				0x07U
86 
87 /** Define List of Targets (Broadcast) */
88 #define I3C_CCC_DEFTGTS				0x08U
89 
90 /**
91  * Set Max Write Length (Broadcast or Direct)
92  *
93  * @param broadcast True if broadcast, false if direct.
94  */
95 #define I3C_CCC_SETMWL(broadcast)		((broadcast) ? 0x09U : 0x89U)
96 
97 /**
98  * Set Max Read Length (Broadcast or Direct)
99  *
100  * @param broadcast True if broadcast, false if direct.
101  */
102 #define I3C_CCC_SETMRL(broadcast)		((broadcast) ? 0x0AU : 0x8AU)
103 
104 /** Enter Test Mode (Broadcast) */
105 #define I3C_CCC_ENTTM				0x0BU
106 
107 /** Set Bus Context (Broadcast) */
108 #define I3C_CCC_SETBUSCON			0x0CU
109 
110 /**
111  * Data Transfer Ending Procedure Control
112  *
113  * @param broadcast True if broadcast, false if direct.
114  */
115 #define I3C_CCC_ENDXFER(broadcast)		((broadcast) ? 0x12U : 0x92U)
116 
117 /** Enter HDR Mode (HDR-DDR) (Broadcast) */
118 #define I3C_CCC_ENTHDR(x)			(0x20U + (x))
119 
120 /** Enter HDR Mode 0 (HDR-DDR) (Broadcast) */
121 #define I3C_CCC_ENTHDR0				0x20U
122 
123 /** Enter HDR Mode 1 (HDR-TSP) (Broadcast) */
124 #define I3C_CCC_ENTHDR1				0x21U
125 
126 /** Enter HDR Mode 2 (HDR-TSL) (Broadcast) */
127 #define I3C_CCC_ENTHDR2				0x22U
128 
129 /** Enter HDR Mode 3 (HDR-BT) (Broadcast) */
130 #define I3C_CCC_ENTHDR3				0x23U
131 
132 /** Enter HDR Mode 4 (Broadcast) */
133 #define I3C_CCC_ENTHDR4				0x24U
134 
135 /** Enter HDR Mode 5 (Broadcast) */
136 #define I3C_CCC_ENTHDR5				0x25U
137 
138 /** Enter HDR Mode 6 (Broadcast) */
139 #define I3C_CCC_ENTHDR6				0x26U
140 
141 /** Enter HDR Mode 7 (Broadcast) */
142 #define I3C_CCC_ENTHDR7				0x27U
143 
144 /**
145  * Exchange Timing Information (Broadcast or Direct)
146  *
147  * @param broadcast True if broadcast, false if direct.
148  */
149 #define I3C_CCC_SETXTIME(broadcast)		((broadcast) ? 0x28U : 0x98U)
150 
151 /** Set All Addresses to Static Addresses (Broadcast) */
152 #define I3C_CCC_SETAASA				0x29U
153 
154 /**
155  * Target Reset Action
156  *
157  * @param broadcast True if broadcast, false if direct.
158  */
159 #define I3C_CCC_RSTACT(broadcast)		((broadcast) ? 0x2AU : 0x9AU)
160 
161 /** Define List of Group Address (Broadcast) */
162 #define I3C_CCC_DEFGRPA				0x2BU
163 
164 /**
165  * Reset Group Address
166  *
167  * @param broadcast True if broadcast, false if direct.
168  */
169 #define I3C_CCC_RSTGRPA(broadcast)		((broadcast) ? 0x2CU : 0x9CU)
170 
171 /** Multi-Lane Data Transfer Control (Broadcast) */
172 #define I3C_CCC_MLANE(broadcast)		((broadcast) ? 0x2DU : 0x9DU)
173 
174 /**
175  * Vendor/Standard Extension
176  *
177  * @param broadcast True if broadcast, false if direct.
178  * @param id Extension ID.
179  */
180 #define I3C_CCC_VENDOR(broadcast, id)		((id) + ((broadcast) ? 0x61U : 0xE0U))
181 
182 /** Set Dynamic Address from Static Address (Direct) */
183 #define I3C_CCC_SETDASA				0x87U
184 
185 /** Set New Dynamic Address (Direct) */
186 #define I3C_CCC_SETNEWDA			0x88U
187 
188 /** Get Max Write Length (Direct) */
189 #define I3C_CCC_GETMWL				0x8BU
190 
191 /** Get Max Read Length (Direct) */
192 #define I3C_CCC_GETMRL				0x8CU
193 
194 /** Get Provisioned ID (Direct) */
195 #define I3C_CCC_GETPID				0x8DU
196 
197 /** Get Bus Characteristics Register (Direct) */
198 #define I3C_CCC_GETBCR				0x8EU
199 
200 /** Get Device Characteristics Register (Direct) */
201 #define I3C_CCC_GETDCR				0x8FU
202 
203 /** Get Device Status (Direct) */
204 #define I3C_CCC_GETSTATUS			0x90U
205 
206 /** Get Accept Controller Role (Direct) */
207 #define I3C_CCC_GETACCCR			0x91U
208 
209 /** Set Bridge Targets (Direct) */
210 #define I3C_CCC_SETBRGTGT			0x93U
211 
212 /** Get Max Data Speed (Direct) */
213 #define I3C_CCC_GETMXDS				0x94U
214 
215 /** Get Optional Feature Capabilities (Direct) */
216 #define I3C_CCC_GETCAPS				0x95U
217 
218 /** Set Route (Direct) */
219 #define I3C_CCC_SETROUTE			0x96U
220 
221 /** Device to Device(s) Tunneling Control (Direct) */
222 #define I3C_CCC_D2DXFER				0x97U
223 
224 /** Get Exchange Timing Information (Direct) */
225 #define I3C_CCC_GETXTIME			0x99U
226 
227 /** Set Group Address (Direct) */
228 #define I3C_CCC_SETGRPA				0x9BU
229 
230 struct i3c_device_desc;
231 
232 /**
233  * @brief Payload structure for Direct CCC to one target.
234  */
235 struct i3c_ccc_target_payload {
236 	/** Target address */
237 	uint8_t addr;
238 
239 	/** @c 0 for Write, @c 1 for Read */
240 	uint8_t rnw:1;
241 
242 	/**
243 	 * - For Write CCC, pointer to the byte array of data
244 	 *   to be sent, which may contain the Sub-Command Byte
245 	 *   and additional data.
246 	 * - For Read CCC, pointer to the byte buffer for data
247 	 *   to be read into.
248 	 */
249 	uint8_t *data;
250 
251 	/** Length in bytes for @p data. */
252 	size_t data_len;
253 
254 	/**
255 	 * Total number of bytes transferred
256 	 *
257 	 * A Target can issue an EoD or the Controller can abort a transfer
258 	 * before the length of the buffer. It is expected for the driver to
259 	 * write to this after the transfer.
260 	 */
261 	size_t num_xfer;
262 };
263 
264 /**
265  * @brief Payload structure for one CCC transaction.
266  */
267 struct i3c_ccc_payload {
268 	struct {
269 		/**
270 		 * The CCC ID (@c I3C_CCC_*).
271 		 */
272 		uint8_t id;
273 
274 		/**
275 		 * Pointer to byte array of data for this CCC.
276 		 *
277 		 * This is the bytes following the CCC command in CCC frame.
278 		 * Set to @c NULL if no associated data.
279 		 */
280 		uint8_t *data;
281 
282 		/** Length in bytes for optional data array. */
283 		size_t data_len;
284 
285 		/**
286 		 * Total number of bytes transferred
287 		 *
288 		 * A Controller can abort a transfer before the length of the buffer.
289 		 * It is expected for the driver to write to this after the transfer.
290 		 */
291 		size_t num_xfer;
292 	} ccc;
293 
294 	struct {
295 		/**
296 		 * Array of struct i3c_ccc_target_payload.
297 		 *
298 		 * Each element describes the target and associated
299 		 * payloads for this CCC.
300 		 *
301 		 * Use with Direct CCC.
302 		 */
303 		struct i3c_ccc_target_payload *payloads;
304 
305 		/** Number of targets */
306 		size_t num_targets;
307 	} targets;
308 };
309 
310 /**
311  * @brief Payload for ENEC/DISEC CCC (Target Events Command).
312  */
313 struct i3c_ccc_events {
314 	/**
315 	 * Event byte:
316 	 * - Bit[0]: ENINT/DISINT:
317 	 *   - Target Interrupt Requests
318 	 * - Bit[1]: ENCR/DISCR:
319 	 *   - Controller Role Requests
320 	 * - Bit[3]: ENHJ/DISHJ:
321 	 *   - Hot-Join Event
322 	 */
323 	uint8_t events;
324 } __packed;
325 
326 /** Enable Events (ENEC) - Target Interrupt Requests. */
327 #define I3C_CCC_ENEC_EVT_ENINTR		BIT(0)
328 
329 /** Enable Events (ENEC) - Controller Role Requests. */
330 #define I3C_CCC_ENEC_EVT_ENCR		BIT(1)
331 
332 /** Enable Events (ENEC) - Hot-Join Event. */
333 #define I3C_CCC_ENEC_EVT_ENHJ		BIT(3)
334 
335 #define I3C_CCC_ENEC_EVT_ALL		\
336 	(I3C_CCC_ENEC_EVT_ENINTR | I3C_CCC_ENEC_EVT_ENCR | I3C_CCC_ENEC_EVT_ENHJ)
337 
338 /** Disable Events (DISEC) - Target Interrupt Requests. */
339 #define I3C_CCC_DISEC_EVT_DISINTR	BIT(0)
340 
341 /** Disable Events (DISEC) - Controller Role Requests. */
342 #define I3C_CCC_DISEC_EVT_DISCR		BIT(1)
343 
344 /** Disable Events (DISEC) - Hot-Join Event. */
345 #define I3C_CCC_DISEC_EVT_DISHJ		BIT(3)
346 
347 #define I3C_CCC_DISEC_EVT_ALL		\
348 	(I3C_CCC_DISEC_EVT_DISINTR | I3C_CCC_DISEC_EVT_DISCR | I3C_CCC_DISEC_EVT_DISHJ)
349 
350 /*
351  * Events for both enabling and disabling since
352  * they have the same bits.
353  */
354 
355 /** Events - Target Interrupt Requests. */
356 #define I3C_CCC_EVT_INTR		BIT(0)
357 
358 /** Events - Controller Role Requests. */
359 #define I3C_CCC_EVT_CR			BIT(1)
360 
361 /** Events - Hot-Join Event. */
362 #define I3C_CCC_EVT_HJ			BIT(3)
363 
364 /** Bitmask for all events. */
365 #define I3C_CCC_EVT_ALL			\
366 	(I3C_CCC_EVT_INTR | I3C_CCC_EVT_CR | I3C_CCC_EVT_HJ)
367 
368 /**
369  * @brief Payload for SETMWL/GETMWL CCC (Set/Get Maximum Write Length).
370  *
371  * @note For drivers and help functions, the raw data coming
372  * back from target device is in big endian. This needs to be
373  * translated back to CPU endianness before passing back to
374  * function caller.
375  */
376 struct i3c_ccc_mwl {
377 	/** Maximum Write Length */
378 	uint16_t len;
379 } __packed;
380 
381 /**
382  * @brief Payload for SETMRL/GETMRL CCC (Set/Get Maximum Read Length).
383  *
384  * @note For drivers and help functions, the raw data coming
385  * back from target device is in big endian. This needs to be
386  * translated back to CPU endianness before passing back to
387  * function caller.
388  */
389 struct i3c_ccc_mrl {
390 	/** Maximum Read Length */
391 	uint16_t len;
392 
393 	/** Optional IBI Payload Size */
394 	uint8_t ibi_len;
395 } __packed;
396 
397 /**
398  * @brief The active controller part of payload for DEFTGTS CCC.
399  *
400  * This is used by DEFTGTS (Define List of Targets) CCC to describe
401  * the active controller on the I3C bus.
402  */
403 struct i3c_ccc_deftgts_active_controller {
404 	/** Dynamic Address of Active Controller */
405 	uint8_t addr;
406 
407 	/** Device Characteristic Register of Active Controller */
408 	uint8_t dcr;
409 
410 	/** Bus Characteristic Register of Active Controller */
411 	uint8_t bcr;
412 
413 	/** Static Address of Active Controller */
414 	uint8_t static_addr;
415 };
416 
417 /**
418  * @brief The target device part of payload for DEFTGTS CCC.
419  *
420  * This is used by DEFTGTS (Define List of Targets) CCC to describe
421  * the existing target devices on the I3C bus.
422  */
423 struct i3c_ccc_deftgts_target {
424 	/** Dynamic Address of a target device, or a group address */
425 	uint8_t addr;
426 
427 	union {
428 		/**
429 		 * Device Characteristic Register of a I3C target device
430 		 * or a group.
431 		 */
432 		uint8_t dcr;
433 
434 		/** Legacy Virtual Register for legacy I2C device. */
435 		uint8_t lvr;
436 	};
437 
438 	/** Bus Characteristic Register of a target device or a group */
439 	uint8_t bcr;
440 
441 	/** Static Address of a target device or a group */
442 	uint8_t static_addr;
443 };
444 
445 /**
446  * @brief Payload for DEFTGTS CCC (Define List of Targets).
447  *
448  * @note @p i3c_ccc_deftgts_target is an array of targets, where
449  * the number of elements is dependent on the number of I3C targets
450  * on the bus. Please have enough space for both read and write of
451  * this CCC.
452  */
453 struct i3c_ccc_deftgts {
454 	/** Number of Targets (and Groups) present on the I3C Bus */
455 	uint8_t count;
456 
457 	/** Data describing the active controller */
458 	struct i3c_ccc_deftgts_active_controller active_controller;
459 
460 	/** Data describing the target(s) on the bus */
461 	struct i3c_ccc_deftgts_target targets[];
462 } __packed;
463 
464 /**
465  * @brief Defining byte values for ENTTM.
466  */
467 enum i3c_ccc_enttm_defbyte {
468 	/** Remove all I3C Devices from Test Mode */
469 	ENTTM_EXIT_TEST_MODE = 0x00U,
470 
471 	/** Indicates that I3C Devices shall return a random 32-bit value
472 	 * in the PID during the Dynamic Address Assignment procedure
473 	 */
474 	ENTTM_VENDOR_TEST_MODE = 0x01U,
475 };
476 
477 /**
478  * @brief Payload for a single device address.
479  *
480  * This is used for:
481  * - SETDASA (Set Dynamic Address from Static Address)
482  * - SETNEWDA (Set New Dynamic Address)
483  * - SETGRPA (Set Group Address)
484  * - GETACCCR (Get Accept Controller Role)
485  *
486  * Note that the target address is encoded within
487  * struct i3c_ccc_target_payload instead of being encoded in
488  * this payload.
489  */
490 struct i3c_ccc_address {
491 	/**
492 	 * - For SETDASA, Static Address to be assigned as
493 	 *   Dynamic Address.
494 	 * - For SETNEWDA, new Dynamic Address to be assigned.
495 	 * - For SETGRPA, new Group Address to be set.
496 	 * - For GETACCCR, the correct address of Secondary
497 	 *   Controller.
498 	 *
499 	 * @note For SETDATA, SETNEWDA and SETGRPA,
500 	 * the address is left-shift by 1, and bit[0] is always 0.
501 	 *
502 	 * @note Fpr SET GETACCCR, the address is left-shift by 1,
503 	 * and bit[0] is the calculated odd parity bit.
504 	 */
505 	uint8_t addr;
506 } __packed;
507 
508 /**
509  * @brief Payload for GETPID CCC (Get Provisioned ID).
510  */
511 struct i3c_ccc_getpid {
512 	/**
513 	 * 48-bit Provisioned ID.
514 	 *
515 	 * @note Data is big-endian where first byte is MSB.
516 	 */
517 	uint8_t pid[6];
518 } __packed;
519 
520 /**
521  * @brief Payload for GETBCR CCC (Get Bus Characteristics Register).
522  */
523 struct i3c_ccc_getbcr {
524 	/** Bus Characteristics Register */
525 	uint8_t bcr;
526 } __packed;
527 
528 /**
529  * @brief Payload for GETDCR CCC (Get Device Characteristics Register).
530  */
531 struct i3c_ccc_getdcr {
532 	/** Device Characteristics Register */
533 	uint8_t dcr;
534 } __packed;
535 
536 
537 /**
538  * @brief Indicate which format of GETSTATUS to use.
539  */
540 enum i3c_ccc_getstatus_fmt {
541 	/** GETSTATUS Format 1 */
542 	GETSTATUS_FORMAT_1,
543 
544 	/** GETSTATUS Format 2 */
545 	GETSTATUS_FORMAT_2,
546 };
547 
548 /**
549  * @brief Defining byte values for GETSTATUS Format 2.
550  */
551 enum i3c_ccc_getstatus_defbyte {
552 	/** Target status. */
553 	GETSTATUS_FORMAT_2_TGTSTAT = 0x00U,
554 
555 	/** PRECR - Alternate status format describing Controller-capable device. */
556 	GETSTATUS_FORMAT_2_PRECR = 0x91U,
557 
558 	/** Invalid defining byte. */
559 	GETSTATUS_FORMAT_2_INVALID = 0x100U
560 };
561 
562 /**
563  * @brief Payload for GETSTATUS CCC (Get Device Status).
564  */
565 union i3c_ccc_getstatus {
566 	struct {
567 		/**
568 		 * Device Status
569 		 * - Bit[15:8]: Reserved.
570 		 * - Bit[7:6]: Activity Mode.
571 		 * - Bit[5]: Protocol Error.
572 		 * - Bit[4]: Reserved.
573 		 * - Bit[3:0]: Number of Pending Interrupts.
574 		 *
575 		 * @note For drivers and help functions, the raw data coming
576 		 * back from target device is in big endian. This needs to be
577 		 * translated back to CPU endianness before passing back to
578 		 * function caller.
579 		 */
580 		uint16_t status;
581 	} fmt1;
582 
583 	union {
584 		/**
585 		 * Defining Byte 0x00: TGTSTAT
586 		 *
587 		 * @see i3c_ccc_getstatus::fmt1::status
588 		 */
589 		uint16_t tgtstat;
590 
591 		/**
592 		 * Defining Byte 0x91: PRECR
593 		 * - Bit[15:8]: Vendor Reserved
594 		 * - Bit[7:2]: Reserved
595 		 * - Bit[1]: Handoff Delay NACK
596 		 * - Bit[0]: Deep Sleep Detected
597 		 *
598 		 * @note For drivers and help functions, the raw data coming
599 		 * back from target device is in big endian. This needs to be
600 		 * translated back to CPU endianness before passing back to
601 		 * function caller.
602 		 */
603 		uint16_t precr;
604 
605 		uint16_t raw_u16;
606 	} fmt2;
607 } __packed;
608 
609 /** GETSTATUS Format 1 - Protocol Error bit. */
610 #define I3C_CCC_GETSTATUS_PROTOCOL_ERR				BIT(5)
611 
612 /** GETSTATUS Format 1 - Activity Mode bitmask. */
613 #define I3C_CCC_GETSTATUS_ACTIVITY_MODE_MASK			GENMASK(7U, 6U)
614 
615 /**
616  * @brief GETSTATUS Format 1 - Activity Mode
617  *
618  * Obtain Activity Mode from GETSTATUS Format 1 value obtained via
619  * GETSTATUS.
620  *
621  * @param status GETSTATUS Format 1 value
622  */
623 #define I3C_CCC_GETSTATUS_ACTIVITY_MODE(status)			\
624 	FIELD_GET(I3C_CCC_GETSTATUS_ACTIVITY_MODE_MASK, (status))
625 
626 /** GETSTATUS Format 1 - Number of Pending Interrupts bitmask. */
627 #define I3C_CCC_GETSTATUS_NUM_INT_MASK				GENMASK(3U, 0U)
628 
629 /**
630  * @brief GETSTATUS Format 1 - Number of Pending Interrupts
631  *
632  * Obtain Number of Pending Interrupts from GETSTATUS Format 1 value
633  * obtained via GETSTATUS.
634  *
635  * @param status GETSTATUS Format 1 value
636  */
637 #define I3C_CCC_GETSTATUS_NUM_INT(status)			\
638 	FIELD_GET(I3C_CCC_GETSTATUS_NUM_INT_MASK, (status))
639 
640 /** GETSTATUS Format 2 - PERCR - Deep Sleep Detected bit. */
641 #define I3C_CCC_GETSTATUS_PRECR_DEEP_SLEEP_DETECTED		BIT(0)
642 
643 /** GETSTATUS Format 2 - PERCR - Handoff Delay NACK. */
644 #define I3C_CCC_GETSTATUS_PRECR_HANDOFF_DELAY_NACK		BIT(1)
645 
646 /**
647  * @brief One Bridged Target for SETBRGTGT payload.
648  */
649 struct i3c_ccc_setbrgtgt_tgt {
650 	/**
651 	 * Dynamic address of the bridged target.
652 	 *
653 	 * @note The address is left-shift by 1, and bit[0]
654 	 * is always 0.
655 	 */
656 	uint8_t addr;
657 
658 	/**
659 	 * 16-bit ID for the bridged target.
660 	 *
661 	 * @note For drivers and help functions, the raw data coming
662 	 * back from target device is in big endian. This needs to be
663 	 * translated back to CPU endianness before passing back to
664 	 * function caller.
665 	 */
666 	uint16_t id;
667 } __packed;
668 
669 /**
670  * @brief Payload for SETBRGTGT CCC (Set Bridge Targets).
671  *
672  * Note that the bridge target address is encoded within
673  * struct i3c_ccc_target_payload instead of being encoded in
674  * this payload.
675  */
676 struct i3c_ccc_setbrgtgt {
677 	/** Number of bridged targets */
678 	uint8_t count;
679 
680 	/** Array of bridged targets */
681 	struct i3c_ccc_setbrgtgt_tgt targets[];
682 } __packed;
683 
684 /**
685  * @brief Indicate which format of getmxds to use.
686  */
687 enum i3c_ccc_getmxds_fmt {
688 	/** GETMXDS Format 1 */
689 	GETMXDS_FORMAT_1,
690 
691 	/** GETMXDS Format 2 */
692 	GETMXDS_FORMAT_2,
693 
694 	/** GETMXDS Format 3 */
695 	GETMXDS_FORMAT_3,
696 };
697 
698 /**
699  * @brief Enum for I3C Get Max Data Speed (GETMXDS) Format 3 Defining Byte Values.
700  */
701 enum i3c_ccc_getmxds_defbyte {
702 	/** Standard Target Write/Read speed parameters, and optional Maximum Read Turnaround Time
703 	 */
704 	GETMXDS_FORMAT_3_WRRDTURN = 0x00U,
705 
706 	/** Delay parameters for a Controller-capable Device, and it's expected Activity State
707 	 * during a Controller Handoff
708 	 */
709 	GETMXDS_FORMAT_3_CRHDLY = 0x91U,
710 
711 	/** Invalid defining byte. */
712 	GETMXDS_FORMAT_3_INVALID = 0x100,
713 };
714 
715 
716 /**
717  * @brief Payload for GETMXDS CCC (Get Max Data Speed).
718  */
719 union i3c_ccc_getmxds {
720 	struct {
721 		/** maxWr */
722 		uint8_t maxwr;
723 
724 		/** maxRd */
725 		uint8_t maxrd;
726 	} fmt1;
727 
728 	struct {
729 		/** maxWr */
730 		uint8_t maxwr;
731 
732 		/** maxRd */
733 		uint8_t maxrd;
734 
735 		/**
736 		 * Maximum Read Turnaround Time in microsecond.
737 		 *
738 		 * This is in little-endian where first byte is LSB.
739 		 */
740 		uint8_t maxrdturn[3];
741 	} fmt2;
742 
743 	struct {
744 		/**
745 		 * Defining Byte 0x00: WRRDTURN
746 		 *
747 		 * @see i3c_ccc_getmxds::fmt2
748 		 */
749 		uint8_t wrrdturn[5];
750 
751 		/**
752 		 * Defining Byte 0x91: CRHDLY
753 		 * - Bit[2]: Set Bus Activity State
754 		 * - Bit[1:0]: Controller Handoff Activity State
755 		 */
756 		uint8_t crhdly1;
757 	} fmt3;
758 } __packed;
759 
760 /** Get Max Data Speed (GETMXDS) - Default Max Sustained Data Rate. */
761 #define I3C_CCC_GETMXDS_MAX_SDR_FSCL_MAX			0
762 
763 /** Get Max Data Speed (GETMXDS) - 8MHz Max Sustained Data Rate. */
764 #define I3C_CCC_GETMXDS_MAX_SDR_FSCL_8MHZ			1
765 
766 /** Get Max Data Speed (GETMXDS) - 6MHz Max Sustained Data Rate. */
767 #define I3C_CCC_GETMXDS_MAX_SDR_FSCL_6MHZ			2
768 
769 /** Get Max Data Speed (GETMXDS) - 4MHz Max Sustained Data Rate. */
770 #define I3C_CCC_GETMXDS_MAX_SDR_FSCL_4MHZ			3
771 
772 /** Get Max Data Speed (GETMXDS) - 2MHz Max Sustained Data Rate. */
773 #define I3C_CCC_GETMXDS_MAX_SDR_FSCL_2MHZ			4
774 
775 /** Get Max Data Speed (GETMXDS) - Clock to Data Turnaround <= 8ns. */
776 #define I3C_CCC_GETMXDS_TSCO_8NS				0
777 
778 /** Get Max Data Speed (GETMXDS) - Clock to Data Turnaround <= 9ns. */
779 #define I3C_CCC_GETMXDS_TSCO_9NS				1
780 
781 /** Get Max Data Speed (GETMXDS) - Clock to Data Turnaround <= 10ns. */
782 #define I3C_CCC_GETMXDS_TSCO_10NS				2
783 
784 /** Get Max Data Speed (GETMXDS) - Clock to Data Turnaround <= 11ns. */
785 #define I3C_CCC_GETMXDS_TSCO_11NS				3
786 
787 /** Get Max Data Speed (GETMXDS) - Clock to Data Turnaround <= 12ns. */
788 #define I3C_CCC_GETMXDS_TSCO_12NS				4
789 
790 /** Get Max Data Speed (GETMXDS) - Clock to Data Turnaround > 12ns. */
791 #define I3C_CCC_GETMXDS_TSCO_GT_12NS				7
792 
793 /** Get Max Data Speed (GETMXDS) - maxWr - Optional Defining Byte Support. */
794 #define I3C_CCC_GETMXDS_MAXWR_DEFINING_BYTE_SUPPORT		BIT(3)
795 
796 /** Get Max Data Speed (GETMXDS) - Max Sustained Data Rate bitmask. */
797 #define I3C_CCC_GETMXDS_MAXWR_MAX_SDR_FSCL_MASK			GENMASK(2U, 0U)
798 
799 /**
800  * @brief Get Max Data Speed (GETMXDS) - maxWr - Max Sustained Data Rate
801  *
802  * Obtain Max Sustained Data Rate value from GETMXDS maxWr value
803  * obtained via GETMXDS.
804  *
805  * @param maxwr GETMXDS maxWr value.
806  */
807 #define I3C_CCC_GETMXDS_MAXWR_MAX_SDR_FSCL(maxwr)		\
808 	FIELD_GET(I3C_CCC_GETMXDS_MAXWR_MAX_SDR_FSCL_MASK, (maxwr))
809 
810 /** Get Max Data Speed (GETMXDS) - maxRd - Write-to-Read Permits Stop Between. */
811 #define I3C_CCC_GETMXDS_MAXRD_W2R_PERMITS_STOP_BETWEEN		BIT(6)
812 
813 /** Get Max Data Speed (GETMXDS) - maxRd - Clock to Data Turnaround bitmask. */
814 #define I3C_CCC_GETMXDS_MAXRD_TSCO_MASK				GENMASK(5U, 3U)
815 
816 /**
817  * @brief Get Max Data Speed (GETMXDS) - maxRd - Clock to Data Turnaround
818  *
819  * Obtain Clock to Data Turnaround value from GETMXDS maxRd value
820  * obtained via GETMXDS.
821  *
822  * @param maxrd GETMXDS maxRd value.
823  */
824 #define I3C_CCC_GETMXDS_MAXRD_TSCO(maxrd)			\
825 	FIELD_GET(I3C_CCC_GETMXDS_MAXRD_TSCO_MASK, (maxrd))
826 
827 /** Get Max Data Speed (GETMXDS) - maxRd - Max Sustained Data Rate bitmask. */
828 #define I3C_CCC_GETMXDS_MAXRD_MAX_SDR_FSCL_MASK			GENMASK(2U, 0U)
829 
830 /**
831  * @brief Get Max Data Speed (GETMXDS) - maxRd - Max Sustained Data Rate
832  *
833  * Obtain Max Sustained Data Rate value from GETMXDS maxRd value
834  * obtained via GETMXDS.
835  *
836  * @param maxrd GETMXDS maxRd value.
837  */
838 #define I3C_CCC_GETMXDS_MAXRD_MAX_SDR_FSCL(maxrd)		\
839 	FIELD_GET(I3C_CCC_GETMXDS_MAXRD_MAX_SDR_FSCL_MASK, (maxrd))
840 
841 /** Get Max Data Speed (GETMXDS) - CRDHLY1 - Set Bus Activity State bit shift value. */
842 #define I3C_CCC_GETMXDS_CRDHLY1_SET_BUS_ACT_STATE		BIT(2)
843 
844 /** Get Max Data Speed (GETMXDS) - CRDHLY1 - Controller Handoff Activity State bitmask. */
845 #define I3C_CCC_GETMXDS_CRDHLY1_CTRL_HANDOFF_ACT_STATE_MASK	GENMASK(1U, 0U)
846 
847 /**
848  * @brief Get Max Data Speed (GETMXDS) - CRDHLY1 - Controller Handoff Activity State
849  *
850  * Obtain Controller Handoff Activity State value from GETMXDS value
851  * obtained via GETMXDS.
852  *
853  * @param crhdly1 GETMXDS value.
854  */
855 #define I3C_CCC_GETMXDS_CRDHLY1_CTRL_HANDOFF_ACT_STATE(crhdly1)	\
856 	FIELD_GET(I3C_CCC_GETMXDS_CRDHLY1_CTRL_HANDOFF_ACT_STATE_MASK, (chrdly1))
857 
858 /**
859  * @brief Indicate which format of GETCAPS to use.
860  */
861 enum i3c_ccc_getcaps_fmt {
862 	/** GETCAPS Format 1 */
863 	GETCAPS_FORMAT_1,
864 
865 	/** GETCAPS Format 2 */
866 	GETCAPS_FORMAT_2,
867 };
868 
869 /**
870  * @brief Enum for I3C Get Capabilities (GETCAPS) Format 2 Defining Byte Values.
871  */
872 enum i3c_ccc_getcaps_defbyte {
873 	/** Standard Target capabilities and features. */
874 	GETCAPS_FORMAT_2_TGTCAPS = 0x00U,
875 
876 	/** Fixed 32b test pattern. */
877 	GETCAPS_FORMAT_2_TESTPAT = 0x5AU,
878 
879 	/** Controller handoff capabilities and features. */
880 	GETCAPS_FORMAT_2_CRCAPS = 0x91U,
881 
882 	/** Virtual Target capabilities and features. */
883 	GETCAPS_FORMAT_2_VTCAPS = 0x93U,
884 
885 	/** Debug-capable Device capabilities and features. */
886 	GETCAPS_FORMAT_2_DBGCAPS = 0xD7U,
887 
888 	/** Invalid defining byte. */
889 	GETCAPS_FORMAT_2_INVALID = 0x100,
890 };
891 
892 /**
893  * @brief Payload for GETCAPS CCC (Get Optional Feature Capabilities).
894  *
895  * @note Only supports GETCAPS Format 1 and Format 2. In I3C v1.0 this was
896  * GETHDRCAP which only returned a single byte which is the same as the
897  * GETCAPS1 byte.
898  */
899 union i3c_ccc_getcaps {
900 	union {
901 		/**
902 		 * I3C v1.0 HDR Capabilities
903 		 * - Bit[0]: HDR-DDR
904 		 * - Bit[1]: HDR-TSP
905 		 * - Bit[2]: HDR-TSL
906 		 * - Bit[7:3]: Reserved
907 		 */
908 		uint8_t gethdrcap;
909 
910 		/**
911 		 * I3C v1.1+ Device Capabilities
912 		 * Byte 1 GETCAPS1
913 		 * - Bit[0]: HDR-DDR
914 		 * - Bit[1]: HDR-TSP
915 		 * - Bit[2]: HDR-TSL
916 		 * - Bit[3]: HDR-BT
917 		 * - Bit[7:4]: Reserved
918 		 * Byte 2 GETCAPS2
919 		 * - Bit[3:0]: I3C 1.x Specification Version
920 		 * - Bit[5:4]: Group Address Capabilities
921 		 * - Bit[6]: HDR-DDR Write Abort
922 		 * - Bit[7]: HDR-DDR Abort CRC
923 		 * Byte 3 GETCAPS3
924 		 * - Bit[0]: Multi-Lane (ML) Data Transfer Support
925 		 * - Bit[1]: Device to Device Transfer (D2DXFER) Support
926 		 * - Bit[2]: Device to Device Transfer (D2DXFER) IBI Capable
927 		 * - Bit[3]: Defining Byte Support in GETCAPS
928 		 * - Bit[4]: Defining Byte Support in GETSTATUS
929 		 * - Bit[5]: HDR-BT CRC-32 Support
930 		 * - Bit[6]: IBI MDB Support for Pending Read Notification
931 		 * - Bit[7]: Reserved
932 		 * Byte 4 GETCAPS4
933 		 * - Bit[7:0]: Reserved
934 		 */
935 		uint8_t getcaps[4];
936 	} fmt1;
937 
938 	union {
939 		/**
940 		 * Defining Byte 0x00: TGTCAPS
941 		 *
942 		 * @see i3c_ccc_getcaps::fmt1::getcaps
943 		 */
944 		uint8_t tgtcaps[4];
945 
946 		/**
947 		 * Defining Byte 0x5A: TESTPAT
948 		 *
949 		 * @note should always be 0xA55AA55A in big endian
950 		 */
951 		uint32_t testpat;
952 
953 		/**
954 		 * Defining Byte 0x91: CRCAPS
955 		 * Byte 1 CRCAPS1
956 		 * - Bit[0]: Hot-Join Support
957 		 * - Bit[1]: Group Management Support
958 		 * - Bit[2]: Multi-Lane Support
959 		 * Byte 2 CRCAPS2
960 		 * - Bit[0]: In-Band Interrupt Support
961 		 * - Bit[1]: Controller Pass-Back
962 		 * - Bit[2]: Deep Sleep Capable
963 		 * - Bit[3]: Delayed Controller Handoff
964 		 */
965 		uint8_t crcaps[2];
966 
967 		/**
968 		 * Defining Byte 0x93: VTCAPS
969 		 * Byte 1 VTCAPS1
970 		 * - Bit[2:0]: Virtual Target Type
971 		 * - Bit[4]: Side Effects
972 		 * - Bit[5]: Shared Peripheral Detect
973 		 * Byte 2 VTCAPS2
974 		 * - Bit[1:0]: Interrupt Requests
975 		 * - Bit[2]: Address Remapping
976 		 * - Bit[4:3]: Bus Context and Conditions
977 		 */
978 		uint8_t vtcaps[2];
979 	} fmt2;
980 } __packed;
981 
982 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR-DDR mode bit. */
983 #define I3C_CCC_GETCAPS1_HDR_DDR				BIT(0)
984 
985 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR-TSP mode bit. */
986 #define I3C_CCC_GETCAPS1_HDR_TSP				BIT(1)
987 
988 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR-TSL mode bit. */
989 #define I3C_CCC_GETCAPS1_HDR_TSL				BIT(2)
990 
991 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR-BT mode bit. */
992 #define I3C_CCC_GETCAPS1_HDR_BT					BIT(3)
993 
994 /**
995  * @brief Get Optional Feature Capabilities Byte 1 (GETCAPS) - HDR Mode
996  *
997  * Get the bit corresponding to HDR mode.
998  *
999  * @param x HDR mode
1000  */
1001 #define I3C_CCC_GETCAPS1_HDR_MODE(x)				BIT(x)
1002 
1003 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 0. */
1004 #define I3C_CCC_GETCAPS1_HDR_MODE0				BIT(0)
1005 
1006 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 1. */
1007 #define I3C_CCC_GETCAPS1_HDR_MODE1				BIT(1)
1008 
1009 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 2. */
1010 #define I3C_CCC_GETCAPS1_HDR_MODE2				BIT(2)
1011 
1012 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 3. */
1013 #define I3C_CCC_GETCAPS1_HDR_MODE3				BIT(3)
1014 
1015 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 4. */
1016 #define I3C_CCC_GETCAPS1_HDR_MODE4				BIT(4)
1017 
1018 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 5. */
1019 #define I3C_CCC_GETCAPS1_HDR_MODE5				BIT(5)
1020 
1021 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 6. */
1022 #define I3C_CCC_GETCAPS1_HDR_MODE6				BIT(6)
1023 
1024 /** Get Optional Feature Capabilities Byte 1 (GETCAPS) Format 1 - HDR Mode 7. */
1025 #define I3C_CCC_GETCAPS1_HDR_MODE7				BIT(7)
1026 
1027 /** Get Optional Feature Capabilities Byte 2 (GETCAPS) Format 1 - HDR-DDR Write Abort bit. */
1028 #define I3C_CCC_GETCAPS2_HDRDDR_WRITE_ABORT			BIT(6)
1029 
1030 /** Get Optional Feature Capabilities Byte 2 (GETCAPS) Format 1 - HDR-DDR Abort CRC bit. */
1031 #define I3C_CCC_GETCAPS2_HDRDDR_ABORT_CRC			BIT(7)
1032 
1033 /**
1034  * @brief Get Optional Feature Capabilities Byte 2 (GETCAPS) Format 1 -
1035  *        Group Address Capabilities bitmask.
1036  */
1037 #define I3C_CCC_GETCAPS2_GRPADDR_CAP_MASK			GENMASK(5U, 4U)
1038 
1039 /**
1040  * @brief Get Optional Feature Capabilities Byte 2 (GETCAPS) Format 1 - Group Address Capabilities.
1041  *
1042  * Obtain Group Address Capabilities value from GETCAPS Format 1 value
1043  * obtained via GETCAPS.
1044  *
1045  * @param getcaps2 GETCAPS2 value.
1046  */
1047 #define I3C_CCC_GETCAPS2_GRPADDR_CAP(getcaps2)			\
1048 	FIELD_GET(I3C_CCC_GETCAPS2_GRPADDR_CAP_MASK, (getcaps2))
1049 
1050 /**
1051  * @brief Get Optional Feature Capabilities Byte 2 (GETCAPS) Format 1 -
1052  *        I3C 1.x Specification Version bitmask.
1053  */
1054 #define I3C_CCC_GETCAPS2_SPEC_VER_MASK				GENMASK(3U, 0U)
1055 
1056 /**
1057  * @brief Get Optional Feature Capabilities Byte 2 (GETCAPS) Format 1 -
1058  *        I3C 1.x Specification Version.
1059  *
1060  * Obtain I3C 1.x Specification Version value from GETCAPS Format 1 value
1061  * obtained via GETCAPS.
1062  *
1063  * @param getcaps2 GETCAPS2 value.
1064  */
1065 #define I3C_CCC_GETCAPS2_SPEC_VER(getcaps2)			\
1066 	FIELD_GET(I3C_CCC_GETCAPS2_SPEC_VER_MASK, (getcaps2))
1067 
1068 /**
1069  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1070  *        Multi-Lane Data Transfer Support bit.
1071  */
1072 #define I3C_CCC_GETCAPS3_MLANE_SUPPORT				BIT(0)
1073 
1074 /**
1075  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1076  *        Device to Device Transfer (D2DXFER) Support bit.
1077  */
1078 #define I3C_CCC_GETCAPS3_D2DXFER_SUPPORT			BIT(1)
1079 
1080 /**
1081  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1082  *        Device to Device Transfer (D2DXFER) IBI Capable bit.
1083  */
1084 #define I3C_CCC_GETCAPS3_D2DXFER_IBI_CAPABLE			BIT(2)
1085 
1086 /**
1087  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1088  *        Defining Byte Support in GETCAPS bit.
1089  */
1090 #define I3C_CCC_GETCAPS3_GETCAPS_DEFINING_BYTE_SUPPORT		BIT(3)
1091 
1092 /**
1093  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1094  *        Defining Byte Support in GETSTATUS bit.
1095  */
1096 #define I3C_CCC_GETCAPS3_GETSTATUS_DEFINING_BYTE_SUPPORT	BIT(4)
1097 
1098 /**
1099  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1100  *        HDR-BT CRC-32 Support bit.
1101  */
1102 #define I3C_CCC_GETCAPS3_HDRBT_CRC32_SUPPORT			BIT(5)
1103 
1104 /**
1105  * @brief Get Optional Feature Capabilities Byte 3 (GETCAPS) Format 1 -
1106  *        IBI MDB Support for Pending Read Notification bit.
1107  */
1108 #define I3C_CCC_GETCAPS3_IBI_MDR_PENDING_READ_NOTIFICATION	BIT(6)
1109 
1110 /**
1111  * @brief Get Fixed Test Pattern (GETCAPS) Format 2 -
1112  *        Fixed Test Pattern Byte 1.
1113  */
1114 #define I3C_CCC_GETCAPS_TESTPAT1				0xA5
1115 
1116 /**
1117  * @brief Get Fixed Test Pattern (GETCAPS) Format 2 -
1118  *        Fixed Test Pattern Byte 2.
1119  */
1120 #define I3C_CCC_GETCAPS_TESTPAT2				0x5A
1121 
1122 /**
1123  * @brief Get Fixed Test Pattern (GETCAPS) Format 2 -
1124  *        Fixed Test Pattern Byte 3.
1125  */
1126 #define I3C_CCC_GETCAPS_TESTPAT3				0xA5
1127 
1128 /**
1129  * @brief Get Fixed Test Pattern (GETCAPS) Format 2 -
1130  *        Fixed Test Pattern Byte 4.
1131  */
1132 #define I3C_CCC_GETCAPS_TESTPAT4				0x5A
1133 
1134 /**
1135  * @brief Get Fixed Test Pattern (GETCAPS) Format 2 -
1136  *        Fixed Test Pattern Word in Big Endian.
1137  */
1138 #define I3C_CCC_GETCAPS_TESTPAT					0xA55AA55A
1139 
1140 /**
1141  * @brief Get Controller Handoff Capabilities Byte 1 (GETCAPS) Format 2 -
1142  *        Hot-Join Support.
1143  */
1144 #define I3C_CCC_GETCAPS_CRCAPS1_HJ_SUPPORT			BIT(0)
1145 
1146 /**
1147  * @brief Get Controller Handoff Capabilities Byte 1 (GETCAPS) Format 2 -
1148  *        Group Management Support.
1149  */
1150 #define I3C_CCC_GETCAPS_CRCAPS1_GRP_MANAGEMENT_SUPPORT		BIT(1)
1151 
1152 /**
1153  * @brief Get Controller Handoff Capabilities Byte 1 (GETCAPS) Format 2 -
1154  *        Multi-Lane Support.
1155  */
1156 #define I3C_CCC_GETCAPS_CRCAPS1_ML_SUPPORT			BIT(2)
1157 
1158 /**
1159  * @brief Get Controller Handoff Capabilities Byte 2 (GETCAPS) Format 2 -
1160  *        In-Band Interrupt Support.
1161  */
1162 #define I3C_CCC_GETCAPS_CRCAPS2_IBI_TIR_SUPPORT			BIT(0)
1163 
1164 /**
1165  * @brief Get Controller Handoff Capabilities Byte 2 (GETCAPS) Format 2 -
1166  *        Controller Pass-Back.
1167  */
1168 #define I3C_CCC_GETCAPS_CRCAPS2_CONTROLLER_PASSBACK		BIT(1)
1169 
1170 /**
1171  * @brief Get Controller Handoff Capabilities Byte 2 (GETCAPS) Format 2 -
1172  *        Deep Sleep Capable.
1173  */
1174 #define I3C_CCC_GETCAPS_CRCAPS2_DEEP_SLEEP_CAPABLE		BIT(2)
1175 
1176 /**
1177  * @brief Get Controller Handoff Capabilities Byte 2 (GETCAPS) Format 2 -
1178  *        Deep Sleep Capable.
1179  */
1180 #define I3C_CCC_GETCAPS_CRCAPS2_DELAYED_CONTROLLER_HANDOFF	BIT(3)
1181 
1182 /** Get Capabilities (GETCAPS) - VTCAP1 - Virtual Target Type bitmask. */
1183 #define I3C_CCC_GETCAPS_VTCAP1_VITRUAL_TARGET_TYPE_MASK		GENMASK(2U, 0U)
1184 
1185 /**
1186  * @brief Get Capabilities (GETCAPS) - VTCAP1 - Virtual Target Type
1187  *
1188  * Obtain Virtual Target Type value from VTCAP1 value
1189  * obtained via GETCAPS format 2 VTCAP def byte.
1190  *
1191  * @param vtcap1 VTCAP1 value.
1192  */
1193 #define I3C_CCC_GETCAPS_VTCAP1_VITRUAL_TARGET_TYPE(vtcap1)	\
1194 	FIELD_GET(I3C_CCC_GETCAPS_VTCAP1_VITRUAL_TARGET_TYPE_MASK, (vtcap1))
1195 
1196 /**
1197  * @brief Get Virtual Target Capabilities Byte 1 (GETCAPS) Format 2 -
1198  *        Side Effects.
1199  */
1200 #define I3C_CCC_GETCAPS_VTCAP1_SIDE_EFFECTS			BIT(4)
1201 
1202 /**
1203  * @brief Get Virtual Target Capabilities Byte 1 (GETCAPS) Format 2 -
1204  *        Shared Peripheral Detect.
1205  */
1206 #define I3C_CCC_GETCAPS_VTCAP1_SHARED_PERIPH_DETECT		BIT(5)
1207 
1208 /** Get Capabilities (GETCAPS) - VTCAP2 - Interrupt Requests bitmask. */
1209 #define I3C_CCC_GETCAPS_VTCAP2_INTERRUPT_REQUESTS_MASK		GENMASK(1U, 0U)
1210 
1211 /**
1212  * @brief Get Capabilities (GETCAPS) - VTCAP2 - Interrupt Requests
1213  *
1214  * Obtain Interrupt Requests value from VTCAP2 value
1215  * obtained via GETCAPS format 2 VTCAP def byte.
1216  *
1217  * @param vtcap2 VTCAP2 value.
1218  */
1219 #define I3C_CCC_GETCAPS_VTCAP2_INTERRUPT_REQUESTS(vtcap2)	\
1220 	FIELD_GET(I3C_CCC_GETCAPS_VTCAP2_INTERRUPT_REQUESTS_MASK, (vtcap2))
1221 
1222 /**
1223  * @brief Get Virtual Target Capabilities Byte 2 (GETCAPS) Format 2 -
1224  *        Address Remapping.
1225  */
1226 #define I3C_CCC_GETCAPS_VTCAP2_ADDRESS_REMAPPING		BIT(2)
1227 
1228 /** Get Capabilities (GETCAPS) - VTCAP2 - Bus Context and Condition bitmask. */
1229 #define I3C_CCC_GETCAPS_VTCAP2_BUS_CONTEXT_AND_COND_MASK	GENMASK(4U, 3U)
1230 
1231 /**
1232  * @brief Get Capabilities (GETCAPS) - VTCAP2 - Bus Context and Condition
1233  *
1234  * Obtain Bus Context and Condition value from VTCAP2 value
1235  * obtained via GETCAPS format 2 VTCAP def byte.
1236  *
1237  * @param vtcap2 VTCAP2 value.
1238  */
1239 #define I3C_CCC_GETCAPS_VTCAP2_BUS_CONTEXT_AND_COND(vtcap2)	\
1240 	FIELD_GET(I3C_CCC_GETCAPS_VTCAP2_BUS_CONTEXT_AND_COND_MASK, (vtcap2))
1241 
1242 /**
1243  * @brief Enum for I3C Reset Action (RSTACT) Defining Byte Values.
1244  */
1245 enum i3c_ccc_rstact_defining_byte {
1246 	/** No Reset on Target Reset Pattern. */
1247 	I3C_CCC_RSTACT_NO_RESET = 0x00U,
1248 
1249 	/** Reset the I3C Peripheral Only. */
1250 	I3C_CCC_RSTACT_PERIPHERAL_ONLY = 0x01U,
1251 
1252 	/** Reset the Whole Target. */
1253 	I3C_CCC_RSTACT_RESET_WHOLE_TARGET = 0x02U,
1254 
1255 	/** Debug Network Adapter Reset. */
1256 	I3C_CCC_RSTACT_DEBUG_NETWORK_ADAPTER = 0x03U,
1257 
1258 	/** Virtual Target Detect. */
1259 	I3C_CCC_RSTACT_VIRTUAL_TARGET_DETECT = 0x04U,
1260 
1261 	/** Return Time to Reset Peripheral */
1262 	I3C_CCC_RSTACT_RETURN_TIME_TO_RESET_PERIPHERAL = 0x81U,
1263 
1264 	/** Return Time to Reset Whole Target */
1265 	I3C_CCC_RSTACT_RETURN_TIME_TO_WHOLE_TARGET = 0x82U,
1266 
1267 	/** Return Time for Debug Network Adapter Reset */
1268 	I3C_CCC_RSTACT_RETURN_TIME_FOR_DEBUG_NETWORK_ADAPTER_RESET = 0x83U,
1269 
1270 	/** Return Virtual Target Indication */
1271 	I3C_CCC_RSTACT_RETURN_VIRTUAL_TARGET_INDICATION = 0x84U,
1272 };
1273 
1274 /**
1275  * @name Set Bus Context MIPI I3C Specification v1.Y Minor Version (SETBUSCON)
1276  * @anchor I3C_CCC_SETBUSCON_I3C_SPEC
1277  *
1278  * - CONTEXT[7:6]: 2'b00
1279  *
1280  * - CONTEXT[5]: I3C Specification Editorial Revision (within Minor Version)
1281  *   - 0: Version 1.Y.0
1282  *   - 1: Version 1.Y.1 or greater
1283  *
1284  * - CONTEXT[4]: I3C Specification Family
1285  *   - 0: MIPI I3C Specification
1286  *   - 1: MIPI I3C Basic Specification
1287  *
1288  * - CONTEXT[3:0]: I3C Specification Minor Version (v1.Y)
1289  *   - 0: Illegal, do not use (see Note below)
1290  *        (It would encode v1.0, but SETBUSCON was not available in I3C Basic v1.0)
1291  *   - 1-15: Version 1.1 - Version 1.15
1292  *
1293  * Examples:  Bit[5]  Bit[4]   Bits[3:0]
1294  *    I3C Basic v1.1.0:  1’b0 || 1’b1 || 4’b0001 or 8’b00010001
1295  *    I3C Basic v1.1.1:  1’b1 || 1’b1 || 4’b0001 or 8’b00110001
1296  *    I3C Basic v1.2.0:  1’b0 || 1’b1 || 4’b0010 or 8’b00010010
1297  *
1298  * @{
1299  */
1300 
1301 /** I3C Specification Minor Version shift mask */
1302 #define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK		GENMASK(3U, 0U)
1303 
1304 /**
1305  * @brief I3C Specification Minor Version (v1.Y)
1306  *
1307  * Set the context bits for SETBUSCON
1308  *
1309  * @param y I3C Specification Minor Version Number
1310  */
1311 #define I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER(y)			\
1312 	FIELD_PREP(I3C_CCC_SETBUSCON_I3C_SPEC_MINOR_VER_MASK, (y))
1313 
1314 /** MIPI I3C Specification */
1315 #define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC			0
1316 
1317 /** MIPI I3C Basic Specification */
1318 #define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_BASIC_SPEC		BIT(4)
1319 
1320 /** Version 1.Y.0 */
1321 #define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_0	0
1322 
1323 /** Version 1.Y.1 or greater */
1324 #define I3C_CCC_SETBUSCON_I3C_SPEC_I3C_SPEC_EDITORIAL_1_Y_1	BIT(5)
1325 
1326 /** @} */
1327 
1328 /**
1329  * @name Set Bus Context Other Standards Organizations (SETBUSCON)
1330  * @anchor I3C_CCC_SETBUSCON_OTHER_STANDARDS
1331  *
1332  * @{
1333  */
1334 
1335 /**
1336  * @brief JEDEC Sideband
1337  *
1338  * JEDEC SideBand Bus device, compliant to JESD403 Specification v1.0 or later.
1339  */
1340 #define I3C_CCC_SETBUSCON_OTHER_STANDARDS_JEDEC_SIDEBAND	128
1341 
1342 /**
1343  * @brief MCTP
1344  *
1345  * MCTP for system manageability (conforming to the content protocol defined in
1346  * the MCTP I3C Transport Binding Specification, released by DMTF, version 1.0
1347  * or newer)
1348  */
1349 #define I3C_CCC_SETBUSCON_OTHER_STANDARDS_MCTP			129
1350 
1351 /**
1352  * @brief ETSI
1353  *
1354  * ETSI for Secure Smart Platform Devices used for mobile networks authentication
1355  * and other ETSI security functions in mobile ecosystem
1356  */
1357 #define I3C_CCC_SETBUSCON_OTHER_STANDARDS_ETSI			130
1358 
1359 /** @} */
1360 
1361 /**
1362  * @brief Test if I3C CCC payload is for broadcast.
1363  *
1364  * This tests if the CCC payload is for broadcast.
1365  *
1366  * @param[in] payload Pointer to the CCC payload.
1367  *
1368  * @retval true if payload target is broadcast
1369  * @retval false if payload target is direct
1370  */
i3c_ccc_is_payload_broadcast(const struct i3c_ccc_payload * payload)1371 static inline bool i3c_ccc_is_payload_broadcast(const struct i3c_ccc_payload *payload)
1372 {
1373 	return (payload->ccc.id <= I3C_CCC_BROADCAST_MAX_ID);
1374 }
1375 
1376 /**
1377  * @brief Get BCR from a target
1378  *
1379  * Helper function to get BCR (Bus Characteristic Register) from
1380  * target device.
1381  *
1382  * @param[in] target Pointer to the target device descriptor.
1383  * @param[out] bcr Pointer to the BCR payload structure.
1384  *
1385  * @return @see i3c_do_ccc
1386  */
1387 int i3c_ccc_do_getbcr(struct i3c_device_desc *target,
1388 		      struct i3c_ccc_getbcr *bcr);
1389 
1390 /**
1391  * @brief Get DCR from a target
1392  *
1393  * Helper function to get DCR (Device Characteristic Register) from
1394  * target device.
1395  *
1396  * @param[in] target Pointer to the target device descriptor.
1397  * @param[out] dcr Pointer to the DCR payload structure.
1398  *
1399  * @return @see i3c_do_ccc
1400  */
1401 int i3c_ccc_do_getdcr(struct i3c_device_desc *target,
1402 		      struct i3c_ccc_getdcr *dcr);
1403 
1404 /**
1405  * @brief Get PID from a target
1406  *
1407  * Helper function to get PID (Provisioned ID) from
1408  * target device.
1409  *
1410  * @param[in] target Pointer to the target device descriptor.
1411  * @param[out] pid Pointer to the PID payload structure.
1412  *
1413  * @return @see i3c_do_ccc
1414  */
1415 int i3c_ccc_do_getpid(struct i3c_device_desc *target,
1416 		      struct i3c_ccc_getpid *pid);
1417 
1418 /**
1419  * @brief Broadcast RSTACT to reset I3C Peripheral (Format 1).
1420  *
1421  * Helper function to broadcast Target Reset Action (RSTACT) to
1422  * all connected targets.
1423  *
1424  * @param[in] controller Pointer to the controller device driver instance.
1425  * @param[in] action What reset action to perform.
1426  *
1427  * @return @see i3c_do_ccc
1428  */
1429 int i3c_ccc_do_rstact_all(const struct device *controller,
1430 			  enum i3c_ccc_rstact_defining_byte action);
1431 
1432 /**
1433  * @brief Single target RSTACT to reset I3C Peripheral.
1434  *
1435  * Helper function to do Target Reset Action (RSTACT) to
1436  * one target.
1437  *
1438  * @param[in] target Pointer to the target device descriptor.
1439  * @param[in] action What reset action to perform.
1440  * @param[in] get True if a get, False if set
1441  * @param[out] data Pointer to RSTACT payload received.
1442  *
1443  * @return @see i3c_do_ccc
1444  */
1445 int i3c_ccc_do_rstact(const struct i3c_device_desc *target,
1446 			  enum i3c_ccc_rstact_defining_byte action,
1447 			  bool get,
1448 			  uint8_t *data);
1449 
1450 /**
1451  * @brief Single target RSTACT to reset I3C Peripheral (Format 2).
1452  *
1453  * Helper function to do Target Reset Action (RSTACT, format 2) to
1454  * one target. This is a Direct Write.
1455  *
1456  * @param[in] target Pointer to the target device descriptor.
1457  * @param[in] action What reset action to perform.
1458  *
1459  * @return @see i3c_do_ccc
1460  */
i3c_ccc_do_rstact_fmt2(const struct i3c_device_desc * target,enum i3c_ccc_rstact_defining_byte action)1461 static inline int i3c_ccc_do_rstact_fmt2(const struct i3c_device_desc *target,
1462 			  enum i3c_ccc_rstact_defining_byte action)
1463 {
1464 	return i3c_ccc_do_rstact(target, action, false, NULL);
1465 }
1466 
1467 /**
1468  * @brief Single target RSTACT to reset I3C Peripheral (Format 3).
1469  *
1470  * Helper function to do Target Reset Action (RSTACT, format 3) to
1471  * one target. This is a Direct Read.
1472  *
1473  * @param[in] target Pointer to the target device descriptor.
1474  * @param[in] action What reset action to perform.
1475  * @param[out] data Pointer to RSTACT payload received.
1476  *
1477  * @return @see i3c_do_ccc
1478  */
i3c_ccc_do_rstact_fmt3(const struct i3c_device_desc * target,enum i3c_ccc_rstact_defining_byte action,uint8_t * data)1479 static inline int i3c_ccc_do_rstact_fmt3(const struct i3c_device_desc *target,
1480 			  enum i3c_ccc_rstact_defining_byte action,
1481 			  uint8_t *data)
1482 {
1483 	return i3c_ccc_do_rstact(target, action, true, data);
1484 }
1485 
1486 /**
1487  * @brief Broadcast RSTDAA to reset dynamic addresses for all targets.
1488  *
1489  * Helper function to reset dynamic addresses of all connected targets.
1490  *
1491  * @param[in] controller Pointer to the controller device driver instance.
1492  *
1493  * @return @see i3c_do_ccc
1494  */
1495 int i3c_ccc_do_rstdaa_all(const struct device *controller);
1496 
1497 /**
1498  * @brief Set Dynamic Address from Static Address for a target
1499  *
1500  * Helper function to do SETDASA (Set Dynamic Address from Static Address)
1501  * for a particular target.
1502  *
1503  * Note this does not update @p target with the new dynamic address.
1504  *
1505  * @param[in] target Pointer to the target device descriptor where
1506  *                   the device is configured with a static address.
1507  * @param[in] da Struct of the Dynamic address
1508  *
1509  * @return @see i3c_do_ccc
1510  */
1511 int i3c_ccc_do_setdasa(const struct i3c_device_desc *target,
1512 			  struct i3c_ccc_address da);
1513 
1514 /**
1515  * @brief Set New Dynamic Address for a target
1516  *
1517  * Helper function to do SETNEWDA(Set New Dynamic Address) for a particular target.
1518  *
1519  * Note this does not update @p target with the new dynamic address.
1520  *
1521  * @param[in] target Pointer to the target device descriptor where
1522  *                   the device is configured with a static address.
1523  * @param[in] new_da Struct of the Dynamic address
1524  *
1525  * @return @see i3c_do_ccc
1526  */
1527 int i3c_ccc_do_setnewda(const struct i3c_device_desc *target,
1528 			  struct i3c_ccc_address new_da);
1529 
1530 /**
1531  * @brief Broadcast ENEC/DISEC to enable/disable target events.
1532  *
1533  * Helper function to broadcast Target Events Command to enable or
1534  * disable target events (ENEC/DISEC).
1535  *
1536  * @param[in] controller Pointer to the controller device driver instance.
1537  * @param[in] enable ENEC if true, DISEC if false.
1538  * @param[in] events Pointer to the event struct.
1539  *
1540  * @return @see i3c_do_ccc
1541  */
1542 int i3c_ccc_do_events_all_set(const struct device *controller,
1543 			      bool enable, struct i3c_ccc_events *events);
1544 
1545 /**
1546  * @brief Direct CCC ENEC/DISEC to enable/disable target events.
1547  *
1548  * Helper function to send Target Events Command to enable or
1549  * disable target events (ENEC/DISEC) on a single target.
1550  *
1551  * @param[in] target Pointer to the target device descriptor.
1552  * @param[in] enable ENEC if true, DISEC if false.
1553  * @param[in] events Pointer to the event struct.
1554  *
1555  * @return @see i3c_do_ccc
1556  */
1557 int i3c_ccc_do_events_set(struct i3c_device_desc *target,
1558 			  bool enable, struct i3c_ccc_events *events);
1559 
1560 /**
1561  * @brief Direct ENTAS to set the Activity State.
1562  *
1563  * Helper function to broadcast Activity State Command on a single
1564  * target.
1565  *
1566  * @param[in] target Pointer to the target device descriptor.
1567  * @param[in] as Activity State level
1568  *
1569  * @return @see i3c_do_ccc
1570  */
1571 int i3c_ccc_do_entas(const struct i3c_device_desc *target, uint8_t as);
1572 
1573 /**
1574  * @brief Direct ENTAS0
1575  *
1576  * Helper function to do ENTAS0 setting the minimum bus activity level to 1us
1577  * on a single target.
1578  *
1579  * @param[in] target Pointer to the target device descriptor.
1580  *
1581  * @return @see i3c_do_ccc
1582  */
i3c_ccc_do_entas0(const struct i3c_device_desc * target)1583 static inline int i3c_ccc_do_entas0(const struct i3c_device_desc *target)
1584 {
1585 	return i3c_ccc_do_entas(target, 0);
1586 }
1587 
1588 /**
1589  * @brief Direct ENTAS1
1590  *
1591  * Helper function to do ENTAS1 setting the minimum bus activity level to 100us
1592  * on a single target.
1593  *
1594  * @param[in] target Pointer to the target device descriptor.
1595  *
1596  * @return @see i3c_do_ccc
1597  */
i3c_ccc_do_entas1(const struct i3c_device_desc * target)1598 static inline int i3c_ccc_do_entas1(const struct i3c_device_desc *target)
1599 {
1600 	return i3c_ccc_do_entas(target, 1);
1601 }
1602 
1603 /**
1604  * @brief Direct ENTAS2
1605  *
1606  * Helper function to do ENTAS2 setting the minimum bus activity level to 2ms
1607  * on a single target.
1608  *
1609  * @param[in] target Pointer to the target device descriptor.
1610  *
1611  * @return @see i3c_do_ccc
1612  */
i3c_ccc_do_entas2(const struct i3c_device_desc * target)1613 static inline int i3c_ccc_do_entas2(const struct i3c_device_desc *target)
1614 {
1615 	return i3c_ccc_do_entas(target, 2);
1616 }
1617 
1618 /**
1619  * @brief Direct ENTAS3
1620  *
1621  * Helper function to do ENTAS3 setting the minimum bus activity level to 50ms
1622  * on a single target.
1623  *
1624  * @param[in] target Pointer to the target device descriptor.
1625  *
1626  * @return @see i3c_do_ccc
1627  */
i3c_ccc_do_entas3(const struct i3c_device_desc * target)1628 static inline int i3c_ccc_do_entas3(const struct i3c_device_desc *target)
1629 {
1630 	return i3c_ccc_do_entas(target, 3);
1631 }
1632 
1633 /**
1634  * @brief Broadcast ENTAS to set the Activity State.
1635  *
1636  * Helper function to broadcast Activity State Command.
1637  *
1638  * @param[in] controller Pointer to the controller device driver instance.
1639  * @param[in] as Activity State level
1640  *
1641  * @return @see i3c_do_ccc
1642  */
1643 int i3c_ccc_do_entas_all(const struct device *controller, uint8_t as);
1644 
1645 /**
1646  * @brief Broadcast ENTAS0
1647  *
1648  * Helper function to do ENTAS0 setting the minimum bus activity level to 1us
1649  *
1650  * @param[in] controller Pointer to the controller device driver instance.
1651  *
1652  * @return @see i3c_do_ccc
1653  */
i3c_ccc_do_entas0_all(const struct device * controller)1654 static inline int i3c_ccc_do_entas0_all(const struct device *controller)
1655 {
1656 	return i3c_ccc_do_entas_all(controller, 0);
1657 }
1658 
1659 /**
1660  * @brief Broadcast ENTAS1
1661  *
1662  * Helper function to do ENTAS1 setting the minimum bus activity level to 100us
1663  *
1664  * @param[in] controller Pointer to the controller device driver instance.
1665  *
1666  * @return @see i3c_do_ccc
1667  */
i3c_ccc_do_entas1_all(const struct device * controller)1668 static inline int i3c_ccc_do_entas1_all(const struct device *controller)
1669 {
1670 	return i3c_ccc_do_entas_all(controller, 1);
1671 }
1672 
1673 /**
1674  * @brief Broadcast ENTAS2
1675  *
1676  * Helper function to do ENTAS2 setting the minimum bus activity level to 2ms
1677  *
1678  * @param[in] controller Pointer to the controller device driver instance.
1679  *
1680  * @return @see i3c_do_ccc
1681  */
i3c_ccc_do_entas2_all(const struct device * controller)1682 static inline int i3c_ccc_do_entas2_all(const struct device *controller)
1683 {
1684 	return i3c_ccc_do_entas_all(controller, 2);
1685 }
1686 
1687 /**
1688  * @brief Broadcast ENTAS3
1689  *
1690  * Helper function to do ENTAS3 setting the minimum bus activity level to 50ms
1691  *
1692  * @param[in] controller Pointer to the controller device driver instance.
1693  *
1694  * @return @see i3c_do_ccc
1695  */
i3c_ccc_do_entas3_all(const struct device * controller)1696 static inline int i3c_ccc_do_entas3_all(const struct device *controller)
1697 {
1698 	return i3c_ccc_do_entas_all(controller, 3);
1699 }
1700 
1701 /**
1702  * @brief Broadcast SETMWL to Set Maximum Write Length.
1703  *
1704  * Helper function to do SETMWL (Set Maximum Write Length) to
1705  * all connected targets.
1706  *
1707  * @param[in] controller Pointer to the controller device driver instance.
1708  * @param[in] mwl Pointer to SETMWL payload.
1709  *
1710  * @return @see i3c_do_ccc
1711  */
1712 int i3c_ccc_do_setmwl_all(const struct device *controller,
1713 			  const struct i3c_ccc_mwl *mwl);
1714 
1715 /**
1716  * @brief Single target SETMWL to Set Maximum Write Length.
1717  *
1718  * Helper function to do SETMWL (Set Maximum Write Length) to
1719  * one target.
1720  *
1721  * @param[in] target Pointer to the target device descriptor.
1722  * @param[in] mwl Pointer to SETMWL payload.
1723  *
1724  * @return @see i3c_do_ccc
1725  */
1726 int i3c_ccc_do_setmwl(const struct i3c_device_desc *target,
1727 		      const struct i3c_ccc_mwl *mwl);
1728 
1729 /**
1730  * @brief Single target GETMWL to Get Maximum Write Length.
1731  *
1732  * Helper function to do GETMWL (Get Maximum Write Length) of
1733  * one target.
1734  *
1735  * @param[in] target Pointer to the target device descriptor.
1736  * @param[out] mwl Pointer to GETMWL payload.
1737  *
1738  * @return @see i3c_do_ccc
1739  */
1740 int i3c_ccc_do_getmwl(const struct i3c_device_desc *target,
1741 		      struct i3c_ccc_mwl *mwl);
1742 
1743 /**
1744  * @brief Broadcast SETMRL to Set Maximum Read Length.
1745  *
1746  * Helper function to do SETMRL (Set Maximum Read Length) to
1747  * all connected targets.
1748  *
1749  * @param[in] controller Pointer to the controller device driver instance.
1750  * @param[in] mrl Pointer to SETMRL payload.
1751  * @param[in] has_ibi_size True if also sending the optional IBI payload
1752  *                         size. False if not sending.
1753  *
1754  * @return @see i3c_do_ccc
1755  */
1756 int i3c_ccc_do_setmrl_all(const struct device *controller,
1757 			  const struct i3c_ccc_mrl *mrl,
1758 			  bool has_ibi_size);
1759 
1760 /**
1761  * @brief Single target SETMRL to Set Maximum Read Length.
1762  *
1763  * Helper function to do SETMRL (Set Maximum Read Length) to
1764  * one target.
1765  *
1766  * Note this uses the BCR of the target to determine whether
1767  * to send the optional IBI payload size.
1768  *
1769  * @param[in] target Pointer to the target device descriptor.
1770  * @param[in] mrl Pointer to SETMRL payload.
1771  *
1772  * @return @see i3c_do_ccc
1773  */
1774 int i3c_ccc_do_setmrl(const struct i3c_device_desc *target,
1775 		      const struct i3c_ccc_mrl *mrl);
1776 
1777 /**
1778  * @brief Single target GETMRL to Get Maximum Read Length.
1779  *
1780  * Helper function to do GETMRL (Get Maximum Read Length) of
1781  * one target.
1782  *
1783  * Note this uses the BCR of the target to determine whether
1784  * to send the optional IBI payload size.
1785  *
1786  * @param[in] target Pointer to the target device descriptor.
1787  * @param[out] mrl Pointer to GETMRL payload.
1788  *
1789  * @return @see i3c_do_ccc
1790  */
1791 int i3c_ccc_do_getmrl(const struct i3c_device_desc *target,
1792 		      struct i3c_ccc_mrl *mrl);
1793 
1794 /**
1795  * @brief Broadcast ENTTM
1796  *
1797  * Helper function to do ENTTM (Enter Test Mode) to all devices
1798  *
1799  * @param[in] controller Pointer to the controller device driver instance.
1800  * @param[in] defbyte Defining Byte for ENTTM.
1801  *
1802  * @return @see i3c_do_ccc
1803  */
1804 int i3c_ccc_do_enttm(const struct device *controller,
1805 			 enum i3c_ccc_enttm_defbyte defbyte);
1806 
1807 /**
1808  * @brief Single target GETSTATUS to Get Target Status.
1809  *
1810  * Helper function to do GETSTATUS (Get Target Status) of
1811  * one target.
1812  *
1813  * Note this uses the BCR of the target to determine whether
1814  * to send the optional IBI payload size.
1815  *
1816  * @param[in] target Pointer to the target device descriptor.
1817  * @param[out] status Pointer to GETSTATUS payload.
1818  * @param[in] fmt Which GETSTATUS to use.
1819  * @param[in] defbyte Defining Byte if using format 2.
1820  *
1821  * @return @see i3c_do_ccc
1822  */
1823 int i3c_ccc_do_getstatus(const struct i3c_device_desc *target,
1824 			 union i3c_ccc_getstatus *status,
1825 			 enum i3c_ccc_getstatus_fmt fmt,
1826 			 enum i3c_ccc_getstatus_defbyte defbyte);
1827 
1828 /**
1829  * @brief Single target GETSTATUS to Get Target Status (Format 1).
1830  *
1831  * Helper function to do GETSTATUS (Get Target Status, format 1) of
1832  * one target.
1833  *
1834  * @param[in] target Pointer to the target device descriptor.
1835  * @param[out] status Pointer to GETSTATUS payload.
1836  *
1837  * @return @see i3c_do_ccc
1838  */
i3c_ccc_do_getstatus_fmt1(const struct i3c_device_desc * target,union i3c_ccc_getstatus * status)1839 static inline int i3c_ccc_do_getstatus_fmt1(const struct i3c_device_desc *target,
1840 					    union i3c_ccc_getstatus *status)
1841 {
1842 	return i3c_ccc_do_getstatus(target, status,
1843 				    GETSTATUS_FORMAT_1,
1844 				    GETSTATUS_FORMAT_2_INVALID);
1845 }
1846 
1847 /**
1848  * @brief Single target GETSTATUS to Get Target Status (Format 2).
1849  *
1850  * Helper function to do GETSTATUS (Get Target Status, format 2) of
1851  * one target.
1852  *
1853  * @param[in] target Pointer to the target device descriptor.
1854  * @param[out] status Pointer to GETSTATUS payload.
1855  * @param[in] defbyte Defining Byte for GETSTATUS format 2.
1856  *
1857  * @return @see i3c_do_ccc
1858  */
i3c_ccc_do_getstatus_fmt2(const struct i3c_device_desc * target,union i3c_ccc_getstatus * status,enum i3c_ccc_getstatus_defbyte defbyte)1859 static inline int i3c_ccc_do_getstatus_fmt2(const struct i3c_device_desc *target,
1860 					    union i3c_ccc_getstatus *status,
1861 					    enum i3c_ccc_getstatus_defbyte defbyte)
1862 {
1863 	return i3c_ccc_do_getstatus(target, status,
1864 				    GETSTATUS_FORMAT_2, defbyte);
1865 }
1866 
1867 /**
1868  * @brief Single target GETCAPS to Get Target Status.
1869  *
1870  * Helper function to do GETCAPS (Get Capabilities) of
1871  * one target.
1872  *
1873  * This should only be supported if Advanced Capabilities Bit of
1874  * the BCR is set
1875  *
1876  * @param[in] target Pointer to the target device descriptor.
1877  * @param[out] caps Pointer to GETCAPS payload.
1878  * @param[in] fmt Which GETCAPS to use.
1879  * @param[in] defbyte Defining Byte if using format 2.
1880  *
1881  * @return @see i3c_do_ccc
1882  */
1883 int i3c_ccc_do_getcaps(const struct i3c_device_desc *target,
1884 			 union i3c_ccc_getcaps *caps,
1885 			 enum i3c_ccc_getcaps_fmt fmt,
1886 			 enum i3c_ccc_getcaps_defbyte defbyte);
1887 
1888 /**
1889  * @brief Single target GETCAPS to Get Capabilities (Format 1).
1890  *
1891  * Helper function to do GETCAPS (Get Capabilities, format 1) of
1892  * one target.
1893  *
1894  * @param[in] target Pointer to the target device descriptor.
1895  * @param[out] caps Pointer to GETCAPS payload.
1896  *
1897  * @return @see i3c_do_ccc
1898  */
i3c_ccc_do_getcaps_fmt1(const struct i3c_device_desc * target,union i3c_ccc_getcaps * caps)1899 static inline int i3c_ccc_do_getcaps_fmt1(const struct i3c_device_desc *target,
1900 					    union i3c_ccc_getcaps *caps)
1901 {
1902 	return i3c_ccc_do_getcaps(target, caps,
1903 				    GETCAPS_FORMAT_1,
1904 				    GETCAPS_FORMAT_2_INVALID);
1905 }
1906 
1907 /**
1908  * @brief Single target GETCAPS to Get Capabilities (Format 2).
1909  *
1910  * Helper function to do GETCAPS (Get Capabilities, format 2) of
1911  * one target.
1912  *
1913  * @param[in] target Pointer to the target device descriptor.
1914  * @param[out] caps Pointer to GETCAPS payload.
1915  * @param[in] defbyte Defining Byte for GETCAPS format 2.
1916  *
1917  * @return @see i3c_do_ccc
1918  */
i3c_ccc_do_getcaps_fmt2(const struct i3c_device_desc * target,union i3c_ccc_getcaps * caps,enum i3c_ccc_getcaps_defbyte defbyte)1919 static inline int i3c_ccc_do_getcaps_fmt2(const struct i3c_device_desc *target,
1920 					    union i3c_ccc_getcaps *caps,
1921 					    enum i3c_ccc_getcaps_defbyte defbyte)
1922 {
1923 	return i3c_ccc_do_getcaps(target, caps,
1924 				    GETCAPS_FORMAT_2, defbyte);
1925 }
1926 
1927 /**
1928  * @brief Single target to Set Vendor / Standard Extension CCC
1929  *
1930  * Helper function to set Vendor / Standard Extension CCC of
1931  * one target.
1932  *
1933  * @param[in] target Pointer to the target device descriptor.
1934  * @param[in] id Vendor CCC ID.
1935  * @param[in] payload Pointer to payload.
1936  * @param[in] len Length of payload. 0 if no payload.
1937  *
1938  * @return @see i3c_do_ccc
1939  */
1940 int i3c_ccc_do_setvendor(const struct i3c_device_desc *target,
1941 			uint8_t id,
1942 			uint8_t *payload,
1943 			size_t len);
1944 
1945 /**
1946  * @brief Single target to Get Vendor / Standard Extension CCC
1947  *
1948  * Helper function to get Vendor / Standard Extension CCC of
1949  * one target.
1950  *
1951  * @param[in] target Pointer to the target device descriptor.
1952  * @param[in] id Vendor CCC ID.
1953  * @param[out] payload Pointer to payload.
1954  * @param[in] len Maximum Expected Length of the payload
1955  * @param[out] num_xfer Length of the received payload
1956  *
1957  * @return @see i3c_do_ccc
1958  */
1959 int i3c_ccc_do_getvendor(const struct i3c_device_desc *target,
1960 			uint8_t id,
1961 			uint8_t *payload,
1962 			size_t len,
1963 			size_t *num_xfer);
1964 
1965 /**
1966  * @brief Single target to Get Vendor / Standard Extension CCC
1967  * with a defining byte
1968  *
1969  * Helper function to get Vendor / Standard Extension CCC of
1970  * one target.
1971  *
1972  * @param[in] target Pointer to the target device descriptor.
1973  * @param[in] id Vendor CCC ID.
1974  * @param[in] defbyte Defining Byte
1975  * @param[out] payload Pointer to payload.
1976  * @param[in] len Maximum Expected Length of the payload
1977  * @param[out] num_xfer Length of the received payload
1978  *
1979  * @return @see i3c_do_ccc
1980  */
1981 int i3c_ccc_do_getvendor_defbyte(const struct i3c_device_desc *target,
1982 			uint8_t id,
1983 			uint8_t defbyte,
1984 			uint8_t *payload,
1985 			size_t len,
1986 			size_t *num_xfer);
1987 
1988 /**
1989  * @brief Broadcast Set Vendor / Standard Extension CCC
1990  *
1991  * Helper function to broadcast Vendor / Standard Extension CCC
1992  *
1993  * @param[in] controller Pointer to the controller device driver instance.
1994  * @param[in] id Vendor CCC ID.
1995  * @param[in] payload Pointer to payload.
1996  * @param[in] len Length of payload. 0 if no payload.
1997  *
1998  * @return @see i3c_do_ccc
1999  */
2000 int i3c_ccc_do_setvendor_all(const struct device *controller,
2001 			uint8_t id,
2002 			uint8_t *payload,
2003 			size_t len);
2004 
2005 /**
2006  * @brief Broadcast SETAASA to set all target's dynamic address to their
2007  * static address.
2008  *
2009  * Helper function to set dynamic addresses of all connected targets to
2010  * their static address.
2011  *
2012  * @param[in] controller Pointer to the controller device driver instance.
2013  *
2014  * @return @see i3c_do_ccc
2015  */
2016 int i3c_ccc_do_setaasa_all(const struct device *controller);
2017 
2018 /**
2019  * @brief Single target GETMXDS to Get Max Data Speed.
2020  *
2021  * Helper function to do GETMXDS (Get Max Data Speed) of
2022  * one target.
2023  *
2024  * This should only be supported if Max Data Speed Limit Bit of
2025  * the BCR is set
2026  *
2027  * @param[in] target Pointer to the target device descriptor.
2028  * @param[out] caps Pointer to GETMXDS payload.
2029  * @param[in] fmt Which GETMXDS to use.
2030  * @param[in] defbyte Defining Byte if using format 3.
2031  *
2032  * @return @see i3c_do_ccc
2033  */
2034 int i3c_ccc_do_getmxds(const struct i3c_device_desc *target,
2035 			 union i3c_ccc_getmxds *caps,
2036 			 enum i3c_ccc_getmxds_fmt fmt,
2037 			 enum i3c_ccc_getmxds_defbyte defbyte);
2038 
2039 /**
2040  * @brief Single target GETMXDS to Get Max Data Speed (Format 1).
2041  *
2042  * Helper function to do GETMXDS (Get Max Data Speed, format 1) of
2043  * one target.
2044  *
2045  * @param[in] target Pointer to the target device descriptor.
2046  * @param[out] caps Pointer to GETMXDS payload.
2047  *
2048  * @return @see i3c_do_ccc
2049  */
i3c_ccc_do_getmxds_fmt1(const struct i3c_device_desc * target,union i3c_ccc_getmxds * caps)2050 static inline int i3c_ccc_do_getmxds_fmt1(const struct i3c_device_desc *target,
2051 					    union i3c_ccc_getmxds *caps)
2052 {
2053 	return i3c_ccc_do_getmxds(target, caps,
2054 				    GETMXDS_FORMAT_1,
2055 				    GETMXDS_FORMAT_3_INVALID);
2056 }
2057 
2058 /**
2059  * @brief Single target GETMXDS to Get Max Data Speed (Format 2).
2060  *
2061  * Helper function to do GETMXDS (Get Max Data Speed, format 2) of
2062  * one target.
2063  *
2064  * @param[in] target Pointer to the target device descriptor.
2065  * @param[out] caps Pointer to GETMXDS payload.
2066  *
2067  * @return @see i3c_do_ccc
2068  */
i3c_ccc_do_getmxds_fmt2(const struct i3c_device_desc * target,union i3c_ccc_getmxds * caps)2069 static inline int i3c_ccc_do_getmxds_fmt2(const struct i3c_device_desc *target,
2070 					    union i3c_ccc_getmxds *caps)
2071 {
2072 	return i3c_ccc_do_getmxds(target, caps,
2073 				    GETMXDS_FORMAT_2,
2074 					GETMXDS_FORMAT_3_INVALID);
2075 }
2076 
2077 /**
2078  * @brief Single target GETMXDS to Get Max Data Speed (Format 3).
2079  *
2080  * Helper function to do GETMXDS (Get Max Data Speed, format 3) of
2081  * one target.
2082  *
2083  * @param[in] target Pointer to the target device descriptor.
2084  * @param[out] caps Pointer to GETMXDS payload.
2085  * @param[in] defbyte Defining Byte for GETMXDS format 3.
2086  *
2087  * @return @see i3c_do_ccc
2088  */
i3c_ccc_do_getmxds_fmt3(const struct i3c_device_desc * target,union i3c_ccc_getmxds * caps,enum i3c_ccc_getmxds_defbyte defbyte)2089 static inline int i3c_ccc_do_getmxds_fmt3(const struct i3c_device_desc *target,
2090 					    union i3c_ccc_getmxds *caps,
2091 					    enum i3c_ccc_getmxds_defbyte defbyte)
2092 {
2093 	return i3c_ccc_do_getmxds(target, caps,
2094 				    GETMXDS_FORMAT_3, defbyte);
2095 }
2096 
2097 /**
2098  * @brief Broadcast DEFTGTS
2099  *
2100  * @param[in] controller Pointer to the controller device driver instance.
2101  * @param[in] deftgts Pointer to the deftgts payload.
2102  *
2103  * @return @see i3c_do_ccc
2104  */
2105 int i3c_ccc_do_deftgts_all(const struct device *controller,
2106 			   struct i3c_ccc_deftgts *deftgts);
2107 
2108 /**
2109  * @brief Broadcast SETBUSCON to set the bus context
2110  *
2111  * Helper function to set the bus context of all connected targets.
2112  *
2113  * @param[in] controller Pointer to the controller device driver instance.
2114  * @param[in] context Pointer to context byte values
2115  * @param[in] length Length of the context buffer
2116  *
2117  * @return @see i3c_do_ccc
2118  */
2119 int i3c_ccc_do_setbuscon(const struct device *controller,
2120 				uint8_t *context, uint16_t length);
2121 
2122 #ifdef __cplusplus
2123 }
2124 #endif
2125 
2126 /**
2127  * @}
2128  */
2129 
2130 #endif /* ZEPHYR_INCLUDE_DRIVERS_I3C_CCC_H_ */
2131