intel_uncore.c 38.8 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 24 25 26
/*
 * Copyright © 2013 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.
 */

#include "i915_drv.h"
#include "intel_drv.h"

27 28
#include <linux/pm_runtime.h>

29 30
#define FORCEWAKE_ACK_TIMEOUT_MS 2

31 32 33 34 35 36 37 38 39 40 41 42 43 44
#define __raw_i915_read8(dev_priv__, reg__) readb((dev_priv__)->regs + (reg__))
#define __raw_i915_write8(dev_priv__, reg__, val__) writeb(val__, (dev_priv__)->regs + (reg__))

#define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__))
#define __raw_i915_write16(dev_priv__, reg__, val__) writew(val__, (dev_priv__)->regs + (reg__))

#define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__))
#define __raw_i915_write32(dev_priv__, reg__, val__) writel(val__, (dev_priv__)->regs + (reg__))

#define __raw_i915_read64(dev_priv__, reg__) readq((dev_priv__)->regs + (reg__))
#define __raw_i915_write64(dev_priv__, reg__, val__) writeq(val__, (dev_priv__)->regs + (reg__))

#define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)

45 46 47
static void
assert_device_not_suspended(struct drm_i915_private *dev_priv)
{
48 49
	WARN_ONCE(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended,
		  "Device suspended\n");
50
}
51

52 53 54 55 56
static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)
{
	/* w/a for a sporadic read returning 0 by waiting for the GT
	 * thread to wake up.
	 */
57 58
	if (wait_for_atomic_us((__raw_i915_read32(dev_priv, GEN6_GT_THREAD_STATUS_REG) &
				GEN6_GT_THREAD_STATUS_CORE_MASK) == 0, 500))
59 60 61 62 63
		DRM_ERROR("GT thread status wait timed out\n");
}

static void __gen6_gt_force_wake_reset(struct drm_i915_private *dev_priv)
{
64 65 66
	__raw_i915_write32(dev_priv, FORCEWAKE, 0);
	/* something from same cacheline, but !FORCEWAKE */
	__raw_posting_read(dev_priv, ECOBUS);
67 68
}

69
static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv,
70
				     int fw_engine)
71
{
72
	if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1) == 0,
73 74 75
			    FORCEWAKE_ACK_TIMEOUT_MS))
		DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");

76 77 78
	__raw_i915_write32(dev_priv, FORCEWAKE, 1);
	/* something from same cacheline, but !FORCEWAKE */
	__raw_posting_read(dev_priv, ECOBUS);
79

80
	if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1),
81 82 83 84 85 86 87
			    FORCEWAKE_ACK_TIMEOUT_MS))
		DRM_ERROR("Timed out waiting for forcewake to ack request.\n");

	/* WaRsForcewakeWaitTC0:snb */
	__gen6_gt_wait_for_thread_c0(dev_priv);
}

88
static void __gen7_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
89
{
90
	__raw_i915_write32(dev_priv, FORCEWAKE_MT, _MASKED_BIT_DISABLE(0xffff));
91
	/* something from same cacheline, but !FORCEWAKE_MT */
92
	__raw_posting_read(dev_priv, ECOBUS);
93 94
}

95
static void __gen7_gt_force_wake_mt_get(struct drm_i915_private *dev_priv,
96
					int fw_engine)
97 98 99
{
	u32 forcewake_ack;

100
	if (IS_HASWELL(dev_priv->dev) || IS_BROADWELL(dev_priv->dev))
101 102 103 104
		forcewake_ack = FORCEWAKE_ACK_HSW;
	else
		forcewake_ack = FORCEWAKE_MT_ACK;

105
	if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL) == 0,
106 107 108
			    FORCEWAKE_ACK_TIMEOUT_MS))
		DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");

109 110
	__raw_i915_write32(dev_priv, FORCEWAKE_MT,
			   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
111
	/* something from same cacheline, but !FORCEWAKE_MT */
112
	__raw_posting_read(dev_priv, ECOBUS);
113

114
	if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL),
115 116 117 118
			    FORCEWAKE_ACK_TIMEOUT_MS))
		DRM_ERROR("Timed out waiting for forcewake to ack request.\n");

	/* WaRsForcewakeWaitTC0:ivb,hsw */
119
	__gen6_gt_wait_for_thread_c0(dev_priv);
120 121 122 123 124
}

static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv)
{
	u32 gtfifodbg;
125 126

	gtfifodbg = __raw_i915_read32(dev_priv, GTFIFODBG);
127 128
	if (WARN(gtfifodbg, "GT wake FIFO error 0x%x\n", gtfifodbg))
		__raw_i915_write32(dev_priv, GTFIFODBG, gtfifodbg);
129 130
}

131
static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv,
132
				     int fw_engine)
133
{
134
	__raw_i915_write32(dev_priv, FORCEWAKE, 0);
135
	/* something from same cacheline, but !FORCEWAKE */
136
	__raw_posting_read(dev_priv, ECOBUS);
137 138 139
	gen6_gt_check_fifodbg(dev_priv);
}

140
static void __gen7_gt_force_wake_mt_put(struct drm_i915_private *dev_priv,
141
					int fw_engine)
142
{
143 144
	__raw_i915_write32(dev_priv, FORCEWAKE_MT,
			   _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
145
	/* something from same cacheline, but !FORCEWAKE_MT */
146
	__raw_posting_read(dev_priv, ECOBUS);
147 148 149

	if (IS_GEN7(dev_priv->dev))
		gen6_gt_check_fifodbg(dev_priv);
150 151 152 153 154 155
}

static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
{
	int ret = 0;

156 157 158 159 160 161 162
	/* On VLV, FIFO will be shared by both SW and HW.
	 * So, we need to read the FREE_ENTRIES everytime */
	if (IS_VALLEYVIEW(dev_priv->dev))
		dev_priv->uncore.fifo_count =
			__raw_i915_read32(dev_priv, GTFIFOCTL) &
						GT_FIFO_FREE_ENTRIES_MASK;

163 164
	if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) {
		int loop = 500;
165
		u32 fifo = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK;
166 167
		while (fifo <= GT_FIFO_NUM_RESERVED_ENTRIES && loop--) {
			udelay(10);
168
			fifo = __raw_i915_read32(dev_priv, GTFIFOCTL) & GT_FIFO_FREE_ENTRIES_MASK;
169 170 171 172 173 174 175 176 177 178 179 180
		}
		if (WARN_ON(loop < 0 && fifo <= GT_FIFO_NUM_RESERVED_ENTRIES))
			++ret;
		dev_priv->uncore.fifo_count = fifo;
	}
	dev_priv->uncore.fifo_count--;

	return ret;
}

static void vlv_force_wake_reset(struct drm_i915_private *dev_priv)
{
181 182
	__raw_i915_write32(dev_priv, FORCEWAKE_VLV,
			   _MASKED_BIT_DISABLE(0xffff));
183 184
	__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
			   _MASKED_BIT_DISABLE(0xffff));
185
	/* something from same cacheline, but !FORCEWAKE_VLV */
186
	__raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
187 188
}

189
static void __vlv_force_wake_get(struct drm_i915_private *dev_priv,
190
				 int fw_engine)
191
{
192 193
	/* Check for Render Engine */
	if (FORCEWAKE_RENDER & fw_engine) {
194 195 196 197 198
		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_VLV) &
						FORCEWAKE_KERNEL) == 0,
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: Render forcewake old ack to clear.\n");
199 200 201 202 203 204 205 206 207 208

		__raw_i915_write32(dev_priv, FORCEWAKE_VLV,
				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));

		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_VLV) &
						FORCEWAKE_KERNEL),
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: waiting for Render to ack.\n");
	}
209

210 211
	/* Check for Media Engine */
	if (FORCEWAKE_MEDIA & fw_engine) {
212 213 214 215 216
		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_MEDIA_VLV) &
						FORCEWAKE_KERNEL) == 0,
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: Media forcewake old ack to clear.\n");
217 218 219 220 221 222 223 224 225 226

		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));

		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_MEDIA_VLV) &
						FORCEWAKE_KERNEL),
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: waiting for media to ack.\n");
	}
227 228
}

229
static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
230
				 int fw_engine)
231
{
232 233 234 235 236 237 238 239 240 241 242
	/* Check for Render Engine */
	if (FORCEWAKE_RENDER & fw_engine)
		__raw_i915_write32(dev_priv, FORCEWAKE_VLV,
					_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));


	/* Check for Media Engine */
	if (FORCEWAKE_MEDIA & fw_engine)
		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));

243 244 245 246
	/* something from same cacheline, but !FORCEWAKE_VLV */
	__raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
	if (!IS_CHERRYVIEW(dev_priv->dev))
		gen6_gt_check_fifodbg(dev_priv);
247 248
}

Z
Zhe Wang 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
static void __gen9_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
{
	__raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
			_MASKED_BIT_DISABLE(0xffff));

	__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
			_MASKED_BIT_DISABLE(0xffff));

	__raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
			_MASKED_BIT_DISABLE(0xffff));
}

static void
__gen9_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
{
	/* Check for Render Engine */
	if (FORCEWAKE_RENDER & fw_engine) {
		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_RENDER_GEN9) &
						FORCEWAKE_KERNEL) == 0,
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: Render forcewake old ack to clear.\n");

		__raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));

		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_RENDER_GEN9) &
						FORCEWAKE_KERNEL),
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: waiting for Render to ack.\n");
	}

	/* Check for Media Engine */
	if (FORCEWAKE_MEDIA & fw_engine) {
		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_MEDIA_GEN9) &
						FORCEWAKE_KERNEL) == 0,
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: Media forcewake old ack to clear.\n");

		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));

		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_MEDIA_GEN9) &
						FORCEWAKE_KERNEL),
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: waiting for Media to ack.\n");
	}

	/* Check for Blitter Engine */
	if (FORCEWAKE_BLITTER & fw_engine) {
		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_BLITTER_GEN9) &
						FORCEWAKE_KERNEL) == 0,
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: Blitter forcewake old ack to clear.\n");

		__raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));

		if (wait_for_atomic((__raw_i915_read32(dev_priv,
						FORCEWAKE_ACK_BLITTER_GEN9) &
						FORCEWAKE_KERNEL),
					FORCEWAKE_ACK_TIMEOUT_MS))
			DRM_ERROR("Timed out: waiting for Blitter to ack.\n");
	}
}

static void
__gen9_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
{
	/* Check for Render Engine */
	if (FORCEWAKE_RENDER & fw_engine)
		__raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));

	/* Check for Media Engine */
	if (FORCEWAKE_MEDIA & fw_engine)
		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));

	/* Check for Blitter Engine */
	if (FORCEWAKE_BLITTER & fw_engine)
		__raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
}

338
static void gen6_force_wake_timer(unsigned long arg)
Z
Zhe Wang 已提交
339
{
340 341
	struct intel_uncore_forcewake_domain *domain = (void *)arg;
	unsigned long irqflags;
Z
Zhe Wang 已提交
342

343
	assert_device_not_suspended(domain->i915);
Z
Zhe Wang 已提交
344

345 346 347 348 349 350 351 352 353
	spin_lock_irqsave(&domain->i915->uncore.lock, irqflags);
	if (WARN_ON(domain->wake_count == 0))
		domain->wake_count++;

	if (--domain->wake_count == 0)
		domain->i915->uncore.funcs.force_wake_put(domain->i915,
							  1 << domain->id);

	spin_unlock_irqrestore(&domain->i915->uncore.lock, irqflags);
Z
Zhe Wang 已提交
354 355
}

356
void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
Z
Zhe Wang 已提交
357
{
358 359 360 361
	struct drm_i915_private *dev_priv = dev->dev_private;
	unsigned long irqflags, fw = 0;
	struct intel_uncore_forcewake_domain *domain;
	int id, active_domains, retry_count = 100;
Z
Zhe Wang 已提交
362

363 364 365 366 367 368
	/* Hold uncore.lock across reset to prevent any register access
	 * with forcewake not set correctly. Wait until all pending
	 * timers are run before holding.
	 */
	while (1) {
		active_domains = 0;
Z
Zhe Wang 已提交
369

370 371 372
		for_each_fw_domain(domain, dev_priv, id) {
			if (del_timer_sync(&domain->timer) == 0)
				continue;
Z
Zhe Wang 已提交
373

374 375
			gen6_force_wake_timer((unsigned long)domain);
		}
376

377
		spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
378

379 380 381 382
		for_each_fw_domain(domain, dev_priv, id) {
			if (timer_pending(&domain->timer))
				active_domains |= (1 << id);
		}
383

384 385
		if (active_domains == 0)
			break;
386

387 388 389 390
		if (--retry_count == 0) {
			DRM_ERROR("Timed out waiting for forcewake timers to finish\n");
			break;
		}
391

392 393 394
		spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
		cond_resched();
	}
395

396 397 398 399 400 401 402 403
	WARN_ON(active_domains);

	for_each_fw_domain(domain, dev_priv, id)
		if (domain->wake_count)
			fw |= 1 << id;

	if (fw)
		dev_priv->uncore.funcs.force_wake_put(dev_priv, fw);
404

405
	if (IS_VALLEYVIEW(dev))
406
		vlv_force_wake_reset(dev_priv);
407
	else if (IS_GEN6(dev) || IS_GEN7(dev))
408
		__gen6_gt_force_wake_reset(dev_priv);
409

410
	if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev) || IS_BROADWELL(dev))
411
		__gen7_gt_force_wake_mt_reset(dev_priv);
412

Z
Zhe Wang 已提交
413 414 415
	if (IS_GEN9(dev))
		__gen9_gt_force_wake_mt_reset(dev_priv);

416 417 418 419 420 421 422 423 424 425
	if (restore) { /* If reset with a user forcewake, try to restore */
		if (fw)
			dev_priv->uncore.funcs.force_wake_get(dev_priv, fw);

		if (IS_GEN6(dev) || IS_GEN7(dev))
			dev_priv->uncore.fifo_count =
				__raw_i915_read32(dev_priv, GTFIFOCTL) &
				GT_FIFO_FREE_ENTRIES_MASK;
	}

426 427 428
	if (!restore)
		assert_force_wake_inactive(dev_priv);

429
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
430 431
}

432 433
static void __intel_uncore_early_sanitize(struct drm_device *dev,
					  bool restore_forcewake)
434 435 436 437
{
	struct drm_i915_private *dev_priv = dev->dev_private;

	if (HAS_FPGA_DBG_UNCLAIMED(dev))
438
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
439

B
Ben Widawsky 已提交
440
	if ((IS_HASWELL(dev) || IS_BROADWELL(dev)) &&
441 442 443 444 445 446 447 448 449
	    (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) == 1)) {
		/* The docs do not explain exactly how the calculation can be
		 * made. It is somewhat guessable, but for now, it's always
		 * 128MB.
		 * NB: We can't write IDICR yet because we do not have gt funcs
		 * set up */
		dev_priv->ellc_size = 128;
		DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
	}
450

451 452 453 454 455
	/* clear out old GT FIFO errors */
	if (IS_GEN6(dev) || IS_GEN7(dev))
		__raw_i915_write32(dev_priv, GTFIFODBG,
				   __raw_i915_read32(dev_priv, GTFIFODBG));

456
	intel_uncore_forcewake_reset(dev, restore_forcewake);
457 458
}

459 460 461 462 463 464
void intel_uncore_early_sanitize(struct drm_device *dev, bool restore_forcewake)
{
	__intel_uncore_early_sanitize(dev, restore_forcewake);
	i915_check_and_clear_faults(dev);
}

465 466
void intel_uncore_sanitize(struct drm_device *dev)
{
467 468 469 470 471 472 473 474 475 476
	/* BIOS often leaves RC6 enabled, but disable it for hw init */
	intel_disable_gt_powersave(dev);
}

/*
 * Generally this is called implicitly by the register read function. However,
 * if some sequence requires the GT to not power down then this function should
 * be called at the beginning of the sequence followed by a call to
 * gen6_gt_force_wake_put() at the end of the sequence.
 */
477 478
void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv,
			    unsigned fw_domains)
479 480
{
	unsigned long irqflags;
481 482
	struct intel_uncore_forcewake_domain *domain;
	int id;
483

484 485 486
	if (!dev_priv->uncore.funcs.force_wake_get)
		return;

487
	WARN_ON(dev_priv->pm.suspended);
488

489 490
	fw_domains &= dev_priv->uncore.fw_domains;

491
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
Z
Zhe Wang 已提交
492

493 494 495
	for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
		if (domain->wake_count++)
			fw_domains &= ~(1 << id);
496
	}
497

498 499 500
	if (fw_domains)
		dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);

501 502 503 504 505 506
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
}

/*
 * see gen6_gt_force_wake_get()
 */
507 508
void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv,
			    unsigned fw_domains)
509 510
{
	unsigned long irqflags;
511 512
	struct intel_uncore_forcewake_domain *domain;
	int id;
513

514 515 516
	if (!dev_priv->uncore.funcs.force_wake_put)
		return;

517 518
	fw_domains &= dev_priv->uncore.fw_domains;

519 520
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);

521 522 523 524 525 526 527 528 529
	for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
		if (WARN_ON(domain->wake_count == 0))
			continue;

		if (--domain->wake_count)
			continue;

		domain->wake_count++;
		mod_timer_pinned(&domain->timer, jiffies + 1);
530
	}
531

532 533 534
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
}

535 536
void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
{
537 538 539
	struct intel_uncore_forcewake_domain *domain;
	int i;

540 541 542
	if (!dev_priv->uncore.funcs.force_wake_get)
		return;

543 544
	for_each_fw_domain(domain, dev_priv, i)
		WARN_ON(domain->wake_count);
545 546
}

547 548
/* We give fast paths for the really cool registers */
#define NEEDS_FORCE_WAKE(dev_priv, reg) \
549
	 ((reg) < 0x40000 && (reg) != FORCEWAKE)
550

551
#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
552

553 554 555 556 557 558 559 560 561 562 563 564 565
#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
	(REG_RANGE((reg), 0x2000, 0x4000) || \
	 REG_RANGE((reg), 0x5000, 0x8000) || \
	 REG_RANGE((reg), 0xB000, 0x12000) || \
	 REG_RANGE((reg), 0x2E000, 0x30000))

#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg) \
	(REG_RANGE((reg), 0x12000, 0x14000) || \
	 REG_RANGE((reg), 0x22000, 0x24000) || \
	 REG_RANGE((reg), 0x30000, 0x40000))

#define FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg) \
	(REG_RANGE((reg), 0x2000, 0x4000) || \
566
	 REG_RANGE((reg), 0x5200, 0x8000) || \
567
	 REG_RANGE((reg), 0x8300, 0x8500) || \
568
	 REG_RANGE((reg), 0xB000, 0xB480) || \
569 570 571 572 573 574 575 576
	 REG_RANGE((reg), 0xE000, 0xE800))

#define FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg) \
	(REG_RANGE((reg), 0x8800, 0x8900) || \
	 REG_RANGE((reg), 0xD000, 0xD800) || \
	 REG_RANGE((reg), 0x12000, 0x14000) || \
	 REG_RANGE((reg), 0x1A000, 0x1C000) || \
	 REG_RANGE((reg), 0x1E800, 0x1EA00) || \
577
	 REG_RANGE((reg), 0x30000, 0x38000))
578 579 580 581 582 583

#define FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg) \
	(REG_RANGE((reg), 0x4000, 0x5000) || \
	 REG_RANGE((reg), 0x8000, 0x8300) || \
	 REG_RANGE((reg), 0x8500, 0x8600) || \
	 REG_RANGE((reg), 0x9000, 0xB000) || \
584
	 REG_RANGE((reg), 0xF000, 0x10000))
585

586
#define FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) \
587
	REG_RANGE((reg), 0xB00,  0x2000)
588 589

#define FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg) \
590 591
	(REG_RANGE((reg), 0x2000, 0x2700) || \
	 REG_RANGE((reg), 0x3000, 0x4000) || \
592
	 REG_RANGE((reg), 0x5200, 0x8000) || \
593
	 REG_RANGE((reg), 0x8140, 0x8160) || \
594 595 596
	 REG_RANGE((reg), 0x8300, 0x8500) || \
	 REG_RANGE((reg), 0x8C00, 0x8D00) || \
	 REG_RANGE((reg), 0xB000, 0xB480) || \
597 598
	 REG_RANGE((reg), 0xE000, 0xE900) || \
	 REG_RANGE((reg), 0x24400, 0x24800))
599 600

#define FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) \
601 602
	(REG_RANGE((reg), 0x8130, 0x8140) || \
	 REG_RANGE((reg), 0x8800, 0x8A00) || \
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
	 REG_RANGE((reg), 0xD000, 0xD800) || \
	 REG_RANGE((reg), 0x12000, 0x14000) || \
	 REG_RANGE((reg), 0x1A000, 0x1EA00) || \
	 REG_RANGE((reg), 0x30000, 0x40000))

#define FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg) \
	REG_RANGE((reg), 0x9400, 0x9800)

#define FORCEWAKE_GEN9_BLITTER_RANGE_OFFSET(reg) \
	((reg) < 0x40000 &&\
	 !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) && \
	 !FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg) && \
	 !FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) && \
	 !FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg))

618 619 620 621 622 623
static void
ilk_dummy_write(struct drm_i915_private *dev_priv)
{
	/* WaIssueDummyWriteToWakeupFromRC6:ilk Issue a dummy write to wake up
	 * the chip from rc6 before touching it for real. MI_MODE is masked,
	 * hence harmless to write 0 into. */
624
	__raw_i915_write32(dev_priv, MI_MODE, 0);
625 626 627
}

static void
628 629
hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, u32 reg, bool read,
			bool before)
630
{
631 632 633 634 635 636
	const char *op = read ? "reading" : "writing to";
	const char *when = before ? "before" : "after";

	if (!i915.mmio_debug)
		return;

637
	if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
638 639
		WARN(1, "Unclaimed register detected %s %s register 0x%x\n",
		     when, op, reg);
640
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
641 642 643 644
	}
}

static void
645
hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv)
646
{
647 648 649
	if (i915.mmio_debug)
		return;

650
	if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
651
		DRM_ERROR("Unclaimed register detected. Please use the i915.mmio_debug=1 to debug this problem.");
652
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
653 654 655
	}
}

656
#define GEN2_READ_HEADER(x) \
B
Ben Widawsky 已提交
657
	u##x val = 0; \
658
	assert_device_not_suspended(dev_priv);
B
Ben Widawsky 已提交
659

660
#define GEN2_READ_FOOTER \
B
Ben Widawsky 已提交
661 662 663
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
	return val

664
#define __gen2_read(x) \
665
static u##x \
666 667
gen2_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
	GEN2_READ_HEADER(x); \
668
	val = __raw_i915_read##x(dev_priv, reg); \
669
	GEN2_READ_FOOTER; \
670 671 672 673 674
}

#define __gen5_read(x) \
static u##x \
gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
675
	GEN2_READ_HEADER(x); \
676 677
	ilk_dummy_write(dev_priv); \
	val = __raw_i915_read##x(dev_priv, reg); \
678
	GEN2_READ_FOOTER; \
679 680
}

681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
__gen5_read(8)
__gen5_read(16)
__gen5_read(32)
__gen5_read(64)
__gen2_read(8)
__gen2_read(16)
__gen2_read(32)
__gen2_read(64)

#undef __gen5_read
#undef __gen2_read

#undef GEN2_READ_FOOTER
#undef GEN2_READ_HEADER

#define GEN6_READ_HEADER(x) \
	unsigned long irqflags; \
	u##x val = 0; \
	assert_device_not_suspended(dev_priv); \
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)

#define GEN6_READ_FOOTER \
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
	trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
	return val

707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730
static inline void __force_wake_get(struct drm_i915_private *dev_priv,
				    unsigned fw_domains)
{
	struct intel_uncore_forcewake_domain *domain;
	int i;

	if (WARN_ON(!fw_domains))
		return;

	/* Ideally GCC would be constant-fold and eliminate this loop */
	for_each_fw_domain_mask(domain, fw_domains, dev_priv, i) {
		if (domain->wake_count) {
			fw_domains &= ~(1 << i);
			continue;
		}

		domain->wake_count++;
		mod_timer_pinned(&domain->timer, jiffies + 1);
	}

	if (fw_domains)
		dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
}

731 732 733
#define __gen6_read(x) \
static u##x \
gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
734
	GEN6_READ_HEADER(x); \
735
	hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
736 737
	if (NEEDS_FORCE_WAKE((dev_priv), (reg))) \
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
738
	val = __raw_i915_read##x(dev_priv, reg); \
739
	hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
740
	GEN6_READ_FOOTER; \
741 742
}

743 744 745
#define __vlv_read(x) \
static u##x \
vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
746
	GEN6_READ_HEADER(x); \
747 748 749 750
	if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) \
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
	else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) \
		__force_wake_get(dev_priv, FORCEWAKE_MEDIA); \
751
	val = __raw_i915_read##x(dev_priv, reg); \
752
	GEN6_READ_FOOTER; \
753 754
}

755 756 757
#define __chv_read(x) \
static u##x \
chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
758
	GEN6_READ_HEADER(x); \
759 760 761 762 763 764 765
	if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
	else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \
		__force_wake_get(dev_priv, FORCEWAKE_MEDIA); \
	else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \
		__force_wake_get(dev_priv, \
				 FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \
766
	val = __raw_i915_read##x(dev_priv, reg); \
767
	GEN6_READ_FOOTER; \
768
}
769

770 771 772 773 774 775
#define SKL_NEEDS_FORCE_WAKE(dev_priv, reg)	\
	 ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg))

#define __gen9_read(x) \
static u##x \
gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
776
	unsigned fw_engine; \
777
	GEN6_READ_HEADER(x); \
778 779 780 781 782 783 784 785 786 787 788 789 790
	if (!SKL_NEEDS_FORCE_WAKE((dev_priv), (reg)))	\
		fw_engine = 0; \
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg))	\
		fw_engine = FORCEWAKE_RENDER; \
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \
		fw_engine = FORCEWAKE_MEDIA; \
	else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
	else \
		fw_engine = FORCEWAKE_BLITTER; \
	if (fw_engine) \
		__force_wake_get(dev_priv, fw_engine); \
	val = __raw_i915_read##x(dev_priv, reg); \
791
	GEN6_READ_FOOTER; \
792 793 794 795 796 797
}

__gen9_read(8)
__gen9_read(16)
__gen9_read(32)
__gen9_read(64)
798 799 800 801
__chv_read(8)
__chv_read(16)
__chv_read(32)
__chv_read(64)
802 803 804 805
__vlv_read(8)
__vlv_read(16)
__vlv_read(32)
__vlv_read(64)
806 807 808 809 810
__gen6_read(8)
__gen6_read(16)
__gen6_read(32)
__gen6_read(64)

811
#undef __gen9_read
812
#undef __chv_read
813
#undef __vlv_read
814
#undef __gen6_read
815 816
#undef GEN6_READ_FOOTER
#undef GEN6_READ_HEADER
B
Ben Widawsky 已提交
817

818
#define GEN2_WRITE_HEADER \
B
Ben Widawsky 已提交
819
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
820
	assert_device_not_suspended(dev_priv); \
821

822
#define GEN2_WRITE_FOOTER
V
Ville Syrjälä 已提交
823

824
#define __gen2_write(x) \
825
static void \
826 827
gen2_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
	GEN2_WRITE_HEADER; \
828
	__raw_i915_write##x(dev_priv, reg, val); \
829
	GEN2_WRITE_FOOTER; \
830 831 832 833 834
}

#define __gen5_write(x) \
static void \
gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
835
	GEN2_WRITE_HEADER; \
836 837
	ilk_dummy_write(dev_priv); \
	__raw_i915_write##x(dev_priv, reg, val); \
838
	GEN2_WRITE_FOOTER; \
839 840
}

841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
__gen5_write(8)
__gen5_write(16)
__gen5_write(32)
__gen5_write(64)
__gen2_write(8)
__gen2_write(16)
__gen2_write(32)
__gen2_write(64)

#undef __gen5_write
#undef __gen2_write

#undef GEN2_WRITE_FOOTER
#undef GEN2_WRITE_HEADER

#define GEN6_WRITE_HEADER \
	unsigned long irqflags; \
	trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
	assert_device_not_suspended(dev_priv); \
	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)

#define GEN6_WRITE_FOOTER \
	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)

865 866 867 868
#define __gen6_write(x) \
static void \
gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
	u32 __fifo_ret = 0; \
869
	GEN6_WRITE_HEADER; \
870 871 872 873 874 875 876
	if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
	} \
	__raw_i915_write##x(dev_priv, reg, val); \
	if (unlikely(__fifo_ret)) { \
		gen6_gt_check_fifodbg(dev_priv); \
	} \
877
	GEN6_WRITE_FOOTER; \
878 879 880 881 882
}

#define __hsw_write(x) \
static void \
hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
883
	u32 __fifo_ret = 0; \
884
	GEN6_WRITE_HEADER; \
885 886 887
	if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
		__fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
	} \
888
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
889
	__raw_i915_write##x(dev_priv, reg, val); \
890 891 892
	if (unlikely(__fifo_ret)) { \
		gen6_gt_check_fifodbg(dev_priv); \
	} \
893 894
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
	hsw_unclaimed_reg_detect(dev_priv); \
895
	GEN6_WRITE_FOOTER; \
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 921
static const u32 gen8_shadowed_regs[] = {
	FORCEWAKE_MT,
	GEN6_RPNSWREQ,
	GEN6_RC_VIDEO_FREQ,
	RING_TAIL(RENDER_RING_BASE),
	RING_TAIL(GEN6_BSD_RING_BASE),
	RING_TAIL(VEBOX_RING_BASE),
	RING_TAIL(BLT_RING_BASE),
	/* TODO: Other registers are not yet used */
};

static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg)
{
	int i;
	for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
		if (reg == gen8_shadowed_regs[i])
			return true;

	return false;
}

#define __gen8_write(x) \
static void \
gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
922
	GEN6_WRITE_HEADER; \
923
	hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
924 925 926
	if (reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg)) \
		__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
	__raw_i915_write##x(dev_priv, reg, val); \
927 928
	hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
	hsw_unclaimed_reg_detect(dev_priv); \
929
	GEN6_WRITE_FOOTER; \
930 931
}

932 933 934 935
#define __chv_write(x) \
static void \
chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
	bool shadowed = is_gen8_shadowed(dev_priv, reg); \
936
	GEN6_WRITE_HEADER; \
937
	if (!shadowed) { \
938 939 940 941 942 943
		if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \
			__force_wake_get(dev_priv, FORCEWAKE_RENDER); \
		else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \
			__force_wake_get(dev_priv, FORCEWAKE_MEDIA); \
		else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \
			__force_wake_get(dev_priv, FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \
944 945
	} \
	__raw_i915_write##x(dev_priv, reg, val); \
946
	GEN6_WRITE_FOOTER; \
947 948
}

Z
Zhe Wang 已提交
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
static const u32 gen9_shadowed_regs[] = {
	RING_TAIL(RENDER_RING_BASE),
	RING_TAIL(GEN6_BSD_RING_BASE),
	RING_TAIL(VEBOX_RING_BASE),
	RING_TAIL(BLT_RING_BASE),
	FORCEWAKE_BLITTER_GEN9,
	FORCEWAKE_RENDER_GEN9,
	FORCEWAKE_MEDIA_GEN9,
	GEN6_RPNSWREQ,
	GEN6_RC_VIDEO_FREQ,
	/* TODO: Other registers are not yet used */
};

static bool is_gen9_shadowed(struct drm_i915_private *dev_priv, u32 reg)
{
	int i;
	for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++)
		if (reg == gen9_shadowed_regs[i])
			return true;

	return false;
}

972 973 974 975
#define __gen9_write(x) \
static void \
gen9_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, \
		bool trace) { \
976
	unsigned fw_engine; \
977
	GEN6_WRITE_HEADER; \
978 979 980 981 982 983 984 985 986 987 988 989 990 991
	if (!SKL_NEEDS_FORCE_WAKE((dev_priv), (reg)) ||	\
	    is_gen9_shadowed(dev_priv, reg)) \
		fw_engine = 0; \
	else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \
		fw_engine = FORCEWAKE_RENDER; \
	else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \
		fw_engine = FORCEWAKE_MEDIA; \
	else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \
		fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
	else \
		fw_engine = FORCEWAKE_BLITTER; \
	if (fw_engine) \
		__force_wake_get(dev_priv, fw_engine); \
	__raw_i915_write##x(dev_priv, reg, val); \
992
	GEN6_WRITE_FOOTER; \
993 994 995 996 997 998
}

__gen9_write(8)
__gen9_write(16)
__gen9_write(32)
__gen9_write(64)
999 1000 1001 1002
__chv_write(8)
__chv_write(16)
__chv_write(32)
__chv_write(64)
1003 1004 1005 1006
__gen8_write(8)
__gen8_write(16)
__gen8_write(32)
__gen8_write(64)
1007 1008 1009 1010 1011 1012 1013 1014 1015
__hsw_write(8)
__hsw_write(16)
__hsw_write(32)
__hsw_write(64)
__gen6_write(8)
__gen6_write(16)
__gen6_write(32)
__gen6_write(64)

1016
#undef __gen9_write
1017
#undef __chv_write
1018
#undef __gen8_write
1019 1020
#undef __hsw_write
#undef __gen6_write
1021 1022
#undef GEN6_WRITE_FOOTER
#undef GEN6_WRITE_HEADER
1023

1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
#define ASSIGN_WRITE_MMIO_VFUNCS(x) \
do { \
	dev_priv->uncore.funcs.mmio_writeb = x##_write8; \
	dev_priv->uncore.funcs.mmio_writew = x##_write16; \
	dev_priv->uncore.funcs.mmio_writel = x##_write32; \
	dev_priv->uncore.funcs.mmio_writeq = x##_write64; \
} while (0)

#define ASSIGN_READ_MMIO_VFUNCS(x) \
do { \
	dev_priv->uncore.funcs.mmio_readb = x##_read8; \
	dev_priv->uncore.funcs.mmio_readw = x##_read16; \
	dev_priv->uncore.funcs.mmio_readl = x##_read32; \
	dev_priv->uncore.funcs.mmio_readq = x##_read64; \
} while (0)

1040 1041 1042
void intel_uncore_init(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
1043 1044
	struct intel_uncore_forcewake_domain *domain;
	int i;
1045

1046
	__intel_uncore_early_sanitize(dev, false);
1047

Z
Zhe Wang 已提交
1048 1049 1050
	if (IS_GEN9(dev)) {
		dev_priv->uncore.funcs.force_wake_get = __gen9_force_wake_get;
		dev_priv->uncore.funcs.force_wake_put = __gen9_force_wake_put;
1051 1052
		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER |
			FORCEWAKE_BLITTER | FORCEWAKE_MEDIA;
Z
Zhe Wang 已提交
1053
	} else if (IS_VALLEYVIEW(dev)) {
1054 1055
		dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
		dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put;
1056
		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER | FORCEWAKE_MEDIA;
1057
	} else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
1058 1059
		dev_priv->uncore.funcs.force_wake_get = __gen7_gt_force_wake_mt_get;
		dev_priv->uncore.funcs.force_wake_put = __gen7_gt_force_wake_mt_put;
1060
		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER;
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
	} else if (IS_IVYBRIDGE(dev)) {
		u32 ecobus;

		/* IVB configs may use multi-threaded forcewake */

		/* A small trick here - if the bios hasn't configured
		 * MT forcewake, and if the device is in RC6, then
		 * force_wake_mt_get will not wake the device and the
		 * ECOBUS read will return zero. Which will be
		 * (correctly) interpreted by the test below as MT
		 * forcewake being disabled.
		 */
		mutex_lock(&dev->struct_mutex);
1074
		__gen7_gt_force_wake_mt_get(dev_priv, FORCEWAKE_ALL);
1075
		ecobus = __raw_i915_read32(dev_priv, ECOBUS);
1076
		__gen7_gt_force_wake_mt_put(dev_priv, FORCEWAKE_ALL);
1077 1078 1079 1080
		mutex_unlock(&dev->struct_mutex);

		if (ecobus & FORCEWAKE_MT_ENABLE) {
			dev_priv->uncore.funcs.force_wake_get =
1081
				__gen7_gt_force_wake_mt_get;
1082
			dev_priv->uncore.funcs.force_wake_put =
1083
				__gen7_gt_force_wake_mt_put;
1084 1085 1086 1087 1088 1089 1090 1091
		} else {
			DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n");
			DRM_INFO("when using vblank-synced partial screen updates.\n");
			dev_priv->uncore.funcs.force_wake_get =
				__gen6_gt_force_wake_get;
			dev_priv->uncore.funcs.force_wake_put =
				__gen6_gt_force_wake_put;
		}
1092
		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER;
1093 1094 1095 1096 1097
	} else if (IS_GEN6(dev)) {
		dev_priv->uncore.funcs.force_wake_get =
			__gen6_gt_force_wake_get;
		dev_priv->uncore.funcs.force_wake_put =
			__gen6_gt_force_wake_put;
1098 1099 1100 1101 1102 1103 1104 1105 1106
		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER;
	}

	for_each_fw_domain(domain, dev_priv, i) {
		domain->i915 = dev_priv;
		domain->id = i;

		setup_timer(&domain->timer, gen6_force_wake_timer,
			    (unsigned long)domain);
1107 1108
	}

1109
	switch (INTEL_INFO(dev)->gen) {
1110
	default:
1111
		MISSING_CASE(INTEL_INFO(dev)->gen);
1112 1113 1114 1115 1116 1117
		return;
	case 9:
		ASSIGN_WRITE_MMIO_VFUNCS(gen9);
		ASSIGN_READ_MMIO_VFUNCS(gen9);
		break;
	case 8:
1118
		if (IS_CHERRYVIEW(dev)) {
1119 1120
			ASSIGN_WRITE_MMIO_VFUNCS(chv);
			ASSIGN_READ_MMIO_VFUNCS(chv);
1121 1122

		} else {
1123 1124
			ASSIGN_WRITE_MMIO_VFUNCS(gen8);
			ASSIGN_READ_MMIO_VFUNCS(gen6);
1125
		}
1126
		break;
1127 1128
	case 7:
	case 6:
1129
		if (IS_HASWELL(dev)) {
1130
			ASSIGN_WRITE_MMIO_VFUNCS(hsw);
1131
		} else {
1132
			ASSIGN_WRITE_MMIO_VFUNCS(gen6);
1133
		}
1134 1135

		if (IS_VALLEYVIEW(dev)) {
1136
			ASSIGN_READ_MMIO_VFUNCS(vlv);
1137
		} else {
1138
			ASSIGN_READ_MMIO_VFUNCS(gen6);
1139
		}
1140 1141
		break;
	case 5:
1142 1143
		ASSIGN_WRITE_MMIO_VFUNCS(gen5);
		ASSIGN_READ_MMIO_VFUNCS(gen5);
1144 1145 1146 1147
		break;
	case 4:
	case 3:
	case 2:
1148 1149
		ASSIGN_WRITE_MMIO_VFUNCS(gen2);
		ASSIGN_READ_MMIO_VFUNCS(gen2);
1150 1151
		break;
	}
1152 1153

	i915_check_and_clear_faults(dev);
1154
}
1155 1156
#undef ASSIGN_WRITE_MMIO_VFUNCS
#undef ASSIGN_READ_MMIO_VFUNCS
1157 1158 1159 1160 1161

void intel_uncore_fini(struct drm_device *dev)
{
	/* Paranoia: make sure we have disabled everything before we exit. */
	intel_uncore_sanitize(dev);
1162
	intel_uncore_forcewake_reset(dev, false);
1163 1164
}

1165 1166
#define GEN_RANGE(l, h) GENMASK(h, l)

1167 1168 1169
static const struct register_whitelist {
	uint64_t offset;
	uint32_t size;
1170 1171
	/* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */
	uint32_t gen_bitmask;
1172
} whitelist[] = {
1173
	{ RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 9) },
1174 1175 1176 1177 1178 1179 1180 1181
};

int i915_reg_read_ioctl(struct drm_device *dev,
			void *data, struct drm_file *file)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_reg_read *reg = data;
	struct register_whitelist const *entry = whitelist;
1182
	int i, ret = 0;
1183 1184 1185 1186 1187 1188 1189 1190 1191 1192

	for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
		if (entry->offset == reg->offset &&
		    (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
			break;
	}

	if (i == ARRAY_SIZE(whitelist))
		return -EINVAL;

1193 1194
	intel_runtime_pm_get(dev_priv);

1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
	switch (entry->size) {
	case 8:
		reg->val = I915_READ64(reg->offset);
		break;
	case 4:
		reg->val = I915_READ(reg->offset);
		break;
	case 2:
		reg->val = I915_READ16(reg->offset);
		break;
	case 1:
		reg->val = I915_READ8(reg->offset);
		break;
	default:
1209
		MISSING_CASE(entry->size);
1210 1211
		ret = -EINVAL;
		goto out;
1212 1213
	}

1214 1215 1216
out:
	intel_runtime_pm_put(dev_priv);
	return ret;
1217 1218
}

1219 1220 1221 1222 1223 1224
int i915_get_reset_stats_ioctl(struct drm_device *dev,
			       void *data, struct drm_file *file)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_reset_stats *args = data;
	struct i915_ctx_hang_stats *hs;
1225
	struct intel_context *ctx;
1226 1227
	int ret;

1228 1229 1230
	if (args->flags || args->pad)
		return -EINVAL;

1231
	if (args->ctx_id == DEFAULT_CONTEXT_HANDLE && !capable(CAP_SYS_ADMIN))
1232 1233 1234 1235 1236 1237
		return -EPERM;

	ret = mutex_lock_interruptible(&dev->struct_mutex);
	if (ret)
		return ret;

1238 1239
	ctx = i915_gem_context_get(file->driver_priv, args->ctx_id);
	if (IS_ERR(ctx)) {
1240
		mutex_unlock(&dev->struct_mutex);
1241
		return PTR_ERR(ctx);
1242
	}
1243
	hs = &ctx->hang_stats;
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257

	if (capable(CAP_SYS_ADMIN))
		args->reset_count = i915_reset_count(&dev_priv->gpu_error);
	else
		args->reset_count = 0;

	args->batch_active = hs->batch_active;
	args->batch_pending = hs->batch_pending;

	mutex_unlock(&dev->struct_mutex);

	return 0;
}

1258
static int i915_reset_complete(struct drm_device *dev)
1259 1260
{
	u8 gdrst;
1261
	pci_read_config_byte(dev->pdev, I915_GDRST, &gdrst);
V
Ville Syrjälä 已提交
1262
	return (gdrst & GRDOM_RESET_STATUS) == 0;
1263 1264
}

1265
static int i915_do_reset(struct drm_device *dev)
1266
{
V
Ville Syrjälä 已提交
1267
	/* assert reset for at least 20 usec */
1268
	pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
V
Ville Syrjälä 已提交
1269
	udelay(20);
1270
	pci_write_config_byte(dev->pdev, I915_GDRST, 0);
1271

1272
	return wait_for(i915_reset_complete(dev), 500);
V
Ville Syrjälä 已提交
1273 1274 1275 1276 1277
}

static int g4x_reset_complete(struct drm_device *dev)
{
	u8 gdrst;
1278
	pci_read_config_byte(dev->pdev, I915_GDRST, &gdrst);
V
Ville Syrjälä 已提交
1279
	return (gdrst & GRDOM_RESET_ENABLE) == 0;
1280 1281
}

1282 1283 1284 1285 1286 1287
static int g33_do_reset(struct drm_device *dev)
{
	pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
	return wait_for(g4x_reset_complete(dev), 500);
}

1288 1289 1290 1291 1292
static int g4x_do_reset(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int ret;

1293
	pci_write_config_byte(dev->pdev, I915_GDRST,
1294
			      GRDOM_RENDER | GRDOM_RESET_ENABLE);
V
Ville Syrjälä 已提交
1295
	ret =  wait_for(g4x_reset_complete(dev), 500);
1296 1297 1298 1299 1300 1301 1302
	if (ret)
		return ret;

	/* WaVcpClkGateDisableForMediaReset:ctg,elk */
	I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE);
	POSTING_READ(VDECCLK_GATE_D);

1303
	pci_write_config_byte(dev->pdev, I915_GDRST,
1304
			      GRDOM_MEDIA | GRDOM_RESET_ENABLE);
V
Ville Syrjälä 已提交
1305
	ret =  wait_for(g4x_reset_complete(dev), 500);
1306 1307 1308 1309 1310 1311 1312
	if (ret)
		return ret;

	/* WaVcpClkGateDisableForMediaReset:ctg,elk */
	I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE);
	POSTING_READ(VDECCLK_GATE_D);

1313
	pci_write_config_byte(dev->pdev, I915_GDRST, 0);
1314 1315 1316 1317

	return 0;
}

1318 1319 1320 1321 1322 1323
static int ironlake_do_reset(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int ret;

	I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
1324
		   ILK_GRDOM_RENDER | ILK_GRDOM_RESET_ENABLE);
V
Ville Syrjälä 已提交
1325
	ret = wait_for((I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) &
1326
			ILK_GRDOM_RESET_ENABLE) == 0, 500);
1327 1328 1329 1330
	if (ret)
		return ret;

	I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
1331
		   ILK_GRDOM_MEDIA | ILK_GRDOM_RESET_ENABLE);
1332 1333 1334 1335 1336 1337 1338 1339
	ret = wait_for((I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) &
			ILK_GRDOM_RESET_ENABLE) == 0, 500);
	if (ret)
		return ret;

	I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR, 0);

	return 0;
1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352
}

static int gen6_do_reset(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int	ret;

	/* Reset the chip */

	/* GEN6_GDRST is not in the gt power well, no need to check
	 * for fifo space for the write or forcewake the chip for
	 * the read
	 */
1353
	__raw_i915_write32(dev_priv, GEN6_GDRST, GEN6_GRDOM_FULL);
1354 1355

	/* Spin waiting for the device to ack the reset request */
1356
	ret = wait_for((__raw_i915_read32(dev_priv, GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500);
1357

1358
	intel_uncore_forcewake_reset(dev, true);
1359

1360 1361 1362 1363 1364
	return ret;
}

int intel_gpu_reset(struct drm_device *dev)
{
1365 1366 1367 1368 1369 1370
	if (INTEL_INFO(dev)->gen >= 6)
		return gen6_do_reset(dev);
	else if (IS_GEN5(dev))
		return ironlake_do_reset(dev);
	else if (IS_G4X(dev))
		return g4x_do_reset(dev);
1371 1372 1373
	else if (IS_G33(dev))
		return g33_do_reset(dev);
	else if (INTEL_INFO(dev)->gen >= 3)
1374
		return i915_do_reset(dev);
1375 1376
	else
		return -ENODEV;
1377 1378 1379 1380 1381 1382 1383
}

void intel_uncore_check_errors(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

	if (HAS_FPGA_DBG_UNCLAIMED(dev) &&
1384
	    (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) {
1385
		DRM_ERROR("Unclaimed register before interrupt\n");
1386
		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
1387 1388
	}
}