intel_fbc.c 44.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * Copyright © 2014 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

R
Rodrigo Vivi 已提交
24 25 26 27 28 29
/**
 * DOC: Frame Buffer Compression (FBC)
 *
 * FBC tries to save memory bandwidth (and so power consumption) by
 * compressing the amount of memory used by the display. It is total
 * transparent to user space and completely handled in the kernel.
30 31
 *
 * The benefits of FBC are mostly visible with solid backgrounds and
R
Rodrigo Vivi 已提交
32 33
 * variation-less patterns. It comes from keeping the memory footprint small
 * and having fewer memory pages opened and accessed for refreshing the display.
34
 *
R
Rodrigo Vivi 已提交
35 36 37 38
 * i915 is responsible to reserve stolen memory for FBC and configure its
 * offset on proper registers. The hardware takes care of all
 * compress/decompress. However there are many known cases where we have to
 * forcibly disable it to allow proper screen updates.
39 40
 */

41 42
#include <drm/drm_fourcc.h>

R
Rodrigo Vivi 已提交
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"
R
Rodrigo Vivi 已提交
50

51 52 53 54 55
/*
 * For SKL+, the plane source size used by the hardware is based on the value we
 * write to the PLANE_SIZE register. For BDW-, the hardware looks at the value
 * we wrote to PIPESRC.
 */
56
static void intel_fbc_get_plane_source_size(const struct intel_fbc_state_cache *cache,
57 58 59
					    int *width, int *height)
{
	if (width)
60
		*width = cache->plane.src_w;
61
	if (height)
62
		*height = cache->plane.src_h;
63 64
}

65 66
/* plane stride in pixels */
static unsigned int intel_fbc_plane_stride(const struct intel_plane_state *plane_state)
67
{
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
	const struct drm_framebuffer *fb = plane_state->hw.fb;
	unsigned int stride;

	stride = plane_state->view.color_plane[0].stride;
	if (!drm_rotation_90_or_270(plane_state->hw.rotation))
		stride /= fb->format->cpp[0];

	return stride;
}

/* plane stride based cfb stride in bytes, assuming 1:1 compression limit */
static unsigned int _intel_fbc_cfb_stride(const struct intel_fbc_state_cache *cache)
{
	unsigned int cpp = 4; /* FBC always 4 bytes per pixel */

	return cache->fb.stride * cpp;
}

/* minimum acceptable cfb stride in bytes, assuming 1:1 compression limit */
static unsigned int skl_fbc_min_cfb_stride(const struct intel_fbc_state_cache *cache)
{
	unsigned int limit = 4; /* 1:4 compression limit is the worst case */
	unsigned int cpp = 4; /* FBC always 4 bytes per pixel */
	unsigned int height = 4; /* FBC segment is 4 lines */
	unsigned int stride;

	/* minimum segment stride we can use */
	stride = cache->plane.src_w * cpp * height / limit;

	/*
	 * At least some of the platforms require each 4 line segment to
	 * be 512 byte aligned. Just do it always for simplicity.
	 */
	stride = ALIGN(stride, 512);

	/* convert back to single line equivalent with 1:1 compression limit */
	return stride * limit / height;
}

/* properly aligned cfb stride in bytes, assuming 1:1 compression limit */
static unsigned int intel_fbc_cfb_stride(struct drm_i915_private *i915,
					 const struct intel_fbc_state_cache *cache)
{
	unsigned int stride = _intel_fbc_cfb_stride(cache);

	/*
	 * At least some of the platforms require each 4 line segment to
	 * be 512 byte aligned. Aligning each line to 512 bytes guarantees
	 * that regardless of the compression limit we choose later.
	 */
	if (DISPLAY_VER(i915) == 9)
		return max(ALIGN(stride, 512), skl_fbc_min_cfb_stride(cache));
	else
		return stride;
}

static unsigned int intel_fbc_cfb_size(struct drm_i915_private *dev_priv,
				       const struct intel_fbc_state_cache *cache)
{
	int lines = cache->plane.src_h;
128

129
	if (DISPLAY_VER(dev_priv) == 7)
130
		lines = min(lines, 2048);
131
	else if (DISPLAY_VER(dev_priv) >= 8)
132
		lines = min(lines, 2560);
133

134
	return lines * intel_fbc_cfb_stride(dev_priv, cache);
135 136
}

137
static void i8xx_fbc_deactivate(struct drm_i915_private *dev_priv)
138 139 140 141
{
	u32 fbc_ctl;

	/* Disable compression */
142
	fbc_ctl = intel_de_read(dev_priv, FBC_CONTROL);
143 144 145 146
	if ((fbc_ctl & FBC_CTL_EN) == 0)
		return;

	fbc_ctl &= ~FBC_CTL_EN;
147
	intel_de_write(dev_priv, FBC_CONTROL, fbc_ctl);
148 149

	/* Wait for compressing bit to clear */
150 151
	if (intel_de_wait_for_clear(dev_priv, FBC_STATUS,
				    FBC_STAT_COMPRESSING, 10)) {
152
		drm_dbg_kms(&dev_priv->drm, "FBC idle timed out\n");
153 154 155 156
		return;
	}
}

157
static void i8xx_fbc_activate(struct drm_i915_private *dev_priv)
158
{
159
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
160 161 162 163
	int cfb_pitch;
	int i;
	u32 fbc_ctl;

164
	/* Note: fbc.limit == 1 for i8xx */
165 166 167
	cfb_pitch = params->cfb_size / FBC_LL_SIZE;
	if (params->fb.stride < cfb_pitch)
		cfb_pitch = params->fb.stride;
168 169

	/* FBC_CTL wants 32B or 64B units */
170
	if (DISPLAY_VER(dev_priv) == 2)
171 172 173 174 175 176
		cfb_pitch = (cfb_pitch / 32) - 1;
	else
		cfb_pitch = (cfb_pitch / 64) - 1;

	/* Clear old tags */
	for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++)
177
		intel_de_write(dev_priv, FBC_TAG(i), 0);
178

179
	if (DISPLAY_VER(dev_priv) == 4) {
180 181 182
		u32 fbc_ctl2;

		/* Set it up... */
183
		fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM;
184
		fbc_ctl2 |= FBC_CTL_PLANE(params->crtc.i9xx_plane);
185 186
		if (params->fence_id >= 0)
			fbc_ctl2 |= FBC_CTL_CPU_FENCE;
187 188
		intel_de_write(dev_priv, FBC_CONTROL2, fbc_ctl2);
		intel_de_write(dev_priv, FBC_FENCE_OFF,
189
			       params->fence_y_offset);
190 191 192
	}

	/* enable it... */
193
	fbc_ctl = FBC_CTL_INTERVAL(params->interval);
194
	fbc_ctl |= FBC_CTL_EN | FBC_CTL_PERIODIC;
195
	if (IS_I945GM(dev_priv))
196
		fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */
197
	fbc_ctl |= FBC_CTL_STRIDE(cfb_pitch & 0xff);
198
	if (params->fence_id >= 0)
199
		fbc_ctl |= FBC_CTL_FENCENO(params->fence_id);
200
	intel_de_write(dev_priv, FBC_CONTROL, fbc_ctl);
201 202
}

203
static bool i8xx_fbc_is_active(struct drm_i915_private *dev_priv)
204
{
205
	return intel_de_read(dev_priv, FBC_CONTROL) & FBC_CTL_EN;
206 207
}

208 209
static u32 g4x_dpfc_ctl_limit(struct drm_i915_private *i915)
{
210
	switch (i915->fbc.limit) {
211
	default:
212
		MISSING_CASE(i915->fbc.limit);
213 214 215 216 217 218 219 220 221 222
		fallthrough;
	case 1:
		return DPFC_CTL_LIMIT_1X;
	case 2:
		return DPFC_CTL_LIMIT_2X;
	case 4:
		return DPFC_CTL_LIMIT_4X;
	}
}

223
static void g4x_fbc_activate(struct drm_i915_private *dev_priv)
224
{
225
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
226 227
	u32 dpfc_ctl;

228
	dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane) | DPFC_SR_EN;
229 230

	dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv);
231

232 233
	if (params->fence_id >= 0) {
		dpfc_ctl |= DPFC_CTL_FENCE_EN | params->fence_id;
234
		intel_de_write(dev_priv, DPFC_FENCE_YOFF,
235
			       params->fence_y_offset);
236
	} else {
237
		intel_de_write(dev_priv, DPFC_FENCE_YOFF, 0);
238
	}
239 240

	/* enable it... */
241
	intel_de_write(dev_priv, DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
242 243
}

244
static void g4x_fbc_deactivate(struct drm_i915_private *dev_priv)
245 246 247 248
{
	u32 dpfc_ctl;

	/* Disable compression */
249
	dpfc_ctl = intel_de_read(dev_priv, DPFC_CONTROL);
250 251
	if (dpfc_ctl & DPFC_CTL_EN) {
		dpfc_ctl &= ~DPFC_CTL_EN;
252
		intel_de_write(dev_priv, DPFC_CONTROL, dpfc_ctl);
253 254 255
	}
}

256
static bool g4x_fbc_is_active(struct drm_i915_private *dev_priv)
257
{
258
	return intel_de_read(dev_priv, DPFC_CONTROL) & DPFC_CTL_EN;
259 260
}

261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
static void i8xx_fbc_recompress(struct drm_i915_private *dev_priv)
{
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
	enum i9xx_plane_id i9xx_plane = params->crtc.i9xx_plane;

	spin_lock_irq(&dev_priv->uncore.lock);
	intel_de_write_fw(dev_priv, DSPADDR(i9xx_plane),
			  intel_de_read_fw(dev_priv, DSPADDR(i9xx_plane)));
	spin_unlock_irq(&dev_priv->uncore.lock);
}

static void i965_fbc_recompress(struct drm_i915_private *dev_priv)
{
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
	enum i9xx_plane_id i9xx_plane = params->crtc.i9xx_plane;

	spin_lock_irq(&dev_priv->uncore.lock);
	intel_de_write_fw(dev_priv, DSPSURF(i9xx_plane),
			  intel_de_read_fw(dev_priv, DSPSURF(i9xx_plane)));
	spin_unlock_irq(&dev_priv->uncore.lock);
}

283
/* This function forces a CFB recompression through the nuke operation. */
284
static void snb_fbc_recompress(struct drm_i915_private *dev_priv)
285
{
286 287
	intel_de_write(dev_priv, MSG_FBC_REND_STATE, FBC_REND_NUKE);
	intel_de_posting_read(dev_priv, MSG_FBC_REND_STATE);
288 289
}

290 291
static void intel_fbc_recompress(struct drm_i915_private *dev_priv)
{
292 293 294 295
	struct intel_fbc *fbc = &dev_priv->fbc;

	trace_intel_fbc_nuke(fbc->crtc);

296
	if (DISPLAY_VER(dev_priv) >= 6)
297
		snb_fbc_recompress(dev_priv);
298
	else if (DISPLAY_VER(dev_priv) >= 4)
299 300 301 302 303
		i965_fbc_recompress(dev_priv);
	else
		i8xx_fbc_recompress(dev_priv);
}

304
static void ilk_fbc_activate(struct drm_i915_private *dev_priv)
305
{
306
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
307 308
	u32 dpfc_ctl;

309
	dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane);
310

311
	dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv);
312

313
	if (params->fence_id >= 0) {
314
		dpfc_ctl |= DPFC_CTL_FENCE_EN;
315
		if (IS_IRONLAKE(dev_priv))
316
			dpfc_ctl |= params->fence_id;
317
		if (IS_SANDYBRIDGE(dev_priv)) {
318 319 320
			intel_de_write(dev_priv, SNB_DPFC_CTL_SA,
				       SNB_CPU_FENCE_ENABLE | params->fence_id);
			intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET,
321
				       params->fence_y_offset);
322 323
		}
	} else {
324
		if (IS_SANDYBRIDGE(dev_priv)) {
325 326
			intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 0);
			intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 0);
327 328
		}
	}
329

330
	intel_de_write(dev_priv, ILK_DPFC_FENCE_YOFF,
331
		       params->fence_y_offset);
332
	/* enable it... */
333
	intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
334 335
}

336
static void ilk_fbc_deactivate(struct drm_i915_private *dev_priv)
337 338 339 340
{
	u32 dpfc_ctl;

	/* Disable compression */
341
	dpfc_ctl = intel_de_read(dev_priv, ILK_DPFC_CONTROL);
342 343
	if (dpfc_ctl & DPFC_CTL_EN) {
		dpfc_ctl &= ~DPFC_CTL_EN;
344
		intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl);
345 346 347
	}
}

348
static bool ilk_fbc_is_active(struct drm_i915_private *dev_priv)
349
{
350
	return intel_de_read(dev_priv, ILK_DPFC_CONTROL) & DPFC_CTL_EN;
351 352
}

353
static void gen7_fbc_activate(struct drm_i915_private *dev_priv)
354
{
355 356
	struct intel_fbc *fbc = &dev_priv->fbc;
	const struct intel_fbc_reg_params *params = &fbc->params;
357 358
	u32 dpfc_ctl;

359
	/* Display WA #0529: skl, kbl, bxt. */
360
	if (DISPLAY_VER(dev_priv) == 9) {
361
		u32 val = 0;
362

363 364
		if (params->override_cfb_stride)
			val |= CHICKEN_FBC_STRIDE_OVERRIDE |
365
				CHICKEN_FBC_STRIDE(params->override_cfb_stride / fbc->limit);
366

367 368 369
		intel_de_rmw(dev_priv, CHICKEN_MISC_4,
			     CHICKEN_FBC_STRIDE_OVERRIDE |
			     CHICKEN_FBC_STRIDE_MASK, val);
370 371
	}

372
	dpfc_ctl = 0;
373
	if (IS_IVYBRIDGE(dev_priv))
374
		dpfc_ctl |= IVB_DPFC_CTL_PLANE(params->crtc.i9xx_plane);
375

376
	dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv);
377

378
	if (params->fence_id >= 0) {
379
		dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN;
380 381 382
		intel_de_write(dev_priv, SNB_DPFC_CTL_SA,
			       SNB_CPU_FENCE_ENABLE | params->fence_id);
		intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET,
383
			       params->fence_y_offset);
384
	} else if (dev_priv->ggtt.num_fences) {
385 386
		intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 0);
		intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 0);
387
	}
388 389 390 391

	if (dev_priv->fbc.false_color)
		dpfc_ctl |= FBC_CTL_FALSE_COLOR;

392
	intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
393 394
}

395 396
static bool intel_fbc_hw_is_active(struct drm_i915_private *dev_priv)
{
397
	if (DISPLAY_VER(dev_priv) >= 5)
398 399 400 401 402 403 404 405 406
		return ilk_fbc_is_active(dev_priv);
	else if (IS_GM45(dev_priv))
		return g4x_fbc_is_active(dev_priv);
	else
		return i8xx_fbc_is_active(dev_priv);
}

static void intel_fbc_hw_activate(struct drm_i915_private *dev_priv)
{
407 408
	struct intel_fbc *fbc = &dev_priv->fbc;

409 410
	trace_intel_fbc_activate(fbc->crtc);

411
	fbc->active = true;
412
	fbc->activated = true;
413

414
	if (DISPLAY_VER(dev_priv) >= 7)
415
		gen7_fbc_activate(dev_priv);
416
	else if (DISPLAY_VER(dev_priv) >= 5)
417 418 419 420 421 422 423 424 425
		ilk_fbc_activate(dev_priv);
	else if (IS_GM45(dev_priv))
		g4x_fbc_activate(dev_priv);
	else
		i8xx_fbc_activate(dev_priv);
}

static void intel_fbc_hw_deactivate(struct drm_i915_private *dev_priv)
{
426 427
	struct intel_fbc *fbc = &dev_priv->fbc;

428 429
	trace_intel_fbc_deactivate(fbc->crtc);

430 431
	fbc->active = false;

432
	if (DISPLAY_VER(dev_priv) >= 5)
433 434 435 436 437 438 439
		ilk_fbc_deactivate(dev_priv);
	else if (IS_GM45(dev_priv))
		g4x_fbc_deactivate(dev_priv);
	else
		i8xx_fbc_deactivate(dev_priv);
}

R
Rodrigo Vivi 已提交
440
/**
441
 * intel_fbc_is_active - Is FBC active?
442
 * @dev_priv: i915 device instance
R
Rodrigo Vivi 已提交
443 444
 *
 * This function is used to verify the current state of FBC.
D
Daniel Vetter 已提交
445
 *
R
Rodrigo Vivi 已提交
446
 * FIXME: This should be tracked in the plane config eventually
D
Daniel Vetter 已提交
447
 * instead of queried at runtime for most callers.
R
Rodrigo Vivi 已提交
448
 */
449
bool intel_fbc_is_active(struct drm_i915_private *dev_priv)
450
{
451
	return dev_priv->fbc.active;
452 453
}

454 455 456 457 458 459
static void intel_fbc_activate(struct drm_i915_private *dev_priv)
{
	intel_fbc_hw_activate(dev_priv);
	intel_fbc_recompress(dev_priv);
}

460 461
static void intel_fbc_deactivate(struct drm_i915_private *dev_priv,
				 const char *reason)
P
Paulo Zanoni 已提交
462
{
463 464
	struct intel_fbc *fbc = &dev_priv->fbc;

465
	drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock));
P
Paulo Zanoni 已提交
466

467
	if (fbc->active)
468
		intel_fbc_hw_deactivate(dev_priv);
469 470

	fbc->no_fbc_reason = reason;
471 472
}

473 474
static u64 intel_fbc_cfb_base_max(struct drm_i915_private *i915)
{
475
	if (DISPLAY_VER(i915) >= 5 || IS_G4X(i915))
476 477 478 479 480
		return BIT_ULL(28);
	else
		return BIT_ULL(32);
}

481
static u64 intel_fbc_stolen_end(struct drm_i915_private *dev_priv)
482
{
483 484 485 486 487 488
	u64 end;

	/* The FBC hardware for BDW/SKL doesn't have access to the stolen
	 * reserved range size, so it always assumes the maximum (8mb) is used.
	 * If we enable FBC using a CFB on that memory range we'll get FIFO
	 * underruns, even if that range is not reserved by the BIOS. */
489
	if (IS_BROADWELL(dev_priv) || (DISPLAY_VER(dev_priv) == 9 &&
490
				       !IS_BROXTON(dev_priv)))
491
		end = resource_size(&dev_priv->dsm) - 8 * 1024 * 1024;
492
	else
493
		end = U64_MAX;
494

495 496 497
	return min(end, intel_fbc_cfb_base_max(dev_priv));
}

498 499 500 501 502 503
static int intel_fbc_min_limit(int fb_cpp)
{
	return fb_cpp == 2 ? 2 : 1;
}

static int intel_fbc_max_limit(struct drm_i915_private *dev_priv)
504 505 506 507 508 509 510 511 512 513 514 515 516
{
	/*
	 * FIXME: FBC1 can have arbitrary cfb stride,
	 * so we could support different compression ratios.
	 */
	if (DISPLAY_VER(dev_priv) < 5 && !IS_G4X(dev_priv))
		return 1;

	/* WaFbcOnly1to1Ratio:ctg */
	if (IS_G4X(dev_priv))
		return 1;

	/* FBC2 can only do 1:1, 1:2, 1:4 */
517
	return 4;
518 519
}

520
static int find_compression_limit(struct drm_i915_private *dev_priv,
521
				  unsigned int size, int min_limit)
522 523 524
{
	struct intel_fbc *fbc = &dev_priv->fbc;
	u64 end = intel_fbc_stolen_end(dev_priv);
525 526 527
	int ret, limit = min_limit;

	size /= limit;
528 529

	/* Try to over-allocate to reduce reallocations and fragmentation. */
530 531
	ret = i915_gem_stolen_insert_node_in_range(dev_priv, &fbc->compressed_fb,
						   size <<= 1, 4096, 0, end);
532
	if (ret == 0)
533
		return limit;
534

535
	for (; limit <= intel_fbc_max_limit(dev_priv); limit <<= 1) {
536 537 538 539
		ret = i915_gem_stolen_insert_node_in_range(dev_priv, &fbc->compressed_fb,
							   size >>= 1, 4096, 0, end);
		if (ret == 0)
			return limit;
540
	}
541 542

	return 0;
543 544
}

545
static int intel_fbc_alloc_cfb(struct drm_i915_private *dev_priv,
546
			       unsigned int size, int min_limit)
547
{
548
	struct intel_fbc *fbc = &dev_priv->fbc;
549
	int ret;
550

551 552
	drm_WARN_ON(&dev_priv->drm,
		    drm_mm_node_allocated(&fbc->compressed_fb));
553 554
	drm_WARN_ON(&dev_priv->drm,
		    drm_mm_node_allocated(&fbc->compressed_llb));
555

556 557 558 559 560 561 562
	if (DISPLAY_VER(dev_priv) < 5 && !IS_G4X(dev_priv)) {
		ret = i915_gem_stolen_insert_node(dev_priv, &fbc->compressed_llb,
						  4096, 4096);
		if (ret)
			goto err;
	}

563
	ret = find_compression_limit(dev_priv, size, min_limit);
564 565
	if (!ret)
		goto err_llb;
566
	else if (ret > min_limit)
567 568
		drm_info_once(&dev_priv->drm,
			      "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");
569

570
	fbc->limit = ret;
571

572
	drm_dbg_kms(&dev_priv->drm,
573 574
		    "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n",
		    fbc->compressed_fb.size, fbc->limit);
575 576 577 578

	return 0;

err_llb:
579 580
	if (drm_mm_node_allocated(&fbc->compressed_llb))
		i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_llb);
581
err:
582
	if (drm_mm_initialized(&dev_priv->mm.stolen))
583
		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);
584 585 586
	return -ENOSPC;
}

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
static void intel_fbc_program_cfb(struct drm_i915_private *dev_priv)
{
	struct intel_fbc *fbc = &dev_priv->fbc;

	if (DISPLAY_VER(dev_priv) >= 5) {
		intel_de_write(dev_priv, ILK_DPFC_CB_BASE,
			       fbc->compressed_fb.start);
	} else if (IS_GM45(dev_priv)) {
		intel_de_write(dev_priv, DPFC_CB_BASE,
			       fbc->compressed_fb.start);
	} else {
		GEM_BUG_ON(range_overflows_end_t(u64, dev_priv->dsm.start,
						 fbc->compressed_fb.start,
						 U32_MAX));
		GEM_BUG_ON(range_overflows_end_t(u64, dev_priv->dsm.start,
602
						 fbc->compressed_llb.start,
603 604 605 606 607
						 U32_MAX));

		intel_de_write(dev_priv, FBC_CFB_BASE,
			       dev_priv->dsm.start + fbc->compressed_fb.start);
		intel_de_write(dev_priv, FBC_LL_BASE,
608
			       dev_priv->dsm.start + fbc->compressed_llb.start);
609 610 611
	}
}

612
static void __intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv)
613
{
614 615
	struct intel_fbc *fbc = &dev_priv->fbc;

616 617 618
	if (WARN_ON(intel_fbc_hw_is_active(dev_priv)))
		return;

619 620 621 622
	if (drm_mm_node_allocated(&fbc->compressed_llb))
		i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_llb);
	if (drm_mm_node_allocated(&fbc->compressed_fb))
		i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb);
623 624
}

625
void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv)
P
Paulo Zanoni 已提交
626
{
627 628
	struct intel_fbc *fbc = &dev_priv->fbc;

629
	if (!HAS_FBC(dev_priv))
630 631
		return;

632
	mutex_lock(&fbc->lock);
633
	__intel_fbc_cleanup_cfb(dev_priv);
634
	mutex_unlock(&fbc->lock);
P
Paulo Zanoni 已提交
635 636
}

637
static bool stride_is_valid(struct drm_i915_private *dev_priv,
638
			    u64 modifier, unsigned int stride)
639
{
640
	/* This should have been caught earlier. */
641
	if (drm_WARN_ON_ONCE(&dev_priv->drm, (stride & (64 - 1)) != 0))
642
		return false;
643 644

	/* Below are the additional FBC restrictions. */
645 646
	if (stride < 512)
		return false;
647

648
	if (DISPLAY_VER(dev_priv) == 2 || DISPLAY_VER(dev_priv) == 3)
649 650
		return stride == 4096 || stride == 8192;

651
	if (DISPLAY_VER(dev_priv) == 4 && !IS_G4X(dev_priv) && stride < 2048)
652 653
		return false;

654
	/* Display WA #1105: skl,bxt,kbl,cfl,glk */
655
	if ((DISPLAY_VER(dev_priv) == 9 || IS_GEMINILAKE(dev_priv)) &&
656 657 658
	    modifier == DRM_FORMAT_MOD_LINEAR && stride & 511)
		return false;

659 660 661 662 663 664
	if (stride > 16384)
		return false;

	return true;
}

665
static bool pixel_format_is_valid(struct drm_i915_private *dev_priv,
666
				  u32 pixel_format)
667
{
668
	switch (pixel_format) {
669 670 671 672 673 674
	case DRM_FORMAT_XRGB8888:
	case DRM_FORMAT_XBGR8888:
		return true;
	case DRM_FORMAT_XRGB1555:
	case DRM_FORMAT_RGB565:
		/* 16bpp not supported on gen2 */
675
		if (DISPLAY_VER(dev_priv) == 2)
676 677 678 679 680 681 682 683 684 685
			return false;
		/* WaFbcOnly1to1Ratio:ctg */
		if (IS_G4X(dev_priv))
			return false;
		return true;
	default:
		return false;
	}
}

686 687 688
static bool rotation_is_valid(struct drm_i915_private *dev_priv,
			      u32 pixel_format, unsigned int rotation)
{
689
	if (DISPLAY_VER(dev_priv) >= 9 && pixel_format == DRM_FORMAT_RGB565 &&
690 691
	    drm_rotation_90_or_270(rotation))
		return false;
692
	else if (DISPLAY_VER(dev_priv) <= 4 && !IS_G4X(dev_priv) &&
693 694 695 696 697 698
		 rotation != DRM_MODE_ROTATE_0)
		return false;

	return true;
}

699 700 701
/*
 * For some reason, the hardware tracking starts looking at whatever we
 * programmed as the display plane base address register. It does not look at
702 703
 * the X and Y offset registers. That's why we include the src x/y offsets
 * instead of just looking at the plane size.
704 705
 */
static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc)
706
{
707
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
708
	struct intel_fbc *fbc = &dev_priv->fbc;
709
	unsigned int effective_w, effective_h, max_w, max_h;
710

711
	if (DISPLAY_VER(dev_priv) >= 10) {
712 713
		max_w = 5120;
		max_h = 4096;
714
	} else if (DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv)) {
715 716
		max_w = 4096;
		max_h = 4096;
717
	} else if (IS_G4X(dev_priv) || DISPLAY_VER(dev_priv) >= 5) {
718 719 720 721 722 723 724
		max_w = 4096;
		max_h = 2048;
	} else {
		max_w = 2048;
		max_h = 1536;
	}

725 726
	intel_fbc_get_plane_source_size(&fbc->state_cache, &effective_w,
					&effective_h);
727 728
	effective_w += fbc->state_cache.plane.adjusted_x;
	effective_h += fbc->state_cache.plane.adjusted_y;
729 730

	return effective_w <= max_w && effective_h <= max_h;
731 732
}

733
static bool tiling_is_valid(struct drm_i915_private *dev_priv,
734
			    u64 modifier)
735 736 737 738
{
	switch (modifier) {
	case DRM_FORMAT_MOD_LINEAR:
	case I915_FORMAT_MOD_Y_TILED:
739 740
		return DISPLAY_VER(dev_priv) >= 9;
	case I915_FORMAT_MOD_X_TILED:
741 742 743 744 745 746
		return true;
	default:
		return false;
	}
}

747
static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
748 749
					 const struct intel_crtc_state *crtc_state,
					 const struct intel_plane_state *plane_state)
750
{
751
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
752
	struct intel_fbc *fbc = &dev_priv->fbc;
753
	struct intel_fbc_state_cache *cache = &fbc->state_cache;
754
	struct drm_framebuffer *fb = plane_state->hw.fb;
755

756 757 758
	cache->plane.visible = plane_state->uapi.visible;
	if (!cache->plane.visible)
		return;
759

760
	cache->crtc.mode_flags = crtc_state->hw.adjusted_mode.flags;
761
	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
762
		cache->crtc.hsw_bdw_pixel_rate = crtc_state->pixel_rate;
763

764
	cache->plane.rotation = plane_state->hw.rotation;
765 766 767 768 769
	/*
	 * Src coordinates are already rotated by 270 degrees for
	 * the 90/270 degree plane rotation cases (to match the
	 * GTT mapping), hence no need to account for rotation here.
	 */
770 771
	cache->plane.src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
	cache->plane.src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
772 773
	cache->plane.adjusted_x = plane_state->view.color_plane[0].x;
	cache->plane.adjusted_y = plane_state->view.color_plane[0].y;
774

775
	cache->plane.pixel_blend_mode = plane_state->hw.pixel_blend_mode;
776

777
	cache->fb.format = fb->format;
778
	cache->fb.modifier = fb->modifier;
779
	cache->fb.stride = intel_fbc_plane_stride(plane_state);
780

781 782
	/* FBC1 compression interval: arbitrary choice of 1 second */
	cache->interval = drm_mode_vrefresh(&crtc_state->hw.adjusted_mode);
783

784 785
	cache->fence_y_offset = intel_plane_fence_y_offset(plane_state);

786
	drm_WARN_ON(&dev_priv->drm, plane_state->flags & PLANE_HAS_FENCE &&
787
		    !plane_state->ggtt_vma->fence);
788 789

	if (plane_state->flags & PLANE_HAS_FENCE &&
790 791
	    plane_state->ggtt_vma->fence)
		cache->fence_id = plane_state->ggtt_vma->fence->id;
792 793
	else
		cache->fence_id = -1;
794 795

	cache->psr2_active = crtc_state->has_psr2;
796 797
}

798 799 800 801
static bool intel_fbc_cfb_size_changed(struct drm_i915_private *dev_priv)
{
	struct intel_fbc *fbc = &dev_priv->fbc;

802
	return intel_fbc_cfb_size(dev_priv, &fbc->state_cache) >
803
		fbc->compressed_fb.size * fbc->limit;
804 805
}

806 807
static u16 intel_fbc_override_cfb_stride(struct drm_i915_private *dev_priv,
					 const struct intel_fbc_state_cache *cache)
808
{
809 810
	unsigned int stride = _intel_fbc_cfb_stride(cache);
	unsigned int stride_aligned = intel_fbc_cfb_stride(dev_priv, cache);
811

812 813 814 815 816 817 818 819 820 821 822
	/*
	 * Override stride in 64 byte units per 4 line segment.
	 *
	 * Gen9 hw miscalculates cfb stride for linear as
	 * PLANE_STRIDE*512 instead of PLANE_STRIDE*64, so
	 * we always need to use the override there.
	 */
	if (stride != stride_aligned ||
	    (DISPLAY_VER(dev_priv) == 9 &&
	     cache->fb.modifier == DRM_FORMAT_MOD_LINEAR))
		return stride_aligned * 4 / 64;
823

824
	return 0;
825 826
}

827 828 829 830 831 832 833 834 835
static bool intel_fbc_can_enable(struct drm_i915_private *dev_priv)
{
	struct intel_fbc *fbc = &dev_priv->fbc;

	if (intel_vgpu_active(dev_priv)) {
		fbc->no_fbc_reason = "VGPU is active";
		return false;
	}

836
	if (!dev_priv->params.enable_fbc) {
837 838 839 840 841 842 843 844 845 846 847 848
		fbc->no_fbc_reason = "disabled per module param or by default";
		return false;
	}

	if (fbc->underrun_detected) {
		fbc->no_fbc_reason = "underrun detected";
		return false;
	}

	return true;
}

849 850
static bool intel_fbc_can_activate(struct intel_crtc *crtc)
{
851
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
852 853 854
	struct intel_fbc *fbc = &dev_priv->fbc;
	struct intel_fbc_state_cache *cache = &fbc->state_cache;

855 856 857
	if (!intel_fbc_can_enable(dev_priv))
		return false;

858 859 860 861 862
	if (!cache->plane.visible) {
		fbc->no_fbc_reason = "primary plane not visible";
		return false;
	}

863 864 865 866 867 868 869 870
	/* We don't need to use a state cache here since this information is
	 * global for all CRTC.
	 */
	if (fbc->underrun_detected) {
		fbc->no_fbc_reason = "underrun detected";
		return false;
	}

871
	if (cache->crtc.mode_flags & DRM_MODE_FLAG_INTERLACE) {
872
		fbc->no_fbc_reason = "incompatible mode";
873
		return false;
874 875
	}

876
	if (!intel_fbc_hw_tracking_covers_screen(crtc)) {
877
		fbc->no_fbc_reason = "mode too large for compression";
878
		return false;
879
	}
880

881 882 883 884 885 886
	/* The use of a CPU fence is one of two ways to detect writes by the
	 * CPU to the scanout and trigger updates to the FBC.
	 *
	 * The other method is by software tracking (see
	 * intel_fbc_invalidate/flush()), it will manually notify FBC and nuke
	 * the current compressed buffer and recompress it.
887 888
	 *
	 * Note that is possible for a tiled surface to be unmappable (and
889
	 * so have no fence associated with it) due to aperture constraints
890
	 * at the time of pinning.
891 892 893 894
	 *
	 * FIXME with 90/270 degree rotation we should use the fence on
	 * the normal GTT view (the rotated view doesn't even have a
	 * fence). Would need changes to the FBC fence Y offset as well.
895
	 * For now this will effectively disable FBC with 90/270 degree
896
	 * rotation.
897
	 */
898
	if (DISPLAY_VER(dev_priv) < 9 && cache->fence_id < 0) {
899 900
		fbc->no_fbc_reason = "framebuffer not tiled or fenced";
		return false;
901
	}
902

903 904 905 906 907
	if (!pixel_format_is_valid(dev_priv, cache->fb.format->format)) {
		fbc->no_fbc_reason = "pixel format is invalid";
		return false;
	}

908 909
	if (!rotation_is_valid(dev_priv, cache->fb.format->format,
			       cache->plane.rotation)) {
910
		fbc->no_fbc_reason = "rotation unsupported";
911
		return false;
912 913
	}

914 915 916 917 918
	if (!tiling_is_valid(dev_priv, cache->fb.modifier)) {
		fbc->no_fbc_reason = "tiling unsupported";
		return false;
	}

919 920
	if (!stride_is_valid(dev_priv, cache->fb.modifier,
			     cache->fb.stride * cache->fb.format->cpp[0])) {
921
		fbc->no_fbc_reason = "framebuffer stride not supported";
922
		return false;
923 924
	}

925 926 927 928 929 930
	if (cache->plane.pixel_blend_mode != DRM_MODE_BLEND_PIXEL_NONE &&
	    cache->fb.format->has_alpha) {
		fbc->no_fbc_reason = "per-pixel alpha blending is incompatible with FBC";
		return false;
	}

931 932
	/* WaFbcExceedCdClockThreshold:hsw,bdw */
	if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) &&
933
	    cache->crtc.hsw_bdw_pixel_rate >= dev_priv->cdclk.hw.cdclk * 95 / 100) {
934
		fbc->no_fbc_reason = "pixel rate is too big";
935
		return false;
936 937
	}

938 939 940 941 942 943 944 945 946 947
	/* It is possible for the required CFB size change without a
	 * crtc->disable + crtc->enable since it is possible to change the
	 * stride without triggering a full modeset. Since we try to
	 * over-allocate the CFB, there's a chance we may keep FBC enabled even
	 * if this happens, but if we exceed the current CFB size we'll have to
	 * disable FBC. Notice that it would be possible to disable FBC, wait
	 * for a frame, free the stolen node, then try to reenable FBC in case
	 * we didn't get any invalidate/deactivate calls, but this would require
	 * a lot of tracking just for a specific case. If we conclude it's an
	 * important case, we can implement it later. */
948
	if (intel_fbc_cfb_size_changed(dev_priv)) {
949
		fbc->no_fbc_reason = "CFB requirements changed";
950 951 952
		return false;
	}

953 954 955 956 957
	/*
	 * Work around a problem on GEN9+ HW, where enabling FBC on a plane
	 * having a Y offset that isn't divisible by 4 causes FIFO underrun
	 * and screen flicker.
	 */
958
	if (DISPLAY_VER(dev_priv) >= 9 &&
959 960 961 962 963
	    (fbc->state_cache.plane.adjusted_y & 3)) {
		fbc->no_fbc_reason = "plane Y offset is misaligned";
		return false;
	}

964
	/* Wa_22010751166: icl, ehl, tgl, dg1, rkl */
965
	if (DISPLAY_VER(dev_priv) >= 11 &&
966 967 968 969 970
	    (cache->plane.src_h + cache->plane.adjusted_y) % 4) {
		fbc->no_fbc_reason = "plane height + offset is non-modulo of 4";
		return false;
	}

971
	/*
972
	 * Display 12+ is not supporting FBC with PSR2.
973 974 975
	 * Recommendation is to keep this combination disabled
	 * Bspec: 50422 HSD: 14010260002
	 */
976
	if (fbc->state_cache.psr2_active && DISPLAY_VER(dev_priv) >= 12) {
977 978 979 980
		fbc->no_fbc_reason = "not supported with PSR2";
		return false;
	}

981 982 983
	return true;
}

984 985 986
static void intel_fbc_get_reg_params(struct intel_crtc *crtc,
				     struct intel_fbc_reg_params *params)
{
987
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
988 989
	struct intel_fbc *fbc = &dev_priv->fbc;
	struct intel_fbc_state_cache *cache = &fbc->state_cache;
990 991 992 993 994 995

	/* Since all our fields are integer types, use memset here so the
	 * comparison function can rely on memcmp because the padding will be
	 * zero. */
	memset(params, 0, sizeof(*params));

996
	params->fence_id = cache->fence_id;
997
	params->fence_y_offset = cache->fence_y_offset;
998

999 1000
	params->interval = cache->interval;

1001
	params->crtc.pipe = crtc->pipe;
V
Ville Syrjälä 已提交
1002
	params->crtc.i9xx_plane = to_intel_plane(crtc->base.primary)->i9xx_plane;
1003

1004
	params->fb.format = cache->fb.format;
1005
	params->fb.modifier = cache->fb.modifier;
1006
	params->fb.stride = cache->fb.stride;
1007

1008 1009 1010
	params->cfb_stride = intel_fbc_cfb_stride(dev_priv, cache);
	params->cfb_size = intel_fbc_cfb_size(dev_priv, cache);
	params->override_cfb_stride = intel_fbc_override_cfb_stride(dev_priv, cache);
1011 1012

	params->plane_visible = cache->plane.visible;
1013 1014
}

1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034
static bool intel_fbc_can_flip_nuke(const struct intel_crtc_state *crtc_state)
{
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
	const struct intel_fbc *fbc = &dev_priv->fbc;
	const struct intel_fbc_state_cache *cache = &fbc->state_cache;
	const struct intel_fbc_reg_params *params = &fbc->params;

	if (drm_atomic_crtc_needs_modeset(&crtc_state->uapi))
		return false;

	if (!params->plane_visible)
		return false;

	if (!intel_fbc_can_activate(crtc))
		return false;

	if (params->fb.format != cache->fb.format)
		return false;

1035 1036 1037
	if (params->fb.modifier != cache->fb.modifier)
		return false;

1038 1039 1040
	if (params->fb.stride != cache->fb.stride)
		return false;

1041
	if (params->cfb_stride != intel_fbc_cfb_stride(dev_priv, cache))
1042 1043
		return false;

1044 1045 1046 1047
	if (params->cfb_size != intel_fbc_cfb_size(dev_priv, cache))
		return false;

	if (params->override_cfb_stride != intel_fbc_override_cfb_stride(dev_priv, cache))
1048 1049 1050 1051 1052
		return false;

	return true;
}

1053 1054
bool intel_fbc_pre_update(struct intel_atomic_state *state,
			  struct intel_crtc *crtc)
1055
{
1056 1057 1058 1059 1060
	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
	const struct intel_crtc_state *crtc_state =
		intel_atomic_get_new_crtc_state(state, crtc);
	const struct intel_plane_state *plane_state =
		intel_atomic_get_new_plane_state(state, plane);
1061
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1062
	struct intel_fbc *fbc = &dev_priv->fbc;
1063
	const char *reason = "update pending";
1064
	bool need_vblank_wait = false;
1065

1066
	if (!plane->has_fbc || !plane_state)
1067 1068
		return need_vblank_wait;

1069
	mutex_lock(&fbc->lock);
1070

V
Ville Syrjälä 已提交
1071
	if (fbc->crtc != crtc)
1072
		goto unlock;
1073

1074
	intel_fbc_update_state_cache(crtc, crtc_state, plane_state);
1075
	fbc->flip_pending = true;
1076

1077
	if (!intel_fbc_can_flip_nuke(crtc_state)) {
1078
		intel_fbc_deactivate(dev_priv, reason);
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093

		/*
		 * Display WA #1198: glk+
		 * Need an extra vblank wait between FBC disable and most plane
		 * updates. Bspec says this is only needed for plane disable, but
		 * that is not true. Touching most plane registers will cause the
		 * corruption to appear. Also SKL/derivatives do not seem to be
		 * affected.
		 *
		 * TODO: could optimize this a bit by sampling the frame
		 * counter when we disable FBC (if it was already done earlier)
		 * and skipping the extra vblank wait before the plane update
		 * if at least one frame has already passed.
		 */
		if (fbc->activated &&
1094
		    DISPLAY_VER(dev_priv) >= 10)
1095 1096 1097
			need_vblank_wait = true;
		fbc->activated = false;
	}
1098 1099
unlock:
	mutex_unlock(&fbc->lock);
1100 1101

	return need_vblank_wait;
1102 1103
}

1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
/**
 * __intel_fbc_disable - disable FBC
 * @dev_priv: i915 device instance
 *
 * This is the low level function that actually disables FBC. Callers should
 * grab the FBC lock.
 */
static void __intel_fbc_disable(struct drm_i915_private *dev_priv)
{
	struct intel_fbc *fbc = &dev_priv->fbc;
	struct intel_crtc *crtc = fbc->crtc;

1116 1117 1118
	drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock));
	drm_WARN_ON(&dev_priv->drm, !fbc->crtc);
	drm_WARN_ON(&dev_priv->drm, fbc->active);
1119

1120 1121
	drm_dbg_kms(&dev_priv->drm, "Disabling FBC on pipe %c\n",
		    pipe_name(crtc->pipe));
1122 1123 1124 1125 1126 1127

	__intel_fbc_cleanup_cfb(dev_priv);

	fbc->crtc = NULL;
}

1128
static void __intel_fbc_post_update(struct intel_crtc *crtc)
1129
{
1130
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1131 1132
	struct intel_fbc *fbc = &dev_priv->fbc;

1133
	drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock));
1134

V
Ville Syrjälä 已提交
1135
	if (fbc->crtc != crtc)
1136 1137
		return;

1138 1139
	fbc->flip_pending = false;

1140
	if (!dev_priv->params.enable_fbc) {
1141 1142 1143 1144 1145 1146
		intel_fbc_deactivate(dev_priv, "disabled at runtime per module param");
		__intel_fbc_disable(dev_priv);

		return;
	}

1147
	intel_fbc_get_reg_params(crtc, &fbc->params);
1148

1149
	if (!intel_fbc_can_activate(crtc))
1150 1151
		return;

1152
	if (!fbc->busy_bits)
1153
		intel_fbc_activate(dev_priv);
1154
	else
1155
		intel_fbc_deactivate(dev_priv, "frontbuffer write");
P
Paulo Zanoni 已提交
1156 1157
}

1158 1159
void intel_fbc_post_update(struct intel_atomic_state *state,
			   struct intel_crtc *crtc)
P
Paulo Zanoni 已提交
1160
{
1161
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1162 1163 1164
	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
	const struct intel_plane_state *plane_state =
		intel_atomic_get_new_plane_state(state, plane);
1165
	struct intel_fbc *fbc = &dev_priv->fbc;
1166

1167
	if (!plane->has_fbc || !plane_state)
1168 1169
		return;

1170
	mutex_lock(&fbc->lock);
1171
	__intel_fbc_post_update(crtc);
1172
	mutex_unlock(&fbc->lock);
1173 1174
}

1175 1176
static unsigned int intel_fbc_get_frontbuffer_bit(struct intel_fbc *fbc)
{
V
Ville Syrjälä 已提交
1177
	if (fbc->crtc)
1178 1179 1180 1181 1182
		return to_intel_plane(fbc->crtc->base.primary)->frontbuffer_bit;
	else
		return fbc->possible_framebuffer_bits;
}

1183 1184 1185 1186
void intel_fbc_invalidate(struct drm_i915_private *dev_priv,
			  unsigned int frontbuffer_bits,
			  enum fb_op_origin origin)
{
1187
	struct intel_fbc *fbc = &dev_priv->fbc;
1188

1189
	if (!HAS_FBC(dev_priv))
1190 1191
		return;

1192
	if (origin == ORIGIN_FLIP)
1193 1194
		return;

1195
	mutex_lock(&fbc->lock);
P
Paulo Zanoni 已提交
1196

1197
	fbc->busy_bits |= intel_fbc_get_frontbuffer_bit(fbc) & frontbuffer_bits;
1198

V
Ville Syrjälä 已提交
1199
	if (fbc->crtc && fbc->busy_bits)
1200
		intel_fbc_deactivate(dev_priv, "frontbuffer write");
P
Paulo Zanoni 已提交
1201

1202
	mutex_unlock(&fbc->lock);
1203 1204 1205
}

void intel_fbc_flush(struct drm_i915_private *dev_priv,
1206
		     unsigned int frontbuffer_bits, enum fb_op_origin origin)
1207
{
1208 1209
	struct intel_fbc *fbc = &dev_priv->fbc;

1210
	if (!HAS_FBC(dev_priv))
1211 1212
		return;

1213
	mutex_lock(&fbc->lock);
1214

1215
	fbc->busy_bits &= ~frontbuffer_bits;
1216

1217
	if (origin == ORIGIN_FLIP)
1218 1219
		goto out;

V
Ville Syrjälä 已提交
1220
	if (!fbc->busy_bits && fbc->crtc &&
1221
	    (frontbuffer_bits & intel_fbc_get_frontbuffer_bit(fbc))) {
1222
		if (fbc->active)
1223
			intel_fbc_recompress(dev_priv);
1224
		else if (!fbc->flip_pending)
1225
			__intel_fbc_post_update(fbc->crtc);
1226
	}
P
Paulo Zanoni 已提交
1227

1228
out:
1229
	mutex_unlock(&fbc->lock);
1230 1231
}

1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244
/**
 * intel_fbc_choose_crtc - select a CRTC to enable FBC on
 * @dev_priv: i915 device instance
 * @state: the atomic state structure
 *
 * This function looks at the proposed state for CRTCs and planes, then chooses
 * which pipe is going to have FBC by setting intel_crtc_state->enable_fbc to
 * true.
 *
 * Later, intel_fbc_enable is going to look for state->enable_fbc and then maybe
 * enable FBC for the chosen CRTC. If it does, it will set dev_priv->fbc.crtc.
 */
void intel_fbc_choose_crtc(struct drm_i915_private *dev_priv,
1245
			   struct intel_atomic_state *state)
1246 1247
{
	struct intel_fbc *fbc = &dev_priv->fbc;
1248 1249
	struct intel_plane *plane;
	struct intel_plane_state *plane_state;
1250
	bool crtc_chosen = false;
1251
	int i;
1252 1253 1254

	mutex_lock(&fbc->lock);

1255 1256
	/* Does this atomic commit involve the CRTC currently tied to FBC? */
	if (fbc->crtc &&
1257
	    !intel_atomic_get_new_crtc_state(state, fbc->crtc))
1258 1259
		goto out;

1260 1261 1262
	if (!intel_fbc_can_enable(dev_priv))
		goto out;

1263 1264 1265 1266
	/* Simply choose the first CRTC that is compatible and has a visible
	 * plane. We could go for fancier schemes such as checking the plane
	 * size, but this would just affect the few platforms that don't tie FBC
	 * to pipe or plane A. */
1267 1268
	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
		struct intel_crtc_state *crtc_state;
1269
		struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc);
1270

1271
		if (!plane->has_fbc)
1272 1273
			continue;

1274
		if (!plane_state->uapi.visible)
1275 1276
			continue;

1277
		crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
1278

1279
		crtc_state->enable_fbc = true;
1280
		crtc_chosen = true;
1281
		break;
1282 1283
	}

1284 1285 1286
	if (!crtc_chosen)
		fbc->no_fbc_reason = "no suitable CRTC for FBC";

1287 1288 1289 1290
out:
	mutex_unlock(&fbc->lock);
}

1291 1292 1293
/**
 * intel_fbc_enable: tries to enable FBC on the CRTC
 * @crtc: the CRTC
1294
 * @state: corresponding &drm_crtc_state for @crtc
1295
 *
1296
 * This function checks if the given CRTC was chosen for FBC, then enables it if
1297 1298 1299
 * possible. Notice that it doesn't activate FBC. It is valid to call
 * intel_fbc_enable multiple times for the same pipe without an
 * intel_fbc_disable in the middle, as long as it is deactivated.
1300
 */
1301 1302
static void intel_fbc_enable(struct intel_atomic_state *state,
			     struct intel_crtc *crtc)
1303
{
1304
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1305 1306 1307 1308 1309
	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
	const struct intel_crtc_state *crtc_state =
		intel_atomic_get_new_crtc_state(state, crtc);
	const struct intel_plane_state *plane_state =
		intel_atomic_get_new_plane_state(state, plane);
1310
	struct intel_fbc *fbc = &dev_priv->fbc;
1311
	struct intel_fbc_state_cache *cache = &fbc->state_cache;
1312
	int min_limit;
1313

1314
	if (!plane->has_fbc || !plane_state)
1315 1316
		return;

1317 1318 1319
	min_limit = intel_fbc_min_limit(plane_state->hw.fb ?
					plane_state->hw.fb->format->cpp[0] : 0);

1320
	mutex_lock(&fbc->lock);
1321

V
Ville Syrjälä 已提交
1322
	if (fbc->crtc) {
1323 1324 1325 1326 1327
		if (fbc->crtc != crtc)
			goto out;

		if (fbc->limit >= min_limit &&
		    !intel_fbc_cfb_size_changed(dev_priv))
1328
			goto out;
1329

1330 1331
		__intel_fbc_disable(dev_priv);
	}
1332

1333
	drm_WARN_ON(&dev_priv->drm, fbc->active);
1334

1335
	intel_fbc_update_state_cache(crtc, crtc_state, plane_state);
1336 1337 1338 1339 1340 1341

	/* FIXME crtc_state->enable_fbc lies :( */
	if (!cache->plane.visible)
		goto out;

	if (intel_fbc_alloc_cfb(dev_priv,
1342
				intel_fbc_cfb_size(dev_priv, cache), min_limit)) {
1343
		cache->plane.visible = false;
1344
		fbc->no_fbc_reason = "not enough stolen memory";
1345 1346 1347
		goto out;
	}

1348 1349
	drm_dbg_kms(&dev_priv->drm, "Enabling FBC on pipe %c\n",
		    pipe_name(crtc->pipe));
1350
	fbc->no_fbc_reason = "FBC enabled but not active yet\n";
1351

1352
	fbc->crtc = crtc;
1353 1354

	intel_fbc_program_cfb(dev_priv);
1355
out:
1356
	mutex_unlock(&fbc->lock);
1357 1358 1359
}

/**
1360
 * intel_fbc_disable - disable FBC if it's associated with crtc
1361 1362 1363 1364
 * @crtc: the CRTC
 *
 * This function disables FBC if it's associated with the provided CRTC.
 */
1365
void intel_fbc_disable(struct intel_crtc *crtc)
1366
{
1367
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1368
	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
1369
	struct intel_fbc *fbc = &dev_priv->fbc;
1370

1371
	if (!plane->has_fbc)
1372 1373
		return;

1374
	mutex_lock(&fbc->lock);
1375
	if (fbc->crtc == crtc)
1376
		__intel_fbc_disable(dev_priv);
1377
	mutex_unlock(&fbc->lock);
1378 1379
}

1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401
/**
 * intel_fbc_update: enable/disable FBC on the CRTC
 * @state: atomic state
 * @crtc: the CRTC
 *
 * This function checks if the given CRTC was chosen for FBC, then enables it if
 * possible. Notice that it doesn't activate FBC. It is valid to call
 * intel_fbc_update multiple times for the same pipe without an
 * intel_fbc_disable in the middle.
 */
void intel_fbc_update(struct intel_atomic_state *state,
		      struct intel_crtc *crtc)
{
	const struct intel_crtc_state *crtc_state =
		intel_atomic_get_new_crtc_state(state, crtc);

	if (crtc_state->update_pipe && !crtc_state->enable_fbc)
		intel_fbc_disable(crtc);
	else
		intel_fbc_enable(state, crtc);
}

1402
/**
1403
 * intel_fbc_global_disable - globally disable FBC
1404 1405 1406 1407
 * @dev_priv: i915 device instance
 *
 * This function disables FBC regardless of which CRTC is associated with it.
 */
1408
void intel_fbc_global_disable(struct drm_i915_private *dev_priv)
1409
{
1410 1411
	struct intel_fbc *fbc = &dev_priv->fbc;

1412
	if (!HAS_FBC(dev_priv))
1413 1414
		return;

1415
	mutex_lock(&fbc->lock);
V
Ville Syrjälä 已提交
1416
	if (fbc->crtc) {
1417
		drm_WARN_ON(&dev_priv->drm, fbc->crtc->active);
1418
		__intel_fbc_disable(dev_priv);
1419
	}
1420
	mutex_unlock(&fbc->lock);
1421 1422
}

1423 1424 1425 1426 1427 1428 1429 1430 1431
static void intel_fbc_underrun_work_fn(struct work_struct *work)
{
	struct drm_i915_private *dev_priv =
		container_of(work, struct drm_i915_private, fbc.underrun_work);
	struct intel_fbc *fbc = &dev_priv->fbc;

	mutex_lock(&fbc->lock);

	/* Maybe we were scheduled twice. */
V
Ville Syrjälä 已提交
1432
	if (fbc->underrun_detected || !fbc->crtc)
1433 1434
		goto out;

1435
	drm_dbg_kms(&dev_priv->drm, "Disabling FBC due to FIFO underrun.\n");
1436 1437
	fbc->underrun_detected = true;

1438
	intel_fbc_deactivate(dev_priv, "FIFO underrun");
1439 1440 1441 1442
out:
	mutex_unlock(&fbc->lock);
}

1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
/*
 * intel_fbc_reset_underrun - reset FBC fifo underrun status.
 * @dev_priv: i915 device instance
 *
 * See intel_fbc_handle_fifo_underrun_irq(). For automated testing we
 * want to re-enable FBC after an underrun to increase test coverage.
 */
int intel_fbc_reset_underrun(struct drm_i915_private *dev_priv)
{
	int ret;

	cancel_work_sync(&dev_priv->fbc.underrun_work);

	ret = mutex_lock_interruptible(&dev_priv->fbc.lock);
	if (ret)
		return ret;

	if (dev_priv->fbc.underrun_detected) {
1461 1462
		drm_dbg_kms(&dev_priv->drm,
			    "Re-allowing FBC after fifo underrun\n");
1463 1464 1465 1466 1467 1468 1469 1470 1471
		dev_priv->fbc.no_fbc_reason = "FIFO underrun cleared";
	}

	dev_priv->fbc.underrun_detected = false;
	mutex_unlock(&dev_priv->fbc.lock);

	return 0;
}

1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489
/**
 * intel_fbc_handle_fifo_underrun_irq - disable FBC when we get a FIFO underrun
 * @dev_priv: i915 device instance
 *
 * Without FBC, most underruns are harmless and don't really cause too many
 * problems, except for an annoying message on dmesg. With FBC, underruns can
 * become black screens or even worse, especially when paired with bad
 * watermarks. So in order for us to be on the safe side, completely disable FBC
 * in case we ever detect a FIFO underrun on any pipe. An underrun on any pipe
 * already suggests that watermarks may be bad, so try to be as safe as
 * possible.
 *
 * This function is called from the IRQ handler.
 */
void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *dev_priv)
{
	struct intel_fbc *fbc = &dev_priv->fbc;

1490
	if (!HAS_FBC(dev_priv))
1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
		return;

	/* There's no guarantee that underrun_detected won't be set to true
	 * right after this check and before the work is scheduled, but that's
	 * not a problem since we'll check it again under the work function
	 * while FBC is locked. This check here is just to prevent us from
	 * unnecessarily scheduling the work, and it relies on the fact that we
	 * never switch underrun_detect back to false after it's true. */
	if (READ_ONCE(fbc->underrun_detected))
		return;

	schedule_work(&fbc->underrun_work);
}

1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
/*
 * The DDX driver changes its behavior depending on the value it reads from
 * i915.enable_fbc, so sanitize it by translating the default value into either
 * 0 or 1 in order to allow it to know what's going on.
 *
 * Notice that this is done at driver initialization and we still allow user
 * space to change the value during runtime without sanitizing it again. IGT
 * relies on being able to change i915.enable_fbc at runtime.
 */
static int intel_sanitize_fbc_option(struct drm_i915_private *dev_priv)
{
1516 1517
	if (dev_priv->params.enable_fbc >= 0)
		return !!dev_priv->params.enable_fbc;
1518

1519 1520 1521
	if (!HAS_FBC(dev_priv))
		return 0;

1522
	if (IS_BROADWELL(dev_priv) || DISPLAY_VER(dev_priv) >= 9)
1523 1524 1525 1526 1527
		return 1;

	return 0;
}

1528 1529 1530
static bool need_fbc_vtd_wa(struct drm_i915_private *dev_priv)
{
	/* WaFbcTurnOffFbcWhenHyperVisorIsUsed:skl,bxt */
1531
	if (intel_vtd_active() &&
1532
	    (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))) {
1533 1534
		drm_info(&dev_priv->drm,
			 "Disabling framebuffer compression (FBC) to prevent screen flicker with VT-d enabled\n");
1535 1536 1537 1538 1539 1540
		return true;
	}

	return false;
}

R
Rodrigo Vivi 已提交
1541 1542 1543 1544 1545 1546
/**
 * intel_fbc_init - Initialize FBC
 * @dev_priv: the i915 device
 *
 * This function might be called during PM init process.
 */
1547 1548
void intel_fbc_init(struct drm_i915_private *dev_priv)
{
1549
	struct intel_fbc *fbc = &dev_priv->fbc;
1550

1551
	INIT_WORK(&fbc->underrun_work, intel_fbc_underrun_work_fn);
1552 1553
	mutex_init(&fbc->lock);
	fbc->active = false;
P
Paulo Zanoni 已提交
1554

1555 1556 1557
	if (!drm_mm_initialized(&dev_priv->mm.stolen))
		mkwrite_device_info(dev_priv)->display.has_fbc = false;

1558
	if (need_fbc_vtd_wa(dev_priv))
1559
		mkwrite_device_info(dev_priv)->display.has_fbc = false;
1560

1561
	dev_priv->params.enable_fbc = intel_sanitize_fbc_option(dev_priv);
1562
	drm_dbg_kms(&dev_priv->drm, "Sanitized enable_fbc value: %d\n",
1563
		    dev_priv->params.enable_fbc);
1564

1565
	if (!HAS_FBC(dev_priv)) {
1566
		fbc->no_fbc_reason = "unsupported by this chipset";
1567 1568 1569
		return;
	}

1570
	/* We still don't have any sort of hardware state readout for FBC, so
1571 1572
	 * deactivate it in case the BIOS activated it to make sure software
	 * matches the hardware state. */
1573 1574
	if (intel_fbc_hw_is_active(dev_priv))
		intel_fbc_hw_deactivate(dev_priv);
1575
}