dp_aux.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/delay.h>
  6. #include <linux/phy/phy.h>
  7. #include <drm/drm_print.h>
  8. #include "dp_reg.h"
  9. #include "dp_aux.h"
  10. enum msm_dp_aux_err {
  11. DP_AUX_ERR_NONE,
  12. DP_AUX_ERR_ADDR,
  13. DP_AUX_ERR_TOUT,
  14. DP_AUX_ERR_NACK,
  15. DP_AUX_ERR_DEFER,
  16. DP_AUX_ERR_NACK_DEFER,
  17. DP_AUX_ERR_PHY,
  18. };
  19. struct dp_aux_private {
  20. struct device *dev;
  21. struct dp_catalog *catalog;
  22. struct phy *phy;
  23. struct mutex mutex;
  24. struct completion comp;
  25. enum msm_dp_aux_err aux_error_num;
  26. u32 retry_cnt;
  27. bool cmd_busy;
  28. bool native;
  29. bool read;
  30. bool no_send_addr;
  31. bool no_send_stop;
  32. bool initted;
  33. bool is_edp;
  34. bool enable_xfers;
  35. u32 offset;
  36. u32 segment;
  37. struct drm_dp_aux dp_aux;
  38. };
  39. #define MAX_AUX_RETRIES 5
  40. static ssize_t dp_aux_write(struct dp_aux_private *aux,
  41. struct drm_dp_aux_msg *msg)
  42. {
  43. u8 data[4];
  44. u32 reg;
  45. ssize_t len;
  46. u8 *msgdata = msg->buffer;
  47. int const AUX_CMD_FIFO_LEN = 128;
  48. int i = 0;
  49. if (aux->read)
  50. len = 0;
  51. else
  52. len = msg->size;
  53. /*
  54. * cmd fifo only has depth of 144 bytes
  55. * limit buf length to 128 bytes here
  56. */
  57. if (len > AUX_CMD_FIFO_LEN - 4) {
  58. DRM_ERROR("buf size greater than allowed size of 128 bytes\n");
  59. return -EINVAL;
  60. }
  61. /* Pack cmd and write to HW */
  62. data[0] = (msg->address >> 16) & 0xf; /* addr[19:16] */
  63. if (aux->read)
  64. data[0] |= BIT(4); /* R/W */
  65. data[1] = msg->address >> 8; /* addr[15:8] */
  66. data[2] = msg->address; /* addr[7:0] */
  67. data[3] = msg->size - 1; /* len[7:0] */
  68. for (i = 0; i < len + 4; i++) {
  69. reg = (i < 4) ? data[i] : msgdata[i - 4];
  70. reg <<= DP_AUX_DATA_OFFSET;
  71. reg &= DP_AUX_DATA_MASK;
  72. reg |= DP_AUX_DATA_WRITE;
  73. /* index = 0, write */
  74. if (i == 0)
  75. reg |= DP_AUX_DATA_INDEX_WRITE;
  76. dp_catalog_aux_write_data(aux->catalog, reg);
  77. }
  78. dp_catalog_aux_clear_trans(aux->catalog, false);
  79. dp_catalog_aux_clear_hw_interrupts(aux->catalog);
  80. reg = 0; /* Transaction number == 1 */
  81. if (!aux->native) { /* i2c */
  82. reg |= DP_AUX_TRANS_CTRL_I2C;
  83. if (aux->no_send_addr)
  84. reg |= DP_AUX_TRANS_CTRL_NO_SEND_ADDR;
  85. if (aux->no_send_stop)
  86. reg |= DP_AUX_TRANS_CTRL_NO_SEND_STOP;
  87. }
  88. reg |= DP_AUX_TRANS_CTRL_GO;
  89. dp_catalog_aux_write_trans(aux->catalog, reg);
  90. return len;
  91. }
  92. static ssize_t dp_aux_cmd_fifo_tx(struct dp_aux_private *aux,
  93. struct drm_dp_aux_msg *msg)
  94. {
  95. ssize_t ret;
  96. unsigned long time_left;
  97. reinit_completion(&aux->comp);
  98. ret = dp_aux_write(aux, msg);
  99. if (ret < 0)
  100. return ret;
  101. time_left = wait_for_completion_timeout(&aux->comp,
  102. msecs_to_jiffies(250));
  103. if (!time_left)
  104. return -ETIMEDOUT;
  105. return ret;
  106. }
  107. static ssize_t dp_aux_cmd_fifo_rx(struct dp_aux_private *aux,
  108. struct drm_dp_aux_msg *msg)
  109. {
  110. u32 data;
  111. u8 *dp;
  112. u32 i, actual_i;
  113. u32 len = msg->size;
  114. dp_catalog_aux_clear_trans(aux->catalog, true);
  115. data = DP_AUX_DATA_INDEX_WRITE; /* INDEX_WRITE */
  116. data |= DP_AUX_DATA_READ; /* read */
  117. dp_catalog_aux_write_data(aux->catalog, data);
  118. dp = msg->buffer;
  119. /* discard first byte */
  120. data = dp_catalog_aux_read_data(aux->catalog);
  121. for (i = 0; i < len; i++) {
  122. data = dp_catalog_aux_read_data(aux->catalog);
  123. *dp++ = (u8)((data >> DP_AUX_DATA_OFFSET) & 0xff);
  124. actual_i = (data >> DP_AUX_DATA_INDEX_OFFSET) & 0xFF;
  125. if (i != actual_i)
  126. break;
  127. }
  128. return i;
  129. }
  130. static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux,
  131. struct drm_dp_aux_msg *input_msg)
  132. {
  133. u32 edid_address = 0x50;
  134. u32 segment_address = 0x30;
  135. bool i2c_read = input_msg->request &
  136. (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ);
  137. u8 *data;
  138. if (aux->native || i2c_read || ((input_msg->address != edid_address) &&
  139. (input_msg->address != segment_address)))
  140. return;
  141. data = input_msg->buffer;
  142. if (input_msg->address == segment_address)
  143. aux->segment = *data;
  144. else
  145. aux->offset = *data;
  146. }
  147. /**
  148. * dp_aux_transfer_helper() - helper function for EDID read transactions
  149. *
  150. * @aux: DP AUX private structure
  151. * @input_msg: input message from DRM upstream APIs
  152. * @send_seg: send the segment to sink
  153. *
  154. * return: void
  155. *
  156. * This helper function is used to fix EDID reads for non-compliant
  157. * sinks that do not handle the i2c middle-of-transaction flag correctly.
  158. */
  159. static void dp_aux_transfer_helper(struct dp_aux_private *aux,
  160. struct drm_dp_aux_msg *input_msg,
  161. bool send_seg)
  162. {
  163. struct drm_dp_aux_msg helper_msg;
  164. u32 message_size = 0x10;
  165. u32 segment_address = 0x30;
  166. u32 const edid_block_length = 0x80;
  167. bool i2c_mot = input_msg->request & DP_AUX_I2C_MOT;
  168. bool i2c_read = input_msg->request &
  169. (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ);
  170. if (!i2c_mot || !i2c_read || (input_msg->size == 0))
  171. return;
  172. /*
  173. * Sending the segment value and EDID offset will be performed
  174. * from the DRM upstream EDID driver for each block. Avoid
  175. * duplicate AUX transactions related to this while reading the
  176. * first 16 bytes of each block.
  177. */
  178. if (!(aux->offset % edid_block_length) || !send_seg)
  179. goto end;
  180. aux->read = false;
  181. aux->cmd_busy = true;
  182. aux->no_send_addr = true;
  183. aux->no_send_stop = true;
  184. /*
  185. * Send the segment address for every i2c read in which the
  186. * middle-of-tranaction flag is set. This is required to support EDID
  187. * reads of more than 2 blocks as the segment address is reset to 0
  188. * since we are overriding the middle-of-transaction flag for read
  189. * transactions.
  190. */
  191. if (aux->segment) {
  192. memset(&helper_msg, 0, sizeof(helper_msg));
  193. helper_msg.address = segment_address;
  194. helper_msg.buffer = &aux->segment;
  195. helper_msg.size = 1;
  196. dp_aux_cmd_fifo_tx(aux, &helper_msg);
  197. }
  198. /*
  199. * Send the offset address for every i2c read in which the
  200. * middle-of-transaction flag is set. This will ensure that the sink
  201. * will update its read pointer and return the correct portion of the
  202. * EDID buffer in the subsequent i2c read trasntion triggered in the
  203. * native AUX transfer function.
  204. */
  205. memset(&helper_msg, 0, sizeof(helper_msg));
  206. helper_msg.address = input_msg->address;
  207. helper_msg.buffer = &aux->offset;
  208. helper_msg.size = 1;
  209. dp_aux_cmd_fifo_tx(aux, &helper_msg);
  210. end:
  211. aux->offset += message_size;
  212. if (aux->offset == 0x80 || aux->offset == 0x100)
  213. aux->segment = 0x0; /* reset segment at end of block */
  214. }
  215. /*
  216. * This function does the real job to process an AUX transaction.
  217. * It will call aux_reset() function to reset the AUX channel,
  218. * if the waiting is timeout.
  219. */
  220. static ssize_t dp_aux_transfer(struct drm_dp_aux *dp_aux,
  221. struct drm_dp_aux_msg *msg)
  222. {
  223. ssize_t ret;
  224. int const aux_cmd_native_max = 16;
  225. int const aux_cmd_i2c_max = 128;
  226. struct dp_aux_private *aux;
  227. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  228. aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ);
  229. /* Ignore address only message */
  230. if (msg->size == 0 || !msg->buffer) {
  231. msg->reply = aux->native ?
  232. DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK;
  233. return msg->size;
  234. }
  235. /* msg sanity check */
  236. if ((aux->native && msg->size > aux_cmd_native_max) ||
  237. msg->size > aux_cmd_i2c_max) {
  238. DRM_ERROR("%s: invalid msg: size(%zu), request(%x)\n",
  239. __func__, msg->size, msg->request);
  240. return -EINVAL;
  241. }
  242. ret = pm_runtime_resume_and_get(dp_aux->dev);
  243. if (ret)
  244. return ret;
  245. mutex_lock(&aux->mutex);
  246. if (!aux->initted) {
  247. ret = -EIO;
  248. goto exit;
  249. }
  250. /*
  251. * If we're using DP and an external display isn't connected then the
  252. * transfer won't succeed. Return right away. If we don't do this we
  253. * can end up with long timeouts if someone tries to access the DP AUX
  254. * character device when no DP device is connected.
  255. */
  256. if (!aux->is_edp && !aux->enable_xfers) {
  257. ret = -ENXIO;
  258. goto exit;
  259. }
  260. dp_aux_update_offset_and_segment(aux, msg);
  261. dp_aux_transfer_helper(aux, msg, true);
  262. aux->read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ);
  263. aux->cmd_busy = true;
  264. if (aux->read) {
  265. aux->no_send_addr = true;
  266. aux->no_send_stop = false;
  267. } else {
  268. aux->no_send_addr = true;
  269. aux->no_send_stop = true;
  270. }
  271. ret = dp_aux_cmd_fifo_tx(aux, msg);
  272. if (ret < 0) {
  273. if (aux->native) {
  274. aux->retry_cnt++;
  275. if (!(aux->retry_cnt % MAX_AUX_RETRIES))
  276. phy_calibrate(aux->phy);
  277. }
  278. /* reset aux if link is in connected state */
  279. if (dp_catalog_link_is_connected(aux->catalog))
  280. dp_catalog_aux_reset(aux->catalog);
  281. } else {
  282. aux->retry_cnt = 0;
  283. switch (aux->aux_error_num) {
  284. case DP_AUX_ERR_NONE:
  285. if (aux->read)
  286. ret = dp_aux_cmd_fifo_rx(aux, msg);
  287. msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK;
  288. break;
  289. case DP_AUX_ERR_DEFER:
  290. msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_DEFER : DP_AUX_I2C_REPLY_DEFER;
  291. break;
  292. case DP_AUX_ERR_PHY:
  293. case DP_AUX_ERR_ADDR:
  294. case DP_AUX_ERR_NACK:
  295. case DP_AUX_ERR_NACK_DEFER:
  296. msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_NACK : DP_AUX_I2C_REPLY_NACK;
  297. break;
  298. case DP_AUX_ERR_TOUT:
  299. ret = -ETIMEDOUT;
  300. break;
  301. }
  302. }
  303. aux->cmd_busy = false;
  304. exit:
  305. mutex_unlock(&aux->mutex);
  306. pm_runtime_put_sync(dp_aux->dev);
  307. return ret;
  308. }
  309. irqreturn_t dp_aux_isr(struct drm_dp_aux *dp_aux)
  310. {
  311. u32 isr;
  312. struct dp_aux_private *aux;
  313. if (!dp_aux) {
  314. DRM_ERROR("invalid input\n");
  315. return IRQ_NONE;
  316. }
  317. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  318. isr = dp_catalog_aux_get_irq(aux->catalog);
  319. /* no interrupts pending, return immediately */
  320. if (!isr)
  321. return IRQ_NONE;
  322. if (!aux->cmd_busy) {
  323. DRM_ERROR("Unexpected DP AUX IRQ %#010x when not busy\n", isr);
  324. return IRQ_NONE;
  325. }
  326. /*
  327. * The logic below assumes only one error bit is set (other than "done"
  328. * which can apparently be set at the same time as some of the other
  329. * bits). Warn if more than one get set so we know we need to improve
  330. * the logic.
  331. */
  332. if (hweight32(isr & ~DP_INTR_AUX_XFER_DONE) > 1)
  333. DRM_WARN("Some DP AUX interrupts unhandled: %#010x\n", isr);
  334. if (isr & DP_INTR_AUX_ERROR) {
  335. aux->aux_error_num = DP_AUX_ERR_PHY;
  336. dp_catalog_aux_clear_hw_interrupts(aux->catalog);
  337. } else if (isr & DP_INTR_NACK_DEFER) {
  338. aux->aux_error_num = DP_AUX_ERR_NACK_DEFER;
  339. } else if (isr & DP_INTR_WRONG_ADDR) {
  340. aux->aux_error_num = DP_AUX_ERR_ADDR;
  341. } else if (isr & DP_INTR_TIMEOUT) {
  342. aux->aux_error_num = DP_AUX_ERR_TOUT;
  343. } else if (!aux->native && (isr & DP_INTR_I2C_NACK)) {
  344. aux->aux_error_num = DP_AUX_ERR_NACK;
  345. } else if (!aux->native && (isr & DP_INTR_I2C_DEFER)) {
  346. if (isr & DP_INTR_AUX_XFER_DONE)
  347. aux->aux_error_num = DP_AUX_ERR_NACK;
  348. else
  349. aux->aux_error_num = DP_AUX_ERR_DEFER;
  350. } else if (isr & DP_INTR_AUX_XFER_DONE) {
  351. aux->aux_error_num = DP_AUX_ERR_NONE;
  352. } else {
  353. DRM_WARN("Unexpected interrupt: %#010x\n", isr);
  354. return IRQ_NONE;
  355. }
  356. complete(&aux->comp);
  357. return IRQ_HANDLED;
  358. }
  359. void dp_aux_enable_xfers(struct drm_dp_aux *dp_aux, bool enabled)
  360. {
  361. struct dp_aux_private *aux;
  362. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  363. aux->enable_xfers = enabled;
  364. }
  365. void dp_aux_reconfig(struct drm_dp_aux *dp_aux)
  366. {
  367. struct dp_aux_private *aux;
  368. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  369. phy_calibrate(aux->phy);
  370. dp_catalog_aux_reset(aux->catalog);
  371. }
  372. void dp_aux_init(struct drm_dp_aux *dp_aux)
  373. {
  374. struct dp_aux_private *aux;
  375. if (!dp_aux) {
  376. DRM_ERROR("invalid input\n");
  377. return;
  378. }
  379. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  380. mutex_lock(&aux->mutex);
  381. dp_catalog_aux_enable(aux->catalog, true);
  382. aux->retry_cnt = 0;
  383. aux->initted = true;
  384. mutex_unlock(&aux->mutex);
  385. }
  386. void dp_aux_deinit(struct drm_dp_aux *dp_aux)
  387. {
  388. struct dp_aux_private *aux;
  389. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  390. mutex_lock(&aux->mutex);
  391. aux->initted = false;
  392. dp_catalog_aux_enable(aux->catalog, false);
  393. mutex_unlock(&aux->mutex);
  394. }
  395. int dp_aux_register(struct drm_dp_aux *dp_aux)
  396. {
  397. int ret;
  398. if (!dp_aux) {
  399. DRM_ERROR("invalid input\n");
  400. return -EINVAL;
  401. }
  402. ret = drm_dp_aux_register(dp_aux);
  403. if (ret) {
  404. DRM_ERROR("%s: failed to register drm aux: %d\n", __func__,
  405. ret);
  406. return ret;
  407. }
  408. return 0;
  409. }
  410. void dp_aux_unregister(struct drm_dp_aux *dp_aux)
  411. {
  412. drm_dp_aux_unregister(dp_aux);
  413. }
  414. static int dp_wait_hpd_asserted(struct drm_dp_aux *dp_aux,
  415. unsigned long wait_us)
  416. {
  417. int ret;
  418. struct dp_aux_private *aux;
  419. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  420. ret = pm_runtime_resume_and_get(aux->dev);
  421. if (ret)
  422. return ret;
  423. ret = dp_catalog_aux_wait_for_hpd_connect_state(aux->catalog, wait_us);
  424. pm_runtime_put_sync(aux->dev);
  425. return ret;
  426. }
  427. struct drm_dp_aux *dp_aux_get(struct device *dev, struct dp_catalog *catalog,
  428. struct phy *phy,
  429. bool is_edp)
  430. {
  431. struct dp_aux_private *aux;
  432. if (!catalog) {
  433. DRM_ERROR("invalid input\n");
  434. return ERR_PTR(-ENODEV);
  435. }
  436. aux = devm_kzalloc(dev, sizeof(*aux), GFP_KERNEL);
  437. if (!aux)
  438. return ERR_PTR(-ENOMEM);
  439. init_completion(&aux->comp);
  440. aux->cmd_busy = false;
  441. aux->is_edp = is_edp;
  442. mutex_init(&aux->mutex);
  443. aux->dev = dev;
  444. aux->catalog = catalog;
  445. aux->phy = phy;
  446. aux->retry_cnt = 0;
  447. /*
  448. * Use the drm_dp_aux_init() to use the aux adapter
  449. * before registering AUX with the DRM device so that
  450. * msm eDP panel can be detected by generic_dep_panel_probe().
  451. */
  452. aux->dp_aux.name = "dpu_dp_aux";
  453. aux->dp_aux.dev = dev;
  454. aux->dp_aux.transfer = dp_aux_transfer;
  455. aux->dp_aux.wait_hpd_asserted = dp_wait_hpd_asserted;
  456. drm_dp_aux_init(&aux->dp_aux);
  457. return &aux->dp_aux;
  458. }
  459. void dp_aux_put(struct drm_dp_aux *dp_aux)
  460. {
  461. struct dp_aux_private *aux;
  462. if (!dp_aux)
  463. return;
  464. aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
  465. mutex_destroy(&aux->mutex);
  466. devm_kfree(aux->dev, aux);
  467. }