i915_dma.c 32.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/* i915_dma.c -- DMA support for the I915 -*- linux-c -*-
 */
D
Dave Airlie 已提交
3
/*
L
Linus Torvalds 已提交
4 5
 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
 * All Rights Reserved.
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * 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, sub license, 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 NON-INFRINGEMENT.
 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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.
 *
D
Dave Airlie 已提交
27
 */
L
Linus Torvalds 已提交
28

29 30
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

31
#include <linux/async.h>
32 33 34
#include <drm/drmP.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_fb_helper.h>
35
#include <drm/drm_legacy.h>
J
Jesse Barnes 已提交
36
#include "intel_drv.h"
37
#include <drm/i915_drm.h>
L
Linus Torvalds 已提交
38
#include "i915_drv.h"
C
Chris Wilson 已提交
39
#include "i915_trace.h"
40
#include <linux/pci.h>
D
Daniel Vetter 已提交
41 42
#include <linux/console.h>
#include <linux/vt.h>
43
#include <linux/vgaarb.h>
44 45
#include <linux/acpi.h>
#include <linux/pnp.h>
46
#include <linux/vga_switcheroo.h>
47
#include <linux/slab.h>
48
#include <acpi/video.h>
49 50
#include <linux/pm.h>
#include <linux/pm_runtime.h>
51
#include <linux/oom.h>
L
Linus Torvalds 已提交
52 53


54 55
static int i915_getparam(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
L
Linus Torvalds 已提交
56
{
57
	struct drm_i915_private *dev_priv = dev->dev_private;
58
	drm_i915_getparam_t *param = data;
L
Linus Torvalds 已提交
59 60
	int value;

61
	switch (param->param) {
L
Linus Torvalds 已提交
62 63
	case I915_PARAM_IRQ_ACTIVE:
	case I915_PARAM_ALLOW_BATCHBUFFER:
D
Dave Airlie 已提交
64
	case I915_PARAM_LAST_DISPATCH:
65
		/* Reject all old ums/dri params. */
66
		return -ENODEV;
K
Kristian Høgsberg 已提交
67
	case I915_PARAM_CHIPSET_ID:
68
		value = dev->pdev->device;
K
Kristian Høgsberg 已提交
69
		break;
70
	case I915_PARAM_HAS_GEM:
71
		value = 1;
72
		break;
73 74 75
	case I915_PARAM_NUM_FENCES_AVAIL:
		value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
		break;
76 77 78
	case I915_PARAM_HAS_OVERLAY:
		value = dev_priv->overlay ? 1 : 0;
		break;
79 80 81
	case I915_PARAM_HAS_PAGEFLIPPING:
		value = 1;
		break;
J
Jesse Barnes 已提交
82 83
	case I915_PARAM_HAS_EXECBUF2:
		/* depends on GEM */
84
		value = 1;
J
Jesse Barnes 已提交
85
		break;
86
	case I915_PARAM_HAS_BSD:
87
		value = intel_ring_initialized(&dev_priv->ring[VCS]);
88
		break;
89
	case I915_PARAM_HAS_BLT:
90
		value = intel_ring_initialized(&dev_priv->ring[BCS]);
91
		break;
92 93 94
	case I915_PARAM_HAS_VEBOX:
		value = intel_ring_initialized(&dev_priv->ring[VECS]);
		break;
95 96 97
	case I915_PARAM_HAS_RELAXED_FENCING:
		value = 1;
		break;
98 99 100
	case I915_PARAM_HAS_COHERENT_RINGS:
		value = 1;
		break;
101 102 103
	case I915_PARAM_HAS_EXEC_CONSTANTS:
		value = INTEL_INFO(dev)->gen >= 4;
		break;
104 105 106
	case I915_PARAM_HAS_RELAXED_DELTA:
		value = 1;
		break;
107 108 109
	case I915_PARAM_HAS_GEN7_SOL_RESET:
		value = 1;
		break;
110 111 112
	case I915_PARAM_HAS_LLC:
		value = HAS_LLC(dev);
		break;
113 114 115
	case I915_PARAM_HAS_WT:
		value = HAS_WT(dev);
		break;
116
	case I915_PARAM_HAS_ALIASING_PPGTT:
117
		value = USES_PPGTT(dev);
118
		break;
119 120 121
	case I915_PARAM_HAS_WAIT_TIMEOUT:
		value = 1;
		break;
122 123 124
	case I915_PARAM_HAS_SEMAPHORES:
		value = i915_semaphore_is_enabled(dev);
		break;
125 126 127
	case I915_PARAM_HAS_PRIME_VMAP_FLUSH:
		value = 1;
		break;
128 129 130
	case I915_PARAM_HAS_SECURE_BATCHES:
		value = capable(CAP_SYS_ADMIN);
		break;
131 132 133
	case I915_PARAM_HAS_PINNED_BATCHES:
		value = 1;
		break;
134 135 136
	case I915_PARAM_HAS_EXEC_NO_RELOC:
		value = 1;
		break;
137 138 139
	case I915_PARAM_HAS_EXEC_HANDLE_LUT:
		value = 1;
		break;
140 141 142
	case I915_PARAM_CMD_PARSER_VERSION:
		value = i915_cmd_parser_get_version();
		break;
143 144 145
	case I915_PARAM_HAS_COHERENT_PHYS_GTT:
		value = 1;
		break;
L
Linus Torvalds 已提交
146
	default:
147
		DRM_DEBUG("Unknown parameter %d\n", param->param);
E
Eric Anholt 已提交
148
		return -EINVAL;
L
Linus Torvalds 已提交
149 150
	}

D
Daniel Vetter 已提交
151 152
	if (copy_to_user(param->value, &value, sizeof(int))) {
		DRM_ERROR("copy_to_user failed\n");
E
Eric Anholt 已提交
153
		return -EFAULT;
L
Linus Torvalds 已提交
154 155 156 157 158
	}

	return 0;
}

159 160
static int i915_setparam(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
L
Linus Torvalds 已提交
161
{
162
	struct drm_i915_private *dev_priv = dev->dev_private;
163
	drm_i915_setparam_t *param = data;
L
Linus Torvalds 已提交
164

165
	switch (param->param) {
L
Linus Torvalds 已提交
166 167 168
	case I915_SETPARAM_USE_MI_BATCHBUFFER_START:
	case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY:
	case I915_SETPARAM_ALLOW_BATCHBUFFER:
169
		/* Reject all old ums/dri params. */
170 171
		return -ENODEV;

172 173 174 175 176 177 178
	case I915_SETPARAM_NUM_USED_FENCES:
		if (param->value > dev_priv->num_fence_regs ||
		    param->value < 0)
			return -EINVAL;
		/* Userspace can use first N regs */
		dev_priv->fence_reg_start = param->value;
		break;
L
Linus Torvalds 已提交
179
	default:
180
		DRM_DEBUG_DRIVER("unknown parameter %d\n",
181
					param->param);
E
Eric Anholt 已提交
182
		return -EINVAL;
L
Linus Torvalds 已提交
183 184 185 186 187
	}

	return 0;
}

188 189 190 191
static int i915_get_bridge_dev(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

192
	dev_priv->bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0));
193 194 195 196 197 198 199
	if (!dev_priv->bridge_dev) {
		DRM_ERROR("bridge device not found\n");
		return -1;
	}
	return 0;
}

200 201 202 203 204 205 206 207 208 209 210
#define MCHBAR_I915 0x44
#define MCHBAR_I965 0x48
#define MCHBAR_SIZE (4*4096)

#define DEVEN_REG 0x54
#define   DEVEN_MCHBAR_EN (1 << 28)

/* Allocate space for the MCH regs if needed, return nonzero on error */
static int
intel_alloc_mchbar_resource(struct drm_device *dev)
{
211
	struct drm_i915_private *dev_priv = dev->dev_private;
212
	int reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
213 214
	u32 temp_lo, temp_hi = 0;
	u64 mchbar_addr;
215
	int ret;
216

217
	if (INTEL_INFO(dev)->gen >= 4)
218 219 220 221 222 223 224
		pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi);
	pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo);
	mchbar_addr = ((u64)temp_hi << 32) | temp_lo;

	/* If ACPI doesn't have it, assume we need to allocate it ourselves */
#ifdef CONFIG_PNP
	if (mchbar_addr &&
225 226
	    pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE))
		return 0;
227 228 229
#endif

	/* Get some space for it */
230 231 232 233
	dev_priv->mch_res.name = "i915 MCHBAR";
	dev_priv->mch_res.flags = IORESOURCE_MEM;
	ret = pci_bus_alloc_resource(dev_priv->bridge_dev->bus,
				     &dev_priv->mch_res,
234 235
				     MCHBAR_SIZE, MCHBAR_SIZE,
				     PCIBIOS_MIN_MEM,
236
				     0, pcibios_align_resource,
237 238 239 240
				     dev_priv->bridge_dev);
	if (ret) {
		DRM_DEBUG_DRIVER("failed bus alloc: %d\n", ret);
		dev_priv->mch_res.start = 0;
241
		return ret;
242 243
	}

244
	if (INTEL_INFO(dev)->gen >= 4)
245 246 247 248 249
		pci_write_config_dword(dev_priv->bridge_dev, reg + 4,
				       upper_32_bits(dev_priv->mch_res.start));

	pci_write_config_dword(dev_priv->bridge_dev, reg,
			       lower_32_bits(dev_priv->mch_res.start));
250
	return 0;
251 252 253 254 255 256
}

/* Setup MCHBAR if possible, return true if we should disable it again */
static void
intel_setup_mchbar(struct drm_device *dev)
{
257
	struct drm_i915_private *dev_priv = dev->dev_private;
258
	int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
259 260 261
	u32 temp;
	bool enabled;

J
Jesse Barnes 已提交
262 263 264
	if (IS_VALLEYVIEW(dev))
		return;

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
	dev_priv->mchbar_need_disable = false;

	if (IS_I915G(dev) || IS_I915GM(dev)) {
		pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
		enabled = !!(temp & DEVEN_MCHBAR_EN);
	} else {
		pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
		enabled = temp & 1;
	}

	/* If it's already enabled, don't have to do anything */
	if (enabled)
		return;

	if (intel_alloc_mchbar_resource(dev))
		return;

	dev_priv->mchbar_need_disable = true;

	/* Space is allocated or reserved, so enable it. */
	if (IS_I915G(dev) || IS_I915GM(dev)) {
		pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG,
				       temp | DEVEN_MCHBAR_EN);
	} else {
		pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
		pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp | 1);
	}
}

static void
intel_teardown_mchbar(struct drm_device *dev)
{
297
	struct drm_i915_private *dev_priv = dev->dev_private;
298
	int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
	u32 temp;

	if (dev_priv->mchbar_need_disable) {
		if (IS_I915G(dev) || IS_I915GM(dev)) {
			pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
			temp &= ~DEVEN_MCHBAR_EN;
			pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG, temp);
		} else {
			pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
			temp &= ~1;
			pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp);
		}
	}

	if (dev_priv->mch_res.start)
		release_resource(&dev_priv->mch_res);
}

317 318 319 320 321 322 323 324 325 326 327 328 329
/* true = enable decode, false = disable decoder */
static unsigned int i915_vga_set_decode(void *cookie, bool state)
{
	struct drm_device *dev = cookie;

	intel_modeset_vga_set_state(dev, state);
	if (state)
		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
		       VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
	else
		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
}

330 331 332 333
static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
{
	struct drm_device *dev = pci_get_drvdata(pdev);
	pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
334

335
	if (state == VGA_SWITCHEROO_ON) {
336
		pr_info("switched on\n");
337
		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
338 339
		/* i915 resume handler doesn't set to D0 */
		pci_set_power_state(dev->pdev, PCI_D0);
340
		i915_resume_legacy(dev);
341
		dev->switch_power_state = DRM_SWITCH_POWER_ON;
342
	} else {
343
		pr_err("switched off\n");
344
		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
345
		i915_suspend_legacy(dev, pmm);
346
		dev->switch_power_state = DRM_SWITCH_POWER_OFF;
347 348 349 350 351 352 353
	}
}

static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
{
	struct drm_device *dev = pci_get_drvdata(pdev);

354 355 356 357 358 359
	/*
	 * FIXME: open_count is protected by drm_global_mutex but that would lead to
	 * locking inversion with the driver load path. And the access here is
	 * completely racy anyway. So don't bother with locking for now.
	 */
	return dev->open_count == 0;
360 361
}

362 363 364 365 366 367
static const struct vga_switcheroo_client_ops i915_switcheroo_ops = {
	.set_gpu_state = i915_switcheroo_set_state,
	.reprobe = NULL,
	.can_switch = i915_switcheroo_can_switch,
};

368 369 370 371
static int i915_load_modeset_init(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int ret;
J
Jesse Barnes 已提交
372

373
	ret = intel_parse_bios(dev);
J
Jesse Barnes 已提交
374 375 376
	if (ret)
		DRM_INFO("failed to find VBIOS tables\n");

377 378 379 380 381 382 383
	/* If we have > 1 VGA cards, then we need to arbitrate access
	 * to the common VGA resources.
	 *
	 * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA),
	 * then we do not take part in VGA arbitration and the
	 * vga_client_register() fails with -ENODEV.
	 */
384 385 386
	ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
	if (ret && ret != -ENODEV)
		goto out;
387

J
Jesse Barnes 已提交
388 389
	intel_register_dsm_handler();

390
	ret = vga_switcheroo_register_client(dev->pdev, &i915_switcheroo_ops, false);
391
	if (ret)
392
		goto cleanup_vga_client;
393

394 395 396 397 398 399 400
	/* Initialise stolen first so that we may reserve preallocated
	 * objects for the BIOS to KMS transition.
	 */
	ret = i915_gem_init_stolen(dev);
	if (ret)
		goto cleanup_vga_switcheroo;

401 402
	intel_power_domains_init_hw(dev_priv);

403
	ret = intel_irq_install(dev_priv);
404 405 406 407 408
	if (ret)
		goto cleanup_gem_stolen;

	/* Important: The output setup functions called by modeset_init need
	 * working irqs for e.g. gmbus and dp aux transfers. */
409 410
	intel_modeset_init(dev);

411
	ret = i915_gem_init(dev);
J
Jesse Barnes 已提交
412
	if (ret)
413
		goto cleanup_irq;
414

415
	intel_modeset_gem_init(dev);
416

J
Jesse Barnes 已提交
417 418
	/* Always safe in the mode setting case. */
	/* FIXME: do pre/post-mode set stuff in core KMS code */
419
	dev->vblank_disable_allowed = true;
420
	if (INTEL_INFO(dev)->num_pipes == 0)
B
Ben Widawsky 已提交
421
		return 0;
J
Jesse Barnes 已提交
422

423 424
	ret = intel_fbdev_init(dev);
	if (ret)
425 426
		goto cleanup_gem;

427
	/* Only enable hotplug handling once the fbdev is fully set up. */
428
	intel_hpd_init(dev_priv);
429 430 431 432 433 434 435 436 437 438 439

	/*
	 * Some ports require correctly set-up hpd registers for detection to
	 * work properly (leading to ghost connected connector status), e.g. VGA
	 * on gm45.  Hence we can only set up the initial fbdev config after hpd
	 * irqs are fully enabled. Now we should scan for the initial config
	 * only once hotplug handling is enabled, but due to screwed-up locking
	 * around kms/fbdev init we can't protect the fdbev initial config
	 * scanning against hotplug events. Hence do this first and ignore the
	 * tiny window where we will loose hotplug notifactions.
	 */
440
	async_schedule(intel_fbdev_initial_config, dev_priv);
441

442
	drm_kms_helper_poll_init(dev);
443

J
Jesse Barnes 已提交
444 445
	return 0;

446 447 448
cleanup_gem:
	mutex_lock(&dev->struct_mutex);
	i915_gem_cleanup_ringbuffer(dev);
449
	i915_gem_context_fini(dev);
450
	mutex_unlock(&dev->struct_mutex);
451
cleanup_irq:
452
	drm_irq_uninstall(dev);
453 454
cleanup_gem_stolen:
	i915_gem_cleanup_stolen(dev);
455 456 457 458
cleanup_vga_switcheroo:
	vga_switcheroo_unregister_client(dev->pdev);
cleanup_vga_client:
	vga_client_register(dev->pdev, NULL, NULL, NULL);
J
Jesse Barnes 已提交
459 460 461 462
out:
	return ret;
}

463
#if IS_ENABLED(CONFIG_FB)
464
static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
465 466 467 468
{
	struct apertures_struct *ap;
	struct pci_dev *pdev = dev_priv->dev->pdev;
	bool primary;
469
	int ret;
470 471 472

	ap = alloc_apertures(1);
	if (!ap)
473
		return -ENOMEM;
474

475
	ap->ranges[0].base = dev_priv->gtt.mappable_base;
476
	ap->ranges[0].size = dev_priv->gtt.mappable_end;
477

478 479 480
	primary =
		pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;

481
	ret = remove_conflicting_framebuffers(ap, "inteldrmfb", primary);
482 483

	kfree(ap);
484 485

	return ret;
486
}
487
#else
488
static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
489
{
490
	return 0;
491 492
}
#endif
493

D
Daniel Vetter 已提交
494 495 496 497 498 499 500 501 502 503 504 505 506
#if !defined(CONFIG_VGA_CONSOLE)
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
{
	return 0;
}
#elif !defined(CONFIG_DUMMY_CONSOLE)
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
{
	return -ENODEV;
}
#else
static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
{
507
	int ret = 0;
D
Daniel Vetter 已提交
508 509 510 511

	DRM_INFO("Replacing VGA console driver\n");

	console_lock();
512 513
	if (con_is_bound(&vga_con))
		ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
D
Daniel Vetter 已提交
514 515 516 517 518 519 520 521 522 523 524 525 526
	if (ret == 0) {
		ret = do_unregister_con_driver(&vga_con);

		/* Ignore "already unregistered". */
		if (ret == -ENODEV)
			ret = 0;
	}
	console_unlock();

	return ret;
}
#endif

D
Daniel Vetter 已提交
527 528
static void i915_dump_device_info(struct drm_i915_private *dev_priv)
{
529
	const struct intel_device_info *info = &dev_priv->info;
D
Daniel Vetter 已提交
530

531 532
#define PRINT_S(name) "%s"
#define SEP_EMPTY
533 534
#define PRINT_FLAG(name) info->name ? #name "," : ""
#define SEP_COMMA ,
535
	DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x rev=0x%02x flags="
536
			 DEV_INFO_FOR_EACH_FLAG(PRINT_S, SEP_EMPTY),
D
Daniel Vetter 已提交
537 538
			 info->gen,
			 dev_priv->dev->pdev->device,
539
			 dev_priv->dev->pdev->revision,
540
			 DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_COMMA));
541 542
#undef PRINT_S
#undef SEP_EMPTY
543 544
#undef PRINT_FLAG
#undef SEP_COMMA
D
Daniel Vetter 已提交
545 546
}

547 548 549 550 551 552 553
/*
 * Determine various intel_device_info fields at runtime.
 *
 * Use it when either:
 *   - it's judged too laborious to fill n static structures with the limit
 *     when a simple if statement does the job,
 *   - run-time checks (eg read fuse/strap registers) are needed.
554 555 556 557 558
 *
 * This function needs to be called:
 *   - after the MMIO has been setup as we are reading registers,
 *   - after the PCH has been detected,
 *   - before the first usage of the fields it can tweak.
559 560 561
 */
static void intel_device_info_runtime_init(struct drm_device *dev)
{
562
	struct drm_i915_private *dev_priv = dev->dev_private;
563
	struct intel_device_info *info;
564
	enum pipe pipe;
565

566
	info = (struct intel_device_info *)&dev_priv->info;
567

568
	if (IS_VALLEYVIEW(dev) || INTEL_INFO(dev)->gen == 9)
569
		for_each_pipe(dev_priv, pipe)
570 571
			info->num_sprites[pipe] = 2;
	else
572
		for_each_pipe(dev_priv, pipe)
573
			info->num_sprites[pipe] = 1;
574

575 576 577 578 579 580
	if (i915.disable_display) {
		DRM_INFO("Display disabled (module parameter)\n");
		info->num_pipes = 0;
	} else if (info->num_pipes > 0 &&
		   (INTEL_INFO(dev)->gen == 7 || INTEL_INFO(dev)->gen == 8) &&
		   !IS_VALLEYVIEW(dev)) {
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600
		u32 fuse_strap = I915_READ(FUSE_STRAP);
		u32 sfuse_strap = I915_READ(SFUSE_STRAP);

		/*
		 * SFUSE_STRAP is supposed to have a bit signalling the display
		 * is fused off. Unfortunately it seems that, at least in
		 * certain cases, fused off display means that PCH display
		 * reads don't land anywhere. In that case, we read 0s.
		 *
		 * On CPT/PPT, we can detect this case as SFUSE_STRAP_FUSE_LOCK
		 * should be set when taking over after the firmware.
		 */
		if (fuse_strap & ILK_INTERNAL_DISPLAY_DISABLE ||
		    sfuse_strap & SFUSE_STRAP_DISPLAY_DISABLED ||
		    (dev_priv->pch_type == PCH_CPT &&
		     !(sfuse_strap & SFUSE_STRAP_FUSE_LOCK))) {
			DRM_INFO("Display fused off, disabling\n");
			info->num_pipes = 0;
		}
	}
601 602
}

J
Jesse Barnes 已提交
603 604 605 606 607 608 609 610 611 612 613
/**
 * i915_driver_load - setup chip and create an initial config
 * @dev: DRM device
 * @flags: startup flags
 *
 * The driver load routine has to do several things:
 *   - drive output discovery via intel_modeset_init()
 *   - initialize the memory manager
 *   - allocate initial config memory
 *   - setup the DRM framebuffer with the allocated memory
 */
614
int i915_driver_load(struct drm_device *dev, unsigned long flags)
615
{
616
	struct drm_i915_private *dev_priv;
617
	struct intel_device_info *info, *device_info;
618
	int ret = 0, mmio_bar, mmio_size;
619
	uint32_t aperture_size;
620

621 622 623
	info = (struct intel_device_info *) flags;

	/* Refuse to load on gen6+ without kms enabled. */
624 625 626
	if (info->gen >= 6 && !drm_core_check_feature(dev, DRIVER_MODESET)) {
		DRM_INFO("Your hardware requires kernel modesetting (KMS)\n");
		DRM_INFO("See CONFIG_DRM_I915_KMS, nomodeset, and i915.modeset parameters\n");
627
		return -ENODEV;
628
	}
629

D
Daniel Vetter 已提交
630 631 632 633
	/* UMS needs agp support. */
	if (!drm_core_check_feature(dev, DRIVER_MODESET) && !dev->agp)
		return -EINVAL;

634
	dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
J
Jesse Barnes 已提交
635 636 637
	if (dev_priv == NULL)
		return -ENOMEM;

638
	dev->dev_private = dev_priv;
639
	dev_priv->dev = dev;
640

641
	/* Setup the write-once "constant" device info */
642
	device_info = (struct intel_device_info *)&dev_priv->info;
643 644
	memcpy(device_info, info, sizeof(dev_priv->info));
	device_info->device_id = dev->pdev->device;
J
Jesse Barnes 已提交
645

646 647
	spin_lock_init(&dev_priv->irq_lock);
	spin_lock_init(&dev_priv->gpu_error.lock);
648
	mutex_init(&dev_priv->backlight_lock);
649
	spin_lock_init(&dev_priv->uncore.lock);
650
	spin_lock_init(&dev_priv->mm.object_stat_lock);
651
	spin_lock_init(&dev_priv->mmio_flip_lock);
652 653 654
	mutex_init(&dev_priv->dpio_lock);
	mutex_init(&dev_priv->modeset_restore_lock);

D
Daniel Vetter 已提交
655
	intel_pm_setup(dev);
656

657 658
	intel_display_crc_init(dev);

D
Daniel Vetter 已提交
659 660
	i915_dump_device_info(dev_priv);

661 662 663 664 665 666 667 668
	/* Not all pre-production machines fall into this category, only the
	 * very first ones. Almost everything should work, except for maybe
	 * suspend/resume. And we don't implement workarounds that affect only
	 * pre-production machines. */
	if (IS_HSW_EARLY_SDV(dev))
		DRM_INFO("This is an early pre-production Haswell machine. "
			 "It may not be fully functional.\n");

669 670 671 672 673
	if (i915_get_bridge_dev(dev)) {
		ret = -EIO;
		goto free_priv;
	}

674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
	mmio_bar = IS_GEN2(dev) ? 1 : 0;
	/* Before gen4, the registers and the GTT are behind different BARs.
	 * However, from gen4 onwards, the registers and the GTT are shared
	 * in the same BAR, so we want to restrict this ioremap from
	 * clobbering the GTT which we want ioremap_wc instead. Fortunately,
	 * the register BAR remains the same size for all the earlier
	 * generations up to Ironlake.
	 */
	if (info->gen < 5)
		mmio_size = 512*1024;
	else
		mmio_size = 2*1024*1024;

	dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, mmio_size);
	if (!dev_priv->regs) {
		DRM_ERROR("failed to map registers\n");
		ret = -EIO;
		goto put_bridge;
	}

694 695 696 697 698
	/* This must be called before any calls to HAS_PCH_* */
	intel_detect_pch(dev);

	intel_uncore_init(dev);

699 700
	ret = i915_gem_gtt_init(dev);
	if (ret)
701
		goto out_regs;
702

D
Daniel Vetter 已提交
703
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
D
Daniel Vetter 已提交
704 705 706
		/* WARNING: Apparently we must kick fbdev drivers before vgacon,
		 * otherwise the vga fbdev driver falls over. */
		ret = i915_kick_out_firmware_fb(dev_priv);
D
Daniel Vetter 已提交
707
		if (ret) {
D
Daniel Vetter 已提交
708
			DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
D
Daniel Vetter 已提交
709 710 711
			goto out_gtt;
		}

D
Daniel Vetter 已提交
712
		ret = i915_kick_out_vgacon(dev_priv);
713
		if (ret) {
D
Daniel Vetter 已提交
714
			DRM_ERROR("failed to remove conflicting VGA console\n");
715 716
			goto out_gtt;
		}
D
Daniel Vetter 已提交
717
	}
718

719 720
	pci_set_master(dev->pdev);

721 722 723 724
	/* overlay on gen2 is broken and can't address above 1G */
	if (IS_GEN2(dev))
		dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30));

725 726 727 728 729 730 731 732 733 734 735
	/* 965GM sometimes incorrectly writes to hardware status page (HWS)
	 * using 32bit addressing, overwriting memory if HWS is located
	 * above 4GB.
	 *
	 * The documentation also mentions an issue with undefined
	 * behaviour if any general state is accessed within a page above 4GB,
	 * which also needs to be handled carefully.
	 */
	if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
		dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32));

736
	aperture_size = dev_priv->gtt.mappable_end;
737

B
Ben Widawsky 已提交
738 739
	dev_priv->gtt.mappable =
		io_mapping_create_wc(dev_priv->gtt.mappable_base,
740
				     aperture_size);
B
Ben Widawsky 已提交
741
	if (dev_priv->gtt.mappable == NULL) {
742
		ret = -EIO;
743
		goto out_gtt;
744 745
	}

746 747
	dev_priv->gtt.mtrr = arch_phys_wc_add(dev_priv->gtt.mappable_base,
					      aperture_size);
748

749 750 751 752 753 754 755
	/* The i915 workqueue is primarily used for batched retirement of
	 * requests (and thus managing bo) once the task has been completed
	 * by the GPU. i915_gem_retire_requests() is called directly when we
	 * need high-priority retirement, such as waiting for an explicit
	 * bo.
	 *
	 * It is also used for periodic low-priority events, such as
756
	 * idle-timers and recording error state.
757 758 759
	 *
	 * All tasks on the workqueue are expected to acquire the dev mutex
	 * so there is no point in running more than one instance of the
760
	 * workqueue at any time.  Use an ordered one.
761
	 */
762
	dev_priv->wq = alloc_ordered_workqueue("i915", 0);
763 764 765
	if (dev_priv->wq == NULL) {
		DRM_ERROR("Failed to create our workqueue.\n");
		ret = -ENOMEM;
766
		goto out_mtrrfree;
767 768
	}

769 770 771 772 773 774 775
	dev_priv->dp_wq = alloc_ordered_workqueue("i915-dp", 0);
	if (dev_priv->dp_wq == NULL) {
		DRM_ERROR("Failed to create our dp workqueue.\n");
		ret = -ENOMEM;
		goto out_freewq;
	}

776
	intel_irq_init(dev_priv);
777
	intel_uncore_sanitize(dev);
778

779 780
	/* Try to make sure MCHBAR is enabled before poking at it */
	intel_setup_mchbar(dev);
781
	intel_setup_gmbus(dev);
782
	intel_opregion_setup(dev);
783

784 785
	intel_setup_bios(dev);

786 787
	i915_gem_load(dev);

788 789 790 791 792 793
	/* On the 945G/GM, the chipset reports the MSI capability on the
	 * integrated graphics even though the support isn't actually there
	 * according to the published specs.  It doesn't appear to function
	 * correctly in testing on 945G.
	 * This may be a side effect of MSI having been made available for PEG
	 * and the registers being closely associated.
794 795
	 *
	 * According to chipset errata, on the 965GM, MSI interrupts may
796 797
	 * be lost or delayed, but we use them anyways to avoid
	 * stuck interrupts on some machines.
798
	 */
799
	if (!IS_I945G(dev) && !IS_I945GM(dev))
800
		pci_enable_msi(dev->pdev);
801

802
	intel_device_info_runtime_init(dev);
803

B
Ben Widawsky 已提交
804 805 806 807 808
	if (INTEL_INFO(dev)->num_pipes) {
		ret = drm_vblank_init(dev, INTEL_INFO(dev)->num_pipes);
		if (ret)
			goto out_gem_unload;
	}
809

810
	intel_power_domains_init(dev_priv);
811

J
Jesse Barnes 已提交
812
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
D
Daniel Vetter 已提交
813
		ret = i915_load_modeset_init(dev);
J
Jesse Barnes 已提交
814 815
		if (ret < 0) {
			DRM_ERROR("failed to init modeset\n");
816
			goto out_power_well;
J
Jesse Barnes 已提交
817 818 819
		}
	}

B
Ben Widawsky 已提交
820 821
	i915_setup_sysfs(dev);

B
Ben Widawsky 已提交
822 823 824
	if (INTEL_INFO(dev)->num_pipes) {
		/* Must be done after probing outputs */
		intel_opregion_init(dev);
825
		acpi_video_register();
B
Ben Widawsky 已提交
826
	}
827

828 829
	if (IS_GEN5(dev))
		intel_gpu_ips_init(dev_priv);
830

831
	intel_runtime_pm_enable(dev_priv);
832

J
Jesse Barnes 已提交
833 834
	return 0;

835
out_power_well:
836
	intel_power_domains_fini(dev_priv);
837
	drm_vblank_cleanup(dev);
838
out_gem_unload:
839 840
	WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier));
	unregister_shrinker(&dev_priv->mm.shrinker);
841

842 843 844 845 846
	if (dev->pdev->msi_enabled)
		pci_disable_msi(dev->pdev);

	intel_teardown_gmbus(dev);
	intel_teardown_mchbar(dev);
847
	pm_qos_remove_request(&dev_priv->pm_qos);
848 849
	destroy_workqueue(dev_priv->dp_wq);
out_freewq:
850
	destroy_workqueue(dev_priv->wq);
851
out_mtrrfree:
852
	arch_phys_wc_del(dev_priv->gtt.mtrr);
B
Ben Widawsky 已提交
853
	io_mapping_free(dev_priv->gtt.mappable);
854
out_gtt:
855
	i915_global_gtt_cleanup(dev);
856
out_regs:
857
	intel_uncore_fini(dev);
858
	pci_iounmap(dev->pdev, dev_priv->regs);
859 860
put_bridge:
	pci_dev_put(dev_priv->bridge_dev);
J
Jesse Barnes 已提交
861
free_priv:
862 863
	if (dev_priv->slab)
		kmem_cache_destroy(dev_priv->slab);
864
	kfree(dev_priv);
J
Jesse Barnes 已提交
865 866 867 868 869 870
	return ret;
}

int i915_driver_unload(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
871
	int ret;
J
Jesse Barnes 已提交
872

873 874 875 876 877 878
	ret = i915_gem_suspend(dev);
	if (ret) {
		DRM_ERROR("failed to idle hardware: %d\n", ret);
		return ret;
	}

879
	intel_power_domains_fini(dev_priv);
880

881
	intel_gpu_ips_teardown();
882

B
Ben Widawsky 已提交
883 884
	i915_teardown_sysfs(dev);

885 886
	WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier));
	unregister_shrinker(&dev_priv->mm.shrinker);
887

B
Ben Widawsky 已提交
888
	io_mapping_free(dev_priv->gtt.mappable);
889
	arch_phys_wc_del(dev_priv->gtt.mtrr);
890

891 892
	acpi_video_unregister();

893
	if (drm_core_check_feature(dev, DRIVER_MODESET))
894
		intel_fbdev_fini(dev);
895 896 897 898

	drm_vblank_cleanup(dev);

	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
899 900
		intel_modeset_cleanup(dev);

Z
Zhao Yakui 已提交
901 902 903 904
		/*
		 * free the memory space allocated for the child device
		 * config parsed from VBT
		 */
905 906 907 908
		if (dev_priv->vbt.child_dev && dev_priv->vbt.child_dev_num) {
			kfree(dev_priv->vbt.child_dev);
			dev_priv->vbt.child_dev = NULL;
			dev_priv->vbt.child_dev_num = 0;
Z
Zhao Yakui 已提交
909
		}
910

911
		vga_switcheroo_unregister_client(dev->pdev);
912
		vga_client_register(dev->pdev, NULL, NULL, NULL);
J
Jesse Barnes 已提交
913 914
	}

915
	/* Free error state after interrupts are fully disabled. */
916 917
	del_timer_sync(&dev_priv->gpu_error.hangcheck_timer);
	cancel_work_sync(&dev_priv->gpu_error.work);
918
	i915_destroy_error_state(dev);
919

920 921 922
	if (dev->pdev->msi_enabled)
		pci_disable_msi(dev->pdev);

923
	intel_opregion_fini(dev);
924

J
Jesse Barnes 已提交
925
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
926 927 928
		/* Flush any outstanding unpin_work. */
		flush_workqueue(dev_priv->wq);

J
Jesse Barnes 已提交
929 930
		mutex_lock(&dev->struct_mutex);
		i915_gem_cleanup_ringbuffer(dev);
931
		i915_gem_context_fini(dev);
J
Jesse Barnes 已提交
932
		mutex_unlock(&dev->struct_mutex);
933
		i915_gem_cleanup_stolen(dev);
J
Jesse Barnes 已提交
934 935
	}

936
	intel_teardown_gmbus(dev);
937 938
	intel_teardown_mchbar(dev);

939
	destroy_workqueue(dev_priv->dp_wq);
940
	destroy_workqueue(dev_priv->wq);
941
	pm_qos_remove_request(&dev_priv->pm_qos);
942

943
	i915_global_gtt_cleanup(dev);
944

945 946 947 948
	intel_uncore_fini(dev);
	if (dev_priv->regs != NULL)
		pci_iounmap(dev->pdev, dev_priv->regs);

949 950
	if (dev_priv->slab)
		kmem_cache_destroy(dev_priv->slab);
951

952
	pci_dev_put(dev_priv->bridge_dev);
953
	kfree(dev_priv);
J
Jesse Barnes 已提交
954

955 956 957
	return 0;
}

958
int i915_driver_open(struct drm_device *dev, struct drm_file *file)
959
{
960
	int ret;
961

962 963 964
	ret = i915_gem_open(dev, file);
	if (ret)
		return ret;
965

966 967 968
	return 0;
}

J
Jesse Barnes 已提交
969 970 971 972 973 974 975 976
/**
 * i915_driver_lastclose - clean up after all DRM clients have exited
 * @dev: DRM device
 *
 * Take care of cleaning up after all DRM clients have exited.  In the
 * mode setting case, we want to restore the kernel's initial mode (just
 * in case the last client left us in a bad state).
 *
977
 * Additionally, in the non-mode setting case, we'll tear down the GTT
J
Jesse Barnes 已提交
978 979 980
 * and DMA structures, since the kernel won't be using them, and clea
 * up any GEM state.
 */
981
void i915_driver_lastclose(struct drm_device *dev)
L
Linus Torvalds 已提交
982
{
983
	struct drm_i915_private *dev_priv = dev->dev_private;
J
Jesse Barnes 已提交
984

985 986 987 988 989 990 991
	/* On gen6+ we refuse to init without kms enabled, but then the drm core
	 * goes right around and calls lastclose. Check for this and don't clean
	 * up anything. */
	if (!dev_priv)
		return;

	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
992
		intel_fbdev_restore_mode(dev);
993
		vga_switcheroo_process_delayed_switch();
D
Dave Airlie 已提交
994
		return;
J
Jesse Barnes 已提交
995
	}
D
Dave Airlie 已提交
996

997
	i915_gem_lastclose(dev);
L
Linus Torvalds 已提交
998 999
}

1000
void i915_driver_preclose(struct drm_device *dev, struct drm_file *file)
L
Linus Torvalds 已提交
1001
{
1002
	mutex_lock(&dev->struct_mutex);
1003 1004
	i915_gem_context_close(dev, file);
	i915_gem_release(dev, file);
1005
	mutex_unlock(&dev->struct_mutex);
1006 1007 1008

	if (drm_core_check_feature(dev, DRIVER_MODESET))
		intel_modeset_preclose(dev, file);
L
Linus Torvalds 已提交
1009 1010
}

1011
void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
1012
{
1013
	struct drm_i915_file_private *file_priv = file->driver_priv;
1014

1015 1016
	if (file_priv && file_priv->bsd_ring)
		file_priv->bsd_ring = NULL;
1017
	kfree(file_priv);
1018 1019
}

R
Rob Clark 已提交
1020
const struct drm_ioctl_desc i915_ioctls[] = {
1021 1022 1023 1024 1025 1026
	DRM_IOCTL_DEF_DRV(I915_INIT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
	DRM_IOCTL_DEF_DRV(I915_FLUSH, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_FLIP, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_BATCHBUFFER, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_IRQ_EMIT, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_IRQ_WAIT, drm_noop, DRM_AUTH),
1027
	DRM_IOCTL_DEF_DRV(I915_GETPARAM, i915_getparam, DRM_AUTH|DRM_RENDER_ALLOW),
1028
	DRM_IOCTL_DEF_DRV(I915_SETPARAM, i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
D
Daniel Vetter 已提交
1029 1030 1031
	DRM_IOCTL_DEF_DRV(I915_ALLOC, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_FREE, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_INIT_HEAP, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1032
	DRM_IOCTL_DEF_DRV(I915_CMDBUFFER, drm_noop, DRM_AUTH),
D
Daniel Vetter 已提交
1033
	DRM_IOCTL_DEF_DRV(I915_DESTROY_HEAP,  drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1034
	DRM_IOCTL_DEF_DRV(I915_SET_VBLANK_PIPE,  drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1035 1036 1037
	DRM_IOCTL_DEF_DRV(I915_GET_VBLANK_PIPE,  drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_VBLANK_SWAP, drm_noop, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_HWS_ADDR, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1038 1039
	DRM_IOCTL_DEF_DRV(I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
	DRM_IOCTL_DEF_DRV(I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH|DRM_UNLOCKED),
1040
	DRM_IOCTL_DEF_DRV(I915_GEM_EXECBUFFER2, i915_gem_execbuffer2, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
1041 1042
	DRM_IOCTL_DEF_DRV(I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),
	DRM_IOCTL_DEF_DRV(I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),
1043 1044 1045 1046
	DRM_IOCTL_DEF_DRV(I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_SET_CACHING, i915_gem_set_caching_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_GET_CACHING, i915_gem_get_caching_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
1047 1048
	DRM_IOCTL_DEF_DRV(I915_GEM_ENTERVT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
	DRM_IOCTL_DEF_DRV(I915_GEM_LEAVEVT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
	DRM_IOCTL_DEF_DRV(I915_GEM_CREATE, i915_gem_create_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_PREAD, i915_gem_pread_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_PWRITE, i915_gem_pwrite_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_MMAP, i915_gem_mmap_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_MMAP_GTT, i915_gem_mmap_gtt_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_SET_DOMAIN, i915_gem_set_domain_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_SET_TILING, i915_gem_set_tiling, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_GET_TILING, i915_gem_get_tiling, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1059
	DRM_IOCTL_DEF_DRV(I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, DRM_UNLOCKED),
1060
	DRM_IOCTL_DEF_DRV(I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1061 1062
	DRM_IOCTL_DEF_DRV(I915_OVERLAY_PUT_IMAGE, intel_overlay_put_image, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
	DRM_IOCTL_DEF_DRV(I915_OVERLAY_ATTRS, intel_overlay_attrs, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1063 1064
	DRM_IOCTL_DEF_DRV(I915_SET_SPRITE_COLORKEY, intel_sprite_set_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
	DRM_IOCTL_DEF_DRV(I915_GET_SPRITE_COLORKEY, intel_sprite_get_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1065 1066 1067 1068
	DRM_IOCTL_DEF_DRV(I915_GEM_WAIT, i915_gem_wait_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_CREATE, i915_gem_context_create_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_DESTROY, i915_gem_context_destroy_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1069
	DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_get_reset_stats_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1070
	DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
D
Dave Airlie 已提交
1071 1072
};

1073
int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
1074

1075 1076 1077 1078
/*
 * This is really ugly: Because old userspace abused the linux agp interface to
 * manage the gtt, we need to claim that all intel devices are agp.  For
 * otherwise the drm core refuses to initialize the agp support code.
1079
 */
1080
int i915_driver_device_is_agp(struct drm_device *dev)
1081 1082 1083
{
	return 1;
}