1 1.6 riastrad /* $NetBSD: intel_display.h,v 1.6 2021/12/19 11:48:27 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2006-2019 Intel Corporation 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice (including the next 14 1.1 riastrad * paragraph) shall be included in all copies or substantial portions of the 15 1.1 riastrad * Software. 16 1.1 riastrad * 17 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 1.1 riastrad * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 1.1 riastrad * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 1.1 riastrad * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23 1.1 riastrad * IN THE SOFTWARE. 24 1.1 riastrad * 25 1.1 riastrad */ 26 1.1 riastrad 27 1.1 riastrad #ifndef _INTEL_DISPLAY_H_ 28 1.1 riastrad #define _INTEL_DISPLAY_H_ 29 1.1 riastrad 30 1.5 riastrad /* 31 1.5 riastrad * NetBSD already has struct pipe, and according to C99 6.2.3 there's 32 1.5 riastrad * only one namespace for struct, union, and enum tags, but the i915 33 1.5 riastrad * driver wants a type called enum pipe. 34 1.5 riastrad * 35 1.5 riastrad * So rename it to avoid conflicts which confuse tools like ctfmerge -- 36 1.5 riastrad * but make sure we include <sys/file.h> first to avoid having two 37 1.5 riastrad * different versions of struct file, one with a pointer to struct pipe 38 1.5 riastrad * and another with a pointer to struct i915_pipe. 39 1.5 riastrad * 40 1.5 riastrad * This will cause trouble if we ever have an API that involves `pipe' 41 1.5 riastrad * as a member which we need to reference from within drm code. But 42 1.5 riastrad * for now that is not the case. 43 1.5 riastrad * 44 1.5 riastrad * XXX Yes, this is disgusting. Sorry. 45 1.5 riastrad */ 46 1.5 riastrad #include <sys/types.h> 47 1.5 riastrad #include <sys/file.h> 48 1.5 riastrad #define pipe pipe_drmhack 49 1.5 riastrad 50 1.1 riastrad #include <drm/drm_util.h> 51 1.1 riastrad #include <drm/i915_drm.h> 52 1.1 riastrad 53 1.1 riastrad enum link_m_n_set; 54 1.1 riastrad struct dpll; 55 1.1 riastrad struct drm_connector; 56 1.1 riastrad struct drm_device; 57 1.1 riastrad struct drm_display_mode; 58 1.1 riastrad struct drm_encoder; 59 1.1 riastrad struct drm_file; 60 1.1 riastrad struct drm_format_info; 61 1.1 riastrad struct drm_framebuffer; 62 1.1 riastrad struct drm_i915_error_state_buf; 63 1.1 riastrad struct drm_i915_gem_object; 64 1.1 riastrad struct drm_i915_private; 65 1.1 riastrad struct drm_modeset_acquire_ctx; 66 1.1 riastrad struct drm_plane; 67 1.1 riastrad struct drm_plane_state; 68 1.1 riastrad struct i915_ggtt_view; 69 1.1 riastrad struct intel_crtc; 70 1.1 riastrad struct intel_crtc_state; 71 1.1 riastrad struct intel_digital_port; 72 1.1 riastrad struct intel_dp; 73 1.1 riastrad struct intel_encoder; 74 1.1 riastrad struct intel_load_detect_pipe; 75 1.1 riastrad struct intel_plane; 76 1.1 riastrad struct intel_plane_state; 77 1.1 riastrad struct intel_remapped_info; 78 1.1 riastrad struct intel_rotation_info; 79 1.1 riastrad struct intel_crtc_state; 80 1.1 riastrad 81 1.1 riastrad enum i915_gpio { 82 1.1 riastrad GPIOA, 83 1.1 riastrad GPIOB, 84 1.1 riastrad GPIOC, 85 1.1 riastrad GPIOD, 86 1.1 riastrad GPIOE, 87 1.1 riastrad GPIOF, 88 1.1 riastrad GPIOG, 89 1.1 riastrad GPIOH, 90 1.1 riastrad __GPIOI_UNUSED, 91 1.1 riastrad GPIOJ, 92 1.1 riastrad GPIOK, 93 1.1 riastrad GPIOL, 94 1.1 riastrad GPIOM, 95 1.1 riastrad GPION, 96 1.1 riastrad GPIOO, 97 1.1 riastrad }; 98 1.1 riastrad 99 1.1 riastrad /* 100 1.1 riastrad * Keep the pipe enum values fixed: the code assumes that PIPE_A=0, the 101 1.1 riastrad * rest have consecutive values and match the enum values of transcoders 102 1.1 riastrad * with a 1:1 transcoder -> pipe mapping. 103 1.1 riastrad */ 104 1.1 riastrad enum pipe { 105 1.1 riastrad INVALID_PIPE = -1, 106 1.1 riastrad 107 1.1 riastrad PIPE_A = 0, 108 1.1 riastrad PIPE_B, 109 1.1 riastrad PIPE_C, 110 1.1 riastrad PIPE_D, 111 1.1 riastrad _PIPE_EDP, 112 1.1 riastrad 113 1.1 riastrad I915_MAX_PIPES = _PIPE_EDP 114 1.1 riastrad }; 115 1.1 riastrad 116 1.1 riastrad #define pipe_name(p) ((p) + 'A') 117 1.1 riastrad 118 1.1 riastrad enum transcoder { 119 1.1 riastrad INVALID_TRANSCODER = -1, 120 1.1 riastrad /* 121 1.1 riastrad * The following transcoders have a 1:1 transcoder -> pipe mapping, 122 1.1 riastrad * keep their values fixed: the code assumes that TRANSCODER_A=0, the 123 1.1 riastrad * rest have consecutive values and match the enum values of the pipes 124 1.1 riastrad * they map to. 125 1.1 riastrad */ 126 1.1 riastrad TRANSCODER_A = PIPE_A, 127 1.1 riastrad TRANSCODER_B = PIPE_B, 128 1.1 riastrad TRANSCODER_C = PIPE_C, 129 1.1 riastrad TRANSCODER_D = PIPE_D, 130 1.1 riastrad 131 1.1 riastrad /* 132 1.1 riastrad * The following transcoders can map to any pipe, their enum value 133 1.1 riastrad * doesn't need to stay fixed. 134 1.1 riastrad */ 135 1.1 riastrad TRANSCODER_EDP, 136 1.1 riastrad TRANSCODER_DSI_0, 137 1.1 riastrad TRANSCODER_DSI_1, 138 1.1 riastrad TRANSCODER_DSI_A = TRANSCODER_DSI_0, /* legacy DSI */ 139 1.1 riastrad TRANSCODER_DSI_C = TRANSCODER_DSI_1, /* legacy DSI */ 140 1.1 riastrad 141 1.1 riastrad I915_MAX_TRANSCODERS 142 1.1 riastrad }; 143 1.1 riastrad 144 1.1 riastrad static inline const char *transcoder_name(enum transcoder transcoder) 145 1.1 riastrad { 146 1.1 riastrad switch (transcoder) { 147 1.1 riastrad case TRANSCODER_A: 148 1.1 riastrad return "A"; 149 1.1 riastrad case TRANSCODER_B: 150 1.1 riastrad return "B"; 151 1.1 riastrad case TRANSCODER_C: 152 1.1 riastrad return "C"; 153 1.1 riastrad case TRANSCODER_D: 154 1.1 riastrad return "D"; 155 1.1 riastrad case TRANSCODER_EDP: 156 1.1 riastrad return "EDP"; 157 1.1 riastrad case TRANSCODER_DSI_A: 158 1.1 riastrad return "DSI A"; 159 1.1 riastrad case TRANSCODER_DSI_C: 160 1.1 riastrad return "DSI C"; 161 1.1 riastrad default: 162 1.1 riastrad return "<invalid>"; 163 1.1 riastrad } 164 1.1 riastrad } 165 1.1 riastrad 166 1.1 riastrad static inline bool transcoder_is_dsi(enum transcoder transcoder) 167 1.1 riastrad { 168 1.1 riastrad return transcoder == TRANSCODER_DSI_A || transcoder == TRANSCODER_DSI_C; 169 1.1 riastrad } 170 1.1 riastrad 171 1.1 riastrad /* 172 1.1 riastrad * Global legacy plane identifier. Valid only for primary/sprite 173 1.1 riastrad * planes on pre-g4x, and only for primary planes on g4x-bdw. 174 1.1 riastrad */ 175 1.1 riastrad enum i9xx_plane_id { 176 1.1 riastrad PLANE_A, 177 1.1 riastrad PLANE_B, 178 1.1 riastrad PLANE_C, 179 1.1 riastrad }; 180 1.1 riastrad 181 1.1 riastrad #define plane_name(p) ((p) + 'A') 182 1.1 riastrad #define sprite_name(p, s) ((p) * RUNTIME_INFO(dev_priv)->num_sprites[(p)] + (s) + 'A') 183 1.1 riastrad 184 1.1 riastrad /* 185 1.1 riastrad * Per-pipe plane identifier. 186 1.1 riastrad * I915_MAX_PLANES in the enum below is the maximum (across all platforms) 187 1.1 riastrad * number of planes per CRTC. Not all platforms really have this many planes, 188 1.1 riastrad * which means some arrays of size I915_MAX_PLANES may have unused entries 189 1.1 riastrad * between the topmost sprite plane and the cursor plane. 190 1.1 riastrad * 191 1.1 riastrad * This is expected to be passed to various register macros 192 1.1 riastrad * (eg. PLANE_CTL(), PS_PLANE_SEL(), etc.) so adjust with care. 193 1.1 riastrad */ 194 1.1 riastrad enum plane_id { 195 1.1 riastrad PLANE_PRIMARY, 196 1.1 riastrad PLANE_SPRITE0, 197 1.1 riastrad PLANE_SPRITE1, 198 1.1 riastrad PLANE_SPRITE2, 199 1.1 riastrad PLANE_SPRITE3, 200 1.1 riastrad PLANE_SPRITE4, 201 1.1 riastrad PLANE_SPRITE5, 202 1.1 riastrad PLANE_CURSOR, 203 1.1 riastrad 204 1.1 riastrad I915_MAX_PLANES, 205 1.1 riastrad }; 206 1.1 riastrad 207 1.1 riastrad #define for_each_plane_id_on_crtc(__crtc, __p) \ 208 1.1 riastrad for ((__p) = PLANE_PRIMARY; (__p) < I915_MAX_PLANES; (__p)++) \ 209 1.1 riastrad for_each_if((__crtc)->plane_ids_mask & BIT(__p)) 210 1.1 riastrad 211 1.1 riastrad enum port { 212 1.1 riastrad PORT_NONE = -1, 213 1.1 riastrad 214 1.1 riastrad PORT_A = 0, 215 1.1 riastrad PORT_B, 216 1.1 riastrad PORT_C, 217 1.1 riastrad PORT_D, 218 1.1 riastrad PORT_E, 219 1.1 riastrad PORT_F, 220 1.1 riastrad PORT_G, 221 1.1 riastrad PORT_H, 222 1.1 riastrad PORT_I, 223 1.1 riastrad 224 1.1 riastrad I915_MAX_PORTS 225 1.1 riastrad }; 226 1.1 riastrad 227 1.1 riastrad #define port_name(p) ((p) + 'A') 228 1.1 riastrad 229 1.1 riastrad /* 230 1.1 riastrad * Ports identifier referenced from other drivers. 231 1.1 riastrad * Expected to remain stable over time 232 1.1 riastrad */ 233 1.1 riastrad static inline const char *port_identifier(enum port port) 234 1.1 riastrad { 235 1.1 riastrad switch (port) { 236 1.1 riastrad case PORT_A: 237 1.1 riastrad return "Port A"; 238 1.1 riastrad case PORT_B: 239 1.1 riastrad return "Port B"; 240 1.1 riastrad case PORT_C: 241 1.1 riastrad return "Port C"; 242 1.1 riastrad case PORT_D: 243 1.1 riastrad return "Port D"; 244 1.1 riastrad case PORT_E: 245 1.1 riastrad return "Port E"; 246 1.1 riastrad case PORT_F: 247 1.1 riastrad return "Port F"; 248 1.1 riastrad case PORT_G: 249 1.1 riastrad return "Port G"; 250 1.1 riastrad case PORT_H: 251 1.1 riastrad return "Port H"; 252 1.1 riastrad case PORT_I: 253 1.1 riastrad return "Port I"; 254 1.1 riastrad default: 255 1.1 riastrad return "<invalid>"; 256 1.1 riastrad } 257 1.1 riastrad } 258 1.1 riastrad 259 1.1 riastrad enum tc_port { 260 1.1 riastrad PORT_TC_NONE = -1, 261 1.1 riastrad 262 1.1 riastrad PORT_TC1 = 0, 263 1.1 riastrad PORT_TC2, 264 1.1 riastrad PORT_TC3, 265 1.1 riastrad PORT_TC4, 266 1.1 riastrad PORT_TC5, 267 1.1 riastrad PORT_TC6, 268 1.1 riastrad 269 1.1 riastrad I915_MAX_TC_PORTS 270 1.1 riastrad }; 271 1.1 riastrad 272 1.1 riastrad enum tc_port_mode { 273 1.1 riastrad TC_PORT_TBT_ALT, 274 1.1 riastrad TC_PORT_DP_ALT, 275 1.1 riastrad TC_PORT_LEGACY, 276 1.1 riastrad }; 277 1.1 riastrad 278 1.1 riastrad enum dpio_channel { 279 1.1 riastrad DPIO_CH0, 280 1.1 riastrad DPIO_CH1 281 1.1 riastrad }; 282 1.1 riastrad 283 1.1 riastrad enum dpio_phy { 284 1.1 riastrad DPIO_PHY0, 285 1.1 riastrad DPIO_PHY1, 286 1.1 riastrad DPIO_PHY2, 287 1.1 riastrad }; 288 1.1 riastrad 289 1.1 riastrad #define I915_NUM_PHYS_VLV 2 290 1.1 riastrad 291 1.1 riastrad enum aux_ch { 292 1.1 riastrad AUX_CH_A, 293 1.1 riastrad AUX_CH_B, 294 1.1 riastrad AUX_CH_C, 295 1.1 riastrad AUX_CH_D, 296 1.1 riastrad AUX_CH_E, /* ICL+ */ 297 1.1 riastrad AUX_CH_F, 298 1.1 riastrad AUX_CH_G, 299 1.1 riastrad }; 300 1.1 riastrad 301 1.1 riastrad #define aux_ch_name(a) ((a) + 'A') 302 1.1 riastrad 303 1.1 riastrad /* Used by dp and fdi links */ 304 1.1 riastrad struct intel_link_m_n { 305 1.1 riastrad u32 tu; 306 1.1 riastrad u32 gmch_m; 307 1.1 riastrad u32 gmch_n; 308 1.1 riastrad u32 link_m; 309 1.1 riastrad u32 link_n; 310 1.1 riastrad }; 311 1.1 riastrad 312 1.1 riastrad enum phy { 313 1.1 riastrad PHY_NONE = -1, 314 1.1 riastrad 315 1.1 riastrad PHY_A = 0, 316 1.1 riastrad PHY_B, 317 1.1 riastrad PHY_C, 318 1.1 riastrad PHY_D, 319 1.1 riastrad PHY_E, 320 1.1 riastrad PHY_F, 321 1.1 riastrad PHY_G, 322 1.1 riastrad PHY_H, 323 1.1 riastrad PHY_I, 324 1.1 riastrad 325 1.1 riastrad I915_MAX_PHYS 326 1.1 riastrad }; 327 1.1 riastrad 328 1.1 riastrad #define phy_name(a) ((a) + 'A') 329 1.1 riastrad 330 1.1 riastrad enum phy_fia { 331 1.1 riastrad FIA1, 332 1.1 riastrad FIA2, 333 1.1 riastrad FIA3, 334 1.1 riastrad }; 335 1.1 riastrad 336 1.1 riastrad #define for_each_pipe(__dev_priv, __p) \ 337 1.1 riastrad for ((__p) = 0; (__p) < INTEL_NUM_PIPES(__dev_priv); (__p)++) 338 1.1 riastrad 339 1.1 riastrad #define for_each_pipe_masked(__dev_priv, __p, __mask) \ 340 1.1 riastrad for ((__p) = 0; (__p) < INTEL_NUM_PIPES(__dev_priv); (__p)++) \ 341 1.1 riastrad for_each_if((__mask) & BIT(__p)) 342 1.1 riastrad 343 1.1 riastrad #define for_each_cpu_transcoder_masked(__dev_priv, __t, __mask) \ 344 1.1 riastrad for ((__t) = 0; (__t) < I915_MAX_TRANSCODERS; (__t)++) \ 345 1.1 riastrad for_each_if ((__mask) & (1 << (__t))) 346 1.1 riastrad 347 1.1 riastrad #define for_each_universal_plane(__dev_priv, __pipe, __p) \ 348 1.1 riastrad for ((__p) = 0; \ 349 1.1 riastrad (__p) < RUNTIME_INFO(__dev_priv)->num_sprites[(__pipe)] + 1; \ 350 1.1 riastrad (__p)++) 351 1.1 riastrad 352 1.1 riastrad #define for_each_sprite(__dev_priv, __p, __s) \ 353 1.1 riastrad for ((__s) = 0; \ 354 1.1 riastrad (__s) < RUNTIME_INFO(__dev_priv)->num_sprites[(__p)]; \ 355 1.1 riastrad (__s)++) 356 1.1 riastrad 357 1.1 riastrad #define for_each_port(__port) \ 358 1.1 riastrad for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++) 359 1.1 riastrad 360 1.1 riastrad #define for_each_port_masked(__port, __ports_mask) \ 361 1.1 riastrad for_each_port(__port) \ 362 1.1 riastrad for_each_if((__ports_mask) & BIT(__port)) 363 1.1 riastrad 364 1.1 riastrad #define for_each_phy_masked(__phy, __phys_mask) \ 365 1.1 riastrad for ((__phy) = PHY_A; (__phy) < I915_MAX_PHYS; (__phy)++) \ 366 1.1 riastrad for_each_if((__phys_mask) & BIT(__phy)) 367 1.1 riastrad 368 1.1 riastrad #define for_each_crtc(dev, crtc) \ 369 1.1 riastrad list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head) 370 1.1 riastrad 371 1.1 riastrad #define for_each_intel_plane(dev, intel_plane) \ 372 1.1 riastrad list_for_each_entry(intel_plane, \ 373 1.1 riastrad &(dev)->mode_config.plane_list, \ 374 1.1 riastrad base.head) 375 1.1 riastrad 376 1.1 riastrad #define for_each_intel_plane_mask(dev, intel_plane, plane_mask) \ 377 1.1 riastrad list_for_each_entry(intel_plane, \ 378 1.1 riastrad &(dev)->mode_config.plane_list, \ 379 1.1 riastrad base.head) \ 380 1.1 riastrad for_each_if((plane_mask) & \ 381 1.1 riastrad drm_plane_mask(&intel_plane->base)) 382 1.1 riastrad 383 1.1 riastrad #define for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) \ 384 1.1 riastrad list_for_each_entry(intel_plane, \ 385 1.1 riastrad &(dev)->mode_config.plane_list, \ 386 1.1 riastrad base.head) \ 387 1.1 riastrad for_each_if((intel_plane)->pipe == (intel_crtc)->pipe) 388 1.1 riastrad 389 1.1 riastrad #define for_each_intel_crtc(dev, intel_crtc) \ 390 1.1 riastrad list_for_each_entry(intel_crtc, \ 391 1.1 riastrad &(dev)->mode_config.crtc_list, \ 392 1.1 riastrad base.head) 393 1.1 riastrad 394 1.1 riastrad #define for_each_intel_crtc_mask(dev, intel_crtc, crtc_mask) \ 395 1.1 riastrad list_for_each_entry(intel_crtc, \ 396 1.1 riastrad &(dev)->mode_config.crtc_list, \ 397 1.1 riastrad base.head) \ 398 1.1 riastrad for_each_if((crtc_mask) & drm_crtc_mask(&intel_crtc->base)) 399 1.1 riastrad 400 1.1 riastrad #define for_each_intel_encoder(dev, intel_encoder) \ 401 1.1 riastrad list_for_each_entry(intel_encoder, \ 402 1.1 riastrad &(dev)->mode_config.encoder_list, \ 403 1.1 riastrad base.head) 404 1.1 riastrad 405 1.1 riastrad #define for_each_intel_encoder_mask(dev, intel_encoder, encoder_mask) \ 406 1.1 riastrad list_for_each_entry(intel_encoder, \ 407 1.1 riastrad &(dev)->mode_config.encoder_list, \ 408 1.1 riastrad base.head) \ 409 1.1 riastrad for_each_if((encoder_mask) & \ 410 1.1 riastrad drm_encoder_mask(&intel_encoder->base)) 411 1.1 riastrad 412 1.1 riastrad #define for_each_intel_dp(dev, intel_encoder) \ 413 1.1 riastrad for_each_intel_encoder(dev, intel_encoder) \ 414 1.1 riastrad for_each_if(intel_encoder_is_dp(intel_encoder)) 415 1.1 riastrad 416 1.1 riastrad #define for_each_intel_connector_iter(intel_connector, iter) \ 417 1.1 riastrad while ((intel_connector = to_intel_connector(drm_connector_list_iter_next(iter)))) 418 1.1 riastrad 419 1.1 riastrad #define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \ 420 1.1 riastrad list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \ 421 1.1 riastrad for_each_if((intel_encoder)->base.crtc == (__crtc)) 422 1.1 riastrad 423 1.1 riastrad #define for_each_connector_on_encoder(dev, __encoder, intel_connector) \ 424 1.1 riastrad list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \ 425 1.1 riastrad for_each_if((intel_connector)->base.encoder == (__encoder)) 426 1.1 riastrad 427 1.1 riastrad #define for_each_old_intel_plane_in_state(__state, plane, old_plane_state, __i) \ 428 1.1 riastrad for ((__i) = 0; \ 429 1.1 riastrad (__i) < (__state)->base.dev->mode_config.num_total_plane && \ 430 1.1 riastrad ((plane) = to_intel_plane((__state)->base.planes[__i].ptr), \ 431 1.1 riastrad (old_plane_state) = to_intel_plane_state((__state)->base.planes[__i].old_state), 1); \ 432 1.1 riastrad (__i)++) \ 433 1.1 riastrad for_each_if(plane) 434 1.1 riastrad 435 1.1 riastrad #define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \ 436 1.1 riastrad for ((__i) = 0; \ 437 1.1 riastrad (__i) < (__state)->base.dev->mode_config.num_total_plane && \ 438 1.1 riastrad ((plane) = to_intel_plane((__state)->base.planes[__i].ptr), \ 439 1.1 riastrad (new_plane_state) = to_intel_plane_state((__state)->base.planes[__i].new_state), 1); \ 440 1.1 riastrad (__i)++) \ 441 1.1 riastrad for_each_if(plane) 442 1.1 riastrad 443 1.1 riastrad #define for_each_new_intel_crtc_in_state(__state, crtc, new_crtc_state, __i) \ 444 1.1 riastrad for ((__i) = 0; \ 445 1.1 riastrad (__i) < (__state)->base.dev->mode_config.num_crtc && \ 446 1.1 riastrad ((crtc) = to_intel_crtc((__state)->base.crtcs[__i].ptr), \ 447 1.1 riastrad (new_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].new_state), 1); \ 448 1.1 riastrad (__i)++) \ 449 1.1 riastrad for_each_if(crtc) 450 1.1 riastrad 451 1.1 riastrad #define for_each_oldnew_intel_plane_in_state(__state, plane, old_plane_state, new_plane_state, __i) \ 452 1.1 riastrad for ((__i) = 0; \ 453 1.1 riastrad (__i) < (__state)->base.dev->mode_config.num_total_plane && \ 454 1.1 riastrad ((plane) = to_intel_plane((__state)->base.planes[__i].ptr), \ 455 1.1 riastrad (old_plane_state) = to_intel_plane_state((__state)->base.planes[__i].old_state), \ 456 1.1 riastrad (new_plane_state) = to_intel_plane_state((__state)->base.planes[__i].new_state), 1); \ 457 1.1 riastrad (__i)++) \ 458 1.1 riastrad for_each_if(plane) 459 1.1 riastrad 460 1.1 riastrad #define for_each_oldnew_intel_crtc_in_state(__state, crtc, old_crtc_state, new_crtc_state, __i) \ 461 1.1 riastrad for ((__i) = 0; \ 462 1.1 riastrad (__i) < (__state)->base.dev->mode_config.num_crtc && \ 463 1.1 riastrad ((crtc) = to_intel_crtc((__state)->base.crtcs[__i].ptr), \ 464 1.1 riastrad (old_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].old_state), \ 465 1.1 riastrad (new_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].new_state), 1); \ 466 1.1 riastrad (__i)++) \ 467 1.1 riastrad for_each_if(crtc) 468 1.1 riastrad 469 1.1 riastrad #define for_each_oldnew_intel_crtc_in_state_reverse(__state, crtc, old_crtc_state, new_crtc_state, __i) \ 470 1.1 riastrad for ((__i) = (__state)->base.dev->mode_config.num_crtc - 1; \ 471 1.1 riastrad (__i) >= 0 && \ 472 1.1 riastrad ((crtc) = to_intel_crtc((__state)->base.crtcs[__i].ptr), \ 473 1.1 riastrad (old_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].old_state), \ 474 1.1 riastrad (new_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].new_state), 1); \ 475 1.1 riastrad (__i)--) \ 476 1.1 riastrad for_each_if(crtc) 477 1.1 riastrad 478 1.1 riastrad #define intel_atomic_crtc_state_for_each_plane_state( \ 479 1.1 riastrad plane, plane_state, \ 480 1.1 riastrad crtc_state) \ 481 1.1 riastrad for_each_intel_plane_mask(((crtc_state)->uapi.state->dev), (plane), \ 482 1.1 riastrad ((crtc_state)->uapi.plane_mask)) \ 483 1.1 riastrad for_each_if ((plane_state = \ 484 1.6 riastrad const_container_of(__drm_atomic_get_current_plane_state((crtc_state)->uapi.state, &plane->base), struct intel_plane_state, uapi))) 485 1.1 riastrad 486 1.1 riastrad #define for_each_new_intel_connector_in_state(__state, connector, new_connector_state, __i) \ 487 1.1 riastrad for ((__i) = 0; \ 488 1.1 riastrad (__i) < (__state)->base.num_connector; \ 489 1.1 riastrad (__i)++) \ 490 1.1 riastrad for_each_if ((__state)->base.connectors[__i].ptr && \ 491 1.1 riastrad ((connector) = to_intel_connector((__state)->base.connectors[__i].ptr), \ 492 1.1 riastrad (new_connector_state) = to_intel_digital_connector_state((__state)->base.connectors[__i].new_state), 1)) 493 1.1 riastrad 494 1.1 riastrad void intel_link_compute_m_n(u16 bpp, int nlanes, 495 1.1 riastrad int pixel_clock, int link_clock, 496 1.1 riastrad struct intel_link_m_n *m_n, 497 1.1 riastrad bool constant_n, bool fec_enable); 498 1.1 riastrad bool is_ccs_modifier(u64 modifier); 499 1.1 riastrad int intel_main_to_aux_plane(const struct drm_framebuffer *fb, int main_plane); 500 1.1 riastrad void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv); 501 1.1 riastrad u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv, 502 1.1 riastrad u32 pixel_format, u64 modifier); 503 1.1 riastrad bool intel_plane_can_remap(const struct intel_plane_state *plane_state); 504 1.1 riastrad enum drm_mode_status 505 1.1 riastrad intel_mode_valid_max_plane_size(struct drm_i915_private *dev_priv, 506 1.1 riastrad const struct drm_display_mode *mode); 507 1.1 riastrad enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port); 508 1.1 riastrad bool is_trans_port_sync_mode(const struct intel_crtc_state *state); 509 1.1 riastrad 510 1.1 riastrad void intel_plane_destroy(struct drm_plane *plane); 511 1.1 riastrad void intel_disable_pipe(const struct intel_crtc_state *old_crtc_state); 512 1.1 riastrad void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); 513 1.1 riastrad void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); 514 1.1 riastrad enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc); 515 1.1 riastrad int vlv_get_hpll_vco(struct drm_i915_private *dev_priv); 516 1.1 riastrad int vlv_get_cck_clock(struct drm_i915_private *dev_priv, 517 1.1 riastrad const char *name, u32 reg, int ref_freq); 518 1.1 riastrad int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv, 519 1.1 riastrad const char *name, u32 reg); 520 1.1 riastrad void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv); 521 1.1 riastrad void lpt_disable_iclkip(struct drm_i915_private *dev_priv); 522 1.1 riastrad void intel_init_display_hooks(struct drm_i915_private *dev_priv); 523 1.1 riastrad unsigned int intel_fb_xy_to_linear(int x, int y, 524 1.1 riastrad const struct intel_plane_state *state, 525 1.1 riastrad int plane); 526 1.1 riastrad unsigned int intel_fb_align_height(const struct drm_framebuffer *fb, 527 1.1 riastrad int color_plane, unsigned int height); 528 1.1 riastrad void intel_add_fb_offsets(int *x, int *y, 529 1.1 riastrad const struct intel_plane_state *state, int plane); 530 1.1 riastrad unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info); 531 1.1 riastrad unsigned int intel_remapped_info_size(const struct intel_remapped_info *rem_info); 532 1.1 riastrad bool intel_has_pending_fb_unpin(struct drm_i915_private *dev_priv); 533 1.1 riastrad int intel_display_suspend(struct drm_device *dev); 534 1.1 riastrad void intel_pps_unlock_regs_wa(struct drm_i915_private *dev_priv); 535 1.1 riastrad void intel_encoder_destroy(struct drm_encoder *encoder); 536 1.1 riastrad struct drm_display_mode * 537 1.1 riastrad intel_encoder_current_mode(struct intel_encoder *encoder); 538 1.1 riastrad bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy); 539 1.1 riastrad bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy); 540 1.1 riastrad enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, 541 1.1 riastrad enum port port); 542 1.1 riastrad int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data, 543 1.1 riastrad struct drm_file *file_priv); 544 1.1 riastrad u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc); 545 1.1 riastrad void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state); 546 1.1 riastrad 547 1.1 riastrad int ilk_get_lanes_required(int target_clock, int link_bw, int bpp); 548 1.1 riastrad void vlv_wait_port_ready(struct drm_i915_private *dev_priv, 549 1.1 riastrad struct intel_digital_port *dport, 550 1.1 riastrad unsigned int expected_mask); 551 1.1 riastrad int intel_get_load_detect_pipe(struct drm_connector *connector, 552 1.1 riastrad struct intel_load_detect_pipe *old, 553 1.1 riastrad struct drm_modeset_acquire_ctx *ctx); 554 1.1 riastrad void intel_release_load_detect_pipe(struct drm_connector *connector, 555 1.1 riastrad struct intel_load_detect_pipe *old, 556 1.1 riastrad struct drm_modeset_acquire_ctx *ctx); 557 1.1 riastrad struct i915_vma * 558 1.1 riastrad intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb, 559 1.1 riastrad const struct i915_ggtt_view *view, 560 1.1 riastrad bool uses_fence, 561 1.1 riastrad unsigned long *out_flags); 562 1.1 riastrad void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags); 563 1.1 riastrad struct drm_framebuffer * 564 1.1 riastrad intel_framebuffer_create(struct drm_i915_gem_object *obj, 565 1.1 riastrad struct drm_mode_fb_cmd2 *mode_cmd); 566 1.1 riastrad int intel_prepare_plane_fb(struct drm_plane *plane, 567 1.1 riastrad struct drm_plane_state *new_state); 568 1.1 riastrad void intel_cleanup_plane_fb(struct drm_plane *plane, 569 1.1 riastrad struct drm_plane_state *old_state); 570 1.1 riastrad 571 1.1 riastrad void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv, 572 1.1 riastrad enum pipe pipe); 573 1.1 riastrad 574 1.1 riastrad int vlv_force_pll_on(struct drm_i915_private *dev_priv, enum pipe pipe, 575 1.1 riastrad const struct dpll *dpll); 576 1.1 riastrad void vlv_force_pll_off(struct drm_i915_private *dev_priv, enum pipe pipe); 577 1.1 riastrad int lpt_get_iclkip(struct drm_i915_private *dev_priv); 578 1.1 riastrad bool intel_fuzzy_clock_check(int clock1, int clock2); 579 1.1 riastrad 580 1.1 riastrad void intel_prepare_reset(struct drm_i915_private *dev_priv); 581 1.1 riastrad void intel_finish_reset(struct drm_i915_private *dev_priv); 582 1.1 riastrad void intel_dp_get_m_n(struct intel_crtc *crtc, 583 1.1 riastrad struct intel_crtc_state *pipe_config); 584 1.1 riastrad void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, 585 1.1 riastrad enum link_m_n_set m_n); 586 1.1 riastrad int intel_dotclock_calculate(int link_freq, const struct intel_link_m_n *m_n); 587 1.1 riastrad bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, 588 1.1 riastrad struct dpll *best_clock); 589 1.1 riastrad int chv_calc_dpll_params(int refclk, struct dpll *pll_clock); 590 1.1 riastrad 591 1.1 riastrad bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state); 592 1.1 riastrad void hsw_enable_ips(const struct intel_crtc_state *crtc_state); 593 1.1 riastrad void hsw_disable_ips(const struct intel_crtc_state *crtc_state); 594 1.1 riastrad enum intel_display_power_domain intel_port_to_power_domain(enum port port); 595 1.1 riastrad enum intel_display_power_domain 596 1.1 riastrad intel_aux_power_domain(struct intel_digital_port *dig_port); 597 1.1 riastrad void intel_mode_from_pipe_config(struct drm_display_mode *mode, 598 1.1 riastrad struct intel_crtc_state *pipe_config); 599 1.1 riastrad void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc, 600 1.1 riastrad struct intel_crtc_state *crtc_state); 601 1.1 riastrad 602 1.1 riastrad u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_center); 603 1.1 riastrad int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state); 604 1.1 riastrad void skl_scaler_disable(const struct intel_crtc_state *old_crtc_state); 605 1.1 riastrad void ilk_pfit_disable(const struct intel_crtc_state *old_crtc_state); 606 1.1 riastrad u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state, 607 1.1 riastrad const struct intel_plane_state *plane_state); 608 1.1 riastrad u32 glk_plane_color_ctl_crtc(const struct intel_crtc_state *crtc_state); 609 1.1 riastrad u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state, 610 1.1 riastrad const struct intel_plane_state *plane_state); 611 1.1 riastrad u32 skl_plane_ctl_crtc(const struct intel_crtc_state *crtc_state); 612 1.1 riastrad u32 skl_plane_stride(const struct intel_plane_state *plane_state, 613 1.1 riastrad int plane); 614 1.1 riastrad int skl_check_plane_surface(struct intel_plane_state *plane_state); 615 1.1 riastrad int i9xx_check_plane_surface(struct intel_plane_state *plane_state); 616 1.1 riastrad int skl_format_to_fourcc(int format, bool rgb_order, bool alpha); 617 1.1 riastrad unsigned int i9xx_plane_max_stride(struct intel_plane *plane, 618 1.1 riastrad u32 pixel_format, u64 modifier, 619 1.1 riastrad unsigned int rotation); 620 1.1 riastrad int bdw_get_pipemisc_bpp(struct intel_crtc *crtc); 621 1.1 riastrad 622 1.1 riastrad struct intel_display_error_state * 623 1.1 riastrad intel_display_capture_error_state(struct drm_i915_private *dev_priv); 624 1.1 riastrad void intel_display_print_error_state(struct drm_i915_error_state_buf *e, 625 1.1 riastrad struct intel_display_error_state *error); 626 1.1 riastrad 627 1.1 riastrad bool 628 1.1 riastrad intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info, 629 1.1 riastrad uint64_t modifier); 630 1.1 riastrad 631 1.1 riastrad /* modesetting */ 632 1.1 riastrad void intel_modeset_init_hw(struct drm_i915_private *i915); 633 1.1 riastrad int intel_modeset_init(struct drm_i915_private *i915); 634 1.1 riastrad void intel_modeset_driver_remove(struct drm_i915_private *i915); 635 1.1 riastrad void intel_display_resume(struct drm_device *dev); 636 1.1 riastrad void intel_init_pch_refclk(struct drm_i915_private *dev_priv); 637 1.1 riastrad 638 1.1 riastrad /* modesetting asserts */ 639 1.1 riastrad void assert_panel_unlocked(struct drm_i915_private *dev_priv, 640 1.1 riastrad enum pipe pipe); 641 1.1 riastrad void assert_pll(struct drm_i915_private *dev_priv, 642 1.1 riastrad enum pipe pipe, bool state); 643 1.1 riastrad #define assert_pll_enabled(d, p) assert_pll(d, p, true) 644 1.1 riastrad #define assert_pll_disabled(d, p) assert_pll(d, p, false) 645 1.1 riastrad void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state); 646 1.1 riastrad #define assert_dsi_pll_enabled(d) assert_dsi_pll(d, true) 647 1.1 riastrad #define assert_dsi_pll_disabled(d) assert_dsi_pll(d, false) 648 1.1 riastrad void assert_fdi_rx_pll(struct drm_i915_private *dev_priv, 649 1.1 riastrad enum pipe pipe, bool state); 650 1.1 riastrad #define assert_fdi_rx_pll_enabled(d, p) assert_fdi_rx_pll(d, p, true) 651 1.1 riastrad #define assert_fdi_rx_pll_disabled(d, p) assert_fdi_rx_pll(d, p, false) 652 1.1 riastrad void assert_pipe(struct drm_i915_private *dev_priv, 653 1.1 riastrad enum transcoder cpu_transcoder, bool state); 654 1.1 riastrad #define assert_pipe_enabled(d, t) assert_pipe(d, t, true) 655 1.1 riastrad #define assert_pipe_disabled(d, t) assert_pipe(d, t, false) 656 1.1 riastrad 657 1.1 riastrad /* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and 658 1.1 riastrad * WARN_ON()) for hw state sanity checks to check for unexpected conditions 659 1.1 riastrad * which may not necessarily be a user visible problem. This will either 660 1.1 riastrad * WARN() or DRM_ERROR() depending on the verbose_checks moduleparam, to 661 1.1 riastrad * enable distros and users to tailor their preferred amount of i915 abrt 662 1.1 riastrad * spam. 663 1.1 riastrad */ 664 1.1 riastrad #define I915_STATE_WARN(condition, format...) ({ \ 665 1.1 riastrad int __ret_warn_on = !!(condition); \ 666 1.1 riastrad if (unlikely(__ret_warn_on)) \ 667 1.1 riastrad if (!WARN(i915_modparams.verbose_state_checks, format)) \ 668 1.1 riastrad DRM_ERROR(format); \ 669 1.1 riastrad unlikely(__ret_warn_on); \ 670 1.1 riastrad }) 671 1.1 riastrad 672 1.1 riastrad #define I915_STATE_WARN_ON(x) \ 673 1.1 riastrad I915_STATE_WARN((x), "%s", "WARN_ON(" __stringify(x) ")") 674 1.1 riastrad 675 1.1 riastrad #endif 676