intel_dsi_vbt.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. /*
  2. * Copyright © 2014 Intel Corporation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. *
  23. * Author: Shobhit Kumar <shobhit.kumar@intel.com>
  24. *
  25. */
  26. #include <drm/drmP.h>
  27. #include <drm/drm_crtc.h>
  28. #include <drm/drm_edid.h>
  29. #include <drm/i915_drm.h>
  30. #include <linux/gpio/consumer.h>
  31. #include <linux/slab.h>
  32. #include <video/mipi_display.h>
  33. #include <asm/intel-mid.h>
  34. #include <video/mipi_display.h>
  35. #include "i915_drv.h"
  36. #include "intel_drv.h"
  37. #include "intel_dsi.h"
  38. #define MIPI_TRANSFER_MODE_SHIFT 0
  39. #define MIPI_VIRTUAL_CHANNEL_SHIFT 1
  40. #define MIPI_PORT_SHIFT 3
  41. #define PREPARE_CNT_MAX 0x3F
  42. #define EXIT_ZERO_CNT_MAX 0x3F
  43. #define CLK_ZERO_CNT_MAX 0xFF
  44. #define TRAIL_CNT_MAX 0x1F
  45. #define NS_KHZ_RATIO 1000000
  46. /* base offsets for gpio pads */
  47. #define VLV_GPIO_NC_0_HV_DDI0_HPD 0x4130
  48. #define VLV_GPIO_NC_1_HV_DDI0_DDC_SDA 0x4120
  49. #define VLV_GPIO_NC_2_HV_DDI0_DDC_SCL 0x4110
  50. #define VLV_GPIO_NC_3_PANEL0_VDDEN 0x4140
  51. #define VLV_GPIO_NC_4_PANEL0_BKLTEN 0x4150
  52. #define VLV_GPIO_NC_5_PANEL0_BKLTCTL 0x4160
  53. #define VLV_GPIO_NC_6_HV_DDI1_HPD 0x4180
  54. #define VLV_GPIO_NC_7_HV_DDI1_DDC_SDA 0x4190
  55. #define VLV_GPIO_NC_8_HV_DDI1_DDC_SCL 0x4170
  56. #define VLV_GPIO_NC_9_PANEL1_VDDEN 0x4100
  57. #define VLV_GPIO_NC_10_PANEL1_BKLTEN 0x40E0
  58. #define VLV_GPIO_NC_11_PANEL1_BKLTCTL 0x40F0
  59. #define VLV_GPIO_PCONF0(base_offset) (base_offset)
  60. #define VLV_GPIO_PAD_VAL(base_offset) ((base_offset) + 8)
  61. struct gpio_map {
  62. u16 base_offset;
  63. bool init;
  64. };
  65. static struct gpio_map vlv_gpio_table[] = {
  66. { VLV_GPIO_NC_0_HV_DDI0_HPD },
  67. { VLV_GPIO_NC_1_HV_DDI0_DDC_SDA },
  68. { VLV_GPIO_NC_2_HV_DDI0_DDC_SCL },
  69. { VLV_GPIO_NC_3_PANEL0_VDDEN },
  70. { VLV_GPIO_NC_4_PANEL0_BKLTEN },
  71. { VLV_GPIO_NC_5_PANEL0_BKLTCTL },
  72. { VLV_GPIO_NC_6_HV_DDI1_HPD },
  73. { VLV_GPIO_NC_7_HV_DDI1_DDC_SDA },
  74. { VLV_GPIO_NC_8_HV_DDI1_DDC_SCL },
  75. { VLV_GPIO_NC_9_PANEL1_VDDEN },
  76. { VLV_GPIO_NC_10_PANEL1_BKLTEN },
  77. { VLV_GPIO_NC_11_PANEL1_BKLTCTL },
  78. };
  79. #define CHV_GPIO_IDX_START_N 0
  80. #define CHV_GPIO_IDX_START_E 73
  81. #define CHV_GPIO_IDX_START_SW 100
  82. #define CHV_GPIO_IDX_START_SE 198
  83. #define CHV_VBT_MAX_PINS_PER_FMLY 15
  84. #define CHV_GPIO_PAD_CFG0(f, i) (0x4400 + (f) * 0x400 + (i) * 8)
  85. #define CHV_GPIO_GPIOEN (1 << 15)
  86. #define CHV_GPIO_GPIOCFG_GPIO (0 << 8)
  87. #define CHV_GPIO_GPIOCFG_GPO (1 << 8)
  88. #define CHV_GPIO_GPIOCFG_GPI (2 << 8)
  89. #define CHV_GPIO_GPIOCFG_HIZ (3 << 8)
  90. #define CHV_GPIO_GPIOTXSTATE(state) ((!!(state)) << 1)
  91. #define CHV_GPIO_PAD_CFG1(f, i) (0x4400 + (f) * 0x400 + (i) * 8 + 4)
  92. #define CHV_GPIO_CFGLOCK (1 << 31)
  93. static inline enum port intel_dsi_seq_port_to_port(u8 port)
  94. {
  95. return port ? PORT_C : PORT_A;
  96. }
  97. static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
  98. const u8 *data)
  99. {
  100. struct mipi_dsi_device *dsi_device;
  101. u8 type, flags, seq_port;
  102. u16 len;
  103. enum port port;
  104. DRM_DEBUG_KMS("\n");
  105. flags = *data++;
  106. type = *data++;
  107. len = *((u16 *) data);
  108. data += 2;
  109. seq_port = (flags >> MIPI_PORT_SHIFT) & 3;
  110. /* For DSI single link on Port A & C, the seq_port value which is
  111. * parsed from Sequence Block#53 of VBT has been set to 0
  112. * Now, read/write of packets for the DSI single link on Port A and
  113. * Port C will based on the DVO port from VBT block 2.
  114. */
  115. if (intel_dsi->ports == (1 << PORT_C))
  116. port = PORT_C;
  117. else
  118. port = intel_dsi_seq_port_to_port(seq_port);
  119. dsi_device = intel_dsi->dsi_hosts[port]->device;
  120. if (!dsi_device) {
  121. DRM_DEBUG_KMS("no dsi device for port %c\n", port_name(port));
  122. goto out;
  123. }
  124. if ((flags >> MIPI_TRANSFER_MODE_SHIFT) & 1)
  125. dsi_device->mode_flags &= ~MIPI_DSI_MODE_LPM;
  126. else
  127. dsi_device->mode_flags |= MIPI_DSI_MODE_LPM;
  128. dsi_device->channel = (flags >> MIPI_VIRTUAL_CHANNEL_SHIFT) & 3;
  129. switch (type) {
  130. case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM:
  131. mipi_dsi_generic_write(dsi_device, NULL, 0);
  132. break;
  133. case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM:
  134. mipi_dsi_generic_write(dsi_device, data, 1);
  135. break;
  136. case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM:
  137. mipi_dsi_generic_write(dsi_device, data, 2);
  138. break;
  139. case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM:
  140. case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM:
  141. case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
  142. DRM_DEBUG_DRIVER("Generic Read not yet implemented or used\n");
  143. break;
  144. case MIPI_DSI_GENERIC_LONG_WRITE:
  145. mipi_dsi_generic_write(dsi_device, data, len);
  146. break;
  147. case MIPI_DSI_DCS_SHORT_WRITE:
  148. mipi_dsi_dcs_write_buffer(dsi_device, data, 1);
  149. break;
  150. case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
  151. mipi_dsi_dcs_write_buffer(dsi_device, data, 2);
  152. break;
  153. case MIPI_DSI_DCS_READ:
  154. DRM_DEBUG_DRIVER("DCS Read not yet implemented or used\n");
  155. break;
  156. case MIPI_DSI_DCS_LONG_WRITE:
  157. mipi_dsi_dcs_write_buffer(dsi_device, data, len);
  158. break;
  159. }
  160. vlv_dsi_wait_for_fifo_empty(intel_dsi, port);
  161. out:
  162. data += len;
  163. return data;
  164. }
  165. static const u8 *mipi_exec_delay(struct intel_dsi *intel_dsi, const u8 *data)
  166. {
  167. u32 delay = *((const u32 *) data);
  168. DRM_DEBUG_KMS("\n");
  169. usleep_range(delay, delay + 10);
  170. data += 4;
  171. return data;
  172. }
  173. static void vlv_exec_gpio(struct drm_i915_private *dev_priv,
  174. u8 gpio_source, u8 gpio_index, bool value)
  175. {
  176. struct gpio_map *map;
  177. u16 pconf0, padval;
  178. u32 tmp;
  179. u8 port;
  180. if (gpio_index >= ARRAY_SIZE(vlv_gpio_table)) {
  181. DRM_DEBUG_KMS("unknown gpio index %u\n", gpio_index);
  182. return;
  183. }
  184. map = &vlv_gpio_table[gpio_index];
  185. if (dev_priv->vbt.dsi.seq_version >= 3) {
  186. /* XXX: this assumes vlv_gpio_table only has NC GPIOs. */
  187. port = IOSF_PORT_GPIO_NC;
  188. } else {
  189. if (gpio_source == 0) {
  190. port = IOSF_PORT_GPIO_NC;
  191. } else if (gpio_source == 1) {
  192. DRM_DEBUG_KMS("SC gpio not supported\n");
  193. return;
  194. } else {
  195. DRM_DEBUG_KMS("unknown gpio source %u\n", gpio_source);
  196. return;
  197. }
  198. }
  199. pconf0 = VLV_GPIO_PCONF0(map->base_offset);
  200. padval = VLV_GPIO_PAD_VAL(map->base_offset);
  201. mutex_lock(&dev_priv->sb_lock);
  202. if (!map->init) {
  203. /* FIXME: remove constant below */
  204. vlv_iosf_sb_write(dev_priv, port, pconf0, 0x2000CC00);
  205. map->init = true;
  206. }
  207. tmp = 0x4 | value;
  208. vlv_iosf_sb_write(dev_priv, port, padval, tmp);
  209. mutex_unlock(&dev_priv->sb_lock);
  210. }
  211. static void chv_exec_gpio(struct drm_i915_private *dev_priv,
  212. u8 gpio_source, u8 gpio_index, bool value)
  213. {
  214. u16 cfg0, cfg1;
  215. u16 family_num;
  216. u8 port;
  217. if (dev_priv->vbt.dsi.seq_version >= 3) {
  218. if (gpio_index >= CHV_GPIO_IDX_START_SE) {
  219. /* XXX: it's unclear whether 255->57 is part of SE. */
  220. gpio_index -= CHV_GPIO_IDX_START_SE;
  221. port = CHV_IOSF_PORT_GPIO_SE;
  222. } else if (gpio_index >= CHV_GPIO_IDX_START_SW) {
  223. gpio_index -= CHV_GPIO_IDX_START_SW;
  224. port = CHV_IOSF_PORT_GPIO_SW;
  225. } else if (gpio_index >= CHV_GPIO_IDX_START_E) {
  226. gpio_index -= CHV_GPIO_IDX_START_E;
  227. port = CHV_IOSF_PORT_GPIO_E;
  228. } else {
  229. port = CHV_IOSF_PORT_GPIO_N;
  230. }
  231. } else {
  232. /* XXX: The spec is unclear about CHV GPIO on seq v2 */
  233. if (gpio_source != 0) {
  234. DRM_DEBUG_KMS("unknown gpio source %u\n", gpio_source);
  235. return;
  236. }
  237. if (gpio_index >= CHV_GPIO_IDX_START_E) {
  238. DRM_DEBUG_KMS("invalid gpio index %u for GPIO N\n",
  239. gpio_index);
  240. return;
  241. }
  242. port = CHV_IOSF_PORT_GPIO_N;
  243. }
  244. family_num = gpio_index / CHV_VBT_MAX_PINS_PER_FMLY;
  245. gpio_index = gpio_index % CHV_VBT_MAX_PINS_PER_FMLY;
  246. cfg0 = CHV_GPIO_PAD_CFG0(family_num, gpio_index);
  247. cfg1 = CHV_GPIO_PAD_CFG1(family_num, gpio_index);
  248. mutex_lock(&dev_priv->sb_lock);
  249. vlv_iosf_sb_write(dev_priv, port, cfg1, 0);
  250. vlv_iosf_sb_write(dev_priv, port, cfg0,
  251. CHV_GPIO_GPIOEN | CHV_GPIO_GPIOCFG_GPO |
  252. CHV_GPIO_GPIOTXSTATE(value));
  253. mutex_unlock(&dev_priv->sb_lock);
  254. }
  255. static void bxt_exec_gpio(struct drm_i915_private *dev_priv,
  256. u8 gpio_source, u8 gpio_index, bool value)
  257. {
  258. /* XXX: this table is a quick ugly hack. */
  259. static struct gpio_desc *bxt_gpio_table[U8_MAX + 1];
  260. struct gpio_desc *gpio_desc = bxt_gpio_table[gpio_index];
  261. if (!gpio_desc) {
  262. gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev,
  263. NULL, gpio_index,
  264. value ? GPIOD_OUT_LOW :
  265. GPIOD_OUT_HIGH);
  266. if (IS_ERR_OR_NULL(gpio_desc)) {
  267. DRM_ERROR("GPIO index %u request failed (%ld)\n",
  268. gpio_index, PTR_ERR(gpio_desc));
  269. return;
  270. }
  271. bxt_gpio_table[gpio_index] = gpio_desc;
  272. }
  273. gpiod_set_value(gpio_desc, value);
  274. }
  275. static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
  276. {
  277. struct drm_device *dev = intel_dsi->base.base.dev;
  278. struct drm_i915_private *dev_priv = to_i915(dev);
  279. u8 gpio_source, gpio_index = 0, gpio_number;
  280. bool value;
  281. DRM_DEBUG_KMS("\n");
  282. if (dev_priv->vbt.dsi.seq_version >= 3)
  283. gpio_index = *data++;
  284. gpio_number = *data++;
  285. /* gpio source in sequence v2 only */
  286. if (dev_priv->vbt.dsi.seq_version == 2)
  287. gpio_source = (*data >> 1) & 3;
  288. else
  289. gpio_source = 0;
  290. /* pull up/down */
  291. value = *data++ & 1;
  292. if (IS_VALLEYVIEW(dev_priv))
  293. vlv_exec_gpio(dev_priv, gpio_source, gpio_number, value);
  294. else if (IS_CHERRYVIEW(dev_priv))
  295. chv_exec_gpio(dev_priv, gpio_source, gpio_number, value);
  296. else
  297. bxt_exec_gpio(dev_priv, gpio_source, gpio_index, value);
  298. return data;
  299. }
  300. static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
  301. {
  302. DRM_DEBUG_KMS("Skipping I2C element execution\n");
  303. return data + *(data + 6) + 7;
  304. }
  305. static const u8 *mipi_exec_spi(struct intel_dsi *intel_dsi, const u8 *data)
  306. {
  307. DRM_DEBUG_KMS("Skipping SPI element execution\n");
  308. return data + *(data + 5) + 6;
  309. }
  310. static const u8 *mipi_exec_pmic(struct intel_dsi *intel_dsi, const u8 *data)
  311. {
  312. DRM_DEBUG_KMS("Skipping PMIC element execution\n");
  313. return data + 15;
  314. }
  315. typedef const u8 * (*fn_mipi_elem_exec)(struct intel_dsi *intel_dsi,
  316. const u8 *data);
  317. static const fn_mipi_elem_exec exec_elem[] = {
  318. [MIPI_SEQ_ELEM_SEND_PKT] = mipi_exec_send_packet,
  319. [MIPI_SEQ_ELEM_DELAY] = mipi_exec_delay,
  320. [MIPI_SEQ_ELEM_GPIO] = mipi_exec_gpio,
  321. [MIPI_SEQ_ELEM_I2C] = mipi_exec_i2c,
  322. [MIPI_SEQ_ELEM_SPI] = mipi_exec_spi,
  323. [MIPI_SEQ_ELEM_PMIC] = mipi_exec_pmic,
  324. };
  325. /*
  326. * MIPI Sequence from VBT #53 parsing logic
  327. * We have already separated each seqence during bios parsing
  328. * Following is generic execution function for any sequence
  329. */
  330. static const char * const seq_name[] = {
  331. [MIPI_SEQ_DEASSERT_RESET] = "MIPI_SEQ_DEASSERT_RESET",
  332. [MIPI_SEQ_INIT_OTP] = "MIPI_SEQ_INIT_OTP",
  333. [MIPI_SEQ_DISPLAY_ON] = "MIPI_SEQ_DISPLAY_ON",
  334. [MIPI_SEQ_DISPLAY_OFF] = "MIPI_SEQ_DISPLAY_OFF",
  335. [MIPI_SEQ_ASSERT_RESET] = "MIPI_SEQ_ASSERT_RESET",
  336. [MIPI_SEQ_BACKLIGHT_ON] = "MIPI_SEQ_BACKLIGHT_ON",
  337. [MIPI_SEQ_BACKLIGHT_OFF] = "MIPI_SEQ_BACKLIGHT_OFF",
  338. [MIPI_SEQ_TEAR_ON] = "MIPI_SEQ_TEAR_ON",
  339. [MIPI_SEQ_TEAR_OFF] = "MIPI_SEQ_TEAR_OFF",
  340. [MIPI_SEQ_POWER_ON] = "MIPI_SEQ_POWER_ON",
  341. [MIPI_SEQ_POWER_OFF] = "MIPI_SEQ_POWER_OFF",
  342. };
  343. static const char *sequence_name(enum mipi_seq seq_id)
  344. {
  345. if (seq_id < ARRAY_SIZE(seq_name) && seq_name[seq_id])
  346. return seq_name[seq_id];
  347. else
  348. return "(unknown)";
  349. }
  350. void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
  351. enum mipi_seq seq_id)
  352. {
  353. struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
  354. const u8 *data;
  355. fn_mipi_elem_exec mipi_elem_exec;
  356. if (WARN_ON(seq_id >= ARRAY_SIZE(dev_priv->vbt.dsi.sequence)))
  357. return;
  358. data = dev_priv->vbt.dsi.sequence[seq_id];
  359. if (!data)
  360. return;
  361. WARN_ON(*data != seq_id);
  362. DRM_DEBUG_KMS("Starting MIPI sequence %d - %s\n",
  363. seq_id, sequence_name(seq_id));
  364. /* Skip Sequence Byte. */
  365. data++;
  366. /* Skip Size of Sequence. */
  367. if (dev_priv->vbt.dsi.seq_version >= 3)
  368. data += 4;
  369. while (1) {
  370. u8 operation_byte = *data++;
  371. u8 operation_size = 0;
  372. if (operation_byte == MIPI_SEQ_ELEM_END)
  373. break;
  374. if (operation_byte < ARRAY_SIZE(exec_elem))
  375. mipi_elem_exec = exec_elem[operation_byte];
  376. else
  377. mipi_elem_exec = NULL;
  378. /* Size of Operation. */
  379. if (dev_priv->vbt.dsi.seq_version >= 3)
  380. operation_size = *data++;
  381. if (mipi_elem_exec) {
  382. const u8 *next = data + operation_size;
  383. data = mipi_elem_exec(intel_dsi, data);
  384. /* Consistency check if we have size. */
  385. if (operation_size && data != next) {
  386. DRM_ERROR("Inconsistent operation size\n");
  387. return;
  388. }
  389. } else if (operation_size) {
  390. /* We have size, skip. */
  391. DRM_DEBUG_KMS("Unsupported MIPI operation byte %u\n",
  392. operation_byte);
  393. data += operation_size;
  394. } else {
  395. /* No size, can't skip without parsing. */
  396. DRM_ERROR("Unsupported MIPI operation byte %u\n",
  397. operation_byte);
  398. return;
  399. }
  400. }
  401. }
  402. int intel_dsi_vbt_get_modes(struct intel_dsi *intel_dsi)
  403. {
  404. struct intel_connector *connector = intel_dsi->attached_connector;
  405. struct drm_device *dev = intel_dsi->base.base.dev;
  406. struct drm_i915_private *dev_priv = to_i915(dev);
  407. struct drm_display_mode *mode;
  408. mode = drm_mode_duplicate(dev, dev_priv->vbt.lfp_lvds_vbt_mode);
  409. if (!mode)
  410. return 0;
  411. mode->type |= DRM_MODE_TYPE_PREFERRED;
  412. drm_mode_probed_add(&connector->base, mode);
  413. return 1;
  414. }
  415. bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
  416. {
  417. struct drm_device *dev = intel_dsi->base.base.dev;
  418. struct drm_i915_private *dev_priv = to_i915(dev);
  419. struct mipi_config *mipi_config = dev_priv->vbt.dsi.config;
  420. struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps;
  421. struct drm_display_mode *mode = dev_priv->vbt.lfp_lvds_vbt_mode;
  422. u32 bpp;
  423. u32 tlpx_ns, extra_byte_count, bitrate, tlpx_ui;
  424. u32 ui_num, ui_den;
  425. u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt;
  426. u32 ths_prepare_ns, tclk_trail_ns;
  427. u32 tclk_prepare_clkzero, ths_prepare_hszero;
  428. u32 lp_to_hs_switch, hs_to_lp_switch;
  429. u32 pclk, computed_ddr;
  430. u32 mul;
  431. u16 burst_mode_ratio;
  432. enum port port;
  433. DRM_DEBUG_KMS("\n");
  434. intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1;
  435. intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0;
  436. intel_dsi->lane_count = mipi_config->lane_cnt + 1;
  437. intel_dsi->pixel_format =
  438. pixel_format_from_register_bits(
  439. mipi_config->videomode_color_format << 7);
  440. bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
  441. intel_dsi->dual_link = mipi_config->dual_link;
  442. intel_dsi->pixel_overlap = mipi_config->pixel_overlap;
  443. intel_dsi->operation_mode = mipi_config->is_cmd_mode;
  444. intel_dsi->video_mode_format = mipi_config->video_transfer_mode;
  445. intel_dsi->escape_clk_div = mipi_config->byte_clk_sel;
  446. intel_dsi->lp_rx_timeout = mipi_config->lp_rx_timeout;
  447. intel_dsi->turn_arnd_val = mipi_config->turn_around_timeout;
  448. intel_dsi->rst_timer_val = mipi_config->device_reset_timer;
  449. intel_dsi->init_count = mipi_config->master_init_timer;
  450. intel_dsi->bw_timer = mipi_config->dbi_bw_timer;
  451. intel_dsi->video_frmt_cfg_bits =
  452. mipi_config->bta_enabled ? DISABLE_VIDEO_BTA : 0;
  453. pclk = mode->clock;
  454. /* In dual link mode each port needs half of pixel clock */
  455. if (intel_dsi->dual_link) {
  456. pclk = pclk / 2;
  457. /* we can enable pixel_overlap if needed by panel. In this
  458. * case we need to increase the pixelclock for extra pixels
  459. */
  460. if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
  461. pclk += DIV_ROUND_UP(mode->vtotal *
  462. intel_dsi->pixel_overlap *
  463. 60, 1000);
  464. }
  465. }
  466. /* Burst Mode Ratio
  467. * Target ddr frequency from VBT / non burst ddr freq
  468. * multiply by 100 to preserve remainder
  469. */
  470. if (intel_dsi->video_mode_format == VIDEO_MODE_BURST) {
  471. if (mipi_config->target_burst_mode_freq) {
  472. computed_ddr = (pclk * bpp) / intel_dsi->lane_count;
  473. if (mipi_config->target_burst_mode_freq <
  474. computed_ddr) {
  475. DRM_ERROR("Burst mode freq is less than computed\n");
  476. return false;
  477. }
  478. burst_mode_ratio = DIV_ROUND_UP(
  479. mipi_config->target_burst_mode_freq * 100,
  480. computed_ddr);
  481. pclk = DIV_ROUND_UP(pclk * burst_mode_ratio, 100);
  482. } else {
  483. DRM_ERROR("Burst mode target is not set\n");
  484. return false;
  485. }
  486. } else
  487. burst_mode_ratio = 100;
  488. intel_dsi->burst_mode_ratio = burst_mode_ratio;
  489. intel_dsi->pclk = pclk;
  490. bitrate = (pclk * bpp) / intel_dsi->lane_count;
  491. switch (intel_dsi->escape_clk_div) {
  492. case 0:
  493. tlpx_ns = 50;
  494. break;
  495. case 1:
  496. tlpx_ns = 100;
  497. break;
  498. case 2:
  499. tlpx_ns = 200;
  500. break;
  501. default:
  502. tlpx_ns = 50;
  503. break;
  504. }
  505. switch (intel_dsi->lane_count) {
  506. case 1:
  507. case 2:
  508. extra_byte_count = 2;
  509. break;
  510. case 3:
  511. extra_byte_count = 4;
  512. break;
  513. case 4:
  514. default:
  515. extra_byte_count = 3;
  516. break;
  517. }
  518. /* in Kbps */
  519. ui_num = NS_KHZ_RATIO;
  520. ui_den = bitrate;
  521. tclk_prepare_clkzero = mipi_config->tclk_prepare_clkzero;
  522. ths_prepare_hszero = mipi_config->ths_prepare_hszero;
  523. /*
  524. * B060
  525. * LP byte clock = TLPX/ (8UI)
  526. */
  527. intel_dsi->lp_byte_clk = DIV_ROUND_UP(tlpx_ns * ui_den, 8 * ui_num);
  528. /* DDR clock period = 2 * UI
  529. * UI(sec) = 1/(bitrate * 10^3) (bitrate is in KHZ)
  530. * UI(nsec) = 10^6 / bitrate
  531. * DDR clock period (nsec) = 2 * UI = (2 * 10^6)/ bitrate
  532. * DDR clock count = ns_value / DDR clock period
  533. *
  534. * For GEMINILAKE dphy_param_reg will be programmed in terms of
  535. * HS byte clock count for other platform in HS ddr clock count
  536. */
  537. mul = IS_GEMINILAKE(dev_priv) ? 8 : 2;
  538. ths_prepare_ns = max(mipi_config->ths_prepare,
  539. mipi_config->tclk_prepare);
  540. /* prepare count */
  541. prepare_cnt = DIV_ROUND_UP(ths_prepare_ns * ui_den, ui_num * mul);
  542. if (prepare_cnt > PREPARE_CNT_MAX) {
  543. DRM_DEBUG_KMS("prepare count too high %u\n", prepare_cnt);
  544. prepare_cnt = PREPARE_CNT_MAX;
  545. }
  546. /* exit zero count */
  547. exit_zero_cnt = DIV_ROUND_UP(
  548. (ths_prepare_hszero - ths_prepare_ns) * ui_den,
  549. ui_num * mul
  550. );
  551. /*
  552. * Exit zero is unified val ths_zero and ths_exit
  553. * minimum value for ths_exit = 110ns
  554. * min (exit_zero_cnt * 2) = 110/UI
  555. * exit_zero_cnt = 55/UI
  556. */
  557. if (exit_zero_cnt < (55 * ui_den / ui_num) && (55 * ui_den) % ui_num)
  558. exit_zero_cnt += 1;
  559. if (exit_zero_cnt > EXIT_ZERO_CNT_MAX) {
  560. DRM_DEBUG_KMS("exit zero count too high %u\n", exit_zero_cnt);
  561. exit_zero_cnt = EXIT_ZERO_CNT_MAX;
  562. }
  563. /* clk zero count */
  564. clk_zero_cnt = DIV_ROUND_UP(
  565. (tclk_prepare_clkzero - ths_prepare_ns)
  566. * ui_den, ui_num * mul);
  567. if (clk_zero_cnt > CLK_ZERO_CNT_MAX) {
  568. DRM_DEBUG_KMS("clock zero count too high %u\n", clk_zero_cnt);
  569. clk_zero_cnt = CLK_ZERO_CNT_MAX;
  570. }
  571. /* trail count */
  572. tclk_trail_ns = max(mipi_config->tclk_trail, mipi_config->ths_trail);
  573. trail_cnt = DIV_ROUND_UP(tclk_trail_ns * ui_den, ui_num * mul);
  574. if (trail_cnt > TRAIL_CNT_MAX) {
  575. DRM_DEBUG_KMS("trail count too high %u\n", trail_cnt);
  576. trail_cnt = TRAIL_CNT_MAX;
  577. }
  578. /* B080 */
  579. intel_dsi->dphy_reg = exit_zero_cnt << 24 | trail_cnt << 16 |
  580. clk_zero_cnt << 8 | prepare_cnt;
  581. /*
  582. * LP to HS switch count = 4TLPX + PREP_COUNT * mul + EXIT_ZERO_COUNT *
  583. * mul + 10UI + Extra Byte Count
  584. *
  585. * HS to LP switch count = THS-TRAIL + 2TLPX + Extra Byte Count
  586. * Extra Byte Count is calculated according to number of lanes.
  587. * High Low Switch Count is the Max of LP to HS and
  588. * HS to LP switch count
  589. *
  590. */
  591. tlpx_ui = DIV_ROUND_UP(tlpx_ns * ui_den, ui_num);
  592. /* B044 */
  593. /* FIXME:
  594. * The comment above does not match with the code */
  595. lp_to_hs_switch = DIV_ROUND_UP(4 * tlpx_ui + prepare_cnt * mul +
  596. exit_zero_cnt * mul + 10, 8);
  597. hs_to_lp_switch = DIV_ROUND_UP(mipi_config->ths_trail + 2 * tlpx_ui, 8);
  598. intel_dsi->hs_to_lp_count = max(lp_to_hs_switch, hs_to_lp_switch);
  599. intel_dsi->hs_to_lp_count += extra_byte_count;
  600. /* B088 */
  601. /* LP -> HS for clock lanes
  602. * LP clk sync + LP11 + LP01 + tclk_prepare + tclk_zero +
  603. * extra byte count
  604. * 2TPLX + 1TLPX + 1 TPLX(in ns) + prepare_cnt * 2 + clk_zero_cnt *
  605. * 2(in UI) + extra byte count
  606. * In byteclks = (4TLPX + prepare_cnt * 2 + clk_zero_cnt *2 (in UI)) /
  607. * 8 + extra byte count
  608. */
  609. intel_dsi->clk_lp_to_hs_count =
  610. DIV_ROUND_UP(
  611. 4 * tlpx_ui + prepare_cnt * 2 +
  612. clk_zero_cnt * 2,
  613. 8);
  614. intel_dsi->clk_lp_to_hs_count += extra_byte_count;
  615. /* HS->LP for Clock Lanes
  616. * Low Power clock synchronisations + 1Tx byteclk + tclk_trail +
  617. * Extra byte count
  618. * 2TLPX + 8UI + (trail_count*2)(in UI) + Extra byte count
  619. * In byteclks = (2*TLpx(in UI) + trail_count*2 +8)(in UI)/8 +
  620. * Extra byte count
  621. */
  622. intel_dsi->clk_hs_to_lp_count =
  623. DIV_ROUND_UP(2 * tlpx_ui + trail_cnt * 2 + 8,
  624. 8);
  625. intel_dsi->clk_hs_to_lp_count += extra_byte_count;
  626. DRM_DEBUG_KMS("Pclk %d\n", intel_dsi->pclk);
  627. DRM_DEBUG_KMS("Pixel overlap %d\n", intel_dsi->pixel_overlap);
  628. DRM_DEBUG_KMS("Lane count %d\n", intel_dsi->lane_count);
  629. DRM_DEBUG_KMS("DPHY param reg 0x%x\n", intel_dsi->dphy_reg);
  630. DRM_DEBUG_KMS("Video mode format %s\n",
  631. intel_dsi->video_mode_format == VIDEO_MODE_NON_BURST_WITH_SYNC_PULSE ?
  632. "non-burst with sync pulse" :
  633. intel_dsi->video_mode_format == VIDEO_MODE_NON_BURST_WITH_SYNC_EVENTS ?
  634. "non-burst with sync events" :
  635. intel_dsi->video_mode_format == VIDEO_MODE_BURST ?
  636. "burst" : "<unknown>");
  637. DRM_DEBUG_KMS("Burst mode ratio %d\n", intel_dsi->burst_mode_ratio);
  638. DRM_DEBUG_KMS("Reset timer %d\n", intel_dsi->rst_timer_val);
  639. DRM_DEBUG_KMS("Eot %s\n", enableddisabled(intel_dsi->eotp_pkt));
  640. DRM_DEBUG_KMS("Clockstop %s\n", enableddisabled(!intel_dsi->clock_stop));
  641. DRM_DEBUG_KMS("Mode %s\n", intel_dsi->operation_mode ? "command" : "video");
  642. if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK)
  643. DRM_DEBUG_KMS("Dual link: DSI_DUAL_LINK_FRONT_BACK\n");
  644. else if (intel_dsi->dual_link == DSI_DUAL_LINK_PIXEL_ALT)
  645. DRM_DEBUG_KMS("Dual link: DSI_DUAL_LINK_PIXEL_ALT\n");
  646. else
  647. DRM_DEBUG_KMS("Dual link: NONE\n");
  648. DRM_DEBUG_KMS("Pixel Format %d\n", intel_dsi->pixel_format);
  649. DRM_DEBUG_KMS("TLPX %d\n", intel_dsi->escape_clk_div);
  650. DRM_DEBUG_KMS("LP RX Timeout 0x%x\n", intel_dsi->lp_rx_timeout);
  651. DRM_DEBUG_KMS("Turnaround Timeout 0x%x\n", intel_dsi->turn_arnd_val);
  652. DRM_DEBUG_KMS("Init Count 0x%x\n", intel_dsi->init_count);
  653. DRM_DEBUG_KMS("HS to LP Count 0x%x\n", intel_dsi->hs_to_lp_count);
  654. DRM_DEBUG_KMS("LP Byte Clock %d\n", intel_dsi->lp_byte_clk);
  655. DRM_DEBUG_KMS("DBI BW Timer 0x%x\n", intel_dsi->bw_timer);
  656. DRM_DEBUG_KMS("LP to HS Clock Count 0x%x\n", intel_dsi->clk_lp_to_hs_count);
  657. DRM_DEBUG_KMS("HS to LP Clock Count 0x%x\n", intel_dsi->clk_hs_to_lp_count);
  658. DRM_DEBUG_KMS("BTA %s\n",
  659. enableddisabled(!(intel_dsi->video_frmt_cfg_bits & DISABLE_VIDEO_BTA)));
  660. /* delays in VBT are in unit of 100us, so need to convert
  661. * here in ms
  662. * Delay (100us) * 100 /1000 = Delay / 10 (ms) */
  663. intel_dsi->backlight_off_delay = pps->bl_disable_delay / 10;
  664. intel_dsi->backlight_on_delay = pps->bl_enable_delay / 10;
  665. intel_dsi->panel_on_delay = pps->panel_on_delay / 10;
  666. intel_dsi->panel_off_delay = pps->panel_off_delay / 10;
  667. intel_dsi->panel_pwr_cycle_delay = pps->panel_power_cycle_delay / 10;
  668. /* a regular driver would get the device in probe */
  669. for_each_dsi_port(port, intel_dsi->ports) {
  670. mipi_dsi_attach(intel_dsi->dsi_hosts[port]->device);
  671. }
  672. return true;
  673. }