i915_dma.c 33.6 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
static int i915_dma_init(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
L
Linus Torvalds 已提交
55
{
56
	return -ENODEV;
L
Linus Torvalds 已提交
57 58
}

59 60
static int i915_flush_ioctl(struct drm_device *dev, void *data,
			    struct drm_file *file_priv)
L
Linus Torvalds 已提交
61
{
62
	return -ENODEV;
L
Linus Torvalds 已提交
63 64
}

65 66
static int i915_batchbuffer(struct drm_device *dev, void *data,
			    struct drm_file *file_priv)
L
Linus Torvalds 已提交
67
{
68
	return -ENODEV;
L
Linus Torvalds 已提交
69 70
}

71 72
static int i915_cmdbuffer(struct drm_device *dev, void *data,
			  struct drm_file *file_priv)
L
Linus Torvalds 已提交
73
{
74
	return -ENODEV;
75 76 77 78 79
}

static int i915_irq_emit(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
{
80
	return -ENODEV;
81 82 83 84 85
}

static int i915_irq_wait(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
{
86
	return -ENODEV;
87 88
}

89 90 91
static int i915_vblank_pipe_get(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
{
92
	return -ENODEV;
93 94 95 96 97
}

static int i915_vblank_swap(struct drm_device *dev, void *data,
		     struct drm_file *file_priv)
{
98
	return -ENODEV;
99 100
}

101 102
static int i915_flip_bufs(struct drm_device *dev, void *data,
			  struct drm_file *file_priv)
L
Linus Torvalds 已提交
103
{
104
	return -ENODEV;
L
Linus Torvalds 已提交
105 106
}

107 108
static int i915_getparam(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
L
Linus Torvalds 已提交
109
{
110
	struct drm_i915_private *dev_priv = dev->dev_private;
111
	drm_i915_getparam_t *param = data;
L
Linus Torvalds 已提交
112 113 114
	int value;

	if (!dev_priv) {
115
		DRM_ERROR("called with no initialization\n");
E
Eric Anholt 已提交
116
		return -EINVAL;
L
Linus Torvalds 已提交
117 118
	}

119
	switch (param->param) {
L
Linus Torvalds 已提交
120
	case I915_PARAM_IRQ_ACTIVE:
121
		return -ENODEV;
L
Linus Torvalds 已提交
122
	case I915_PARAM_ALLOW_BATCHBUFFER:
123
		return -ENODEV;
D
Dave Airlie 已提交
124
	case I915_PARAM_LAST_DISPATCH:
125
		return -ENODEV;
K
Kristian Høgsberg 已提交
126
	case I915_PARAM_CHIPSET_ID:
127
		value = dev->pdev->device;
K
Kristian Høgsberg 已提交
128
		break;
129
	case I915_PARAM_HAS_GEM:
130
		value = 1;
131
		break;
132 133 134
	case I915_PARAM_NUM_FENCES_AVAIL:
		value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
		break;
135 136 137
	case I915_PARAM_HAS_OVERLAY:
		value = dev_priv->overlay ? 1 : 0;
		break;
138 139 140
	case I915_PARAM_HAS_PAGEFLIPPING:
		value = 1;
		break;
J
Jesse Barnes 已提交
141 142
	case I915_PARAM_HAS_EXECBUF2:
		/* depends on GEM */
143
		value = 1;
J
Jesse Barnes 已提交
144
		break;
145
	case I915_PARAM_HAS_BSD:
146
		value = intel_ring_initialized(&dev_priv->ring[VCS]);
147
		break;
148
	case I915_PARAM_HAS_BLT:
149
		value = intel_ring_initialized(&dev_priv->ring[BCS]);
150
		break;
151 152 153
	case I915_PARAM_HAS_VEBOX:
		value = intel_ring_initialized(&dev_priv->ring[VECS]);
		break;
154 155 156
	case I915_PARAM_HAS_RELAXED_FENCING:
		value = 1;
		break;
157 158 159
	case I915_PARAM_HAS_COHERENT_RINGS:
		value = 1;
		break;
160 161 162
	case I915_PARAM_HAS_EXEC_CONSTANTS:
		value = INTEL_INFO(dev)->gen >= 4;
		break;
163 164 165
	case I915_PARAM_HAS_RELAXED_DELTA:
		value = 1;
		break;
166 167 168
	case I915_PARAM_HAS_GEN7_SOL_RESET:
		value = 1;
		break;
169 170 171
	case I915_PARAM_HAS_LLC:
		value = HAS_LLC(dev);
		break;
172 173 174
	case I915_PARAM_HAS_WT:
		value = HAS_WT(dev);
		break;
175
	case I915_PARAM_HAS_ALIASING_PPGTT:
176
		value = USES_PPGTT(dev);
177
		break;
178 179 180
	case I915_PARAM_HAS_WAIT_TIMEOUT:
		value = 1;
		break;
181 182 183
	case I915_PARAM_HAS_SEMAPHORES:
		value = i915_semaphore_is_enabled(dev);
		break;
184 185 186
	case I915_PARAM_HAS_PRIME_VMAP_FLUSH:
		value = 1;
		break;
187 188 189
	case I915_PARAM_HAS_SECURE_BATCHES:
		value = capable(CAP_SYS_ADMIN);
		break;
190 191 192
	case I915_PARAM_HAS_PINNED_BATCHES:
		value = 1;
		break;
193 194 195
	case I915_PARAM_HAS_EXEC_NO_RELOC:
		value = 1;
		break;
196 197 198
	case I915_PARAM_HAS_EXEC_HANDLE_LUT:
		value = 1;
		break;
199 200 201
	case I915_PARAM_CMD_PARSER_VERSION:
		value = i915_cmd_parser_get_version();
		break;
202 203 204
	case I915_PARAM_HAS_COHERENT_PHYS_GTT:
		value = 1;
		break;
L
Linus Torvalds 已提交
205
	default:
206
		DRM_DEBUG("Unknown parameter %d\n", param->param);
E
Eric Anholt 已提交
207
		return -EINVAL;
L
Linus Torvalds 已提交
208 209
	}

D
Daniel Vetter 已提交
210 211
	if (copy_to_user(param->value, &value, sizeof(int))) {
		DRM_ERROR("copy_to_user failed\n");
E
Eric Anholt 已提交
212
		return -EFAULT;
L
Linus Torvalds 已提交
213 214 215 216 217
	}

	return 0;
}

218 219
static int i915_setparam(struct drm_device *dev, void *data,
			 struct drm_file *file_priv)
L
Linus Torvalds 已提交
220
{
221
	struct drm_i915_private *dev_priv = dev->dev_private;
222
	drm_i915_setparam_t *param = data;
L
Linus Torvalds 已提交
223 224

	if (!dev_priv) {
225
		DRM_ERROR("called with no initialization\n");
E
Eric Anholt 已提交
226
		return -EINVAL;
L
Linus Torvalds 已提交
227 228
	}

229
	switch (param->param) {
L
Linus Torvalds 已提交
230 231 232
	case I915_SETPARAM_USE_MI_BATCHBUFFER_START:
	case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY:
	case I915_SETPARAM_ALLOW_BATCHBUFFER:
233 234
		return -ENODEV;

235 236 237 238 239 240 241
	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 已提交
242
	default:
243
		DRM_DEBUG_DRIVER("unknown parameter %d\n",
244
					param->param);
E
Eric Anholt 已提交
245
		return -EINVAL;
L
Linus Torvalds 已提交
246 247 248 249 250
	}

	return 0;
}

251 252
static int i915_set_status_page(struct drm_device *dev, void *data,
				struct drm_file *file_priv)
253
{
254
	return -ENODEV;
255 256
}

257 258 259 260
static int i915_get_bridge_dev(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

261
	dev_priv->bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0));
262 263 264 265 266 267 268
	if (!dev_priv->bridge_dev) {
		DRM_ERROR("bridge device not found\n");
		return -1;
	}
	return 0;
}

269 270 271 272 273 274 275 276 277 278 279
#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)
{
280
	struct drm_i915_private *dev_priv = dev->dev_private;
281
	int reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
282 283
	u32 temp_lo, temp_hi = 0;
	u64 mchbar_addr;
284
	int ret;
285

286
	if (INTEL_INFO(dev)->gen >= 4)
287 288 289 290 291 292 293
		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 &&
294 295
	    pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE))
		return 0;
296 297 298
#endif

	/* Get some space for it */
299 300 301 302
	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,
303 304
				     MCHBAR_SIZE, MCHBAR_SIZE,
				     PCIBIOS_MIN_MEM,
305
				     0, pcibios_align_resource,
306 307 308 309
				     dev_priv->bridge_dev);
	if (ret) {
		DRM_DEBUG_DRIVER("failed bus alloc: %d\n", ret);
		dev_priv->mch_res.start = 0;
310
		return ret;
311 312
	}

313
	if (INTEL_INFO(dev)->gen >= 4)
314 315 316 317 318
		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));
319
	return 0;
320 321 322 323 324 325
}

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

J
Jesse Barnes 已提交
331 332 333
	if (IS_VALLEYVIEW(dev))
		return;

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
	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)
{
366
	struct drm_i915_private *dev_priv = dev->dev_private;
367
	int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
	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);
}

386 387 388 389 390 391 392 393 394 395 396 397 398
/* 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;
}

399 400 401 402
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 };
403

404
	if (state == VGA_SWITCHEROO_ON) {
405
		pr_info("switched on\n");
406
		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
407 408
		/* i915 resume handler doesn't set to D0 */
		pci_set_power_state(dev->pdev, PCI_D0);
409
		i915_resume_legacy(dev);
410
		dev->switch_power_state = DRM_SWITCH_POWER_ON;
411
	} else {
412
		pr_err("switched off\n");
413
		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
414
		i915_suspend_legacy(dev, pmm);
415
		dev->switch_power_state = DRM_SWITCH_POWER_OFF;
416 417 418 419 420 421 422
	}
}

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

423 424 425 426 427 428
	/*
	 * 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;
429 430
}

431 432 433 434 435 436
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,
};

437 438 439 440
static int i915_load_modeset_init(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int ret;
J
Jesse Barnes 已提交
441

442
	ret = intel_parse_bios(dev);
J
Jesse Barnes 已提交
443 444 445
	if (ret)
		DRM_INFO("failed to find VBIOS tables\n");

446 447 448 449 450 451 452
	/* 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.
	 */
453 454 455
	ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
	if (ret && ret != -ENODEV)
		goto out;
456

J
Jesse Barnes 已提交
457 458
	intel_register_dsm_handler();

459
	ret = vga_switcheroo_register_client(dev->pdev, &i915_switcheroo_ops, false);
460
	if (ret)
461
		goto cleanup_vga_client;
462

463 464 465 466 467 468 469
	/* 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;

470 471
	intel_power_domains_init_hw(dev_priv);

472
	ret = intel_irq_install(dev_priv);
473 474 475 476 477
	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. */
478 479
	intel_modeset_init(dev);

480
	ret = i915_gem_init(dev);
J
Jesse Barnes 已提交
481
	if (ret)
482
		goto cleanup_irq;
483

484
	intel_modeset_gem_init(dev);
485

J
Jesse Barnes 已提交
486 487
	/* Always safe in the mode setting case. */
	/* FIXME: do pre/post-mode set stuff in core KMS code */
488
	dev->vblank_disable_allowed = true;
489
	if (INTEL_INFO(dev)->num_pipes == 0)
B
Ben Widawsky 已提交
490
		return 0;
J
Jesse Barnes 已提交
491

492 493
	ret = intel_fbdev_init(dev);
	if (ret)
494 495
		goto cleanup_gem;

496
	/* Only enable hotplug handling once the fbdev is fully set up. */
497
	intel_hpd_init(dev_priv);
498 499 500 501 502 503 504 505 506 507 508

	/*
	 * 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.
	 */
509
	async_schedule(intel_fbdev_initial_config, dev_priv);
510

511
	drm_kms_helper_poll_init(dev);
512

J
Jesse Barnes 已提交
513 514
	return 0;

515 516 517
cleanup_gem:
	mutex_lock(&dev->struct_mutex);
	i915_gem_cleanup_ringbuffer(dev);
518
	i915_gem_context_fini(dev);
519
	mutex_unlock(&dev->struct_mutex);
520
cleanup_irq:
521
	drm_irq_uninstall(dev);
522 523
cleanup_gem_stolen:
	i915_gem_cleanup_stolen(dev);
524 525 526 527
cleanup_vga_switcheroo:
	vga_switcheroo_unregister_client(dev->pdev);
cleanup_vga_client:
	vga_client_register(dev->pdev, NULL, NULL, NULL);
J
Jesse Barnes 已提交
528 529 530 531
out:
	return ret;
}

532
#if IS_ENABLED(CONFIG_FB)
533
static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
534 535 536 537
{
	struct apertures_struct *ap;
	struct pci_dev *pdev = dev_priv->dev->pdev;
	bool primary;
538
	int ret;
539 540 541

	ap = alloc_apertures(1);
	if (!ap)
542
		return -ENOMEM;
543

544
	ap->ranges[0].base = dev_priv->gtt.mappable_base;
545
	ap->ranges[0].size = dev_priv->gtt.mappable_end;
546

547 548 549
	primary =
		pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;

550
	ret = remove_conflicting_framebuffers(ap, "inteldrmfb", primary);
551 552

	kfree(ap);
553 554

	return ret;
555
}
556
#else
557
static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
558
{
559
	return 0;
560 561
}
#endif
562

D
Daniel Vetter 已提交
563 564 565 566 567 568 569 570 571 572 573 574 575
#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)
{
576
	int ret = 0;
D
Daniel Vetter 已提交
577 578 579 580

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

	console_lock();
581 582
	if (con_is_bound(&vga_con))
		ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
D
Daniel Vetter 已提交
583 584 585 586 587 588 589 590 591 592 593 594 595
	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 已提交
596 597
static void i915_dump_device_info(struct drm_i915_private *dev_priv)
{
598
	const struct intel_device_info *info = &dev_priv->info;
D
Daniel Vetter 已提交
599

600 601
#define PRINT_S(name) "%s"
#define SEP_EMPTY
602 603
#define PRINT_FLAG(name) info->name ? #name "," : ""
#define SEP_COMMA ,
604
	DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x rev=0x%02x flags="
605
			 DEV_INFO_FOR_EACH_FLAG(PRINT_S, SEP_EMPTY),
D
Daniel Vetter 已提交
606 607
			 info->gen,
			 dev_priv->dev->pdev->device,
608
			 dev_priv->dev->pdev->revision,
609
			 DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_COMMA));
610 611
#undef PRINT_S
#undef SEP_EMPTY
612 613
#undef PRINT_FLAG
#undef SEP_COMMA
D
Daniel Vetter 已提交
614 615
}

616 617 618 619 620 621 622
/*
 * 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.
623 624 625 626 627
 *
 * 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.
628 629 630
 */
static void intel_device_info_runtime_init(struct drm_device *dev)
{
631
	struct drm_i915_private *dev_priv = dev->dev_private;
632
	struct intel_device_info *info;
633
	enum pipe pipe;
634

635
	info = (struct intel_device_info *)&dev_priv->info;
636

637
	if (IS_VALLEYVIEW(dev) || INTEL_INFO(dev)->gen == 9)
638
		for_each_pipe(dev_priv, pipe)
639 640
			info->num_sprites[pipe] = 2;
	else
641
		for_each_pipe(dev_priv, pipe)
642
			info->num_sprites[pipe] = 1;
643

644 645 646 647 648 649
	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)) {
650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
		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;
		}
	}
670 671
}

J
Jesse Barnes 已提交
672 673 674 675 676 677 678 679 680 681 682
/**
 * 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
 */
683
int i915_driver_load(struct drm_device *dev, unsigned long flags)
684
{
685
	struct drm_i915_private *dev_priv;
686
	struct intel_device_info *info, *device_info;
687
	int ret = 0, mmio_bar, mmio_size;
688
	uint32_t aperture_size;
689

690 691 692
	info = (struct intel_device_info *) flags;

	/* Refuse to load on gen6+ without kms enabled. */
693 694 695
	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");
696
		return -ENODEV;
697
	}
698

D
Daniel Vetter 已提交
699 700 701 702
	/* UMS needs agp support. */
	if (!drm_core_check_feature(dev, DRIVER_MODESET) && !dev->agp)
		return -EINVAL;

703
	dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
J
Jesse Barnes 已提交
704 705 706
	if (dev_priv == NULL)
		return -ENOMEM;

707
	dev->dev_private = dev_priv;
708
	dev_priv->dev = dev;
709

710
	/* Setup the write-once "constant" device info */
711
	device_info = (struct intel_device_info *)&dev_priv->info;
712 713
	memcpy(device_info, info, sizeof(dev_priv->info));
	device_info->device_id = dev->pdev->device;
J
Jesse Barnes 已提交
714

715 716
	spin_lock_init(&dev_priv->irq_lock);
	spin_lock_init(&dev_priv->gpu_error.lock);
717
	mutex_init(&dev_priv->backlight_lock);
718
	spin_lock_init(&dev_priv->uncore.lock);
719
	spin_lock_init(&dev_priv->mm.object_stat_lock);
720
	spin_lock_init(&dev_priv->mmio_flip_lock);
721 722 723
	mutex_init(&dev_priv->dpio_lock);
	mutex_init(&dev_priv->modeset_restore_lock);

D
Daniel Vetter 已提交
724
	intel_pm_setup(dev);
725

726 727
	intel_display_crc_init(dev);

D
Daniel Vetter 已提交
728 729
	i915_dump_device_info(dev_priv);

730 731 732 733 734 735 736 737
	/* 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");

738 739 740 741 742
	if (i915_get_bridge_dev(dev)) {
		ret = -EIO;
		goto free_priv;
	}

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762
	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;
	}

763 764 765 766 767
	/* This must be called before any calls to HAS_PCH_* */
	intel_detect_pch(dev);

	intel_uncore_init(dev);

768 769
	ret = i915_gem_gtt_init(dev);
	if (ret)
770
		goto out_regs;
771

D
Daniel Vetter 已提交
772
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
D
Daniel Vetter 已提交
773 774 775
		/* 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 已提交
776
		if (ret) {
D
Daniel Vetter 已提交
777
			DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
D
Daniel Vetter 已提交
778 779 780
			goto out_gtt;
		}

D
Daniel Vetter 已提交
781
		ret = i915_kick_out_vgacon(dev_priv);
782
		if (ret) {
D
Daniel Vetter 已提交
783
			DRM_ERROR("failed to remove conflicting VGA console\n");
784 785
			goto out_gtt;
		}
D
Daniel Vetter 已提交
786
	}
787

788 789
	pci_set_master(dev->pdev);

790 791 792 793
	/* 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));

794 795 796 797 798 799 800 801 802 803 804
	/* 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));

805
	aperture_size = dev_priv->gtt.mappable_end;
806

B
Ben Widawsky 已提交
807 808
	dev_priv->gtt.mappable =
		io_mapping_create_wc(dev_priv->gtt.mappable_base,
809
				     aperture_size);
B
Ben Widawsky 已提交
810
	if (dev_priv->gtt.mappable == NULL) {
811
		ret = -EIO;
812
		goto out_gtt;
813 814
	}

815 816
	dev_priv->gtt.mtrr = arch_phys_wc_add(dev_priv->gtt.mappable_base,
					      aperture_size);
817

818 819 820 821 822 823 824
	/* 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
825
	 * idle-timers and recording error state.
826 827 828
	 *
	 * 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
829
	 * workqueue at any time.  Use an ordered one.
830
	 */
831
	dev_priv->wq = alloc_ordered_workqueue("i915", 0);
832 833 834
	if (dev_priv->wq == NULL) {
		DRM_ERROR("Failed to create our workqueue.\n");
		ret = -ENOMEM;
835
		goto out_mtrrfree;
836 837
	}

838 839 840 841 842 843 844
	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;
	}

845
	intel_irq_init(dev_priv);
846
	intel_uncore_sanitize(dev);
847

848 849
	/* Try to make sure MCHBAR is enabled before poking at it */
	intel_setup_mchbar(dev);
850
	intel_setup_gmbus(dev);
851
	intel_opregion_setup(dev);
852

853 854
	intel_setup_bios(dev);

855 856
	i915_gem_load(dev);

857 858 859 860 861 862
	/* 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.
863 864
	 *
	 * According to chipset errata, on the 965GM, MSI interrupts may
865 866
	 * be lost or delayed, but we use them anyways to avoid
	 * stuck interrupts on some machines.
867
	 */
868
	if (!IS_I945G(dev) && !IS_I945GM(dev))
869
		pci_enable_msi(dev->pdev);
870

871
	intel_device_info_runtime_init(dev);
872

B
Ben Widawsky 已提交
873 874 875 876 877
	if (INTEL_INFO(dev)->num_pipes) {
		ret = drm_vblank_init(dev, INTEL_INFO(dev)->num_pipes);
		if (ret)
			goto out_gem_unload;
	}
878

879
	intel_power_domains_init(dev_priv);
880

J
Jesse Barnes 已提交
881
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
D
Daniel Vetter 已提交
882
		ret = i915_load_modeset_init(dev);
J
Jesse Barnes 已提交
883 884
		if (ret < 0) {
			DRM_ERROR("failed to init modeset\n");
885
			goto out_power_well;
J
Jesse Barnes 已提交
886
		}
887 888 889
	} else {
		/* Start out suspended in ums mode. */
		dev_priv->ums.mm_suspended = 1;
J
Jesse Barnes 已提交
890 891
	}

B
Ben Widawsky 已提交
892 893
	i915_setup_sysfs(dev);

B
Ben Widawsky 已提交
894 895 896
	if (INTEL_INFO(dev)->num_pipes) {
		/* Must be done after probing outputs */
		intel_opregion_init(dev);
897
		acpi_video_register();
B
Ben Widawsky 已提交
898
	}
899

900 901
	if (IS_GEN5(dev))
		intel_gpu_ips_init(dev_priv);
902

903
	intel_runtime_pm_enable(dev_priv);
904

J
Jesse Barnes 已提交
905 906
	return 0;

907
out_power_well:
908
	intel_power_domains_fini(dev_priv);
909
	drm_vblank_cleanup(dev);
910
out_gem_unload:
911 912
	WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier));
	unregister_shrinker(&dev_priv->mm.shrinker);
913

914 915 916 917 918
	if (dev->pdev->msi_enabled)
		pci_disable_msi(dev->pdev);

	intel_teardown_gmbus(dev);
	intel_teardown_mchbar(dev);
919
	pm_qos_remove_request(&dev_priv->pm_qos);
920 921
	destroy_workqueue(dev_priv->dp_wq);
out_freewq:
922
	destroy_workqueue(dev_priv->wq);
923
out_mtrrfree:
924
	arch_phys_wc_del(dev_priv->gtt.mtrr);
B
Ben Widawsky 已提交
925
	io_mapping_free(dev_priv->gtt.mappable);
926
out_gtt:
927
	i915_global_gtt_cleanup(dev);
928
out_regs:
929
	intel_uncore_fini(dev);
930
	pci_iounmap(dev->pdev, dev_priv->regs);
931 932
put_bridge:
	pci_dev_put(dev_priv->bridge_dev);
J
Jesse Barnes 已提交
933
free_priv:
934 935
	if (dev_priv->slab)
		kmem_cache_destroy(dev_priv->slab);
936
	kfree(dev_priv);
J
Jesse Barnes 已提交
937 938 939 940 941 942
	return ret;
}

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

945 946 947 948 949 950
	ret = i915_gem_suspend(dev);
	if (ret) {
		DRM_ERROR("failed to idle hardware: %d\n", ret);
		return ret;
	}

951
	intel_power_domains_fini(dev_priv);
952

953
	intel_gpu_ips_teardown();
954

B
Ben Widawsky 已提交
955 956
	i915_teardown_sysfs(dev);

957 958
	WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier));
	unregister_shrinker(&dev_priv->mm.shrinker);
959

B
Ben Widawsky 已提交
960
	io_mapping_free(dev_priv->gtt.mappable);
961
	arch_phys_wc_del(dev_priv->gtt.mtrr);
962

963 964
	acpi_video_unregister();

965
	if (drm_core_check_feature(dev, DRIVER_MODESET))
966
		intel_fbdev_fini(dev);
967 968 969 970

	drm_vblank_cleanup(dev);

	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
971 972
		intel_modeset_cleanup(dev);

Z
Zhao Yakui 已提交
973 974 975 976
		/*
		 * free the memory space allocated for the child device
		 * config parsed from VBT
		 */
977 978 979 980
		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 已提交
981
		}
982

983
		vga_switcheroo_unregister_client(dev->pdev);
984
		vga_client_register(dev->pdev, NULL, NULL, NULL);
J
Jesse Barnes 已提交
985 986
	}

987
	/* Free error state after interrupts are fully disabled. */
988 989
	del_timer_sync(&dev_priv->gpu_error.hangcheck_timer);
	cancel_work_sync(&dev_priv->gpu_error.work);
990
	i915_destroy_error_state(dev);
991

992 993 994
	if (dev->pdev->msi_enabled)
		pci_disable_msi(dev->pdev);

995
	intel_opregion_fini(dev);
996

J
Jesse Barnes 已提交
997
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
998 999 1000
		/* Flush any outstanding unpin_work. */
		flush_workqueue(dev_priv->wq);

J
Jesse Barnes 已提交
1001 1002
		mutex_lock(&dev->struct_mutex);
		i915_gem_cleanup_ringbuffer(dev);
1003
		i915_gem_context_fini(dev);
J
Jesse Barnes 已提交
1004
		mutex_unlock(&dev->struct_mutex);
1005
		i915_gem_cleanup_stolen(dev);
J
Jesse Barnes 已提交
1006 1007
	}

1008
	intel_teardown_gmbus(dev);
1009 1010
	intel_teardown_mchbar(dev);

1011
	destroy_workqueue(dev_priv->dp_wq);
1012
	destroy_workqueue(dev_priv->wq);
1013
	pm_qos_remove_request(&dev_priv->pm_qos);
1014

1015
	i915_global_gtt_cleanup(dev);
1016

1017 1018 1019 1020
	intel_uncore_fini(dev);
	if (dev_priv->regs != NULL)
		pci_iounmap(dev->pdev, dev_priv->regs);

1021 1022
	if (dev_priv->slab)
		kmem_cache_destroy(dev_priv->slab);
1023

1024
	pci_dev_put(dev_priv->bridge_dev);
1025
	kfree(dev_priv);
J
Jesse Barnes 已提交
1026

1027 1028 1029
	return 0;
}

1030
int i915_driver_open(struct drm_device *dev, struct drm_file *file)
1031
{
1032
	int ret;
1033

1034 1035 1036
	ret = i915_gem_open(dev, file);
	if (ret)
		return ret;
1037

1038 1039 1040
	return 0;
}

J
Jesse Barnes 已提交
1041 1042 1043 1044 1045 1046 1047 1048
/**
 * 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).
 *
1049
 * Additionally, in the non-mode setting case, we'll tear down the GTT
J
Jesse Barnes 已提交
1050 1051 1052
 * and DMA structures, since the kernel won't be using them, and clea
 * up any GEM state.
 */
1053
void i915_driver_lastclose(struct drm_device *dev)
L
Linus Torvalds 已提交
1054
{
1055
	struct drm_i915_private *dev_priv = dev->dev_private;
J
Jesse Barnes 已提交
1056

1057 1058 1059 1060 1061 1062 1063
	/* 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)) {
1064
		intel_fbdev_restore_mode(dev);
1065
		vga_switcheroo_process_delayed_switch();
D
Dave Airlie 已提交
1066
		return;
J
Jesse Barnes 已提交
1067
	}
D
Dave Airlie 已提交
1068

1069
	i915_gem_lastclose(dev);
L
Linus Torvalds 已提交
1070 1071
}

1072
void i915_driver_preclose(struct drm_device *dev, struct drm_file *file)
L
Linus Torvalds 已提交
1073
{
1074
	mutex_lock(&dev->struct_mutex);
1075 1076
	i915_gem_context_close(dev, file);
	i915_gem_release(dev, file);
1077
	mutex_unlock(&dev->struct_mutex);
1078 1079 1080

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

1083
void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
1084
{
1085
	struct drm_i915_file_private *file_priv = file->driver_priv;
1086

1087 1088
	if (file_priv && file_priv->bsd_ring)
		file_priv->bsd_ring = NULL;
1089
	kfree(file_priv);
1090 1091
}

R
Rob Clark 已提交
1092
const struct drm_ioctl_desc i915_ioctls[] = {
1093 1094 1095 1096 1097 1098
	DRM_IOCTL_DEF_DRV(I915_INIT, i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
	DRM_IOCTL_DEF_DRV(I915_FLUSH, i915_flush_ioctl, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_FLIP, i915_flip_bufs, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_BATCHBUFFER, i915_batchbuffer, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_IRQ_EMIT, i915_irq_emit, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_IRQ_WAIT, i915_irq_wait, DRM_AUTH),
1099
	DRM_IOCTL_DEF_DRV(I915_GETPARAM, i915_getparam, DRM_AUTH|DRM_RENDER_ALLOW),
1100
	DRM_IOCTL_DEF_DRV(I915_SETPARAM, i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
D
Daniel Vetter 已提交
1101 1102 1103
	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),
1104
	DRM_IOCTL_DEF_DRV(I915_CMDBUFFER, i915_cmdbuffer, DRM_AUTH),
D
Daniel Vetter 已提交
1105
	DRM_IOCTL_DEF_DRV(I915_DESTROY_HEAP,  drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1106
	DRM_IOCTL_DEF_DRV(I915_SET_VBLANK_PIPE,  drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1107 1108 1109 1110 1111
	DRM_IOCTL_DEF_DRV(I915_GET_VBLANK_PIPE,  i915_vblank_pipe_get, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
	DRM_IOCTL_DEF_DRV(I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
	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),
1112
	DRM_IOCTL_DEF_DRV(I915_GEM_EXECBUFFER2, i915_gem_execbuffer2, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
1113 1114
	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),
1115 1116 1117 1118
	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),
1119 1120
	DRM_IOCTL_DEF_DRV(I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
	DRM_IOCTL_DEF_DRV(I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
	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),
1131
	DRM_IOCTL_DEF_DRV(I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, DRM_UNLOCKED),
1132
	DRM_IOCTL_DEF_DRV(I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1133 1134
	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),
1135 1136
	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),
1137 1138 1139 1140
	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),
1141
	DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_get_reset_stats_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
1142
	DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
D
Dave Airlie 已提交
1143 1144
};

1145
int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
1146

1147 1148 1149 1150
/*
 * 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.
1151
 */
1152
int i915_driver_device_is_agp(struct drm_device *dev)
1153 1154 1155
{
	return 1;
}