cmd_v1.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. /*
  3. * Copyright (c) 2020, MIPI Alliance, Inc.
  4. *
  5. * Author: Nicolas Pitre <[email protected]>
  6. *
  7. * I3C HCI v1.0/v1.1 Command Descriptor Handling
  8. */
  9. #include <linux/bitfield.h>
  10. #include <linux/i3c/master.h>
  11. #include "hci.h"
  12. #include "cmd.h"
  13. #include "dat.h"
  14. #include "dct.h"
  15. /*
  16. * Address Assignment Command
  17. */
  18. #define CMD_0_ATTR_A FIELD_PREP(CMD_0_ATTR, 0x2)
  19. #define CMD_A0_TOC W0_BIT_(31)
  20. #define CMD_A0_ROC W0_BIT_(30)
  21. #define CMD_A0_DEV_COUNT(v) FIELD_PREP(W0_MASK(29, 26), v)
  22. #define CMD_A0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v)
  23. #define CMD_A0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v)
  24. #define CMD_A0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
  25. /*
  26. * Immediate Data Transfer Command
  27. */
  28. #define CMD_0_ATTR_I FIELD_PREP(CMD_0_ATTR, 0x1)
  29. #define CMD_I1_DATA_BYTE_4(v) FIELD_PREP(W1_MASK(63, 56), v)
  30. #define CMD_I1_DATA_BYTE_3(v) FIELD_PREP(W1_MASK(55, 48), v)
  31. #define CMD_I1_DATA_BYTE_2(v) FIELD_PREP(W1_MASK(47, 40), v)
  32. #define CMD_I1_DATA_BYTE_1(v) FIELD_PREP(W1_MASK(39, 32), v)
  33. #define CMD_I1_DEF_BYTE(v) FIELD_PREP(W1_MASK(39, 32), v)
  34. #define CMD_I0_TOC W0_BIT_(31)
  35. #define CMD_I0_ROC W0_BIT_(30)
  36. #define CMD_I0_RNW W0_BIT_(29)
  37. #define CMD_I0_MODE(v) FIELD_PREP(W0_MASK(28, 26), v)
  38. #define CMD_I0_DTT(v) FIELD_PREP(W0_MASK(25, 23), v)
  39. #define CMD_I0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v)
  40. #define CMD_I0_CP W0_BIT_(15)
  41. #define CMD_I0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v)
  42. #define CMD_I0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
  43. /*
  44. * Regular Data Transfer Command
  45. */
  46. #define CMD_0_ATTR_R FIELD_PREP(CMD_0_ATTR, 0x0)
  47. #define CMD_R1_DATA_LENGTH(v) FIELD_PREP(W1_MASK(63, 48), v)
  48. #define CMD_R1_DEF_BYTE(v) FIELD_PREP(W1_MASK(39, 32), v)
  49. #define CMD_R0_TOC W0_BIT_(31)
  50. #define CMD_R0_ROC W0_BIT_(30)
  51. #define CMD_R0_RNW W0_BIT_(29)
  52. #define CMD_R0_MODE(v) FIELD_PREP(W0_MASK(28, 26), v)
  53. #define CMD_R0_DBP W0_BIT_(25)
  54. #define CMD_R0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v)
  55. #define CMD_R0_CP W0_BIT_(15)
  56. #define CMD_R0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v)
  57. #define CMD_R0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
  58. /*
  59. * Combo Transfer (Write + Write/Read) Command
  60. */
  61. #define CMD_0_ATTR_C FIELD_PREP(CMD_0_ATTR, 0x3)
  62. #define CMD_C1_DATA_LENGTH(v) FIELD_PREP(W1_MASK(63, 48), v)
  63. #define CMD_C1_OFFSET(v) FIELD_PREP(W1_MASK(47, 32), v)
  64. #define CMD_C0_TOC W0_BIT_(31)
  65. #define CMD_C0_ROC W0_BIT_(30)
  66. #define CMD_C0_RNW W0_BIT_(29)
  67. #define CMD_C0_MODE(v) FIELD_PREP(W0_MASK(28, 26), v)
  68. #define CMD_C0_16_BIT_SUBOFFSET W0_BIT_(25)
  69. #define CMD_C0_FIRST_PHASE_MODE W0_BIT_(24)
  70. #define CMD_C0_DATA_LENGTH_POSITION(v) FIELD_PREP(W0_MASK(23, 22), v)
  71. #define CMD_C0_DEV_INDEX(v) FIELD_PREP(W0_MASK(20, 16), v)
  72. #define CMD_C0_CP W0_BIT_(15)
  73. #define CMD_C0_CMD(v) FIELD_PREP(W0_MASK(14, 7), v)
  74. #define CMD_C0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
  75. /*
  76. * Internal Control Command
  77. */
  78. #define CMD_0_ATTR_M FIELD_PREP(CMD_0_ATTR, 0x7)
  79. #define CMD_M1_VENDOR_SPECIFIC W1_MASK(63, 32)
  80. #define CMD_M0_MIPI_RESERVED W0_MASK(31, 12)
  81. #define CMD_M0_MIPI_CMD W0_MASK(11, 8)
  82. #define CMD_M0_VENDOR_INFO_PRESENT W0_BIT_( 7)
  83. #define CMD_M0_TID(v) FIELD_PREP(W0_MASK( 6, 3), v)
  84. /* Data Transfer Speed and Mode */
  85. enum hci_cmd_mode {
  86. MODE_I3C_SDR0 = 0x0,
  87. MODE_I3C_SDR1 = 0x1,
  88. MODE_I3C_SDR2 = 0x2,
  89. MODE_I3C_SDR3 = 0x3,
  90. MODE_I3C_SDR4 = 0x4,
  91. MODE_I3C_HDR_TSx = 0x5,
  92. MODE_I3C_HDR_DDR = 0x6,
  93. MODE_I3C_HDR_BT = 0x7,
  94. MODE_I3C_Fm_FmP = 0x8,
  95. MODE_I2C_Fm = 0x0,
  96. MODE_I2C_FmP = 0x1,
  97. MODE_I2C_UD1 = 0x2,
  98. MODE_I2C_UD2 = 0x3,
  99. MODE_I2C_UD3 = 0x4,
  100. };
  101. static enum hci_cmd_mode get_i3c_mode(struct i3c_hci *hci)
  102. {
  103. struct i3c_bus *bus = i3c_master_get_bus(&hci->master);
  104. if (bus->scl_rate.i3c >= 12500000)
  105. return MODE_I3C_SDR0;
  106. if (bus->scl_rate.i3c > 8000000)
  107. return MODE_I3C_SDR1;
  108. if (bus->scl_rate.i3c > 6000000)
  109. return MODE_I3C_SDR2;
  110. if (bus->scl_rate.i3c > 4000000)
  111. return MODE_I3C_SDR3;
  112. if (bus->scl_rate.i3c > 2000000)
  113. return MODE_I3C_SDR4;
  114. return MODE_I3C_Fm_FmP;
  115. }
  116. static enum hci_cmd_mode get_i2c_mode(struct i3c_hci *hci)
  117. {
  118. struct i3c_bus *bus = i3c_master_get_bus(&hci->master);
  119. if (bus->scl_rate.i2c >= 1000000)
  120. return MODE_I2C_FmP;
  121. return MODE_I2C_Fm;
  122. }
  123. static void fill_data_bytes(struct hci_xfer *xfer, u8 *data,
  124. unsigned int data_len)
  125. {
  126. xfer->cmd_desc[1] = 0;
  127. switch (data_len) {
  128. case 4:
  129. xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_4(data[3]);
  130. fallthrough;
  131. case 3:
  132. xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_3(data[2]);
  133. fallthrough;
  134. case 2:
  135. xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_2(data[1]);
  136. fallthrough;
  137. case 1:
  138. xfer->cmd_desc[1] |= CMD_I1_DATA_BYTE_1(data[0]);
  139. fallthrough;
  140. case 0:
  141. break;
  142. }
  143. /* we consumed all the data with the cmd descriptor */
  144. xfer->data = NULL;
  145. }
  146. static int hci_cmd_v1_prep_ccc(struct i3c_hci *hci,
  147. struct hci_xfer *xfer,
  148. u8 ccc_addr, u8 ccc_cmd, bool raw)
  149. {
  150. unsigned int dat_idx = 0;
  151. enum hci_cmd_mode mode = get_i3c_mode(hci);
  152. u8 *data = xfer->data;
  153. unsigned int data_len = xfer->data_len;
  154. bool rnw = xfer->rnw;
  155. int ret;
  156. /* this should never happen */
  157. if (WARN_ON(raw))
  158. return -EINVAL;
  159. if (ccc_addr != I3C_BROADCAST_ADDR) {
  160. ret = mipi_i3c_hci_dat_v1.get_index(hci, ccc_addr);
  161. if (ret < 0)
  162. return ret;
  163. dat_idx = ret;
  164. }
  165. xfer->cmd_tid = hci_get_tid();
  166. if (!rnw && data_len <= 4) {
  167. /* we use an Immediate Data Transfer Command */
  168. xfer->cmd_desc[0] =
  169. CMD_0_ATTR_I |
  170. CMD_I0_TID(xfer->cmd_tid) |
  171. CMD_I0_CMD(ccc_cmd) | CMD_I0_CP |
  172. CMD_I0_DEV_INDEX(dat_idx) |
  173. CMD_I0_DTT(data_len) |
  174. CMD_I0_MODE(mode);
  175. fill_data_bytes(xfer, data, data_len);
  176. } else {
  177. /* we use a Regular Data Transfer Command */
  178. xfer->cmd_desc[0] =
  179. CMD_0_ATTR_R |
  180. CMD_R0_TID(xfer->cmd_tid) |
  181. CMD_R0_CMD(ccc_cmd) | CMD_R0_CP |
  182. CMD_R0_DEV_INDEX(dat_idx) |
  183. CMD_R0_MODE(mode) |
  184. (rnw ? CMD_R0_RNW : 0);
  185. xfer->cmd_desc[1] =
  186. CMD_R1_DATA_LENGTH(data_len);
  187. }
  188. return 0;
  189. }
  190. static void hci_cmd_v1_prep_i3c_xfer(struct i3c_hci *hci,
  191. struct i3c_dev_desc *dev,
  192. struct hci_xfer *xfer)
  193. {
  194. struct i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev);
  195. unsigned int dat_idx = dev_data->dat_idx;
  196. enum hci_cmd_mode mode = get_i3c_mode(hci);
  197. u8 *data = xfer->data;
  198. unsigned int data_len = xfer->data_len;
  199. bool rnw = xfer->rnw;
  200. xfer->cmd_tid = hci_get_tid();
  201. if (!rnw && data_len <= 4) {
  202. /* we use an Immediate Data Transfer Command */
  203. xfer->cmd_desc[0] =
  204. CMD_0_ATTR_I |
  205. CMD_I0_TID(xfer->cmd_tid) |
  206. CMD_I0_DEV_INDEX(dat_idx) |
  207. CMD_I0_DTT(data_len) |
  208. CMD_I0_MODE(mode);
  209. fill_data_bytes(xfer, data, data_len);
  210. } else {
  211. /* we use a Regular Data Transfer Command */
  212. xfer->cmd_desc[0] =
  213. CMD_0_ATTR_R |
  214. CMD_R0_TID(xfer->cmd_tid) |
  215. CMD_R0_DEV_INDEX(dat_idx) |
  216. CMD_R0_MODE(mode) |
  217. (rnw ? CMD_R0_RNW : 0);
  218. xfer->cmd_desc[1] =
  219. CMD_R1_DATA_LENGTH(data_len);
  220. }
  221. }
  222. static void hci_cmd_v1_prep_i2c_xfer(struct i3c_hci *hci,
  223. struct i2c_dev_desc *dev,
  224. struct hci_xfer *xfer)
  225. {
  226. struct i3c_hci_dev_data *dev_data = i2c_dev_get_master_data(dev);
  227. unsigned int dat_idx = dev_data->dat_idx;
  228. enum hci_cmd_mode mode = get_i2c_mode(hci);
  229. u8 *data = xfer->data;
  230. unsigned int data_len = xfer->data_len;
  231. bool rnw = xfer->rnw;
  232. xfer->cmd_tid = hci_get_tid();
  233. if (!rnw && data_len <= 4) {
  234. /* we use an Immediate Data Transfer Command */
  235. xfer->cmd_desc[0] =
  236. CMD_0_ATTR_I |
  237. CMD_I0_TID(xfer->cmd_tid) |
  238. CMD_I0_DEV_INDEX(dat_idx) |
  239. CMD_I0_DTT(data_len) |
  240. CMD_I0_MODE(mode);
  241. fill_data_bytes(xfer, data, data_len);
  242. } else {
  243. /* we use a Regular Data Transfer Command */
  244. xfer->cmd_desc[0] =
  245. CMD_0_ATTR_R |
  246. CMD_R0_TID(xfer->cmd_tid) |
  247. CMD_R0_DEV_INDEX(dat_idx) |
  248. CMD_R0_MODE(mode) |
  249. (rnw ? CMD_R0_RNW : 0);
  250. xfer->cmd_desc[1] =
  251. CMD_R1_DATA_LENGTH(data_len);
  252. }
  253. }
  254. static int hci_cmd_v1_daa(struct i3c_hci *hci)
  255. {
  256. struct hci_xfer *xfer;
  257. int ret, dat_idx = -1;
  258. u8 next_addr = 0;
  259. u64 pid;
  260. unsigned int dcr, bcr;
  261. DECLARE_COMPLETION_ONSTACK(done);
  262. xfer = hci_alloc_xfer(2);
  263. if (!xfer)
  264. return -ENOMEM;
  265. /*
  266. * Simple for now: we allocate a temporary DAT entry, do a single
  267. * DAA, register the device which will allocate its own DAT entry
  268. * via the core callback, then free the temporary DAT entry.
  269. * Loop until there is no more devices to assign an address to.
  270. * Yes, there is room for improvements.
  271. */
  272. for (;;) {
  273. ret = mipi_i3c_hci_dat_v1.alloc_entry(hci);
  274. if (ret < 0)
  275. break;
  276. dat_idx = ret;
  277. ret = i3c_master_get_free_addr(&hci->master, next_addr);
  278. if (ret < 0)
  279. break;
  280. next_addr = ret;
  281. DBG("next_addr = 0x%02x, DAA using DAT %d", next_addr, dat_idx);
  282. mipi_i3c_hci_dat_v1.set_dynamic_addr(hci, dat_idx, next_addr);
  283. mipi_i3c_hci_dct_index_reset(hci);
  284. xfer->cmd_tid = hci_get_tid();
  285. xfer->cmd_desc[0] =
  286. CMD_0_ATTR_A |
  287. CMD_A0_TID(xfer->cmd_tid) |
  288. CMD_A0_CMD(I3C_CCC_ENTDAA) |
  289. CMD_A0_DEV_INDEX(dat_idx) |
  290. CMD_A0_DEV_COUNT(1) |
  291. CMD_A0_ROC | CMD_A0_TOC;
  292. xfer->cmd_desc[1] = 0;
  293. hci->io->queue_xfer(hci, xfer, 1);
  294. if (!wait_for_completion_timeout(&done, HZ) &&
  295. hci->io->dequeue_xfer(hci, xfer, 1)) {
  296. ret = -ETIME;
  297. break;
  298. }
  299. if (RESP_STATUS(xfer[0].response) == RESP_ERR_NACK &&
  300. RESP_STATUS(xfer[0].response) == 1) {
  301. ret = 0; /* no more devices to be assigned */
  302. break;
  303. }
  304. if (RESP_STATUS(xfer[0].response) != RESP_SUCCESS) {
  305. ret = -EIO;
  306. break;
  307. }
  308. i3c_hci_dct_get_val(hci, 0, &pid, &dcr, &bcr);
  309. DBG("assigned address %#x to device PID=0x%llx DCR=%#x BCR=%#x",
  310. next_addr, pid, dcr, bcr);
  311. mipi_i3c_hci_dat_v1.free_entry(hci, dat_idx);
  312. dat_idx = -1;
  313. /*
  314. * TODO: Extend the subsystem layer to allow for registering
  315. * new device and provide BCR/DCR/PID at the same time.
  316. */
  317. ret = i3c_master_add_i3c_dev_locked(&hci->master, next_addr);
  318. if (ret)
  319. break;
  320. }
  321. if (dat_idx >= 0)
  322. mipi_i3c_hci_dat_v1.free_entry(hci, dat_idx);
  323. hci_free_xfer(xfer, 1);
  324. return ret;
  325. }
  326. const struct hci_cmd_ops mipi_i3c_hci_cmd_v1 = {
  327. .prep_ccc = hci_cmd_v1_prep_ccc,
  328. .prep_i3c_xfer = hci_cmd_v1_prep_i3c_xfer,
  329. .prep_i2c_xfer = hci_cmd_v1_prep_i2c_xfer,
  330. .perform_daa = hci_cmd_v1_daa,
  331. };