intel_fbc.c 40.2 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_display_types.h"
47
#include "intel_fbc.h"
48
#include "intel_frontbuffer.h"
R
Rodrigo Vivi 已提交
49

50 51 52 53 54
/*
 * 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.
 */
55
static void intel_fbc_get_plane_source_size(const struct intel_fbc_state_cache *cache,
56 57 58
					    int *width, int *height)
{
	if (width)
59
		*width = cache->plane.src_w;
60
	if (height)
61
		*height = cache->plane.src_h;
62 63
}

64
static int intel_fbc_calculate_cfb_size(struct drm_i915_private *dev_priv,
65
					const struct intel_fbc_state_cache *cache)
66 67 68
{
	int lines;

69
	intel_fbc_get_plane_source_size(cache, NULL, &lines);
70
	if (IS_GEN(dev_priv, 7))
71
		lines = min(lines, 2048);
72 73
	else if (INTEL_GEN(dev_priv) >= 8)
		lines = min(lines, 2560);
74 75

	/* Hardware needs the full buffer stride, not just the active area. */
76
	return lines * cache->fb.stride;
77 78
}

79
static void i8xx_fbc_deactivate(struct drm_i915_private *dev_priv)
80 81 82 83
{
	u32 fbc_ctl;

	/* Disable compression */
84
	fbc_ctl = intel_de_read(dev_priv, FBC_CONTROL);
85 86 87 88
	if ((fbc_ctl & FBC_CTL_EN) == 0)
		return;

	fbc_ctl &= ~FBC_CTL_EN;
89
	intel_de_write(dev_priv, FBC_CONTROL, fbc_ctl);
90 91

	/* Wait for compressing bit to clear */
92 93
	if (intel_de_wait_for_clear(dev_priv, FBC_STATUS,
				    FBC_STAT_COMPRESSING, 10)) {
94
		drm_dbg_kms(&dev_priv->drm, "FBC idle timed out\n");
95 96 97 98
		return;
	}
}

99
static void i8xx_fbc_activate(struct drm_i915_private *dev_priv)
100
{
101
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
102 103 104 105
	int cfb_pitch;
	int i;
	u32 fbc_ctl;

106
	/* Note: fbc.threshold == 1 for i8xx */
107 108 109
	cfb_pitch = params->cfb_size / FBC_LL_SIZE;
	if (params->fb.stride < cfb_pitch)
		cfb_pitch = params->fb.stride;
110 111

	/* FBC_CTL wants 32B or 64B units */
112
	if (IS_GEN(dev_priv, 2))
113 114 115 116 117 118
		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++)
119
		intel_de_write(dev_priv, FBC_TAG(i), 0);
120

121
	if (IS_GEN(dev_priv, 4)) {
122 123 124
		u32 fbc_ctl2;

		/* Set it up... */
125
		fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM;
126
		fbc_ctl2 |= FBC_CTL_PLANE(params->crtc.i9xx_plane);
127 128
		if (params->fence_id >= 0)
			fbc_ctl2 |= FBC_CTL_CPU_FENCE;
129 130
		intel_de_write(dev_priv, FBC_CONTROL2, fbc_ctl2);
		intel_de_write(dev_priv, FBC_FENCE_OFF,
131
			       params->fence_y_offset);
132 133 134
	}

	/* enable it... */
135
	fbc_ctl = intel_de_read(dev_priv, FBC_CONTROL);
136 137
	fbc_ctl &= 0x3fff << FBC_CTL_INTERVAL_SHIFT;
	fbc_ctl |= FBC_CTL_EN | FBC_CTL_PERIODIC;
138
	if (IS_I945GM(dev_priv))
139 140
		fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */
	fbc_ctl |= (cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT;
141 142
	if (params->fence_id >= 0)
		fbc_ctl |= 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 void g4x_fbc_activate(struct drm_i915_private *dev_priv)
152
{
153
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
154 155
	u32 dpfc_ctl;

156
	dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane) | DPFC_SR_EN;
157
	if (params->fb.format->cpp[0] == 2)
158 159 160 161
		dpfc_ctl |= DPFC_CTL_LIMIT_2X;
	else
		dpfc_ctl |= DPFC_CTL_LIMIT_1X;

162 163
	if (params->fence_id >= 0) {
		dpfc_ctl |= DPFC_CTL_FENCE_EN | params->fence_id;
164
		intel_de_write(dev_priv, DPFC_FENCE_YOFF,
165
			       params->fence_y_offset);
166
	} else {
167
		intel_de_write(dev_priv, DPFC_FENCE_YOFF, 0);
168
	}
169 170

	/* enable it... */
171
	intel_de_write(dev_priv, DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
172 173
}

174
static void g4x_fbc_deactivate(struct drm_i915_private *dev_priv)
175 176 177 178
{
	u32 dpfc_ctl;

	/* Disable compression */
179
	dpfc_ctl = intel_de_read(dev_priv, DPFC_CONTROL);
180 181
	if (dpfc_ctl & DPFC_CTL_EN) {
		dpfc_ctl &= ~DPFC_CTL_EN;
182
		intel_de_write(dev_priv, DPFC_CONTROL, dpfc_ctl);
183 184 185
	}
}

186
static bool g4x_fbc_is_active(struct drm_i915_private *dev_priv)
187
{
188
	return intel_de_read(dev_priv, DPFC_CONTROL) & DPFC_CTL_EN;
189 190
}

191 192
/* This function forces a CFB recompression through the nuke operation. */
static void intel_fbc_recompress(struct drm_i915_private *dev_priv)
193
{
194 195 196 197
	struct intel_fbc *fbc = &dev_priv->fbc;

	trace_intel_fbc_nuke(fbc->crtc);

198 199
	intel_de_write(dev_priv, MSG_FBC_REND_STATE, FBC_REND_NUKE);
	intel_de_posting_read(dev_priv, MSG_FBC_REND_STATE);
200 201
}

202
static void ilk_fbc_activate(struct drm_i915_private *dev_priv)
203
{
204
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
205
	u32 dpfc_ctl;
206
	int threshold = dev_priv->fbc.threshold;
207

208
	dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane);
209
	if (params->fb.format->cpp[0] == 2)
210
		threshold++;
211

212
	switch (threshold) {
213 214 215 216 217 218 219 220 221 222 223
	case 4:
	case 3:
		dpfc_ctl |= DPFC_CTL_LIMIT_4X;
		break;
	case 2:
		dpfc_ctl |= DPFC_CTL_LIMIT_2X;
		break;
	case 1:
		dpfc_ctl |= DPFC_CTL_LIMIT_1X;
		break;
	}
224

225
	if (params->fence_id >= 0) {
226
		dpfc_ctl |= DPFC_CTL_FENCE_EN;
227
		if (IS_GEN(dev_priv, 5))
228
			dpfc_ctl |= params->fence_id;
229
		if (IS_GEN(dev_priv, 6)) {
230 231 232
			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,
233
				       params->fence_y_offset);
234 235
		}
	} else {
236
		if (IS_GEN(dev_priv, 6)) {
237 238
			intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 0);
			intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 0);
239 240
		}
	}
241

242
	intel_de_write(dev_priv, ILK_DPFC_FENCE_YOFF,
243
		       params->fence_y_offset);
244
	/* enable it... */
245
	intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
246

247
	intel_fbc_recompress(dev_priv);
248 249
}

250
static void ilk_fbc_deactivate(struct drm_i915_private *dev_priv)
251 252 253 254
{
	u32 dpfc_ctl;

	/* Disable compression */
255
	dpfc_ctl = intel_de_read(dev_priv, ILK_DPFC_CONTROL);
256 257
	if (dpfc_ctl & DPFC_CTL_EN) {
		dpfc_ctl &= ~DPFC_CTL_EN;
258
		intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl);
259 260 261
	}
}

262
static bool ilk_fbc_is_active(struct drm_i915_private *dev_priv)
263
{
264
	return intel_de_read(dev_priv, ILK_DPFC_CONTROL) & DPFC_CTL_EN;
265 266
}

267
static void gen7_fbc_activate(struct drm_i915_private *dev_priv)
268
{
269
	struct intel_fbc_reg_params *params = &dev_priv->fbc.params;
270
	u32 dpfc_ctl;
271
	int threshold = dev_priv->fbc.threshold;
272

273
	/* Display WA #0529: skl, kbl, bxt. */
274
	if (IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv)) {
275
		u32 val = intel_de_read(dev_priv, CHICKEN_MISC_4);
276 277 278

		val &= ~(FBC_STRIDE_OVERRIDE | FBC_STRIDE_MASK);

279
		if (params->gen9_wa_cfb_stride)
280 281
			val |= FBC_STRIDE_OVERRIDE | params->gen9_wa_cfb_stride;

282
		intel_de_write(dev_priv, CHICKEN_MISC_4, val);
283 284
	}

285
	dpfc_ctl = 0;
286
	if (IS_IVYBRIDGE(dev_priv))
287
		dpfc_ctl |= IVB_DPFC_CTL_PLANE(params->crtc.i9xx_plane);
288

289
	if (params->fb.format->cpp[0] == 2)
290
		threshold++;
291

292
	switch (threshold) {
293 294 295 296 297 298 299 300 301 302 303 304
	case 4:
	case 3:
		dpfc_ctl |= DPFC_CTL_LIMIT_4X;
		break;
	case 2:
		dpfc_ctl |= DPFC_CTL_LIMIT_2X;
		break;
	case 1:
		dpfc_ctl |= DPFC_CTL_LIMIT_1X;
		break;
	}

305
	if (params->fence_id >= 0) {
306
		dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN;
307 308 309
		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,
310
			       params->fence_y_offset);
311
	} else if (dev_priv->ggtt.num_fences) {
312 313
		intel_de_write(dev_priv, SNB_DPFC_CTL_SA, 0);
		intel_de_write(dev_priv, DPFC_CPU_FENCE_OFFSET, 0);
314
	}
315 316 317 318

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

319
	if (IS_IVYBRIDGE(dev_priv)) {
320
		/* WaFbcAsynchFlipDisableFbcQueue:ivb */
321 322
		intel_de_write(dev_priv, ILK_DISPLAY_CHICKEN1,
			       intel_de_read(dev_priv, ILK_DISPLAY_CHICKEN1) | ILK_FBCQ_DIS);
323
	} else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
324
		/* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */
325 326
		intel_de_write(dev_priv, CHICKEN_PIPESL_1(params->crtc.pipe),
			       intel_de_read(dev_priv, CHICKEN_PIPESL_1(params->crtc.pipe)) | HSW_FBCQ_DIS);
327 328
	}

329 330
	if (INTEL_GEN(dev_priv) >= 11)
		/* Wa_1409120013:icl,ehl,tgl */
331 332
		intel_de_write(dev_priv, ILK_DPFC_CHICKEN,
			       ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL);
M
Matt Roper 已提交
333

334
	intel_de_write(dev_priv, ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
335

336
	intel_fbc_recompress(dev_priv);
337 338
}

339 340
static bool intel_fbc_hw_is_active(struct drm_i915_private *dev_priv)
{
341
	if (INTEL_GEN(dev_priv) >= 5)
342 343 344 345 346 347 348 349 350
		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)
{
351 352
	struct intel_fbc *fbc = &dev_priv->fbc;

353 354
	trace_intel_fbc_activate(fbc->crtc);

355
	fbc->active = true;
356
	fbc->activated = true;
357

358
	if (INTEL_GEN(dev_priv) >= 7)
359
		gen7_fbc_activate(dev_priv);
360
	else if (INTEL_GEN(dev_priv) >= 5)
361 362 363 364 365 366 367 368 369
		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)
{
370 371
	struct intel_fbc *fbc = &dev_priv->fbc;

372 373
	trace_intel_fbc_deactivate(fbc->crtc);

374 375
	fbc->active = false;

376
	if (INTEL_GEN(dev_priv) >= 5)
377 378 379 380 381 382 383
		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 已提交
384
/**
385
 * intel_fbc_is_active - Is FBC active?
386
 * @dev_priv: i915 device instance
R
Rodrigo Vivi 已提交
387 388
 *
 * This function is used to verify the current state of FBC.
D
Daniel Vetter 已提交
389
 *
R
Rodrigo Vivi 已提交
390
 * FIXME: This should be tracked in the plane config eventually
D
Daniel Vetter 已提交
391
 * instead of queried at runtime for most callers.
R
Rodrigo Vivi 已提交
392
 */
393
bool intel_fbc_is_active(struct drm_i915_private *dev_priv)
394
{
395
	return dev_priv->fbc.active;
396 397
}

398 399
static void intel_fbc_deactivate(struct drm_i915_private *dev_priv,
				 const char *reason)
P
Paulo Zanoni 已提交
400
{
401 402
	struct intel_fbc *fbc = &dev_priv->fbc;

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

405
	if (fbc->active)
406
		intel_fbc_hw_deactivate(dev_priv);
407 408

	fbc->no_fbc_reason = reason;
409 410
}

411
static int find_compression_threshold(struct drm_i915_private *dev_priv,
412
				      struct drm_mm_node *node,
413 414
				      unsigned int size,
				      unsigned int fb_cpp)
415 416 417
{
	int compression_threshold = 1;
	int ret;
418 419 420 421 422 423
	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. */
424
	if (IS_BROADWELL(dev_priv) || IS_GEN9_BC(dev_priv))
425
		end = resource_size(&dev_priv->dsm) - 8 * 1024 * 1024;
426
	else
427
		end = U64_MAX;
428 429 430 431 432 433 434 435 436

	/* HACK: This code depends on what we will do in *_enable_fbc. If that
	 * code changes, this code needs to change as well.
	 *
	 * The enable_fbc code will attempt to use one of our 2 compression
	 * thresholds, therefore, in that case, we only have 1 resort.
	 */

	/* Try to over-allocate to reduce reallocations and fragmentation. */
437 438
	ret = i915_gem_stolen_insert_node_in_range(dev_priv, node, size <<= 1,
						   4096, 0, end);
439 440 441 442 443 444 445 446 447
	if (ret == 0)
		return compression_threshold;

again:
	/* HW's ability to limit the CFB is 1:4 */
	if (compression_threshold > 4 ||
	    (fb_cpp == 2 && compression_threshold == 2))
		return 0;

448 449
	ret = i915_gem_stolen_insert_node_in_range(dev_priv, node, size >>= 1,
						   4096, 0, end);
450
	if (ret && INTEL_GEN(dev_priv) <= 4) {
451 452 453 454 455 456 457 458 459
		return 0;
	} else if (ret) {
		compression_threshold <<= 1;
		goto again;
	} else {
		return compression_threshold;
	}
}

460 461
static int intel_fbc_alloc_cfb(struct drm_i915_private *dev_priv,
			       unsigned int size, unsigned int fb_cpp)
462
{
463
	struct intel_fbc *fbc = &dev_priv->fbc;
464
	struct drm_mm_node *uninitialized_var(compressed_llb);
465
	int ret;
466

467 468
	drm_WARN_ON(&dev_priv->drm,
		    drm_mm_node_allocated(&fbc->compressed_fb));
469

470
	ret = find_compression_threshold(dev_priv, &fbc->compressed_fb,
471 472 473 474
					 size, fb_cpp);
	if (!ret)
		goto err_llb;
	else if (ret > 1) {
475 476
		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");
477 478
	}

479
	fbc->threshold = ret;
480

481
	if (INTEL_GEN(dev_priv) >= 5)
482 483
		intel_de_write(dev_priv, ILK_DPFC_CB_BASE,
			       fbc->compressed_fb.start);
484
	else if (IS_GM45(dev_priv)) {
485 486
		intel_de_write(dev_priv, DPFC_CB_BASE,
			       fbc->compressed_fb.start);
487 488 489 490 491 492 493 494 495 496
	} else {
		compressed_llb = kzalloc(sizeof(*compressed_llb), GFP_KERNEL);
		if (!compressed_llb)
			goto err_fb;

		ret = i915_gem_stolen_insert_node(dev_priv, compressed_llb,
						  4096, 4096);
		if (ret)
			goto err_fb;

497
		fbc->compressed_llb = compressed_llb;
498

499 500 501 502 503 504
		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,
						 fbc->compressed_llb->start,
						 U32_MAX));
505 506 507 508
		intel_de_write(dev_priv, FBC_CFB_BASE,
			       dev_priv->dsm.start + fbc->compressed_fb.start);
		intel_de_write(dev_priv, FBC_LL_BASE,
			       dev_priv->dsm.start + compressed_llb->start);
509 510
	}

511 512 513
	drm_dbg_kms(&dev_priv->drm,
		    "reserved %llu bytes of contiguous stolen space for FBC, threshold: %d\n",
		    fbc->compressed_fb.size, fbc->threshold);
514 515 516 517 518

	return 0;

err_fb:
	kfree(compressed_llb);
519
	i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb);
520
err_llb:
521
	if (drm_mm_initialized(&dev_priv->mm.stolen))
522
		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);
523 524 525
	return -ENOSPC;
}

526
static void __intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv)
527
{
528 529
	struct intel_fbc *fbc = &dev_priv->fbc;

530 531 532
	if (WARN_ON(intel_fbc_hw_is_active(dev_priv)))
		return;

533 534
	if (!drm_mm_node_allocated(&fbc->compressed_fb))
		return;
535 536 537 538

	if (fbc->compressed_llb) {
		i915_gem_stolen_remove_node(dev_priv, fbc->compressed_llb);
		kfree(fbc->compressed_llb);
539
	}
540 541

	i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb);
542 543
}

544
void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv)
P
Paulo Zanoni 已提交
545
{
546 547
	struct intel_fbc *fbc = &dev_priv->fbc;

548
	if (!HAS_FBC(dev_priv))
549 550
		return;

551
	mutex_lock(&fbc->lock);
552
	__intel_fbc_cleanup_cfb(dev_priv);
553
	mutex_unlock(&fbc->lock);
P
Paulo Zanoni 已提交
554 555
}

556
static bool stride_is_valid(struct drm_i915_private *dev_priv,
557
			    u64 modifier, unsigned int stride)
558
{
559
	/* This should have been caught earlier. */
560
	if (drm_WARN_ON_ONCE(&dev_priv->drm, (stride & (64 - 1)) != 0))
561
		return false;
562 563

	/* Below are the additional FBC restrictions. */
564 565
	if (stride < 512)
		return false;
566

567
	if (IS_GEN(dev_priv, 2) || IS_GEN(dev_priv, 3))
568 569
		return stride == 4096 || stride == 8192;

570
	if (IS_GEN(dev_priv, 4) && !IS_G4X(dev_priv) && stride < 2048)
571 572
		return false;

573 574 575 576 577
	/* Display WA #1105: skl,bxt,kbl,cfl,glk */
	if (IS_GEN(dev_priv, 9) &&
	    modifier == DRM_FORMAT_MOD_LINEAR && stride & 511)
		return false;

578 579 580 581 582 583
	if (stride > 16384)
		return false;

	return true;
}

584
static bool pixel_format_is_valid(struct drm_i915_private *dev_priv,
585
				  u32 pixel_format)
586
{
587
	switch (pixel_format) {
588 589 590 591 592 593
	case DRM_FORMAT_XRGB8888:
	case DRM_FORMAT_XBGR8888:
		return true;
	case DRM_FORMAT_XRGB1555:
	case DRM_FORMAT_RGB565:
		/* 16bpp not supported on gen2 */
594
		if (IS_GEN(dev_priv, 2))
595 596 597 598 599 600 601 602 603 604
			return false;
		/* WaFbcOnly1to1Ratio:ctg */
		if (IS_G4X(dev_priv))
			return false;
		return true;
	default:
		return false;
	}
}

605 606 607 608 609 610 611 612 613 614 615 616 617
static bool rotation_is_valid(struct drm_i915_private *dev_priv,
			      u32 pixel_format, unsigned int rotation)
{
	if (INTEL_GEN(dev_priv) >= 9 && pixel_format == DRM_FORMAT_RGB565 &&
	    drm_rotation_90_or_270(rotation))
		return false;
	else if (INTEL_GEN(dev_priv) <= 4 && !IS_G4X(dev_priv) &&
		 rotation != DRM_MODE_ROTATE_0)
		return false;

	return true;
}

618 619 620
/*
 * For some reason, the hardware tracking starts looking at whatever we
 * programmed as the display plane base address register. It does not look at
621 622
 * the X and Y offset registers. That's why we include the src x/y offsets
 * instead of just looking at the plane size.
623 624
 */
static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc)
625
{
626
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
627
	struct intel_fbc *fbc = &dev_priv->fbc;
628
	unsigned int effective_w, effective_h, max_w, max_h;
629

630 631 632 633
	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) {
		max_w = 5120;
		max_h = 4096;
	} else if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv)) {
634 635
		max_w = 4096;
		max_h = 4096;
636
	} else if (IS_G4X(dev_priv) || INTEL_GEN(dev_priv) >= 5) {
637 638 639 640 641 642 643
		max_w = 4096;
		max_h = 2048;
	} else {
		max_w = 2048;
		max_h = 1536;
	}

644 645
	intel_fbc_get_plane_source_size(&fbc->state_cache, &effective_w,
					&effective_h);
646 647
	effective_w += fbc->state_cache.plane.adjusted_x;
	effective_h += fbc->state_cache.plane.adjusted_y;
648 649

	return effective_w <= max_w && effective_h <= max_h;
650 651
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667
static bool tiling_is_valid(struct drm_i915_private *dev_priv,
			    uint64_t modifier)
{
	switch (modifier) {
	case DRM_FORMAT_MOD_LINEAR:
		if (INTEL_GEN(dev_priv) >= 9)
			return true;
		return false;
	case I915_FORMAT_MOD_X_TILED:
	case I915_FORMAT_MOD_Y_TILED:
		return true;
	default:
		return false;
	}
}

668
static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
669 670
					 const struct intel_crtc_state *crtc_state,
					 const struct intel_plane_state *plane_state)
671
{
672
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
673
	struct intel_fbc *fbc = &dev_priv->fbc;
674
	struct intel_fbc_state_cache *cache = &fbc->state_cache;
675
	struct drm_framebuffer *fb = plane_state->hw.fb;
676

677 678 679
	cache->plane.visible = plane_state->uapi.visible;
	if (!cache->plane.visible)
		return;
680

681
	cache->crtc.mode_flags = crtc_state->hw.adjusted_mode.flags;
682
	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
683
		cache->crtc.hsw_bdw_pixel_rate = crtc_state->pixel_rate;
684

685
	cache->plane.rotation = plane_state->hw.rotation;
686 687 688 689 690
	/*
	 * 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.
	 */
691 692
	cache->plane.src_w = drm_rect_width(&plane_state->uapi.src) >> 16;
	cache->plane.src_h = drm_rect_height(&plane_state->uapi.src) >> 16;
693 694
	cache->plane.adjusted_x = plane_state->color_plane[0].x;
	cache->plane.adjusted_y = plane_state->color_plane[0].y;
695

696
	cache->plane.pixel_blend_mode = plane_state->hw.pixel_blend_mode;
697

698
	cache->fb.format = fb->format;
699
	cache->fb.stride = fb->pitches[0];
700
	cache->fb.modifier = fb->modifier;
701

702 703
	cache->fence_y_offset = intel_plane_fence_y_offset(plane_state);

704 705
	drm_WARN_ON(&dev_priv->drm, plane_state->flags & PLANE_HAS_FENCE &&
		    !plane_state->vma->fence);
706 707 708 709 710 711

	if (plane_state->flags & PLANE_HAS_FENCE &&
	    plane_state->vma->fence)
		cache->fence_id = plane_state->vma->fence->id;
	else
		cache->fence_id = -1;
712 713
}

714 715 716 717 718 719 720 721
static bool intel_fbc_cfb_size_changed(struct drm_i915_private *dev_priv)
{
	struct intel_fbc *fbc = &dev_priv->fbc;

	return intel_fbc_calculate_cfb_size(dev_priv, &fbc->state_cache) >
		fbc->compressed_fb.size * fbc->threshold;
}

722 723 724 725 726 727 728 729 730
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;
	}

731
	if (!dev_priv->params.enable_fbc) {
732 733 734 735 736 737 738 739 740 741 742 743
		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;
}

744 745
static bool intel_fbc_can_activate(struct intel_crtc *crtc)
{
746
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
747 748 749
	struct intel_fbc *fbc = &dev_priv->fbc;
	struct intel_fbc_state_cache *cache = &fbc->state_cache;

750 751 752
	if (!intel_fbc_can_enable(dev_priv))
		return false;

753 754 755 756 757
	if (!cache->plane.visible) {
		fbc->no_fbc_reason = "primary plane not visible";
		return false;
	}

758 759 760 761 762 763 764 765
	/* 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;
	}

766
	if (cache->crtc.mode_flags & DRM_MODE_FLAG_INTERLACE) {
767
		fbc->no_fbc_reason = "incompatible mode";
768
		return false;
769 770
	}

771
	if (!intel_fbc_hw_tracking_covers_screen(crtc)) {
772
		fbc->no_fbc_reason = "mode too large for compression";
773
		return false;
774
	}
775

776 777 778 779 780 781
	/* 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.
782 783
	 *
	 * Note that is possible for a tiled surface to be unmappable (and
784
	 * so have no fence associated with it) due to aperture constraints
785
	 * at the time of pinning.
786 787 788 789
	 *
	 * 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.
790
	 * For now this will effectively disable FBC with 90/270 degree
791
	 * rotation.
792
	 */
793
	if (INTEL_GEN(dev_priv) < 9 && cache->fence_id < 0) {
794 795
		fbc->no_fbc_reason = "framebuffer not tiled or fenced";
		return false;
796
	}
797 798 799

	if (!rotation_is_valid(dev_priv, cache->fb.format->format,
			       cache->plane.rotation)) {
800
		fbc->no_fbc_reason = "rotation unsupported";
801
		return false;
802 803
	}

804 805 806 807 808
	if (!tiling_is_valid(dev_priv, cache->fb.modifier)) {
		fbc->no_fbc_reason = "tiling unsupported";
		return false;
	}

809
	if (!stride_is_valid(dev_priv, cache->fb.modifier, cache->fb.stride)) {
810
		fbc->no_fbc_reason = "framebuffer stride not supported";
811
		return false;
812 813
	}

814
	if (!pixel_format_is_valid(dev_priv, cache->fb.format->format)) {
815
		fbc->no_fbc_reason = "pixel format is invalid";
816
		return false;
817 818
	}

819 820 821 822 823 824
	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;
	}

825 826
	/* WaFbcExceedCdClockThreshold:hsw,bdw */
	if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) &&
827
	    cache->crtc.hsw_bdw_pixel_rate >= dev_priv->cdclk.hw.cdclk * 95 / 100) {
828
		fbc->no_fbc_reason = "pixel rate is too big";
829
		return false;
830 831
	}

832 833 834 835 836 837 838 839 840 841
	/* 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. */
842
	if (intel_fbc_cfb_size_changed(dev_priv)) {
843
		fbc->no_fbc_reason = "CFB requirements changed";
844 845 846
		return false;
	}

847 848 849 850 851
	/*
	 * 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.
	 */
852
	if (INTEL_GEN(dev_priv) >= 9 &&
853 854 855 856 857
	    (fbc->state_cache.plane.adjusted_y & 3)) {
		fbc->no_fbc_reason = "plane Y offset is misaligned";
		return false;
	}

858 859 860
	return true;
}

861 862 863
static void intel_fbc_get_reg_params(struct intel_crtc *crtc,
				     struct intel_fbc_reg_params *params)
{
864
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
865 866
	struct intel_fbc *fbc = &dev_priv->fbc;
	struct intel_fbc_state_cache *cache = &fbc->state_cache;
867 868 869 870 871 872

	/* 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));

873
	params->fence_id = cache->fence_id;
874
	params->fence_y_offset = cache->fence_y_offset;
875

876
	params->crtc.pipe = crtc->pipe;
V
Ville Syrjälä 已提交
877
	params->crtc.i9xx_plane = to_intel_plane(crtc->base.primary)->i9xx_plane;
878

879
	params->fb.format = cache->fb.format;
880
	params->fb.stride = cache->fb.stride;
881

882
	params->cfb_size = intel_fbc_calculate_cfb_size(dev_priv, cache);
883

884
	params->gen9_wa_cfb_stride = cache->gen9_wa_cfb_stride;
885 886

	params->plane_visible = cache->plane.visible;
887 888
}

889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
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;

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

	if (params->cfb_size != intel_fbc_calculate_cfb_size(dev_priv, cache))
		return false;

	if (params->gen9_wa_cfb_stride != cache->gen9_wa_cfb_stride)
		return false;

	return true;
}

921 922
bool intel_fbc_pre_update(struct intel_atomic_state *state,
			  struct intel_crtc *crtc)
923
{
924 925 926 927 928
	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);
929
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
930
	struct intel_fbc *fbc = &dev_priv->fbc;
931
	const char *reason = "update pending";
932
	bool need_vblank_wait = false;
933

934
	if (!plane->has_fbc || !plane_state)
935 936
		return need_vblank_wait;

937
	mutex_lock(&fbc->lock);
938

V
Ville Syrjälä 已提交
939
	if (fbc->crtc != crtc)
940
		goto unlock;
941

942
	intel_fbc_update_state_cache(crtc, crtc_state, plane_state);
943
	fbc->flip_pending = true;
944

945
	if (!intel_fbc_can_flip_nuke(crtc_state)) {
946
		intel_fbc_deactivate(dev_priv, reason);
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965

		/*
		 * 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 &&
		    (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)))
			need_vblank_wait = true;
		fbc->activated = false;
	}
966 967
unlock:
	mutex_unlock(&fbc->lock);
968 969

	return need_vblank_wait;
970 971
}

972 973 974 975 976 977 978 979 980 981 982 983
/**
 * __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;

984 985 986
	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);
987

988 989
	drm_dbg_kms(&dev_priv->drm, "Disabling FBC on pipe %c\n",
		    pipe_name(crtc->pipe));
990 991 992 993 994 995

	__intel_fbc_cleanup_cfb(dev_priv);

	fbc->crtc = NULL;
}

996
static void __intel_fbc_post_update(struct intel_crtc *crtc)
997
{
998
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
999 1000
	struct intel_fbc *fbc = &dev_priv->fbc;

1001
	drm_WARN_ON(&dev_priv->drm, !mutex_is_locked(&fbc->lock));
1002

V
Ville Syrjälä 已提交
1003
	if (fbc->crtc != crtc)
1004 1005
		return;

1006 1007
	fbc->flip_pending = false;

1008
	if (!dev_priv->params.enable_fbc) {
1009 1010 1011 1012 1013 1014
		intel_fbc_deactivate(dev_priv, "disabled at runtime per module param");
		__intel_fbc_disable(dev_priv);

		return;
	}

1015
	intel_fbc_get_reg_params(crtc, &fbc->params);
1016

1017
	if (!intel_fbc_can_activate(crtc))
1018 1019
		return;

1020
	if (!fbc->busy_bits)
1021
		intel_fbc_hw_activate(dev_priv);
1022
	else
1023
		intel_fbc_deactivate(dev_priv, "frontbuffer write");
P
Paulo Zanoni 已提交
1024 1025
}

1026 1027
void intel_fbc_post_update(struct intel_atomic_state *state,
			   struct intel_crtc *crtc)
P
Paulo Zanoni 已提交
1028
{
1029
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1030 1031 1032
	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);
1033
	struct intel_fbc *fbc = &dev_priv->fbc;
1034

1035
	if (!plane->has_fbc || !plane_state)
1036 1037
		return;

1038
	mutex_lock(&fbc->lock);
1039
	__intel_fbc_post_update(crtc);
1040
	mutex_unlock(&fbc->lock);
1041 1042
}

1043 1044
static unsigned int intel_fbc_get_frontbuffer_bit(struct intel_fbc *fbc)
{
V
Ville Syrjälä 已提交
1045
	if (fbc->crtc)
1046 1047 1048 1049 1050
		return to_intel_plane(fbc->crtc->base.primary)->frontbuffer_bit;
	else
		return fbc->possible_framebuffer_bits;
}

1051 1052 1053 1054
void intel_fbc_invalidate(struct drm_i915_private *dev_priv,
			  unsigned int frontbuffer_bits,
			  enum fb_op_origin origin)
{
1055
	struct intel_fbc *fbc = &dev_priv->fbc;
1056

1057
	if (!HAS_FBC(dev_priv))
1058 1059
		return;

1060
	if (origin == ORIGIN_GTT || origin == ORIGIN_FLIP)
1061 1062
		return;

1063
	mutex_lock(&fbc->lock);
P
Paulo Zanoni 已提交
1064

1065
	fbc->busy_bits |= intel_fbc_get_frontbuffer_bit(fbc) & frontbuffer_bits;
1066

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

1070
	mutex_unlock(&fbc->lock);
1071 1072 1073
}

void intel_fbc_flush(struct drm_i915_private *dev_priv,
1074
		     unsigned int frontbuffer_bits, enum fb_op_origin origin)
1075
{
1076 1077
	struct intel_fbc *fbc = &dev_priv->fbc;

1078
	if (!HAS_FBC(dev_priv))
1079 1080
		return;

1081 1082 1083 1084 1085 1086 1087 1088
	/*
	 * GTT tracking does not nuke the entire cfb
	 * so don't clear busy_bits set for some other
	 * reason.
	 */
	if (origin == ORIGIN_GTT)
		return;

1089
	mutex_lock(&fbc->lock);
1090

1091
	fbc->busy_bits &= ~frontbuffer_bits;
1092

1093
	if (origin == ORIGIN_FLIP)
1094 1095
		goto out;

V
Ville Syrjälä 已提交
1096
	if (!fbc->busy_bits && fbc->crtc &&
1097
	    (frontbuffer_bits & intel_fbc_get_frontbuffer_bit(fbc))) {
1098
		if (fbc->active)
1099
			intel_fbc_recompress(dev_priv);
1100
		else if (!fbc->flip_pending)
1101
			__intel_fbc_post_update(fbc->crtc);
1102
	}
P
Paulo Zanoni 已提交
1103

1104
out:
1105
	mutex_unlock(&fbc->lock);
1106 1107
}

1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
/**
 * 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,
1121
			   struct intel_atomic_state *state)
1122 1123
{
	struct intel_fbc *fbc = &dev_priv->fbc;
1124 1125
	struct intel_plane *plane;
	struct intel_plane_state *plane_state;
1126
	bool crtc_chosen = false;
1127
	int i;
1128 1129 1130

	mutex_lock(&fbc->lock);

1131 1132
	/* Does this atomic commit involve the CRTC currently tied to FBC? */
	if (fbc->crtc &&
1133
	    !intel_atomic_get_new_crtc_state(state, fbc->crtc))
1134 1135
		goto out;

1136 1137 1138
	if (!intel_fbc_can_enable(dev_priv))
		goto out;

1139 1140 1141 1142
	/* 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. */
1143 1144
	for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
		struct intel_crtc_state *crtc_state;
1145
		struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc);
1146

1147
		if (!plane->has_fbc)
1148 1149
			continue;

1150
		if (!plane_state->uapi.visible)
1151 1152
			continue;

1153
		crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
1154

1155
		crtc_state->enable_fbc = true;
1156
		crtc_chosen = true;
1157
		break;
1158 1159
	}

1160 1161 1162
	if (!crtc_chosen)
		fbc->no_fbc_reason = "no suitable CRTC for FBC";

1163 1164 1165 1166
out:
	mutex_unlock(&fbc->lock);
}

1167 1168 1169
/**
 * intel_fbc_enable: tries to enable FBC on the CRTC
 * @crtc: the CRTC
1170
 * @state: corresponding &drm_crtc_state for @crtc
1171
 *
1172
 * This function checks if the given CRTC was chosen for FBC, then enables it if
1173 1174 1175
 * 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.
1176
 */
1177 1178
void intel_fbc_enable(struct intel_atomic_state *state,
		      struct intel_crtc *crtc)
1179
{
1180
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1181 1182 1183 1184 1185
	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);
1186
	struct intel_fbc *fbc = &dev_priv->fbc;
1187
	struct intel_fbc_state_cache *cache = &fbc->state_cache;
1188

1189
	if (!plane->has_fbc || !plane_state)
1190 1191
		return;

1192
	mutex_lock(&fbc->lock);
1193

V
Ville Syrjälä 已提交
1194
	if (fbc->crtc) {
1195 1196 1197
		if (fbc->crtc != crtc ||
		    !intel_fbc_cfb_size_changed(dev_priv))
			goto out;
1198

1199 1200
		__intel_fbc_disable(dev_priv);
	}
1201

1202
	drm_WARN_ON(&dev_priv->drm, fbc->active);
1203

1204
	intel_fbc_update_state_cache(crtc, crtc_state, plane_state);
1205 1206 1207 1208 1209 1210 1211

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

	if (intel_fbc_alloc_cfb(dev_priv,
				intel_fbc_calculate_cfb_size(dev_priv, cache),
1212
				plane_state->hw.fb->format->cpp[0])) {
1213
		cache->plane.visible = false;
1214
		fbc->no_fbc_reason = "not enough stolen memory";
1215 1216 1217
		goto out;
	}

1218
	if ((IS_GEN9_BC(dev_priv) || IS_BROXTON(dev_priv)) &&
1219
	    plane_state->hw.fb->modifier != I915_FORMAT_MOD_X_TILED)
1220 1221 1222 1223 1224
		cache->gen9_wa_cfb_stride =
			DIV_ROUND_UP(cache->plane.src_w, 32 * fbc->threshold) * 8;
	else
		cache->gen9_wa_cfb_stride = 0;

1225 1226
	drm_dbg_kms(&dev_priv->drm, "Enabling FBC on pipe %c\n",
		    pipe_name(crtc->pipe));
1227
	fbc->no_fbc_reason = "FBC enabled but not active yet\n";
1228

1229
	fbc->crtc = crtc;
1230
out:
1231
	mutex_unlock(&fbc->lock);
1232 1233 1234
}

/**
1235
 * intel_fbc_disable - disable FBC if it's associated with crtc
1236 1237 1238 1239
 * @crtc: the CRTC
 *
 * This function disables FBC if it's associated with the provided CRTC.
 */
1240
void intel_fbc_disable(struct intel_crtc *crtc)
1241
{
1242
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1243
	struct intel_plane *plane = to_intel_plane(crtc->base.primary);
1244
	struct intel_fbc *fbc = &dev_priv->fbc;
1245

1246
	if (!plane->has_fbc)
1247 1248
		return;

1249
	mutex_lock(&fbc->lock);
1250
	if (fbc->crtc == crtc)
1251
		__intel_fbc_disable(dev_priv);
1252
	mutex_unlock(&fbc->lock);
1253 1254 1255
}

/**
1256
 * intel_fbc_global_disable - globally disable FBC
1257 1258 1259 1260
 * @dev_priv: i915 device instance
 *
 * This function disables FBC regardless of which CRTC is associated with it.
 */
1261
void intel_fbc_global_disable(struct drm_i915_private *dev_priv)
1262
{
1263 1264
	struct intel_fbc *fbc = &dev_priv->fbc;

1265
	if (!HAS_FBC(dev_priv))
1266 1267
		return;

1268
	mutex_lock(&fbc->lock);
V
Ville Syrjälä 已提交
1269
	if (fbc->crtc) {
1270
		drm_WARN_ON(&dev_priv->drm, fbc->crtc->active);
1271
		__intel_fbc_disable(dev_priv);
1272
	}
1273
	mutex_unlock(&fbc->lock);
1274 1275
}

1276 1277 1278 1279 1280 1281 1282 1283 1284
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ä 已提交
1285
	if (fbc->underrun_detected || !fbc->crtc)
1286 1287
		goto out;

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

1291
	intel_fbc_deactivate(dev_priv, "FIFO underrun");
1292 1293 1294 1295
out:
	mutex_unlock(&fbc->lock);
}

1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
/*
 * 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) {
1314 1315
		drm_dbg_kms(&dev_priv->drm,
			    "Re-allowing FBC after fifo underrun\n");
1316 1317 1318 1319 1320 1321 1322 1323 1324
		dev_priv->fbc.no_fbc_reason = "FIFO underrun cleared";
	}

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

	return 0;
}

1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342
/**
 * 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;

1343
	if (!HAS_FBC(dev_priv))
1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
		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);
}

1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
/*
 * 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)
{
1369 1370
	if (dev_priv->params.enable_fbc >= 0)
		return !!dev_priv->params.enable_fbc;
1371

1372 1373 1374
	if (!HAS_FBC(dev_priv))
		return 0;

P
Paulo Zanoni 已提交
1375
	if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9)
1376 1377 1378 1379 1380
		return 1;

	return 0;
}

1381 1382 1383
static bool need_fbc_vtd_wa(struct drm_i915_private *dev_priv)
{
	/* WaFbcTurnOffFbcWhenHyperVisorIsUsed:skl,bxt */
1384
	if (intel_vtd_active() &&
1385
	    (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))) {
1386 1387
		drm_info(&dev_priv->drm,
			 "Disabling framebuffer compression (FBC) to prevent screen flicker with VT-d enabled\n");
1388 1389 1390 1391 1392 1393
		return true;
	}

	return false;
}

R
Rodrigo Vivi 已提交
1394 1395 1396 1397 1398 1399
/**
 * intel_fbc_init - Initialize FBC
 * @dev_priv: the i915 device
 *
 * This function might be called during PM init process.
 */
1400 1401
void intel_fbc_init(struct drm_i915_private *dev_priv)
{
1402
	struct intel_fbc *fbc = &dev_priv->fbc;
1403

1404
	INIT_WORK(&fbc->underrun_work, intel_fbc_underrun_work_fn);
1405 1406
	mutex_init(&fbc->lock);
	fbc->active = false;
P
Paulo Zanoni 已提交
1407

1408 1409 1410
	if (!drm_mm_initialized(&dev_priv->mm.stolen))
		mkwrite_device_info(dev_priv)->display.has_fbc = false;

1411
	if (need_fbc_vtd_wa(dev_priv))
1412
		mkwrite_device_info(dev_priv)->display.has_fbc = false;
1413

1414
	dev_priv->params.enable_fbc = intel_sanitize_fbc_option(dev_priv);
1415
	drm_dbg_kms(&dev_priv->drm, "Sanitized enable_fbc value: %d\n",
1416
		    dev_priv->params.enable_fbc);
1417

1418
	if (!HAS_FBC(dev_priv)) {
1419
		fbc->no_fbc_reason = "unsupported by this chipset";
1420 1421 1422
		return;
	}

1423
	/* This value was pulled out of someone's hat */
1424
	if (INTEL_GEN(dev_priv) <= 4 && !IS_GM45(dev_priv))
1425 1426
		intel_de_write(dev_priv, FBC_CONTROL,
		               500 << FBC_CTL_INTERVAL_SHIFT);
1427

1428
	/* We still don't have any sort of hardware state readout for FBC, so
1429 1430
	 * deactivate it in case the BIOS activated it to make sure software
	 * matches the hardware state. */
1431 1432
	if (intel_fbc_hw_is_active(dev_priv))
		intel_fbc_hw_deactivate(dev_priv);
1433
}