cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ccc.h (10040B)


      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 */