1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2018 Cadence Design Systems Inc.
4 *
5 * Author: Boris Brezillon <boris.brezillon@bootlin.com>
6 */
7
8#ifndef I3C_CCC_H
9#define I3C_CCC_H
10
11#include <linux/bitops.h>
12#include <linux/i3c/device.h>
13
14/* I3C CCC (Common Command Codes) related definitions */
15#define I3C_CCC_DIRECT BIT(7)
16
17#define I3C_CCC_ID(id, broadcast) \
18 ((id) | ((broadcast) ? 0 : I3C_CCC_DIRECT))
19
20/* Commands valid in both broadcast and unicast modes */
21#define I3C_CCC_ENEC(broadcast) I3C_CCC_ID(0x0, broadcast)
22#define I3C_CCC_DISEC(broadcast) I3C_CCC_ID(0x1, broadcast)
23#define I3C_CCC_ENTAS(as, broadcast) I3C_CCC_ID(0x2 + (as), broadcast)
24#define I3C_CCC_RSTDAA(broadcast) I3C_CCC_ID(0x6, broadcast)
25#define I3C_CCC_SETMWL(broadcast) I3C_CCC_ID(0x9, broadcast)
26#define I3C_CCC_SETMRL(broadcast) I3C_CCC_ID(0xa, broadcast)
27#define I3C_CCC_SETXTIME(broadcast) ((broadcast) ? 0x28 : 0x98)
28#define I3C_CCC_VENDOR(id, broadcast) ((id) + ((broadcast) ? 0x61 : 0xe0))
29
30/* Broadcast-only commands */
31#define I3C_CCC_ENTDAA I3C_CCC_ID(0x7, true)
32#define I3C_CCC_DEFSLVS I3C_CCC_ID(0x8, true)
33#define I3C_CCC_ENTTM I3C_CCC_ID(0xb, true)
34#define I3C_CCC_ENTHDR(x) I3C_CCC_ID(0x20 + (x), true)
35
36/* Unicast-only commands */
37#define I3C_CCC_SETDASA I3C_CCC_ID(0x7, false)
38#define I3C_CCC_SETNEWDA I3C_CCC_ID(0x8, false)
39#define I3C_CCC_GETMWL I3C_CCC_ID(0xb, false)
40#define I3C_CCC_GETMRL I3C_CCC_ID(0xc, false)
41#define I3C_CCC_GETPID I3C_CCC_ID(0xd, false)
42#define I3C_CCC_GETBCR I3C_CCC_ID(0xe, false)
43#define I3C_CCC_GETDCR I3C_CCC_ID(0xf, false)
44#define I3C_CCC_GETSTATUS I3C_CCC_ID(0x10, false)
45#define I3C_CCC_GETACCMST I3C_CCC_ID(0x11, false)
46#define I3C_CCC_SETBRGTGT I3C_CCC_ID(0x13, false)
47#define I3C_CCC_GETMXDS I3C_CCC_ID(0x14, false)
48#define I3C_CCC_GETHDRCAP I3C_CCC_ID(0x15, false)
49#define I3C_CCC_GETXTIME I3C_CCC_ID(0x19, false)
50
51#define I3C_CCC_EVENT_SIR BIT(0)
52#define I3C_CCC_EVENT_MR BIT(1)
53#define I3C_CCC_EVENT_HJ BIT(3)
54
55/**
56 * struct i3c_ccc_events - payload passed to ENEC/DISEC CCC
57 *
58 * @events: bitmask of I3C_CCC_EVENT_xxx events.
59 *
60 * Depending on the CCC command, the specific events coming from all devices
61 * (broadcast version) or a specific device (unicast version) will be
62 * enabled (ENEC) or disabled (DISEC).
63 */
64struct i3c_ccc_events {
65 u8 events;
66};
67
68/**
69 * struct i3c_ccc_mwl - payload passed to SETMWL/GETMWL CCC
70 *
71 * @len: maximum write length in bytes
72 *
73 * The maximum write length is only applicable to SDR private messages or
74 * extended Write CCCs (like SETXTIME).
75 */
76struct i3c_ccc_mwl {
77 __be16 len;
78};
79
80/**
81 * struct i3c_ccc_mrl - payload passed to SETMRL/GETMRL CCC
82 *
83 * @len: maximum read length in bytes
84 * @ibi_len: maximum IBI payload length
85 *
86 * The maximum read length is only applicable to SDR private messages or
87 * extended Read CCCs (like GETXTIME).
88 * The IBI length is only valid if the I3C slave is IBI capable
89 * (%I3C_BCR_IBI_REQ_CAP is set).
90 */
91struct i3c_ccc_mrl {
92 __be16 read_len;
93 u8 ibi_len;
94} __packed;
95
96/**
97 * struct i3c_ccc_dev_desc - I3C/I2C device descriptor used for DEFSLVS
98 *
99 * @dyn_addr: dynamic address assigned to the I3C slave or 0 if the entry is
100 * describing an I2C slave.
101 * @dcr: DCR value (not applicable to entries describing I2C devices)
102 * @lvr: LVR value (not applicable to entries describing I3C devices)
103 * @bcr: BCR value or 0 if this entry is describing an I2C slave
104 * @static_addr: static address or 0 if the device does not have a static
105 * address
106 *
107 * The DEFSLVS command should be passed an array of i3c_ccc_dev_desc
108 * descriptors (one entry per I3C/I2C dev controlled by the master).
109 */
110struct i3c_ccc_dev_desc {
111 u8 dyn_addr;
112 union {
113 u8 dcr;
114 u8 lvr;
115 };
116 u8 bcr;
117 u8 static_addr;
118};
119
120/**
121 * struct i3c_ccc_defslvs - payload passed to DEFSLVS CCC
122 *
123 * @count: number of dev descriptors
124 * @master: descriptor describing the current master
125 * @slaves: array of descriptors describing slaves controlled by the
126 * current master
127 *
128 * Information passed to the broadcast DEFSLVS to propagate device
129 * information to all masters currently acting as slaves on the bus.
130 * This is only meaningful if you have more than one master.
131 */
132struct i3c_ccc_defslvs {
133 u8 count;
134 struct i3c_ccc_dev_desc master;
135 struct i3c_ccc_dev_desc slaves[];
136} __packed;
137
138/**
139 * enum i3c_ccc_test_mode - enum listing all available test modes
140 *
141 * @I3C_CCC_EXIT_TEST_MODE: exit test mode
142 * @I3C_CCC_VENDOR_TEST_MODE: enter vendor test mode
143 */
144enum i3c_ccc_test_mode {
145 I3C_CCC_EXIT_TEST_MODE,
146 I3C_CCC_VENDOR_TEST_MODE,
147};
148
149/**
150 * struct i3c_ccc_enttm - payload passed to ENTTM CCC
151 *
152 * @mode: one of the &enum i3c_ccc_test_mode modes
153 *
154 * Information passed to the ENTTM CCC to instruct an I3C device to enter a
155 * specific test mode.
156 */
157struct i3c_ccc_enttm {
158 u8 mode;
159};
160
161/**
162 * struct i3c_ccc_setda - payload passed to SETNEWDA and SETDASA CCCs
163 *
164 * @addr: dynamic address to assign to an I3C device
165 *
166 * Information passed to the SETNEWDA and SETDASA CCCs to assign/change the
167 * dynamic address of an I3C device.
168 */
169struct i3c_ccc_setda {
170 u8 addr;
171};
172
173/**
174 * struct i3c_ccc_getpid - payload passed to GETPID CCC
175 *
176 * @pid: 48 bits PID in big endian
177 */
178struct i3c_ccc_getpid {
179 u8 pid[6];
180};
181
182/**
183 * struct i3c_ccc_getbcr - payload passed to GETBCR CCC
184 *
185 * @bcr: BCR (Bus Characteristic Register) value
186 */
187struct i3c_ccc_getbcr {
188 u8 bcr;
189};
190
191/**
192 * struct i3c_ccc_getdcr - payload passed to GETDCR CCC
193 *
194 * @dcr: DCR (Device Characteristic Register) value
195 */
196struct i3c_ccc_getdcr {
197 u8 dcr;
198};
199
200#define I3C_CCC_STATUS_PENDING_INT(status) ((status) & GENMASK(3, 0))
201#define I3C_CCC_STATUS_PROTOCOL_ERROR BIT(5)
202#define I3C_CCC_STATUS_ACTIVITY_MODE(status) \
203 (((status) & GENMASK(7, 6)) >> 6)
204
205/**
206 * struct i3c_ccc_getstatus - payload passed to GETSTATUS CCC
207 *
208 * @status: status of the I3C slave (see I3C_CCC_STATUS_xxx macros for more
209 * information).
210 */
211struct i3c_ccc_getstatus {
212 __be16 status;
213};
214
215/**
216 * struct i3c_ccc_getaccmst - payload passed to GETACCMST CCC
217 *
218 * @newmaster: address of the master taking bus ownership
219 */
220struct i3c_ccc_getaccmst {
221 u8 newmaster;
222};
223
224/**
225 * struct i3c_ccc_bridged_slave_desc - bridged slave descriptor
226 *
227 * @addr: dynamic address of the bridged device
228 * @id: ID of the slave device behind the bridge
229 */
230struct i3c_ccc_bridged_slave_desc {
231 u8 addr;
232 __be16 id;
233} __packed;
234
235/**
236 * struct i3c_ccc_setbrgtgt - payload passed to SETBRGTGT CCC
237 *
238 * @count: number of bridged slaves
239 * @bslaves: bridged slave descriptors
240 */
241struct i3c_ccc_setbrgtgt {
242 u8 count;
243 struct i3c_ccc_bridged_slave_desc bslaves[];
244} __packed;
245
246/**
247 * enum i3c_sdr_max_data_rate - max data rate values for private SDR transfers
248 */
249enum i3c_sdr_max_data_rate {
250 I3C_SDR0_FSCL_MAX,
251 I3C_SDR1_FSCL_8MHZ,
252 I3C_SDR2_FSCL_6MHZ,
253 I3C_SDR3_FSCL_4MHZ,
254 I3C_SDR4_FSCL_2MHZ,
255};
256
257/**
258 * enum i3c_tsco - clock to data turn-around
259 */
260enum i3c_tsco {
261 I3C_TSCO_8NS,
262 I3C_TSCO_9NS,
263 I3C_TSCO_10NS,
264 I3C_TSCO_11NS,
265 I3C_TSCO_12NS,
266};
267
268#define I3C_CCC_MAX_SDR_FSCL_MASK GENMASK(2, 0)
269#define I3C_CCC_MAX_SDR_FSCL(x) ((x) & I3C_CCC_MAX_SDR_FSCL_MASK)
270
271/**
272 * struct i3c_ccc_getmxds - payload passed to GETMXDS CCC
273 *
274 * @maxwr: write limitations
275 * @maxrd: read limitations
276 * @maxrdturn: maximum read turn-around expressed micro-seconds and
277 * little-endian formatted
278 */
279struct i3c_ccc_getmxds {
280 u8 maxwr;
281 u8 maxrd;
282 u8 maxrdturn[3];
283} __packed;
284
285#define I3C_CCC_HDR_MODE(mode) BIT(mode)
286
287/**
288 * struct i3c_ccc_gethdrcap - payload passed to GETHDRCAP CCC
289 *
290 * @modes: bitmap of supported HDR modes
291 */
292struct i3c_ccc_gethdrcap {
293 u8 modes;
294} __packed;
295
296/**
297 * enum i3c_ccc_setxtime_subcmd - SETXTIME sub-commands
298 */
299enum i3c_ccc_setxtime_subcmd {
300 I3C_CCC_SETXTIME_ST = 0x7f,
301 I3C_CCC_SETXTIME_DT = 0xbf,
302 I3C_CCC_SETXTIME_ENTER_ASYNC_MODE0 = 0xdf,
303 I3C_CCC_SETXTIME_ENTER_ASYNC_MODE1 = 0xef,
304 I3C_CCC_SETXTIME_ENTER_ASYNC_MODE2 = 0xf7,
305 I3C_CCC_SETXTIME_ENTER_ASYNC_MODE3 = 0xfb,
306 I3C_CCC_SETXTIME_ASYNC_TRIGGER = 0xfd,
307 I3C_CCC_SETXTIME_TPH = 0x3f,
308 I3C_CCC_SETXTIME_TU = 0x9f,
309 I3C_CCC_SETXTIME_ODR = 0x8f,
310};
311
312/**
313 * struct i3c_ccc_setxtime - payload passed to SETXTIME CCC
314 *
315 * @subcmd: one of the sub-commands ddefined in &enum i3c_ccc_setxtime_subcmd
316 * @data: sub-command payload. Amount of data is determined by
317 * &i3c_ccc_setxtime->subcmd
318 */
319struct i3c_ccc_setxtime {
320 u8 subcmd;
321 u8 data[];
322} __packed;
323
324#define I3C_CCC_GETXTIME_SYNC_MODE BIT(0)
325#define I3C_CCC_GETXTIME_ASYNC_MODE(x) BIT((x) + 1)
326#define I3C_CCC_GETXTIME_OVERFLOW BIT(7)
327
328/**
329 * struct i3c_ccc_getxtime - payload retrieved from GETXTIME CCC
330 *
331 * @supported_modes: bitmap describing supported XTIME modes
332 * @state: current status (enabled mode and overflow status)
333 * @frequency: slave's internal oscillator frequency in 500KHz steps
334 * @inaccuracy: slave's internal oscillator inaccuracy in 0.1% steps
335 */
336struct i3c_ccc_getxtime {
337 u8 supported_modes;
338 u8 state;
339 u8 frequency;
340 u8 inaccuracy;
341} __packed;
342
343/**
344 * struct i3c_ccc_cmd_payload - CCC payload
345 *
346 * @len: payload length
347 * @data: payload data. This buffer must be DMA-able
348 */
349struct i3c_ccc_cmd_payload {
350 u16 len;
351 void *data;
352};
353
354/**
355 * struct i3c_ccc_cmd_dest - CCC command destination
356 *
357 * @addr: can be an I3C device address or the broadcast address if this is a
358 * broadcast CCC
359 * @payload: payload to be sent to this device or broadcasted
360 */
361struct i3c_ccc_cmd_dest {
362 u8 addr;
363 struct i3c_ccc_cmd_payload payload;
364};
365
366/**
367 * struct i3c_ccc_cmd - CCC command
368 *
369 * @rnw: true if the CCC should retrieve data from the device. Only valid for
370 * unicast commands
371 * @id: CCC command id
372 * @ndests: number of destinations. Should always be one for broadcast commands
373 * @dests: array of destinations and associated payload for this CCC. Most of
374 * the time, only one destination is provided
375 * @err: I3C error code
376 */
377struct i3c_ccc_cmd {
378 u8 rnw;
379 u8 id;
380 unsigned int ndests;
381 struct i3c_ccc_cmd_dest *dests;
382 enum i3c_error_code err;
383};
384
385#endif /* I3C_CCC_H */
386

source code of linux/include/linux/i3c/ccc.h