intel_display.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. /*
  2. * Copyright © 2006-2017 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 DEALINGS
  21. * IN THE SOFTWARE.
  22. *
  23. */
  24. #ifndef _INTEL_DISPLAY_H_
  25. #define _INTEL_DISPLAY_H_
  26. #include <drm/drm_util.h>
  27. enum i915_gpio {
  28. GPIOA,
  29. GPIOB,
  30. GPIOC,
  31. GPIOD,
  32. GPIOE,
  33. GPIOF,
  34. GPIOG,
  35. GPIOH,
  36. __GPIOI_UNUSED,
  37. GPIOJ,
  38. GPIOK,
  39. GPIOL,
  40. GPIOM,
  41. };
  42. enum pipe {
  43. INVALID_PIPE = -1,
  44. PIPE_A = 0,
  45. PIPE_B,
  46. PIPE_C,
  47. _PIPE_EDP,
  48. I915_MAX_PIPES = _PIPE_EDP
  49. };
  50. #define pipe_name(p) ((p) + 'A')
  51. enum transcoder {
  52. TRANSCODER_A = 0,
  53. TRANSCODER_B,
  54. TRANSCODER_C,
  55. TRANSCODER_EDP,
  56. TRANSCODER_DSI_A,
  57. TRANSCODER_DSI_C,
  58. I915_MAX_TRANSCODERS
  59. };
  60. static inline const char *transcoder_name(enum transcoder transcoder)
  61. {
  62. switch (transcoder) {
  63. case TRANSCODER_A:
  64. return "A";
  65. case TRANSCODER_B:
  66. return "B";
  67. case TRANSCODER_C:
  68. return "C";
  69. case TRANSCODER_EDP:
  70. return "EDP";
  71. case TRANSCODER_DSI_A:
  72. return "DSI A";
  73. case TRANSCODER_DSI_C:
  74. return "DSI C";
  75. default:
  76. return "<invalid>";
  77. }
  78. }
  79. static inline bool transcoder_is_dsi(enum transcoder transcoder)
  80. {
  81. return transcoder == TRANSCODER_DSI_A || transcoder == TRANSCODER_DSI_C;
  82. }
  83. /*
  84. * Global legacy plane identifier. Valid only for primary/sprite
  85. * planes on pre-g4x, and only for primary planes on g4x-bdw.
  86. */
  87. enum i9xx_plane_id {
  88. PLANE_A,
  89. PLANE_B,
  90. PLANE_C,
  91. };
  92. #define plane_name(p) ((p) + 'A')
  93. #define sprite_name(p, s) ((p) * INTEL_INFO(dev_priv)->num_sprites[(p)] + (s) + 'A')
  94. /*
  95. * Per-pipe plane identifier.
  96. * I915_MAX_PLANES in the enum below is the maximum (across all platforms)
  97. * number of planes per CRTC. Not all platforms really have this many planes,
  98. * which means some arrays of size I915_MAX_PLANES may have unused entries
  99. * between the topmost sprite plane and the cursor plane.
  100. *
  101. * This is expected to be passed to various register macros
  102. * (eg. PLANE_CTL(), PS_PLANE_SEL(), etc.) so adjust with care.
  103. */
  104. enum plane_id {
  105. PLANE_PRIMARY,
  106. PLANE_SPRITE0,
  107. PLANE_SPRITE1,
  108. PLANE_SPRITE2,
  109. PLANE_CURSOR,
  110. I915_MAX_PLANES,
  111. };
  112. #define for_each_plane_id_on_crtc(__crtc, __p) \
  113. for ((__p) = PLANE_PRIMARY; (__p) < I915_MAX_PLANES; (__p)++) \
  114. for_each_if((__crtc)->plane_ids_mask & BIT(__p))
  115. enum port {
  116. PORT_NONE = -1,
  117. PORT_A = 0,
  118. PORT_B,
  119. PORT_C,
  120. PORT_D,
  121. PORT_E,
  122. PORT_F,
  123. I915_MAX_PORTS
  124. };
  125. #define port_name(p) ((p) + 'A')
  126. /*
  127. * Ports identifier referenced from other drivers.
  128. * Expected to remain stable over time
  129. */
  130. static inline const char *port_identifier(enum port port)
  131. {
  132. switch (port) {
  133. case PORT_A:
  134. return "Port A";
  135. case PORT_B:
  136. return "Port B";
  137. case PORT_C:
  138. return "Port C";
  139. case PORT_D:
  140. return "Port D";
  141. case PORT_E:
  142. return "Port E";
  143. case PORT_F:
  144. return "Port F";
  145. default:
  146. return "<invalid>";
  147. }
  148. }
  149. enum tc_port {
  150. PORT_TC_NONE = -1,
  151. PORT_TC1 = 0,
  152. PORT_TC2,
  153. PORT_TC3,
  154. PORT_TC4,
  155. I915_MAX_TC_PORTS
  156. };
  157. enum tc_port_type {
  158. TC_PORT_UNKNOWN = 0,
  159. TC_PORT_TYPEC,
  160. TC_PORT_TBT,
  161. TC_PORT_LEGACY,
  162. };
  163. enum dpio_channel {
  164. DPIO_CH0,
  165. DPIO_CH1
  166. };
  167. enum dpio_phy {
  168. DPIO_PHY0,
  169. DPIO_PHY1,
  170. DPIO_PHY2,
  171. };
  172. #define I915_NUM_PHYS_VLV 2
  173. enum aux_ch {
  174. AUX_CH_A,
  175. AUX_CH_B,
  176. AUX_CH_C,
  177. AUX_CH_D,
  178. AUX_CH_E, /* ICL+ */
  179. AUX_CH_F,
  180. };
  181. #define aux_ch_name(a) ((a) + 'A')
  182. enum intel_display_power_domain {
  183. POWER_DOMAIN_PIPE_A,
  184. POWER_DOMAIN_PIPE_B,
  185. POWER_DOMAIN_PIPE_C,
  186. POWER_DOMAIN_PIPE_A_PANEL_FITTER,
  187. POWER_DOMAIN_PIPE_B_PANEL_FITTER,
  188. POWER_DOMAIN_PIPE_C_PANEL_FITTER,
  189. POWER_DOMAIN_TRANSCODER_A,
  190. POWER_DOMAIN_TRANSCODER_B,
  191. POWER_DOMAIN_TRANSCODER_C,
  192. POWER_DOMAIN_TRANSCODER_EDP,
  193. POWER_DOMAIN_TRANSCODER_DSI_A,
  194. POWER_DOMAIN_TRANSCODER_DSI_C,
  195. POWER_DOMAIN_PORT_DDI_A_LANES,
  196. POWER_DOMAIN_PORT_DDI_B_LANES,
  197. POWER_DOMAIN_PORT_DDI_C_LANES,
  198. POWER_DOMAIN_PORT_DDI_D_LANES,
  199. POWER_DOMAIN_PORT_DDI_E_LANES,
  200. POWER_DOMAIN_PORT_DDI_F_LANES,
  201. POWER_DOMAIN_PORT_DDI_A_IO,
  202. POWER_DOMAIN_PORT_DDI_B_IO,
  203. POWER_DOMAIN_PORT_DDI_C_IO,
  204. POWER_DOMAIN_PORT_DDI_D_IO,
  205. POWER_DOMAIN_PORT_DDI_E_IO,
  206. POWER_DOMAIN_PORT_DDI_F_IO,
  207. POWER_DOMAIN_PORT_DSI,
  208. POWER_DOMAIN_PORT_CRT,
  209. POWER_DOMAIN_PORT_OTHER,
  210. POWER_DOMAIN_VGA,
  211. POWER_DOMAIN_AUDIO,
  212. POWER_DOMAIN_PLLS,
  213. POWER_DOMAIN_AUX_A,
  214. POWER_DOMAIN_AUX_B,
  215. POWER_DOMAIN_AUX_C,
  216. POWER_DOMAIN_AUX_D,
  217. POWER_DOMAIN_AUX_E,
  218. POWER_DOMAIN_AUX_F,
  219. POWER_DOMAIN_AUX_IO_A,
  220. POWER_DOMAIN_AUX_TBT1,
  221. POWER_DOMAIN_AUX_TBT2,
  222. POWER_DOMAIN_AUX_TBT3,
  223. POWER_DOMAIN_AUX_TBT4,
  224. POWER_DOMAIN_GMBUS,
  225. POWER_DOMAIN_MODESET,
  226. POWER_DOMAIN_GT_IRQ,
  227. POWER_DOMAIN_INIT,
  228. POWER_DOMAIN_NUM,
  229. };
  230. #define POWER_DOMAIN_PIPE(pipe) ((pipe) + POWER_DOMAIN_PIPE_A)
  231. #define POWER_DOMAIN_PIPE_PANEL_FITTER(pipe) \
  232. ((pipe) + POWER_DOMAIN_PIPE_A_PANEL_FITTER)
  233. #define POWER_DOMAIN_TRANSCODER(tran) \
  234. ((tran) == TRANSCODER_EDP ? POWER_DOMAIN_TRANSCODER_EDP : \
  235. (tran) + POWER_DOMAIN_TRANSCODER_A)
  236. /* Used by dp and fdi links */
  237. struct intel_link_m_n {
  238. u32 tu;
  239. u32 gmch_m;
  240. u32 gmch_n;
  241. u32 link_m;
  242. u32 link_n;
  243. };
  244. #define for_each_pipe(__dev_priv, __p) \
  245. for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes; (__p)++)
  246. #define for_each_pipe_masked(__dev_priv, __p, __mask) \
  247. for ((__p) = 0; (__p) < INTEL_INFO(__dev_priv)->num_pipes; (__p)++) \
  248. for_each_if((__mask) & BIT(__p))
  249. #define for_each_cpu_transcoder_masked(__dev_priv, __t, __mask) \
  250. for ((__t) = 0; (__t) < I915_MAX_TRANSCODERS; (__t)++) \
  251. for_each_if ((__mask) & (1 << (__t)))
  252. #define for_each_universal_plane(__dev_priv, __pipe, __p) \
  253. for ((__p) = 0; \
  254. (__p) < INTEL_INFO(__dev_priv)->num_sprites[(__pipe)] + 1; \
  255. (__p)++)
  256. #define for_each_sprite(__dev_priv, __p, __s) \
  257. for ((__s) = 0; \
  258. (__s) < INTEL_INFO(__dev_priv)->num_sprites[(__p)]; \
  259. (__s)++)
  260. #define for_each_port_masked(__port, __ports_mask) \
  261. for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++) \
  262. for_each_if((__ports_mask) & BIT(__port))
  263. #define for_each_crtc(dev, crtc) \
  264. list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head)
  265. #define for_each_intel_plane(dev, intel_plane) \
  266. list_for_each_entry(intel_plane, \
  267. &(dev)->mode_config.plane_list, \
  268. base.head)
  269. #define for_each_intel_plane_mask(dev, intel_plane, plane_mask) \
  270. list_for_each_entry(intel_plane, \
  271. &(dev)->mode_config.plane_list, \
  272. base.head) \
  273. for_each_if((plane_mask) & \
  274. drm_plane_mask(&intel_plane->base)))
  275. #define for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) \
  276. list_for_each_entry(intel_plane, \
  277. &(dev)->mode_config.plane_list, \
  278. base.head) \
  279. for_each_if((intel_plane)->pipe == (intel_crtc)->pipe)
  280. #define for_each_intel_crtc(dev, intel_crtc) \
  281. list_for_each_entry(intel_crtc, \
  282. &(dev)->mode_config.crtc_list, \
  283. base.head)
  284. #define for_each_intel_crtc_mask(dev, intel_crtc, crtc_mask) \
  285. list_for_each_entry(intel_crtc, \
  286. &(dev)->mode_config.crtc_list, \
  287. base.head) \
  288. for_each_if((crtc_mask) & drm_crtc_mask(&intel_crtc->base))
  289. #define for_each_intel_encoder(dev, intel_encoder) \
  290. list_for_each_entry(intel_encoder, \
  291. &(dev)->mode_config.encoder_list, \
  292. base.head)
  293. #define for_each_intel_dp(dev, intel_encoder) \
  294. for_each_intel_encoder(dev, intel_encoder) \
  295. for_each_if(intel_encoder_is_dp(intel_encoder))
  296. #define for_each_intel_connector_iter(intel_connector, iter) \
  297. while ((intel_connector = to_intel_connector(drm_connector_list_iter_next(iter))))
  298. #define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
  299. list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
  300. for_each_if((intel_encoder)->base.crtc == (__crtc))
  301. #define for_each_connector_on_encoder(dev, __encoder, intel_connector) \
  302. list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
  303. for_each_if((intel_connector)->base.encoder == (__encoder))
  304. #define for_each_power_domain(domain, mask) \
  305. for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
  306. for_each_if(BIT_ULL(domain) & (mask))
  307. #define for_each_power_well(__dev_priv, __power_well) \
  308. for ((__power_well) = (__dev_priv)->power_domains.power_wells; \
  309. (__power_well) - (__dev_priv)->power_domains.power_wells < \
  310. (__dev_priv)->power_domains.power_well_count; \
  311. (__power_well)++)
  312. #define for_each_power_well_rev(__dev_priv, __power_well) \
  313. for ((__power_well) = (__dev_priv)->power_domains.power_wells + \
  314. (__dev_priv)->power_domains.power_well_count - 1; \
  315. (__power_well) - (__dev_priv)->power_domains.power_wells >= 0; \
  316. (__power_well)--)
  317. #define for_each_power_domain_well(__dev_priv, __power_well, __domain_mask) \
  318. for_each_power_well(__dev_priv, __power_well) \
  319. for_each_if((__power_well)->desc->domains & (__domain_mask))
  320. #define for_each_power_domain_well_rev(__dev_priv, __power_well, __domain_mask) \
  321. for_each_power_well_rev(__dev_priv, __power_well) \
  322. for_each_if((__power_well)->desc->domains & (__domain_mask))
  323. #define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \
  324. for ((__i) = 0; \
  325. (__i) < (__state)->base.dev->mode_config.num_total_plane && \
  326. ((plane) = to_intel_plane((__state)->base.planes[__i].ptr), \
  327. (new_plane_state) = to_intel_plane_state((__state)->base.planes[__i].new_state), 1); \
  328. (__i)++) \
  329. for_each_if(plane)
  330. #define for_each_new_intel_crtc_in_state(__state, crtc, new_crtc_state, __i) \
  331. for ((__i) = 0; \
  332. (__i) < (__state)->base.dev->mode_config.num_crtc && \
  333. ((crtc) = to_intel_crtc((__state)->base.crtcs[__i].ptr), \
  334. (new_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].new_state), 1); \
  335. (__i)++) \
  336. for_each_if(crtc)
  337. #define for_each_oldnew_intel_plane_in_state(__state, plane, old_plane_state, new_plane_state, __i) \
  338. for ((__i) = 0; \
  339. (__i) < (__state)->base.dev->mode_config.num_total_plane && \
  340. ((plane) = to_intel_plane((__state)->base.planes[__i].ptr), \
  341. (old_plane_state) = to_intel_plane_state((__state)->base.planes[__i].old_state), \
  342. (new_plane_state) = to_intel_plane_state((__state)->base.planes[__i].new_state), 1); \
  343. (__i)++) \
  344. for_each_if(plane)
  345. void intel_link_compute_m_n(int bpp, int nlanes,
  346. int pixel_clock, int link_clock,
  347. struct intel_link_m_n *m_n,
  348. bool constant_n);
  349. bool is_ccs_modifier(u64 modifier);
  350. #endif