0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/bitfield.h>
0013 #include <linux/i3c/master.h>
0014
0015 #include "hci.h"
0016 #include "cmd.h"
0017 #include "xfer_mode_rate.h"
0018
0019
0020
0021
0022
0023
0024 #define CMD_0_ATTR_U FIELD_PREP(CMD_0_ATTR, 0x4)
0025
0026 #define CMD_U3_HDR_TSP_ML_CTRL(v) FIELD_PREP(W3_MASK(107, 104), v)
0027 #define CMD_U3_IDB4(v) FIELD_PREP(W3_MASK(103, 96), v)
0028 #define CMD_U3_HDR_CMD(v) FIELD_PREP(W3_MASK(103, 96), v)
0029 #define CMD_U2_IDB3(v) FIELD_PREP(W2_MASK( 95, 88), v)
0030 #define CMD_U2_HDR_BT(v) FIELD_PREP(W2_MASK( 95, 88), v)
0031 #define CMD_U2_IDB2(v) FIELD_PREP(W2_MASK( 87, 80), v)
0032 #define CMD_U2_BT_CMD2(v) FIELD_PREP(W2_MASK( 87, 80), v)
0033 #define CMD_U2_IDB1(v) FIELD_PREP(W2_MASK( 79, 72), v)
0034 #define CMD_U2_BT_CMD1(v) FIELD_PREP(W2_MASK( 79, 72), v)
0035 #define CMD_U2_IDB0(v) FIELD_PREP(W2_MASK( 71, 64), v)
0036 #define CMD_U2_BT_CMD0(v) FIELD_PREP(W2_MASK( 71, 64), v)
0037 #define CMD_U1_ERR_HANDLING(v) FIELD_PREP(W1_MASK( 63, 62), v)
0038 #define CMD_U1_ADD_FUNC(v) FIELD_PREP(W1_MASK( 61, 56), v)
0039 #define CMD_U1_COMBO_XFER W1_BIT_( 55)
0040 #define CMD_U1_DATA_LENGTH(v) FIELD_PREP(W1_MASK( 53, 32), v)
0041 #define CMD_U0_TOC W0_BIT_( 31)
0042 #define CMD_U0_ROC W0_BIT_( 30)
0043 #define CMD_U0_MAY_YIELD W0_BIT_( 29)
0044 #define CMD_U0_NACK_RCNT(v) FIELD_PREP(W0_MASK( 28, 27), v)
0045 #define CMD_U0_IDB_COUNT(v) FIELD_PREP(W0_MASK( 26, 24), v)
0046 #define CMD_U0_MODE_INDEX(v) FIELD_PREP(W0_MASK( 22, 18), v)
0047 #define CMD_U0_XFER_RATE(v) FIELD_PREP(W0_MASK( 17, 15), v)
0048 #define CMD_U0_DEV_ADDRESS(v) FIELD_PREP(W0_MASK( 14, 8), v)
0049 #define CMD_U0_RnW W0_BIT_( 7)
0050 #define CMD_U0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
0051
0052
0053
0054
0055
0056 #define CMD_0_ATTR_A FIELD_PREP(CMD_0_ATTR, 0x2)
0057
0058 #define CMD_A1_DATA_LENGTH(v) FIELD_PREP(W1_MASK( 53, 32), v)
0059 #define CMD_A0_TOC W0_BIT_( 31)
0060 #define CMD_A0_ROC W0_BIT_( 30)
0061 #define CMD_A0_XFER_RATE(v) FIELD_PREP(W0_MASK( 17, 15), v)
0062 #define CMD_A0_ASSIGN_ADDRESS(v) FIELD_PREP(W0_MASK( 14, 8), v)
0063 #define CMD_A0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
0064
0065
0066 static unsigned int get_i3c_rate_idx(struct i3c_hci *hci)
0067 {
0068 struct i3c_bus *bus = i3c_master_get_bus(&hci->master);
0069
0070 if (bus->scl_rate.i3c >= 12000000)
0071 return XFERRATE_I3C_SDR0;
0072 if (bus->scl_rate.i3c > 8000000)
0073 return XFERRATE_I3C_SDR1;
0074 if (bus->scl_rate.i3c > 6000000)
0075 return XFERRATE_I3C_SDR2;
0076 if (bus->scl_rate.i3c > 4000000)
0077 return XFERRATE_I3C_SDR3;
0078 if (bus->scl_rate.i3c > 2000000)
0079 return XFERRATE_I3C_SDR4;
0080 return XFERRATE_I3C_SDR_FM_FMP;
0081 }
0082
0083 static unsigned int get_i2c_rate_idx(struct i3c_hci *hci)
0084 {
0085 struct i3c_bus *bus = i3c_master_get_bus(&hci->master);
0086
0087 if (bus->scl_rate.i2c >= 1000000)
0088 return XFERRATE_I2C_FMP;
0089 return XFERRATE_I2C_FM;
0090 }
0091
0092 static void hci_cmd_v2_prep_private_xfer(struct i3c_hci *hci,
0093 struct hci_xfer *xfer,
0094 u8 addr, unsigned int mode,
0095 unsigned int rate)
0096 {
0097 u8 *data = xfer->data;
0098 unsigned int data_len = xfer->data_len;
0099 bool rnw = xfer->rnw;
0100
0101 xfer->cmd_tid = hci_get_tid();
0102
0103 if (!rnw && data_len <= 5) {
0104 xfer->cmd_desc[0] =
0105 CMD_0_ATTR_U |
0106 CMD_U0_TID(xfer->cmd_tid) |
0107 CMD_U0_DEV_ADDRESS(addr) |
0108 CMD_U0_XFER_RATE(rate) |
0109 CMD_U0_MODE_INDEX(mode) |
0110 CMD_U0_IDB_COUNT(data_len);
0111 xfer->cmd_desc[1] =
0112 CMD_U1_DATA_LENGTH(0);
0113 xfer->cmd_desc[2] = 0;
0114 xfer->cmd_desc[3] = 0;
0115 switch (data_len) {
0116 case 5:
0117 xfer->cmd_desc[3] |= CMD_U3_IDB4(data[4]);
0118 fallthrough;
0119 case 4:
0120 xfer->cmd_desc[2] |= CMD_U2_IDB3(data[3]);
0121 fallthrough;
0122 case 3:
0123 xfer->cmd_desc[2] |= CMD_U2_IDB2(data[2]);
0124 fallthrough;
0125 case 2:
0126 xfer->cmd_desc[2] |= CMD_U2_IDB1(data[1]);
0127 fallthrough;
0128 case 1:
0129 xfer->cmd_desc[2] |= CMD_U2_IDB0(data[0]);
0130 fallthrough;
0131 case 0:
0132 break;
0133 }
0134
0135 xfer->data = NULL;
0136 } else {
0137 xfer->cmd_desc[0] =
0138 CMD_0_ATTR_U |
0139 CMD_U0_TID(xfer->cmd_tid) |
0140 (rnw ? CMD_U0_RnW : 0) |
0141 CMD_U0_DEV_ADDRESS(addr) |
0142 CMD_U0_XFER_RATE(rate) |
0143 CMD_U0_MODE_INDEX(mode);
0144 xfer->cmd_desc[1] =
0145 CMD_U1_DATA_LENGTH(data_len);
0146 xfer->cmd_desc[2] = 0;
0147 xfer->cmd_desc[3] = 0;
0148 }
0149 }
0150
0151 static int hci_cmd_v2_prep_ccc(struct i3c_hci *hci, struct hci_xfer *xfer,
0152 u8 ccc_addr, u8 ccc_cmd, bool raw)
0153 {
0154 unsigned int mode = XFERMODE_IDX_I3C_SDR;
0155 unsigned int rate = get_i3c_rate_idx(hci);
0156 u8 *data = xfer->data;
0157 unsigned int data_len = xfer->data_len;
0158 bool rnw = xfer->rnw;
0159
0160 if (raw && ccc_addr != I3C_BROADCAST_ADDR) {
0161 hci_cmd_v2_prep_private_xfer(hci, xfer, ccc_addr, mode, rate);
0162 return 0;
0163 }
0164
0165 xfer->cmd_tid = hci_get_tid();
0166
0167 if (!rnw && data_len <= 4) {
0168 xfer->cmd_desc[0] =
0169 CMD_0_ATTR_U |
0170 CMD_U0_TID(xfer->cmd_tid) |
0171 CMD_U0_DEV_ADDRESS(ccc_addr) |
0172 CMD_U0_XFER_RATE(rate) |
0173 CMD_U0_MODE_INDEX(mode) |
0174 CMD_U0_IDB_COUNT(data_len + (!raw ? 0 : 1));
0175 xfer->cmd_desc[1] =
0176 CMD_U1_DATA_LENGTH(0);
0177 xfer->cmd_desc[2] =
0178 CMD_U2_IDB0(ccc_cmd);
0179 xfer->cmd_desc[3] = 0;
0180 switch (data_len) {
0181 case 4:
0182 xfer->cmd_desc[3] |= CMD_U3_IDB4(data[3]);
0183 fallthrough;
0184 case 3:
0185 xfer->cmd_desc[2] |= CMD_U2_IDB3(data[2]);
0186 fallthrough;
0187 case 2:
0188 xfer->cmd_desc[2] |= CMD_U2_IDB2(data[1]);
0189 fallthrough;
0190 case 1:
0191 xfer->cmd_desc[2] |= CMD_U2_IDB1(data[0]);
0192 fallthrough;
0193 case 0:
0194 break;
0195 }
0196
0197 xfer->data = NULL;
0198 } else {
0199 xfer->cmd_desc[0] =
0200 CMD_0_ATTR_U |
0201 CMD_U0_TID(xfer->cmd_tid) |
0202 (rnw ? CMD_U0_RnW : 0) |
0203 CMD_U0_DEV_ADDRESS(ccc_addr) |
0204 CMD_U0_XFER_RATE(rate) |
0205 CMD_U0_MODE_INDEX(mode) |
0206 CMD_U0_IDB_COUNT(!raw ? 0 : 1);
0207 xfer->cmd_desc[1] =
0208 CMD_U1_DATA_LENGTH(data_len);
0209 xfer->cmd_desc[2] =
0210 CMD_U2_IDB0(ccc_cmd);
0211 xfer->cmd_desc[3] = 0;
0212 }
0213
0214 return 0;
0215 }
0216
0217 static void hci_cmd_v2_prep_i3c_xfer(struct i3c_hci *hci,
0218 struct i3c_dev_desc *dev,
0219 struct hci_xfer *xfer)
0220 {
0221 unsigned int mode = XFERMODE_IDX_I3C_SDR;
0222 unsigned int rate = get_i3c_rate_idx(hci);
0223 u8 addr = dev->info.dyn_addr;
0224
0225 hci_cmd_v2_prep_private_xfer(hci, xfer, addr, mode, rate);
0226 }
0227
0228 static void hci_cmd_v2_prep_i2c_xfer(struct i3c_hci *hci,
0229 struct i2c_dev_desc *dev,
0230 struct hci_xfer *xfer)
0231 {
0232 unsigned int mode = XFERMODE_IDX_I2C;
0233 unsigned int rate = get_i2c_rate_idx(hci);
0234 u8 addr = dev->addr;
0235
0236 hci_cmd_v2_prep_private_xfer(hci, xfer, addr, mode, rate);
0237 }
0238
0239 static int hci_cmd_v2_daa(struct i3c_hci *hci)
0240 {
0241 struct hci_xfer *xfer;
0242 int ret;
0243 u8 next_addr = 0;
0244 u32 device_id[2];
0245 u64 pid;
0246 unsigned int dcr, bcr;
0247 DECLARE_COMPLETION_ONSTACK(done);
0248
0249 xfer = hci_alloc_xfer(2);
0250 if (!xfer)
0251 return -ENOMEM;
0252
0253 xfer[0].data = &device_id;
0254 xfer[0].data_len = 8;
0255 xfer[0].rnw = true;
0256 xfer[0].cmd_desc[1] = CMD_A1_DATA_LENGTH(8);
0257 xfer[1].completion = &done;
0258
0259 for (;;) {
0260 ret = i3c_master_get_free_addr(&hci->master, next_addr);
0261 if (ret < 0)
0262 break;
0263 next_addr = ret;
0264 DBG("next_addr = 0x%02x", next_addr);
0265 xfer[0].cmd_tid = hci_get_tid();
0266 xfer[0].cmd_desc[0] =
0267 CMD_0_ATTR_A |
0268 CMD_A0_TID(xfer[0].cmd_tid) |
0269 CMD_A0_ROC;
0270 xfer[1].cmd_tid = hci_get_tid();
0271 xfer[1].cmd_desc[0] =
0272 CMD_0_ATTR_A |
0273 CMD_A0_TID(xfer[1].cmd_tid) |
0274 CMD_A0_ASSIGN_ADDRESS(next_addr) |
0275 CMD_A0_ROC |
0276 CMD_A0_TOC;
0277 hci->io->queue_xfer(hci, xfer, 2);
0278 if (!wait_for_completion_timeout(&done, HZ) &&
0279 hci->io->dequeue_xfer(hci, xfer, 2)) {
0280 ret = -ETIME;
0281 break;
0282 }
0283 if (RESP_STATUS(xfer[0].response) != RESP_SUCCESS) {
0284 ret = 0;
0285 break;
0286 }
0287 if (RESP_STATUS(xfer[1].response) != RESP_SUCCESS) {
0288 ret = -EIO;
0289 break;
0290 }
0291
0292 pid = FIELD_GET(W1_MASK(47, 32), device_id[1]);
0293 pid = (pid << 32) | device_id[0];
0294 bcr = FIELD_GET(W1_MASK(55, 48), device_id[1]);
0295 dcr = FIELD_GET(W1_MASK(63, 56), device_id[1]);
0296 DBG("assigned address %#x to device PID=0x%llx DCR=%#x BCR=%#x",
0297 next_addr, pid, dcr, bcr);
0298
0299
0300
0301
0302 ret = i3c_master_add_i3c_dev_locked(&hci->master, next_addr);
0303 if (ret)
0304 break;
0305 }
0306
0307 hci_free_xfer(xfer, 2);
0308 return ret;
0309 }
0310
0311 const struct hci_cmd_ops mipi_i3c_hci_cmd_v2 = {
0312 .prep_ccc = hci_cmd_v2_prep_ccc,
0313 .prep_i3c_xfer = hci_cmd_v2_prep_i3c_xfer,
0314 .prep_i2c_xfer = hci_cmd_v2_prep_i2c_xfer,
0315 .perform_daa = hci_cmd_v2_daa,
0316 };