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 24 /** 25 * DOC: Frame Buffer Compression (FBC) 26 * 27 * FBC tries to save memory bandwidth (and so power consumption) by 28 * compressing the amount of memory used by the display. It is total 29 * transparent to user space and completely handled in the kernel. 30 * 31 * The benefits of FBC are mostly visible with solid backgrounds and 32 * variation-less patterns. It comes from keeping the memory footprint small 33 * and having fewer memory pages opened and accessed for refreshing the display. 34 * 35 * i915 is responsible to reserve stolen memory for FBC and configure its 36 * offset on proper registers. The hardware takes care of all 37 * compress/decompress. However there are many known cases where we have to 38 * forcibly disable it to allow proper screen updates. 39 */ 40 41 #include <drm/drm_fourcc.h> 42 43 #include "i915_drv.h" 44 #include "i915_trace.h" 45 #include "i915_vgpu.h" 46 #include "intel_de.h" 47 #include "intel_display_types.h" 48 #include "intel_fbc.h" 49 #include "intel_frontbuffer.h" 50 51 /* 52 * For SKL+, the plane source size used by the hardware is based on the value we 53 * write to the PLANE_SIZE register. For BDW-, the hardware looks at the value 54 * we wrote to PIPESRC. 55 */ 56 static void intel_fbc_get_plane_source_size(const struct intel_fbc_state_cache *cache, 57 int *width, int *height) 58 { 59 if (width) 60 *width = cache->plane.src_w; 61 if (height) 62 *height = cache->plane.src_h; 63 } 64 65 static int intel_fbc_calculate_cfb_size(struct drm_i915_private *dev_priv, 66 const struct intel_fbc_state_cache *cache) 67 { 68 int lines; 69 70 intel_fbc_get_plane_source_size(cache, NULL, &lines); 71 if (DISPLAY_VER(dev_priv) == 7) 72 lines = min(lines, 2048); 73 else if (DISPLAY_VER(dev_priv) >= 8) 74 lines = min(lines, 2560); 75 76 /* Hardware needs the full buffer stride, not just the active area. */ 77 return lines * cache->fb.stride; 78 } 79 80 static void i8xx_fbc_deactivate(struct drm_i915_private *dev_priv) 81 { 82 u32 fbc_ctl; 83 84 /* Disable compression */ 85 fbc_ctl = intel_de_read(dev_priv, FBC_CONTROL); 86 if ((fbc_ctl & FBC_CTL_EN) == 0) 87 return; 88 89 fbc_ctl &= ~FBC_CTL_EN; 90 intel_de_write(dev_priv, FBC_CONTROL, fbc_ctl); 91 92 /* Wait for compressing bit to clear */ 93 if (intel_de_wait_for_clear(dev_priv, FBC_STATUS, 94 FBC_STAT_COMPRESSING, 10)) { 95 drm_dbg_kms(&dev_priv->drm, "FBC idle timed out\n"); 96 return; 97 } 98 } 99 100 static void i8xx_fbc_activate(struct drm_i915_private *dev_priv) 101 { 102 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 103 int cfb_pitch; 104 int i; 105 u32 fbc_ctl; 106 107 /* Note: fbc.limit == 1 for i8xx */ 108 cfb_pitch = params->cfb_size / FBC_LL_SIZE; 109 if (params->fb.stride < cfb_pitch) 110 cfb_pitch = params->fb.stride; 111 112 /* FBC_CTL wants 32B or 64B units */ 113 if (DISPLAY_VER(dev_priv) == 2) 114 cfb_pitch = (cfb_pitch / 32) - 1; 115 else 116 cfb_pitch = (cfb_pitch / 64) - 1; 117 118 /* Clear old tags */ 119 for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++) 120 intel_de_write(dev_priv, FBC_TAG(i), 0); 121 122 if (DISPLAY_VER(dev_priv) == 4) { 123 u32 fbc_ctl2; 124 125 /* Set it up... */ 126 fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM; 127 fbc_ctl2 |= FBC_CTL_PLANE(params->crtc.i9xx_plane); 128 if (params->fence_id >= 0) 129 fbc_ctl2 |= FBC_CTL_CPU_FENCE; 130 intel_de_write(dev_priv, FBC_CONTROL2, fbc_ctl2); 131 intel_de_write(dev_priv, FBC_FENCE_OFF, 132 params->fence_y_offset); 133 } 134 135 /* enable it... */ 136 fbc_ctl = FBC_CTL_INTERVAL(params->interval); 137 fbc_ctl |= FBC_CTL_EN | FBC_CTL_PERIODIC; 138 if (IS_I945GM(dev_priv)) 139 fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */ 140 fbc_ctl |= FBC_CTL_STRIDE(cfb_pitch & 0xff); 141 if (params->fence_id >= 0) 142 fbc_ctl |= FBC_CTL_FENCENO(params->fence_id); 143 intel_de_write(dev_priv, FBC_CONTROL, fbc_ctl); 144 } 145 146 static bool i8xx_fbc_is_active(struct drm_i915_private *dev_priv) 147 { 148 return intel_de_read(dev_priv, FBC_CONTROL) & FBC_CTL_EN; 149 } 150 151 static u32 g4x_dpfc_ctl_limit(struct drm_i915_private *i915) 152 { 153 const struct intel_fbc_reg_params *params = &i915->fbc.params; 154 int limit = i915->fbc.limit; 155 156 if (params->fb.format->cpp[0] == 2) 157 limit <<= 1; 158 159 switch (limit) { 160 default: 161 MISSING_CASE(limit); 162 fallthrough; 163 case 1: 164 return DPFC_CTL_LIMIT_1X; 165 case 2: 166 return DPFC_CTL_LIMIT_2X; 167 case 4: 168 return DPFC_CTL_LIMIT_4X; 169 } 170 } 171 172 static void g4x_fbc_activate(struct drm_i915_private *dev_priv) 173 { 174 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 175 u32 dpfc_ctl; 176 177 dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane) | DPFC_SR_EN; 178 179 dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv); 180 181 if (params->fence_id >= 0) { 182 dpfc_ctl |= DPFC_CTL_FENCE_EN | params->fence_id; 183 intel_de_write(dev_priv, DPFC_FENCE_YOFF, 184 params->fence_y_offset); 185 } else { 186 intel_de_write(dev_priv, DPFC_FENCE_YOFF, 0); 187 } 188 189 /* enable it... */ 190 intel_de_write(dev_priv, DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); 191 } 192 193 static void g4x_fbc_deactivate(struct drm_i915_private *dev_priv) 194 { 195 u32 dpfc_ctl; 196 197 /* Disable compression */ 198 dpfc_ctl = intel_de_read(dev_priv, DPFC_CONTROL); 199 if (dpfc_ctl & DPFC_CTL_EN) { 200 dpfc_ctl &= ~DPFC_CTL_EN; 201 intel_de_write(dev_priv, DPFC_CONTROL, dpfc_ctl); 202 } 203 } 204 205 static bool g4x_fbc_is_active(struct drm_i915_private *dev_priv) 206 { 207 return intel_de_read(dev_priv, DPFC_CONTROL) & DPFC_CTL_EN; 208 } 209 210 static void i8xx_fbc_recompress(struct drm_i915_private *dev_priv) 211 { 212 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 213 enum i9xx_plane_id i9xx_plane = params->crtc.i9xx_plane; 214 215 spin_lock_irq(&dev_priv->uncore.lock); 216 intel_de_write_fw(dev_priv, DSPADDR(i9xx_plane), 217 intel_de_read_fw(dev_priv, DSPADDR(i9xx_plane))); 218 spin_unlock_irq(&dev_priv->uncore.lock); 219 } 220 221 static void i965_fbc_recompress(struct drm_i915_private *dev_priv) 222 { 223 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 224 enum i9xx_plane_id i9xx_plane = params->crtc.i9xx_plane; 225 226 spin_lock_irq(&dev_priv->uncore.lock); 227 intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane), 228 intel_de_read_fw(dev_priv, DSPSURF(i9xx_plane))); 229 spin_unlock_irq(&dev_priv->uncore.lock); 230 } 231 232 /* This function forces a CFB recompression through the nuke operation. */ 233 static void snb_fbc_recompress(struct drm_i915_private *dev_priv) 234 { 235 struct intel_fbc *fbc = &dev_priv->fbc; 236 237 trace_intel_fbc_nuke(fbc->crtc); 238 239 intel_de_write(dev_priv, MSG_FBC_REND_STATE, FBC_REND_NUKE); 240 intel_de_posting_read(dev_priv, MSG_FBC_REND_STATE); 241 } 242 243 static void intel_fbc_recompress(struct drm_i915_private *dev_priv) 244 { 245 if (DISPLAY_VER(dev_priv) >= 6) 246 snb_fbc_recompress(dev_priv); 247 else if (DISPLAY_VER(dev_priv) >= 4) 248 i965_fbc_recompress(dev_priv); 249 else 250 i8xx_fbc_recompress(dev_priv); 251 } 252 253 static void ilk_fbc_activate(struct drm_i915_private *dev_priv) 254 { 255 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 256 u32 dpfc_ctl; 257 258 dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane); 259 260 dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv); 261 262 if (params->fence_id >= 0) { 263 dpfc_ctl |= DPFC_CTL_FENCE_EN; 264 if (IS_IRONLAKE(dev_priv)) 265 dpfc_ctl |= params->fence_id; 266 if (IS_SANDYBRIDGE(dev_priv)) { 267 intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 268 SNB_CPU_FENCE_ENABLE | params->fence_id); 269 intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 270 params->fence_y_offset); 271 } 272 } else { 273 if (IS_SANDYBRIDGE(dev_priv)) { 274 intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 0); 275 intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 0); 276 } 277 } 278 279 intel_de_write(dev_priv, ILK_DPFC_FENCE_YOFF, 280 params->fence_y_offset); 281 /* enable it... */ 282 intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); 283 284 intel_fbc_recompress(dev_priv); 285 } 286 287 static void ilk_fbc_deactivate(struct drm_i915_private *dev_priv) 288 { 289 u32 dpfc_ctl; 290 291 /* Disable compression */ 292 dpfc_ctl = intel_de_read(dev_priv, ILK_DPFC_CONTROL); 293 if (dpfc_ctl & DPFC_CTL_EN) { 294 dpfc_ctl &= ~DPFC_CTL_EN; 295 intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl); 296 } 297 } 298 299 static bool ilk_fbc_is_active(struct drm_i915_private *dev_priv) 300 { 301 return intel_de_read(dev_priv, ILK_DPFC_CONTROL) & DPFC_CTL_EN; 302 } 303 304 static void gen7_fbc_activate(struct drm_i915_private *dev_priv) 305 { 306 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 307 u32 dpfc_ctl; 308 309 /* Display WA #0529: skl, kbl, bxt. */ 310 if (DISPLAY_VER(dev_priv) == 9) { 311 u32 val = intel_de_read(dev_priv, CHICKEN_MISC_4); 312 313 val &= ~(FBC_STRIDE_OVERRIDE | FBC_STRIDE_MASK); 314 315 if (params->gen9_wa_cfb_stride) 316 val |= FBC_STRIDE_OVERRIDE | params->gen9_wa_cfb_stride; 317 318 intel_de_write(dev_priv, CHICKEN_MISC_4, val); 319 } 320 321 dpfc_ctl = 0; 322 if (IS_IVYBRIDGE(dev_priv)) 323 dpfc_ctl |= IVB_DPFC_CTL_PLANE(params->crtc.i9xx_plane); 324 325 dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv); 326 327 if (params->fence_id >= 0) { 328 dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN; 329 intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 330 SNB_CPU_FENCE_ENABLE | params->fence_id); 331 intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 332 params->fence_y_offset); 333 } else if (dev_priv->ggtt.num_fences) { 334 intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 0); 335 intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 0); 336 } 337 338 if (dev_priv->fbc.false_color) 339 dpfc_ctl |= FBC_CTL_FALSE_COLOR; 340 341 intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); 342 343 intel_fbc_recompress(dev_priv); 344 } 345 346 static bool intel_fbc_hw_is_active(struct drm_i915_private *dev_priv) 347 { 348 if (DISPLAY_VER(dev_priv) >= 5) 349 return ilk_fbc_is_active(dev_priv); 350 else if (IS_GM45(dev_priv)) 351 return g4x_fbc_is_active(dev_priv); 352 else 353 return i8xx_fbc_is_active(dev_priv); 354 } 355 356 static void intel_fbc_hw_activate(struct drm_i915_private *dev_priv) 357 { 358 struct intel_fbc *fbc = &dev_priv->fbc; 359 360 trace_intel_fbc_activate(fbc->crtc); 361 362 fbc->active = true; 363 fbc->activated = true; 364 365 if (DISPLAY_VER(dev_priv) >= 7) 366 gen7_fbc_activate(dev_priv); 367 else if (DISPLAY_VER(dev_priv) >= 5) 368 ilk_fbc_activate(dev_priv); 369 else if (IS_GM45(dev_priv)) 370 g4x_fbc_activate(dev_priv); 371 else 372 i8xx_fbc_activate(dev_priv); 373 } 374 375 static void intel_fbc_hw_deactivate(struct drm_i915_private *dev_priv) 376 { 377 struct intel_fbc *fbc = &dev_priv->fbc; 378 379 trace_intel_fbc_deactivate(fbc->crtc); 380 381 fbc->active = false; 382 383 if (DISPLAY_VER(dev_priv) >= 5) 384 ilk_fbc_deactivate(dev_priv); 385 else if (IS_GM45(dev_priv)) 386 g4x_fbc_deactivate(dev_priv); 387 else 388 i8xx_fbc_deactivate(dev_priv); 389 } 390 391 /** 392 * intel_fbc_is_active - Is FBC active? 393 * @dev_priv: i915 device instance 394 * 395 * This function is used to verify the current state of FBC. 396 * 397 * FIXME: This should be tracked in the plane config eventually 398 * instead of queried at runtime for most callers. 399 */ 400 bool intel_fbc_is_active(struct drm_i915_private *dev_priv) 401 { 402 return dev_priv->fbc.active; 403 } 404 405 static void intel_fbc_deactivate(struct drm_i915_private *dev_priv, 406 const char *reason) 407 { 408 struct intel_fbc *fbc = &dev_priv->fbc; 409 410 drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock)); 411 412 if (fbc->active) 413 intel_fbc_hw_deactivate(dev_priv); 414 415 fbc->no_fbc_reason = reason; 416 } 417 418 static u64 intel_fbc_cfb_base_max(struct drm_i915_private *i915) 419 { 420 if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915)) 421 return BIT_ULL(28); 422 else 423 return BIT_ULL(32); 424 } 425 426 static u64 intel_fbc_stolen_end(struct drm_i915_private *dev_priv) 427 { 428 u64 end; 429 430 /* The FBC hardware for BDW/SKL doesn't have access to the stolen 431 * reserved range size, so it always assumes the maximum (8mb) is used. 432 * If we enable FBC using a CFB on that memory range we'll get FIFO 433 * underruns, even if that range is not reserved by the BIOS. */ 434 if (IS_BROADWELL(dev_priv) || (DISPLAY_VER(dev_priv) == 9 && 435 !IS_BROXTON(dev_priv))) 436 end = resource_size(&dev_priv->dsm) - 8 * 1024 * 1024; 437 else 438 end = U64_MAX; 439 440 return min(end, intel_fbc_cfb_base_max(dev_priv)); 441 } 442 443 static int intel_fbc_max_limit(struct drm_i915_private *dev_priv, int fb_cpp) 444 { 445 /* 446 * FIXME: FBC1 can have arbitrary cfb stride, 447 * so we could support different compression ratios. 448 */ 449 if (DISPLAY_VER(dev_priv) < 5 && !IS_G4X(dev_priv)) 450 return 1; 451 452 /* WaFbcOnly1to1Ratio:ctg */ 453 if (IS_G4X(dev_priv)) 454 return 1; 455 456 /* FBC2 can only do 1:1, 1:2, 1:4 */ 457 return fb_cpp == 2 ? 2 : 4; 458 } 459 460 static int find_compression_limit(struct drm_i915_private *dev_priv, 461 unsigned int size, 462 unsigned int fb_cpp) 463 { 464 struct intel_fbc *fbc = &dev_priv->fbc; 465 u64 end = intel_fbc_stolen_end(dev_priv); 466 int ret, limit = 1; 467 468 /* Try to over-allocate to reduce reallocations and fragmentation. */ 469 ret = i915_gem_stolen_insert_node_in_range(dev_priv, &fbc->compressed_fb, 470 size <<= 1, 4096, 0, end); 471 if (ret == 0) 472 return limit; 473 474 for (; limit <= intel_fbc_max_limit(dev_priv, fb_cpp); limit <<= 1) { 475 ret = i915_gem_stolen_insert_node_in_range(dev_priv, &fbc->compressed_fb, 476 size >>= 1, 4096, 0, end); 477 if (ret == 0) 478 return limit; 479 } 480 481 return 0; 482 } 483 484 static int intel_fbc_alloc_cfb(struct drm_i915_private *dev_priv, 485 unsigned int size, unsigned int fb_cpp) 486 { 487 struct intel_fbc *fbc = &dev_priv->fbc; 488 int ret; 489 490 drm_WARN_ON(&dev_priv->drm, 491 drm_mm_node_allocated(&fbc->compressed_fb)); 492 drm_WARN_ON(&dev_priv->drm, 493 drm_mm_node_allocated(&fbc->compressed_llb)); 494 495 if (DISPLAY_VER(dev_priv) < 5 && !IS_G4X(dev_priv)) { 496 ret = i915_gem_stolen_insert_node(dev_priv, &fbc->compressed_llb, 497 4096, 4096); 498 if (ret) 499 goto err; 500 } 501 502 ret = find_compression_limit(dev_priv, size, fb_cpp); 503 if (!ret) 504 goto err_llb; 505 else if (ret > 1) { 506 drm_info_once(&dev_priv->drm, 507 "Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n"); 508 } 509 510 fbc->limit = ret; 511 512 drm_dbg_kms(&dev_priv->drm, 513 "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", 514 fbc->compressed_fb.size, fbc->limit); 515 516 return 0; 517 518 err_llb: 519 if (drm_mm_node_allocated(&fbc->compressed_llb)) 520 i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_llb); 521 err: 522 if (drm_mm_initialized(&dev_priv->mm.stolen)) 523 drm_info_once(&dev_priv->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); 524 return -ENOSPC; 525 } 526 527 static void intel_fbc_program_cfb(struct drm_i915_private *dev_priv) 528 { 529 struct intel_fbc *fbc = &dev_priv->fbc; 530 531 if (DISPLAY_VER(dev_priv) >= 5) { 532 intel_de_write(dev_priv, ILK_DPFC_CB_BASE, 533 fbc->compressed_fb.start); 534 } else if (IS_GM45(dev_priv)) { 535 intel_de_write(dev_priv, DPFC_CB_BASE, 536 fbc->compressed_fb.start); 537 } else { 538 GEM_BUG_ON(range_overflows_end_t(u64, dev_priv->dsm.start, 539 fbc->compressed_fb.start, 540 U32_MAX)); 541 GEM_BUG_ON(range_overflows_end_t(u64, dev_priv->dsm.start, 542 fbc->compressed_llb.start, 543 U32_MAX)); 544 545 intel_de_write(dev_priv, FBC_CFB_BASE, 546 dev_priv->dsm.start + fbc->compressed_fb.start); 547 intel_de_write(dev_priv, FBC_LL_BASE, 548 dev_priv->dsm.start + fbc->compressed_llb.start); 549 } 550 } 551 552 static void __intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv) 553 { 554 struct intel_fbc *fbc = &dev_priv->fbc; 555 556 if (WARN_ON(intel_fbc_hw_is_active(dev_priv))) 557 return; 558 559 if (drm_mm_node_allocated(&fbc->compressed_llb)) 560 i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_llb); 561 if (drm_mm_node_allocated(&fbc->compressed_fb)) 562 i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb); 563 } 564 565 void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv) 566 { 567 struct intel_fbc *fbc = &dev_priv->fbc; 568 569 if (!HAS_FBC(dev_priv)) 570 return; 571 572 mutex_lock(&fbc->lock); 573 __intel_fbc_cleanup_cfb(dev_priv); 574 mutex_unlock(&fbc->lock); 575 } 576 577 static bool stride_is_valid(struct drm_i915_private *dev_priv, 578 u64 modifier, unsigned int stride) 579 { 580 /* This should have been caught earlier. */ 581 if (drm_WARN_ON_ONCE(&dev_priv->drm, (stride & (64 - 1)) != 0)) 582 return false; 583 584 /* Below are the additional FBC restrictions. */ 585 if (stride < 512) 586 return false; 587 588 if (DISPLAY_VER(dev_priv) == 2 || DISPLAY_VER(dev_priv) == 3) 589 return stride == 4096 || stride == 8192; 590 591 if (DISPLAY_VER(dev_priv) == 4 && !IS_G4X(dev_priv) && stride < 2048) 592 return false; 593 594 /* Display WA #1105: skl,bxt,kbl,cfl,glk */ 595 if ((DISPLAY_VER(dev_priv) == 9 || IS_GEMINILAKE(dev_priv)) && 596 modifier == DRM_FORMAT_MOD_LINEAR && stride & 511) 597 return false; 598 599 if (stride > 16384) 600 return false; 601 602 return true; 603 } 604 605 static bool pixel_format_is_valid(struct drm_i915_private *dev_priv, 606 u32 pixel_format) 607 { 608 switch (pixel_format) { 609 case DRM_FORMAT_XRGB8888: 610 case DRM_FORMAT_XBGR8888: 611 return true; 612 case DRM_FORMAT_XRGB1555: 613 case DRM_FORMAT_RGB565: 614 /* 16bpp not supported on gen2 */ 615 if (DISPLAY_VER(dev_priv) == 2) 616 return false; 617 /* WaFbcOnly1to1Ratio:ctg */ 618 if (IS_G4X(dev_priv)) 619 return false; 620 return true; 621 default: 622 return false; 623 } 624 } 625 626 static bool rotation_is_valid(struct drm_i915_private *dev_priv, 627 u32 pixel_format, unsigned int rotation) 628 { 629 if (DISPLAY_VER(dev_priv) >= 9 && pixel_format == DRM_FORMAT_RGB565 && 630 drm_rotation_90_or_270(rotation)) 631 return false; 632 else if (DISPLAY_VER(dev_priv) <= 4 && !IS_G4X(dev_priv) && 633 rotation != DRM_MODE_ROTATE_0) 634 return false; 635 636 return true; 637 } 638 639 /* 640 * For some reason, the hardware tracking starts looking at whatever we 641 * programmed as the display plane base address register. It does not look at 642 * the X and Y offset registers. That's why we include the src x/y offsets 643 * instead of just looking at the plane size. 644 */ 645 static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc) 646 { 647 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 648 struct intel_fbc *fbc = &dev_priv->fbc; 649 unsigned int effective_w, effective_h, max_w, max_h; 650 651 if (DISPLAY_VER(dev_priv) >= 10) { 652 max_w = 5120; 653 max_h = 4096; 654 } else if (DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv)) { 655 max_w = 4096; 656 max_h = 4096; 657 } else if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5) { 658 max_w = 4096; 659 max_h = 2048; 660 } else { 661 max_w = 2048; 662 max_h = 1536; 663 } 664 665 intel_fbc_get_plane_source_size(&fbc->state_cache, &effective_w, 666 &effective_h); 667 effective_w += fbc->state_cache.plane.adjusted_x; 668 effective_h += fbc->state_cache.plane.adjusted_y; 669 670 return effective_w <= max_w && effective_h <= max_h; 671 } 672 673 static bool tiling_is_valid(struct drm_i915_private *dev_priv, 674 u64 modifier) 675 { 676 switch (modifier) { 677 case DRM_FORMAT_MOD_LINEAR: 678 if (DISPLAY_VER(dev_priv) >= 9) 679 return true; 680 return false; 681 case I915_FORMAT_MOD_X_TILED: 682 case I915_FORMAT_MOD_Y_TILED: 683 return true; 684 default: 685 return false; 686 } 687 } 688 689 static void intel_fbc_update_state_cache(struct intel_crtc *crtc, 690 const struct intel_crtc_state *crtc_state, 691 const struct intel_plane_state *plane_state) 692 { 693 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 694 struct intel_fbc *fbc = &dev_priv->fbc; 695 struct intel_fbc_state_cache *cache = &fbc->state_cache; 696 struct drm_framebuffer *fb = plane_state->hw.fb; 697 698 cache->plane.visible = plane_state->uapi.visible; 699 if (!cache->plane.visible) 700 return; 701 702 cache->crtc.mode_flags = crtc_state->hw.adjusted_mode.flags; 703 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 704 cache->crtc.hsw_bdw_pixel_rate = crtc_state->pixel_rate; 705 706 cache->plane.rotation = plane_state->hw.rotation; 707 /* 708 * Src coordinates are already rotated by 270 degrees for 709 * the 90/270 degree plane rotation cases (to match the 710 * GTT mapping), hence no need to account for rotation here. 711 */ 712 cache->plane.src_w = drm_rect_width(&plane_state->uapi.src) >> 16; 713 cache->plane.src_h = drm_rect_height(&plane_state->uapi.src) >> 16; 714 cache->plane.adjusted_x = plane_state->view.color_plane[0].x; 715 cache->plane.adjusted_y = plane_state->view.color_plane[0].y; 716 717 cache->plane.pixel_blend_mode = plane_state->hw.pixel_blend_mode; 718 719 cache->fb.format = fb->format; 720 cache->fb.modifier = fb->modifier; 721 722 /* FIXME is this correct? */ 723 cache->fb.stride = plane_state->view.color_plane[0].stride; 724 if (drm_rotation_90_or_270(plane_state->hw.rotation)) 725 cache->fb.stride *= fb->format->cpp[0]; 726 727 /* FBC1 compression interval: arbitrary choice of 1 second */ 728 cache->interval = drm_mode_vrefresh(&crtc_state->hw.adjusted_mode); 729 730 cache->fence_y_offset = intel_plane_fence_y_offset(plane_state); 731 732 drm_WARN_ON(&dev_priv->drm, plane_state->flags & PLANE_HAS_FENCE && 733 !plane_state->ggtt_vma->fence); 734 735 if (plane_state->flags & PLANE_HAS_FENCE && 736 plane_state->ggtt_vma->fence) 737 cache->fence_id = plane_state->ggtt_vma->fence->id; 738 else 739 cache->fence_id = -1; 740 741 cache->psr2_active = crtc_state->has_psr2; 742 } 743 744 static bool intel_fbc_cfb_size_changed(struct drm_i915_private *dev_priv) 745 { 746 struct intel_fbc *fbc = &dev_priv->fbc; 747 748 return intel_fbc_calculate_cfb_size(dev_priv, &fbc->state_cache) > 749 fbc->compressed_fb.size * fbc->limit; 750 } 751 752 static u16 intel_fbc_gen9_wa_cfb_stride(struct drm_i915_private *dev_priv) 753 { 754 struct intel_fbc *fbc = &dev_priv->fbc; 755 struct intel_fbc_state_cache *cache = &fbc->state_cache; 756 757 if ((DISPLAY_VER(dev_priv) == 9) && 758 cache->fb.modifier != I915_FORMAT_MOD_X_TILED) 759 return DIV_ROUND_UP(cache->plane.src_w, 32 * fbc->limit) * 8; 760 else 761 return 0; 762 } 763 764 static bool intel_fbc_gen9_wa_cfb_stride_changed(struct drm_i915_private *dev_priv) 765 { 766 struct intel_fbc *fbc = &dev_priv->fbc; 767 768 return fbc->params.gen9_wa_cfb_stride != intel_fbc_gen9_wa_cfb_stride(dev_priv); 769 } 770 771 static bool intel_fbc_can_enable(struct drm_i915_private *dev_priv) 772 { 773 struct intel_fbc *fbc = &dev_priv->fbc; 774 775 if (intel_vgpu_active(dev_priv)) { 776 fbc->no_fbc_reason = "VGPU is active"; 777 return false; 778 } 779 780 if (!dev_priv->params.enable_fbc) { 781 fbc->no_fbc_reason = "disabled per module param or by default"; 782 return false; 783 } 784 785 if (fbc->underrun_detected) { 786 fbc->no_fbc_reason = "underrun detected"; 787 return false; 788 } 789 790 return true; 791 } 792 793 static bool intel_fbc_can_activate(struct intel_crtc *crtc) 794 { 795 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 796 struct intel_fbc *fbc = &dev_priv->fbc; 797 struct intel_fbc_state_cache *cache = &fbc->state_cache; 798 799 if (!intel_fbc_can_enable(dev_priv)) 800 return false; 801 802 if (!cache->plane.visible) { 803 fbc->no_fbc_reason = "primary plane not visible"; 804 return false; 805 } 806 807 /* We don't need to use a state cache here since this information is 808 * global for all CRTC. 809 */ 810 if (fbc->underrun_detected) { 811 fbc->no_fbc_reason = "underrun detected"; 812 return false; 813 } 814 815 if (cache->crtc.mode_flags & DRM_MODE_FLAG_INTERLACE) { 816 fbc->no_fbc_reason = "incompatible mode"; 817 return false; 818 } 819 820 if (!intel_fbc_hw_tracking_covers_screen(crtc)) { 821 fbc->no_fbc_reason = "mode too large for compression"; 822 return false; 823 } 824 825 /* The use of a CPU fence is one of two ways to detect writes by the 826 * CPU to the scanout and trigger updates to the FBC. 827 * 828 * The other method is by software tracking (see 829 * intel_fbc_invalidate/flush()), it will manually notify FBC and nuke 830 * the current compressed buffer and recompress it. 831 * 832 * Note that is possible for a tiled surface to be unmappable (and 833 * so have no fence associated with it) due to aperture constraints 834 * at the time of pinning. 835 * 836 * FIXME with 90/270 degree rotation we should use the fence on 837 * the normal GTT view (the rotated view doesn't even have a 838 * fence). Would need changes to the FBC fence Y offset as well. 839 * For now this will effectively disable FBC with 90/270 degree 840 * rotation. 841 */ 842 if (DISPLAY_VER(dev_priv) < 9 && cache->fence_id < 0) { 843 fbc->no_fbc_reason = "framebuffer not tiled or fenced"; 844 return false; 845 } 846 847 if (!pixel_format_is_valid(dev_priv, cache->fb.format->format)) { 848 fbc->no_fbc_reason = "pixel format is invalid"; 849 return false; 850 } 851 852 if (!rotation_is_valid(dev_priv, cache->fb.format->format, 853 cache->plane.rotation)) { 854 fbc->no_fbc_reason = "rotation unsupported"; 855 return false; 856 } 857 858 if (!tiling_is_valid(dev_priv, cache->fb.modifier)) { 859 fbc->no_fbc_reason = "tiling unsupported"; 860 return false; 861 } 862 863 if (!stride_is_valid(dev_priv, cache->fb.modifier, cache->fb.stride)) { 864 fbc->no_fbc_reason = "framebuffer stride not supported"; 865 return false; 866 } 867 868 if (cache->plane.pixel_blend_mode != DRM_MODE_BLEND_PIXEL_NONE && 869 cache->fb.format->has_alpha) { 870 fbc->no_fbc_reason = "per-pixel alpha blending is incompatible with FBC"; 871 return false; 872 } 873 874 /* WaFbcExceedCdClockThreshold:hsw,bdw */ 875 if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) && 876 cache->crtc.hsw_bdw_pixel_rate >= dev_priv->cdclk.hw.cdclk * 95 / 100) { 877 fbc->no_fbc_reason = "pixel rate is too big"; 878 return false; 879 } 880 881 /* It is possible for the required CFB size change without a 882 * crtc->disable + crtc->enable since it is possible to change the 883 * stride without triggering a full modeset. Since we try to 884 * over-allocate the CFB, there's a chance we may keep FBC enabled even 885 * if this happens, but if we exceed the current CFB size we'll have to 886 * disable FBC. Notice that it would be possible to disable FBC, wait 887 * for a frame, free the stolen node, then try to reenable FBC in case 888 * we didn't get any invalidate/deactivate calls, but this would require 889 * a lot of tracking just for a specific case. If we conclude it's an 890 * important case, we can implement it later. */ 891 if (intel_fbc_cfb_size_changed(dev_priv)) { 892 fbc->no_fbc_reason = "CFB requirements changed"; 893 return false; 894 } 895 896 /* 897 * Work around a problem on GEN9+ HW, where enabling FBC on a plane 898 * having a Y offset that isn't divisible by 4 causes FIFO underrun 899 * and screen flicker. 900 */ 901 if (DISPLAY_VER(dev_priv) >= 9 && 902 (fbc->state_cache.plane.adjusted_y & 3)) { 903 fbc->no_fbc_reason = "plane Y offset is misaligned"; 904 return false; 905 } 906 907 /* Wa_22010751166: icl, ehl, tgl, dg1, rkl */ 908 if (DISPLAY_VER(dev_priv) >= 11 && 909 (cache->plane.src_h + cache->plane.adjusted_y) % 4) { 910 fbc->no_fbc_reason = "plane height + offset is non-modulo of 4"; 911 return false; 912 } 913 914 /* 915 * Display 12+ is not supporting FBC with PSR2. 916 * Recommendation is to keep this combination disabled 917 * Bspec: 50422 HSD: 14010260002 918 */ 919 if (fbc->state_cache.psr2_active && DISPLAY_VER(dev_priv) >= 12) { 920 fbc->no_fbc_reason = "not supported with PSR2"; 921 return false; 922 } 923 924 return true; 925 } 926 927 static void intel_fbc_get_reg_params(struct intel_crtc *crtc, 928 struct intel_fbc_reg_params *params) 929 { 930 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 931 struct intel_fbc *fbc = &dev_priv->fbc; 932 struct intel_fbc_state_cache *cache = &fbc->state_cache; 933 934 /* Since all our fields are integer types, use memset here so the 935 * comparison function can rely on memcmp because the padding will be 936 * zero. */ 937 memset(params, 0, sizeof(*params)); 938 939 params->fence_id = cache->fence_id; 940 params->fence_y_offset = cache->fence_y_offset; 941 942 params->interval = cache->interval; 943 944 params->crtc.pipe = crtc->pipe; 945 params->crtc.i9xx_plane = to_intel_plane(crtc->base.primary)->i9xx_plane; 946 947 params->fb.format = cache->fb.format; 948 params->fb.modifier = cache->fb.modifier; 949 params->fb.stride = cache->fb.stride; 950 951 params->cfb_size = intel_fbc_calculate_cfb_size(dev_priv, cache); 952 953 params->gen9_wa_cfb_stride = cache->gen9_wa_cfb_stride; 954 955 params->plane_visible = cache->plane.visible; 956 } 957 958 static bool intel_fbc_can_flip_nuke(const struct intel_crtc_state *crtc_state) 959 { 960 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 961 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 962 const struct intel_fbc *fbc = &dev_priv->fbc; 963 const struct intel_fbc_state_cache *cache = &fbc->state_cache; 964 const struct intel_fbc_reg_params *params = &fbc->params; 965 966 if (drm_atomic_crtc_needs_modeset(&crtc_state->uapi)) 967 return false; 968 969 if (!params->plane_visible) 970 return false; 971 972 if (!intel_fbc_can_activate(crtc)) 973 return false; 974 975 if (params->fb.format != cache->fb.format) 976 return false; 977 978 if (params->fb.modifier != cache->fb.modifier) 979 return false; 980 981 if (params->fb.stride != cache->fb.stride) 982 return false; 983 984 if (params->cfb_size != intel_fbc_calculate_cfb_size(dev_priv, cache)) 985 return false; 986 987 if (params->gen9_wa_cfb_stride != cache->gen9_wa_cfb_stride) 988 return false; 989 990 return true; 991 } 992 993 bool intel_fbc_pre_update(struct intel_atomic_state *state, 994 struct intel_crtc *crtc) 995 { 996 struct intel_plane *plane = to_intel_plane(crtc->base.primary); 997 const struct intel_crtc_state *crtc_state = 998 intel_atomic_get_new_crtc_state(state, crtc); 999 const struct intel_plane_state *plane_state = 1000 intel_atomic_get_new_plane_state(state, plane); 1001 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1002 struct intel_fbc *fbc = &dev_priv->fbc; 1003 const char *reason = "update pending"; 1004 bool need_vblank_wait = false; 1005 1006 if (!plane->has_fbc || !plane_state) 1007 return need_vblank_wait; 1008 1009 mutex_lock(&fbc->lock); 1010 1011 if (fbc->crtc != crtc) 1012 goto unlock; 1013 1014 intel_fbc_update_state_cache(crtc, crtc_state, plane_state); 1015 fbc->flip_pending = true; 1016 1017 if (!intel_fbc_can_flip_nuke(crtc_state)) { 1018 intel_fbc_deactivate(dev_priv, reason); 1019 1020 /* 1021 * Display WA #1198: glk+ 1022 * Need an extra vblank wait between FBC disable and most plane 1023 * updates. Bspec says this is only needed for plane disable, but 1024 * that is not true. Touching most plane registers will cause the 1025 * corruption to appear. Also SKL/derivatives do not seem to be 1026 * affected. 1027 * 1028 * TODO: could optimize this a bit by sampling the frame 1029 * counter when we disable FBC (if it was already done earlier) 1030 * and skipping the extra vblank wait before the plane update 1031 * if at least one frame has already passed. 1032 */ 1033 if (fbc->activated && 1034 DISPLAY_VER(dev_priv) >= 10) 1035 need_vblank_wait = true; 1036 fbc->activated = false; 1037 } 1038 unlock: 1039 mutex_unlock(&fbc->lock); 1040 1041 return need_vblank_wait; 1042 } 1043 1044 /** 1045 * __intel_fbc_disable - disable FBC 1046 * @dev_priv: i915 device instance 1047 * 1048 * This is the low level function that actually disables FBC. Callers should 1049 * grab the FBC lock. 1050 */ 1051 static void __intel_fbc_disable(struct drm_i915_private *dev_priv) 1052 { 1053 struct intel_fbc *fbc = &dev_priv->fbc; 1054 struct intel_crtc *crtc = fbc->crtc; 1055 1056 drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock)); 1057 drm_WARN_ON(&dev_priv->drm, !fbc->crtc); 1058 drm_WARN_ON(&dev_priv->drm, fbc->active); 1059 1060 drm_dbg_kms(&dev_priv->drm, "Disabling FBC on pipe %c\n", 1061 pipe_name(crtc->pipe)); 1062 1063 __intel_fbc_cleanup_cfb(dev_priv); 1064 1065 fbc->crtc = NULL; 1066 } 1067 1068 static void __intel_fbc_post_update(struct intel_crtc *crtc) 1069 { 1070 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1071 struct intel_fbc *fbc = &dev_priv->fbc; 1072 1073 drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock)); 1074 1075 if (fbc->crtc != crtc) 1076 return; 1077 1078 fbc->flip_pending = false; 1079 1080 if (!dev_priv->params.enable_fbc) { 1081 intel_fbc_deactivate(dev_priv, "disabled at runtime per module param"); 1082 __intel_fbc_disable(dev_priv); 1083 1084 return; 1085 } 1086 1087 intel_fbc_get_reg_params(crtc, &fbc->params); 1088 1089 if (!intel_fbc_can_activate(crtc)) 1090 return; 1091 1092 if (!fbc->busy_bits) 1093 intel_fbc_hw_activate(dev_priv); 1094 else 1095 intel_fbc_deactivate(dev_priv, "frontbuffer write"); 1096 } 1097 1098 void intel_fbc_post_update(struct intel_atomic_state *state, 1099 struct intel_crtc *crtc) 1100 { 1101 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1102 struct intel_plane *plane = to_intel_plane(crtc->base.primary); 1103 const struct intel_plane_state *plane_state = 1104 intel_atomic_get_new_plane_state(state, plane); 1105 struct intel_fbc *fbc = &dev_priv->fbc; 1106 1107 if (!plane->has_fbc || !plane_state) 1108 return; 1109 1110 mutex_lock(&fbc->lock); 1111 __intel_fbc_post_update(crtc); 1112 mutex_unlock(&fbc->lock); 1113 } 1114 1115 static unsigned int intel_fbc_get_frontbuffer_bit(struct intel_fbc *fbc) 1116 { 1117 if (fbc->crtc) 1118 return to_intel_plane(fbc->crtc->base.primary)->frontbuffer_bit; 1119 else 1120 return fbc->possible_framebuffer_bits; 1121 } 1122 1123 void intel_fbc_invalidate(struct drm_i915_private *dev_priv, 1124 unsigned int frontbuffer_bits, 1125 enum fb_op_origin origin) 1126 { 1127 struct intel_fbc *fbc = &dev_priv->fbc; 1128 1129 if (!HAS_FBC(dev_priv)) 1130 return; 1131 1132 if (origin == ORIGIN_GTT || origin == ORIGIN_FLIP) 1133 return; 1134 1135 mutex_lock(&fbc->lock); 1136 1137 fbc->busy_bits |= intel_fbc_get_frontbuffer_bit(fbc) & frontbuffer_bits; 1138 1139 if (fbc->crtc && fbc->busy_bits) 1140 intel_fbc_deactivate(dev_priv, "frontbuffer write"); 1141 1142 mutex_unlock(&fbc->lock); 1143 } 1144 1145 void intel_fbc_flush(struct drm_i915_private *dev_priv, 1146 unsigned int frontbuffer_bits, enum fb_op_origin origin) 1147 { 1148 struct intel_fbc *fbc = &dev_priv->fbc; 1149 1150 if (!HAS_FBC(dev_priv)) 1151 return; 1152 1153 /* 1154 * GTT tracking does not nuke the entire cfb 1155 * so don't clear busy_bits set for some other 1156 * reason. 1157 */ 1158 if (origin == ORIGIN_GTT) 1159 return; 1160 1161 mutex_lock(&fbc->lock); 1162 1163 fbc->busy_bits &= ~frontbuffer_bits; 1164 1165 if (origin == ORIGIN_FLIP) 1166 goto out; 1167 1168 if (!fbc->busy_bits && fbc->crtc && 1169 (frontbuffer_bits & intel_fbc_get_frontbuffer_bit(fbc))) { 1170 if (fbc->active) 1171 intel_fbc_recompress(dev_priv); 1172 else if (!fbc->flip_pending) 1173 __intel_fbc_post_update(fbc->crtc); 1174 } 1175 1176 out: 1177 mutex_unlock(&fbc->lock); 1178 } 1179 1180 /** 1181 * intel_fbc_choose_crtc - select a CRTC to enable FBC on 1182 * @dev_priv: i915 device instance 1183 * @state: the atomic state structure 1184 * 1185 * This function looks at the proposed state for CRTCs and planes, then chooses 1186 * which pipe is going to have FBC by setting intel_crtc_state->enable_fbc to 1187 * true. 1188 * 1189 * Later, intel_fbc_enable is going to look for state->enable_fbc and then maybe 1190 * enable FBC for the chosen CRTC. If it does, it will set dev_priv->fbc.crtc. 1191 */ 1192 void intel_fbc_choose_crtc(struct drm_i915_private *dev_priv, 1193 struct intel_atomic_state *state) 1194 { 1195 struct intel_fbc *fbc = &dev_priv->fbc; 1196 struct intel_plane *plane; 1197 struct intel_plane_state *plane_state; 1198 bool crtc_chosen = false; 1199 int i; 1200 1201 mutex_lock(&fbc->lock); 1202 1203 /* Does this atomic commit involve the CRTC currently tied to FBC? */ 1204 if (fbc->crtc && 1205 !intel_atomic_get_new_crtc_state(state, fbc->crtc)) 1206 goto out; 1207 1208 if (!intel_fbc_can_enable(dev_priv)) 1209 goto out; 1210 1211 /* Simply choose the first CRTC that is compatible and has a visible 1212 * plane. We could go for fancier schemes such as checking the plane 1213 * size, but this would just affect the few platforms that don't tie FBC 1214 * to pipe or plane A. */ 1215 for_each_new_intel_plane_in_state(state, plane, plane_state, i) { 1216 struct intel_crtc_state *crtc_state; 1217 struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc); 1218 1219 if (!plane->has_fbc) 1220 continue; 1221 1222 if (!plane_state->uapi.visible) 1223 continue; 1224 1225 crtc_state = intel_atomic_get_new_crtc_state(state, crtc); 1226 1227 crtc_state->enable_fbc = true; 1228 crtc_chosen = true; 1229 break; 1230 } 1231 1232 if (!crtc_chosen) 1233 fbc->no_fbc_reason = "no suitable CRTC for FBC"; 1234 1235 out: 1236 mutex_unlock(&fbc->lock); 1237 } 1238 1239 /** 1240 * intel_fbc_enable: tries to enable FBC on the CRTC 1241 * @crtc: the CRTC 1242 * @state: corresponding &drm_crtc_state for @crtc 1243 * 1244 * This function checks if the given CRTC was chosen for FBC, then enables it if 1245 * possible. Notice that it doesn't activate FBC. It is valid to call 1246 * intel_fbc_enable multiple times for the same pipe without an 1247 * intel_fbc_disable in the middle, as long as it is deactivated. 1248 */ 1249 void intel_fbc_enable(struct intel_atomic_state *state, 1250 struct intel_crtc *crtc) 1251 { 1252 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1253 struct intel_plane *plane = to_intel_plane(crtc->base.primary); 1254 const struct intel_crtc_state *crtc_state = 1255 intel_atomic_get_new_crtc_state(state, crtc); 1256 const struct intel_plane_state *plane_state = 1257 intel_atomic_get_new_plane_state(state, plane); 1258 struct intel_fbc *fbc = &dev_priv->fbc; 1259 struct intel_fbc_state_cache *cache = &fbc->state_cache; 1260 1261 if (!plane->has_fbc || !plane_state) 1262 return; 1263 1264 mutex_lock(&fbc->lock); 1265 1266 if (fbc->crtc) { 1267 if (fbc->crtc != crtc || 1268 (!intel_fbc_cfb_size_changed(dev_priv) && 1269 !intel_fbc_gen9_wa_cfb_stride_changed(dev_priv))) 1270 goto out; 1271 1272 __intel_fbc_disable(dev_priv); 1273 } 1274 1275 drm_WARN_ON(&dev_priv->drm, fbc->active); 1276 1277 intel_fbc_update_state_cache(crtc, crtc_state, plane_state); 1278 1279 /* FIXME crtc_state->enable_fbc lies :( */ 1280 if (!cache->plane.visible) 1281 goto out; 1282 1283 if (intel_fbc_alloc_cfb(dev_priv, 1284 intel_fbc_calculate_cfb_size(dev_priv, cache), 1285 plane_state->hw.fb->format->cpp[0])) { 1286 cache->plane.visible = false; 1287 fbc->no_fbc_reason = "not enough stolen memory"; 1288 goto out; 1289 } 1290 1291 cache->gen9_wa_cfb_stride = intel_fbc_gen9_wa_cfb_stride(dev_priv); 1292 1293 drm_dbg_kms(&dev_priv->drm, "Enabling FBC on pipe %c\n", 1294 pipe_name(crtc->pipe)); 1295 fbc->no_fbc_reason = "FBC enabled but not active yet\n"; 1296 1297 fbc->crtc = crtc; 1298 1299 intel_fbc_program_cfb(dev_priv); 1300 out: 1301 mutex_unlock(&fbc->lock); 1302 } 1303 1304 /** 1305 * intel_fbc_disable - disable FBC if it's associated with crtc 1306 * @crtc: the CRTC 1307 * 1308 * This function disables FBC if it's associated with the provided CRTC. 1309 */ 1310 void intel_fbc_disable(struct intel_crtc *crtc) 1311 { 1312 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1313 struct intel_plane *plane = to_intel_plane(crtc->base.primary); 1314 struct intel_fbc *fbc = &dev_priv->fbc; 1315 1316 if (!plane->has_fbc) 1317 return; 1318 1319 mutex_lock(&fbc->lock); 1320 if (fbc->crtc == crtc) 1321 __intel_fbc_disable(dev_priv); 1322 mutex_unlock(&fbc->lock); 1323 } 1324 1325 /** 1326 * intel_fbc_global_disable - globally disable FBC 1327 * @dev_priv: i915 device instance 1328 * 1329 * This function disables FBC regardless of which CRTC is associated with it. 1330 */ 1331 void intel_fbc_global_disable(struct drm_i915_private *dev_priv) 1332 { 1333 struct intel_fbc *fbc = &dev_priv->fbc; 1334 1335 if (!HAS_FBC(dev_priv)) 1336 return; 1337 1338 mutex_lock(&fbc->lock); 1339 if (fbc->crtc) { 1340 drm_WARN_ON(&dev_priv->drm, fbc->crtc->active); 1341 __intel_fbc_disable(dev_priv); 1342 } 1343 mutex_unlock(&fbc->lock); 1344 } 1345 1346 static void intel_fbc_underrun_work_fn(struct work_struct *work) 1347 { 1348 struct drm_i915_private *dev_priv = 1349 container_of(work, struct drm_i915_private, fbc.underrun_work); 1350 struct intel_fbc *fbc = &dev_priv->fbc; 1351 1352 mutex_lock(&fbc->lock); 1353 1354 /* Maybe we were scheduled twice. */ 1355 if (fbc->underrun_detected || !fbc->crtc) 1356 goto out; 1357 1358 drm_dbg_kms(&dev_priv->drm, "Disabling FBC due to FIFO underrun.\n"); 1359 fbc->underrun_detected = true; 1360 1361 intel_fbc_deactivate(dev_priv, "FIFO underrun"); 1362 out: 1363 mutex_unlock(&fbc->lock); 1364 } 1365 1366 /* 1367 * intel_fbc_reset_underrun - reset FBC fifo underrun status. 1368 * @dev_priv: i915 device instance 1369 * 1370 * See intel_fbc_handle_fifo_underrun_irq(). For automated testing we 1371 * want to re-enable FBC after an underrun to increase test coverage. 1372 */ 1373 int intel_fbc_reset_underrun(struct drm_i915_private *dev_priv) 1374 { 1375 int ret; 1376 1377 cancel_work_sync(&dev_priv->fbc.underrun_work); 1378 1379 ret = mutex_lock_interruptible(&dev_priv->fbc.lock); 1380 if (ret) 1381 return ret; 1382 1383 if (dev_priv->fbc.underrun_detected) { 1384 drm_dbg_kms(&dev_priv->drm, 1385 "Re-allowing FBC after fifo underrun\n"); 1386 dev_priv->fbc.no_fbc_reason = "FIFO underrun cleared"; 1387 } 1388 1389 dev_priv->fbc.underrun_detected = false; 1390 mutex_unlock(&dev_priv->fbc.lock); 1391 1392 return 0; 1393 } 1394 1395 /** 1396 * intel_fbc_handle_fifo_underrun_irq - disable FBC when we get a FIFO underrun 1397 * @dev_priv: i915 device instance 1398 * 1399 * Without FBC, most underruns are harmless and don't really cause too many 1400 * problems, except for an annoying message on dmesg. With FBC, underruns can 1401 * become black screens or even worse, especially when paired with bad 1402 * watermarks. So in order for us to be on the safe side, completely disable FBC 1403 * in case we ever detect a FIFO underrun on any pipe. An underrun on any pipe 1404 * already suggests that watermarks may be bad, so try to be as safe as 1405 * possible. 1406 * 1407 * This function is called from the IRQ handler. 1408 */ 1409 void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *dev_priv) 1410 { 1411 struct intel_fbc *fbc = &dev_priv->fbc; 1412 1413 if (!HAS_FBC(dev_priv)) 1414 return; 1415 1416 /* There's no guarantee that underrun_detected won't be set to true 1417 * right after this check and before the work is scheduled, but that's 1418 * not a problem since we'll check it again under the work function 1419 * while FBC is locked. This check here is just to prevent us from 1420 * unnecessarily scheduling the work, and it relies on the fact that we 1421 * never switch underrun_detect back to false after it's true. */ 1422 if (READ_ONCE(fbc->underrun_detected)) 1423 return; 1424 1425 schedule_work(&fbc->underrun_work); 1426 } 1427 1428 /* 1429 * The DDX driver changes its behavior depending on the value it reads from 1430 * i915.enable_fbc, so sanitize it by translating the default value into either 1431 * 0 or 1 in order to allow it to know what's going on. 1432 * 1433 * Notice that this is done at driver initialization and we still allow user 1434 * space to change the value during runtime without sanitizing it again. IGT 1435 * relies on being able to change i915.enable_fbc at runtime. 1436 */ 1437 static int intel_sanitize_fbc_option(struct drm_i915_private *dev_priv) 1438 { 1439 if (dev_priv->params.enable_fbc >= 0) 1440 return !!dev_priv->params.enable_fbc; 1441 1442 if (!HAS_FBC(dev_priv)) 1443 return 0; 1444 1445 if (IS_BROADWELL(dev_priv) || DISPLAY_VER(dev_priv) >= 9) 1446 return 1; 1447 1448 return 0; 1449 } 1450 1451 static bool need_fbc_vtd_wa(struct drm_i915_private *dev_priv) 1452 { 1453 /* WaFbcTurnOffFbcWhenHyperVisorIsUsed:skl,bxt */ 1454 if (intel_vtd_active() && 1455 (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))) { 1456 drm_info(&dev_priv->drm, 1457 "Disabling framebuffer compression (FBC) to prevent screen flicker with VT-d enabled\n"); 1458 return true; 1459 } 1460 1461 return false; 1462 } 1463 1464 /** 1465 * intel_fbc_init - Initialize FBC 1466 * @dev_priv: the i915 device 1467 * 1468 * This function might be called during PM init process. 1469 */ 1470 void intel_fbc_init(struct drm_i915_private *dev_priv) 1471 { 1472 struct intel_fbc *fbc = &dev_priv->fbc; 1473 1474 INIT_WORK(&fbc->underrun_work, intel_fbc_underrun_work_fn); 1475 mutex_init(&fbc->lock); 1476 fbc->active = false; 1477 1478 if (!drm_mm_initialized(&dev_priv->mm.stolen)) 1479 mkwrite_device_info(dev_priv)->display.has_fbc = false; 1480 1481 if (need_fbc_vtd_wa(dev_priv)) 1482 mkwrite_device_info(dev_priv)->display.has_fbc = false; 1483 1484 dev_priv->params.enable_fbc = intel_sanitize_fbc_option(dev_priv); 1485 drm_dbg_kms(&dev_priv->drm, "Sanitized enable_fbc value: %d\n", 1486 dev_priv->params.enable_fbc); 1487 1488 if (!HAS_FBC(dev_priv)) { 1489 fbc->no_fbc_reason = "unsupported by this chipset"; 1490 return; 1491 } 1492 1493 /* We still don't have any sort of hardware state readout for FBC, so 1494 * deactivate it in case the BIOS activated it to make sure software 1495 * matches the hardware state. */ 1496 if (intel_fbc_hw_is_active(dev_priv)) 1497 intel_fbc_hw_deactivate(dev_priv); 1498 } 1499