~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/i3c/ccc.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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  */
 64 struct 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  */
 76 struct 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  */
 91 struct 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  */
110 struct 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  */
132 struct 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  */
144 enum 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  */
157 struct 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  */
169 struct 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  */
178 struct 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  */
187 struct 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  */
196 struct 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  */
211 struct 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  */
220 struct 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  */
230 struct 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  */
241 struct 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  */
249 enum 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  */
260 enum 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  */
279 struct 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  */
292 struct i3c_ccc_gethdrcap {
293         u8 modes;
294 } __packed;
295 
296 /**
297  * enum i3c_ccc_setxtime_subcmd - SETXTIME sub-commands
298  */
299 enum 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  */
319 struct 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  */
336 struct 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  */
349 struct 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  */
361 struct 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  */
377 struct 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 navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php