xref: /NextBSD/sys/dev/drm2/i915/i915_dma.c (revision 4557fabb34e865d7f40be64b39c9e34fa41dbb60)
1 /* i915_dma.c -- DMA support for the I915 -*- linux-c -*-
2  */
3 /*
4  * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  *
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  */
28 
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 
32 #include <dev/drm2/drmP.h>
33 #include <dev/drm2/drm.h>
34 #include <dev/drm2/i915/i915_drm.h>
35 #include <dev/drm2/i915/i915_drv.h>
36 #include <dev/drm2/i915/intel_drv.h>
37 #include <dev/drm2/i915/intel_ringbuffer.h>
38 
39 #define LP_RING(d) (&((struct drm_i915_private *)(d))->rings[RCS])
40 
41 #define BEGIN_LP_RING(n) \
42 	intel_ring_begin(LP_RING(dev_priv), (n))
43 
44 #define OUT_RING(x) \
45 	intel_ring_emit(LP_RING(dev_priv), x)
46 
47 #define ADVANCE_LP_RING() \
48 	intel_ring_advance(LP_RING(dev_priv))
49 
50 /**
51  * Lock test for when it's just for synchronization of ring access.
52  *
53  * In that case, we don't need to do it when GEM is initialized as nobody else
54  * has access to the ring.
55  */
56 #define RING_LOCK_TEST_WITH_RETURN(dev, file) do {			\
57 	if (LP_RING(dev->dev_private)->obj == NULL)			\
58 		LOCK_TEST_WITH_RETURN(dev, file);			\
59 } while (0)
60 
61 static inline u32
intel_read_legacy_status_page(struct drm_i915_private * dev_priv,int reg)62 intel_read_legacy_status_page(struct drm_i915_private *dev_priv, int reg)
63 {
64 	if (I915_NEED_GFX_HWS(dev_priv->dev))
65 		return ((volatile u32*)(dev_priv->dri1.gfx_hws_cpu_addr))[reg];
66 	else
67 		return intel_read_status_page(LP_RING(dev_priv), reg);
68 }
69 
70 #define READ_HWSP(dev_priv, reg) intel_read_legacy_status_page(dev_priv, reg)
71 #define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX)
72 #define I915_BREADCRUMB_INDEX		0x21
73 
i915_update_dri1_breadcrumb(struct drm_device * dev)74 void i915_update_dri1_breadcrumb(struct drm_device *dev)
75 {
76 	drm_i915_private_t *dev_priv = dev->dev_private;
77 	struct drm_i915_master_private *master_priv;
78 
79 	if (dev->primary->master) {
80 		master_priv = dev->primary->master->driver_priv;
81 		if (master_priv->sarea_priv)
82 			master_priv->sarea_priv->last_dispatch =
83 				READ_BREADCRUMB(dev_priv);
84 	}
85 }
86 
i915_write_hws_pga(struct drm_device * dev)87 static void i915_write_hws_pga(struct drm_device *dev)
88 {
89 	drm_i915_private_t *dev_priv = dev->dev_private;
90 	u32 addr;
91 
92 	addr = dev_priv->status_page_dmah->busaddr;
93 	if (INTEL_INFO(dev)->gen >= 4)
94 		addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0;
95 	I915_WRITE(HWS_PGA, addr);
96 }
97 
98 /**
99  * Sets up the hardware status page for devices that need a physical address
100  * in the register.
101  */
i915_init_phys_hws(struct drm_device * dev)102 static int i915_init_phys_hws(struct drm_device *dev)
103 {
104 	drm_i915_private_t *dev_priv = dev->dev_private;
105 	struct intel_ring_buffer *ring = LP_RING(dev_priv);
106 
107 	/*
108 	 * Program Hardware Status Page
109 	 * XXXKIB Keep 4GB limit for allocation for now.  This method
110 	 * of allocation is used on <= 965 hardware, that has several
111 	 * erratas regarding the use of physical memory > 4 GB.
112 	 */
113 	dev_priv->status_page_dmah =
114 		drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, BUS_SPACE_MAXADDR);
115 	if (!dev_priv->status_page_dmah) {
116 		DRM_ERROR("Can not allocate hardware status page\n");
117 		return -ENOMEM;
118 	}
119 	ring->status_page.page_addr = dev_priv->hw_status_page =
120 	    dev_priv->status_page_dmah->vaddr;
121 	dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
122 
123 	memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
124 
125 	i915_write_hws_pga(dev);
126 	DRM_DEBUG("Enabled hardware status page, phys %jx\n",
127 	    (uintmax_t)dev_priv->dma_status_page);
128 	return 0;
129 }
130 
131 /**
132  * Frees the hardware status page, whether it's a physical address or a virtual
133  * address set up by the X Server.
134  */
i915_free_hws(struct drm_device * dev)135 static void i915_free_hws(struct drm_device *dev)
136 {
137 	drm_i915_private_t *dev_priv = dev->dev_private;
138 	struct intel_ring_buffer *ring = LP_RING(dev_priv);
139 
140 	if (dev_priv->status_page_dmah) {
141 		drm_pci_free(dev, dev_priv->status_page_dmah);
142 		dev_priv->status_page_dmah = NULL;
143 	}
144 
145 	if (dev_priv->status_gfx_addr) {
146 		dev_priv->status_gfx_addr = 0;
147 		ring->status_page.gfx_addr = 0;
148 		pmap_unmapdev((vm_offset_t)dev_priv->dri1.gfx_hws_cpu_addr,
149 		    PAGE_SIZE);
150 	}
151 
152 	/* Need to rewrite hardware status page */
153 	I915_WRITE(HWS_PGA, 0x1ffff000);
154 }
155 
i915_kernel_lost_context(struct drm_device * dev)156 void i915_kernel_lost_context(struct drm_device * dev)
157 {
158 	drm_i915_private_t *dev_priv = dev->dev_private;
159 	struct drm_i915_master_private *master_priv;
160 	struct intel_ring_buffer *ring = LP_RING(dev_priv);
161 
162 	/*
163 	 * We should never lose context on the ring with modesetting
164 	 * as we don't expose it to userspace
165 	 */
166 	if (drm_core_check_feature(dev, DRIVER_MODESET))
167 		return;
168 
169 	ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
170 	ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
171 	ring->space = ring->head - (ring->tail + 8);
172 	if (ring->space < 0)
173 		ring->space += ring->size;
174 
175 	if (!dev->primary->master)
176 		return;
177 
178 	master_priv = dev->primary->master->driver_priv;
179 	if (ring->head == ring->tail && master_priv->sarea_priv)
180 		master_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY;
181 }
182 
i915_dma_cleanup(struct drm_device * dev)183 static int i915_dma_cleanup(struct drm_device * dev)
184 {
185 	drm_i915_private_t *dev_priv = dev->dev_private;
186 	int i;
187 
188 	/* Make sure interrupts are disabled here because the uninstall ioctl
189 	 * may not have been called from userspace and after dev_private
190 	 * is freed, it's too late.
191 	 */
192 	if (dev->irq_enabled)
193 		drm_irq_uninstall(dev);
194 
195 	DRM_LOCK(dev);
196 	for (i = 0; i < I915_NUM_RINGS; i++)
197 		intel_cleanup_ring_buffer(&dev_priv->rings[i]);
198 	DRM_UNLOCK(dev);
199 
200 	/* Clear the HWS virtual address at teardown */
201 	if (I915_NEED_GFX_HWS(dev))
202 		i915_free_hws(dev);
203 
204 	return 0;
205 }
206 
i915_initialize(struct drm_device * dev,drm_i915_init_t * init)207 static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
208 {
209 	drm_i915_private_t *dev_priv = dev->dev_private;
210 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
211 	int ret;
212 
213 	master_priv->sarea = drm_getsarea(dev);
214 	if (master_priv->sarea) {
215 		master_priv->sarea_priv = (drm_i915_sarea_t *)
216 			((u8 *)master_priv->sarea->handle + init->sarea_priv_offset);
217 	} else {
218 		DRM_DEBUG_DRIVER("sarea not found assuming DRI2 userspace\n");
219 	}
220 
221 	if (init->ring_size != 0) {
222 		if (LP_RING(dev_priv)->obj != NULL) {
223 			i915_dma_cleanup(dev);
224 			DRM_ERROR("Client tried to initialize ringbuffer in "
225 				  "GEM mode\n");
226 			return -EINVAL;
227 		}
228 
229 		ret = intel_render_ring_init_dri(dev,
230 						 init->ring_start,
231 						 init->ring_size);
232 		if (ret) {
233 			i915_dma_cleanup(dev);
234 			return ret;
235 		}
236 	}
237 
238 	dev_priv->cpp = init->cpp;
239 	dev_priv->back_offset = init->back_offset;
240 	dev_priv->front_offset = init->front_offset;
241 	dev_priv->current_page = 0;
242 	if (master_priv->sarea_priv)
243 		master_priv->sarea_priv->pf_current_page = 0;
244 
245 	/* Allow hardware batchbuffers unless told otherwise.
246 	 */
247 	dev_priv->dri1.allow_batchbuffer = 1;
248 
249 	return 0;
250 }
251 
i915_dma_resume(struct drm_device * dev)252 static int i915_dma_resume(struct drm_device * dev)
253 {
254 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
255 	struct intel_ring_buffer *ring = LP_RING(dev_priv);
256 
257 	DRM_DEBUG_DRIVER("%s\n", __func__);
258 
259 	if (ring->virtual_start == NULL) {
260 		DRM_ERROR("can not ioremap virtual address for"
261 			  " ring buffer\n");
262 		return -ENOMEM;
263 	}
264 
265 	/* Program Hardware Status Page */
266 	if (!ring->status_page.page_addr) {
267 		DRM_ERROR("Can not find hardware status page\n");
268 		return -EINVAL;
269 	}
270 	DRM_DEBUG_DRIVER("hw status page @ %p\n",
271 				ring->status_page.page_addr);
272 	if (ring->status_page.gfx_addr != 0)
273 		intel_ring_setup_status_page(ring);
274 	else
275 		i915_write_hws_pga(dev);
276 
277 	DRM_DEBUG_DRIVER("Enabled hardware status page\n");
278 
279 	return 0;
280 }
281 
i915_dma_init(struct drm_device * dev,void * data,struct drm_file * file_priv)282 static int i915_dma_init(struct drm_device *dev, void *data,
283 			 struct drm_file *file_priv)
284 {
285 	drm_i915_init_t *init = data;
286 	int retcode = 0;
287 
288 	if (drm_core_check_feature(dev, DRIVER_MODESET))
289 		return -ENODEV;
290 
291 	switch (init->func) {
292 	case I915_INIT_DMA:
293 		retcode = i915_initialize(dev, init);
294 		break;
295 	case I915_CLEANUP_DMA:
296 		retcode = i915_dma_cleanup(dev);
297 		break;
298 	case I915_RESUME_DMA:
299 		retcode = i915_dma_resume(dev);
300 		break;
301 	default:
302 		retcode = -EINVAL;
303 		break;
304 	}
305 
306 	return retcode;
307 }
308 
309 /* Implement basically the same security restrictions as hardware does
310  * for MI_BATCH_NON_SECURE.  These can be made stricter at any time.
311  *
312  * Most of the calculations below involve calculating the size of a
313  * particular instruction.  It's important to get the size right as
314  * that tells us where the next instruction to check is.  Any illegal
315  * instruction detected will be given a size of zero, which is a
316  * signal to abort the rest of the buffer.
317  */
validate_cmd(int cmd)318 static int validate_cmd(int cmd)
319 {
320 	switch (((cmd >> 29) & 0x7)) {
321 	case 0x0:
322 		switch ((cmd >> 23) & 0x3f) {
323 		case 0x0:
324 			return 1;	/* MI_NOOP */
325 		case 0x4:
326 			return 1;	/* MI_FLUSH */
327 		default:
328 			return 0;	/* disallow everything else */
329 		}
330 		break;
331 	case 0x1:
332 		return 0;	/* reserved */
333 	case 0x2:
334 		return (cmd & 0xff) + 2;	/* 2d commands */
335 	case 0x3:
336 		if (((cmd >> 24) & 0x1f) <= 0x18)
337 			return 1;
338 
339 		switch ((cmd >> 24) & 0x1f) {
340 		case 0x1c:
341 			return 1;
342 		case 0x1d:
343 			switch ((cmd >> 16) & 0xff) {
344 			case 0x3:
345 				return (cmd & 0x1f) + 2;
346 			case 0x4:
347 				return (cmd & 0xf) + 2;
348 			default:
349 				return (cmd & 0xffff) + 2;
350 			}
351 		case 0x1e:
352 			if (cmd & (1 << 23))
353 				return (cmd & 0xffff) + 1;
354 			else
355 				return 1;
356 		case 0x1f:
357 			if ((cmd & (1 << 23)) == 0)	/* inline vertices */
358 				return (cmd & 0x1ffff) + 2;
359 			else if (cmd & (1 << 17))	/* indirect random */
360 				if ((cmd & 0xffff) == 0)
361 					return 0;	/* unknown length, too hard */
362 				else
363 					return (((cmd & 0xffff) + 1) / 2) + 1;
364 			else
365 				return 2;	/* indirect sequential */
366 		default:
367 			return 0;
368 		}
369 	default:
370 		return 0;
371 	}
372 
373 	return 0;
374 }
375 
i915_emit_cmds(struct drm_device * dev,int * buffer,int dwords)376 static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
377 {
378 	drm_i915_private_t *dev_priv = dev->dev_private;
379 	int i;
380 
381 	if ((dwords+1) * sizeof(int) >= LP_RING(dev_priv)->size - 8)
382 		return -EINVAL;
383 
384 	BEGIN_LP_RING((dwords+1)&~1);
385 
386 	for (i = 0; i < dwords;) {
387 		int cmd, sz;
388 
389 		if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd)))
390 			return -EINVAL;
391 
392 		if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords)
393 			return -EINVAL;
394 
395 		OUT_RING(cmd);
396 
397 		while (++i, --sz) {
398 			if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i],
399 							 sizeof(cmd))) {
400 				return -EINVAL;
401 			}
402 			OUT_RING(cmd);
403 		}
404 	}
405 
406 	if (dwords & 1)
407 		OUT_RING(0);
408 
409 	ADVANCE_LP_RING();
410 
411 	return 0;
412 }
413 
414 int
i915_emit_box(struct drm_device * dev,struct drm_clip_rect * box,int DR1,int DR4)415 i915_emit_box(struct drm_device *dev,
416 	      struct drm_clip_rect *box,
417 	      int DR1, int DR4)
418 {
419 	struct drm_i915_private *dev_priv = dev->dev_private;
420 	int ret;
421 
422 	if (box->y2 <= box->y1 || box->x2 <= box->x1 ||
423 	    box->y2 <= 0 || box->x2 <= 0) {
424 		DRM_ERROR("Bad box %d,%d..%d,%d\n",
425 			  box->x1, box->y1, box->x2, box->y2);
426 		return -EINVAL;
427 	}
428 
429 	if (INTEL_INFO(dev)->gen >= 4) {
430 		ret = BEGIN_LP_RING(4);
431 		if (ret)
432 			return ret;
433 
434 		OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
435 		OUT_RING((box->x1 & 0xffff) | (box->y1 << 16));
436 		OUT_RING(((box->x2 - 1) & 0xffff) | ((box->y2 - 1) << 16));
437 		OUT_RING(DR4);
438 	} else {
439 		ret = BEGIN_LP_RING(6);
440 		if (ret)
441 			return ret;
442 
443 		OUT_RING(GFX_OP_DRAWRECT_INFO);
444 		OUT_RING(DR1);
445 		OUT_RING((box->x1 & 0xffff) | (box->y1 << 16));
446 		OUT_RING(((box->x2 - 1) & 0xffff) | ((box->y2 - 1) << 16));
447 		OUT_RING(DR4);
448 		OUT_RING(0);
449 	}
450 	ADVANCE_LP_RING();
451 
452 	return 0;
453 }
454 
455 /* XXX: Emitting the counter should really be moved to part of the IRQ
456  * emit. For now, do it in both places:
457  */
458 
i915_emit_breadcrumb(struct drm_device * dev)459 static void i915_emit_breadcrumb(struct drm_device *dev)
460 {
461 	drm_i915_private_t *dev_priv = dev->dev_private;
462 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
463 
464 	if (++dev_priv->counter > 0x7FFFFFFFUL)
465 		dev_priv->counter = 0;
466 	if (master_priv->sarea_priv)
467 		master_priv->sarea_priv->last_enqueue = dev_priv->counter;
468 
469 	if (BEGIN_LP_RING(4) == 0) {
470 		OUT_RING(MI_STORE_DWORD_INDEX);
471 		OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
472 		OUT_RING(dev_priv->counter);
473 		OUT_RING(0);
474 		ADVANCE_LP_RING();
475 	}
476 }
477 
i915_dispatch_cmdbuffer(struct drm_device * dev,drm_i915_cmdbuffer_t * cmd,struct drm_clip_rect * cliprects,void * cmdbuf)478 static int i915_dispatch_cmdbuffer(struct drm_device * dev,
479 				   drm_i915_cmdbuffer_t *cmd,
480 				   struct drm_clip_rect *cliprects,
481 				   void *cmdbuf)
482 {
483 	int nbox = cmd->num_cliprects;
484 	int i = 0, count, ret;
485 
486 	if (cmd->sz & 0x3) {
487 		DRM_ERROR("alignment\n");
488 		return -EINVAL;
489 	}
490 
491 	i915_kernel_lost_context(dev);
492 
493 	count = nbox ? nbox : 1;
494 
495 	for (i = 0; i < count; i++) {
496 		if (i < nbox) {
497 			ret = i915_emit_box(dev, &cliprects[i],
498 					    cmd->DR1, cmd->DR4);
499 			if (ret)
500 				return ret;
501 		}
502 
503 		ret = i915_emit_cmds(dev, cmdbuf, cmd->sz / 4);
504 		if (ret)
505 			return ret;
506 	}
507 
508 	i915_emit_breadcrumb(dev);
509 	return 0;
510 }
511 
i915_dispatch_batchbuffer(struct drm_device * dev,drm_i915_batchbuffer_t * batch,struct drm_clip_rect * cliprects)512 static int i915_dispatch_batchbuffer(struct drm_device * dev,
513 				     drm_i915_batchbuffer_t * batch,
514 				     struct drm_clip_rect *cliprects)
515 {
516 	struct drm_i915_private *dev_priv = dev->dev_private;
517 	int nbox = batch->num_cliprects;
518 	int i, count, ret;
519 
520 	if (drm_core_check_feature(dev, DRIVER_MODESET))
521 		return -ENODEV;
522 
523 	if ((batch->start | batch->used) & 0x7) {
524 		DRM_ERROR("alignment\n");
525 		return -EINVAL;
526 	}
527 
528 	i915_kernel_lost_context(dev);
529 
530 	count = nbox ? nbox : 1;
531 	for (i = 0; i < count; i++) {
532 		if (i < nbox) {
533 			ret = i915_emit_box(dev, &cliprects[i],
534 					    batch->DR1, batch->DR4);
535 			if (ret)
536 				return ret;
537 		}
538 
539 		if (!IS_I830(dev) && !IS_845G(dev)) {
540 			ret = BEGIN_LP_RING(2);
541 			if (ret)
542 				return ret;
543 
544 			if (INTEL_INFO(dev)->gen >= 4) {
545 				OUT_RING(MI_BATCH_BUFFER_START | (2 << 6) | MI_BATCH_NON_SECURE_I965);
546 				OUT_RING(batch->start);
547 			} else {
548 				OUT_RING(MI_BATCH_BUFFER_START | (2 << 6));
549 				OUT_RING(batch->start | MI_BATCH_NON_SECURE);
550 			}
551 		} else {
552 			ret = BEGIN_LP_RING(4);
553 			if (ret)
554 				return ret;
555 
556 			OUT_RING(MI_BATCH_BUFFER);
557 			OUT_RING(batch->start | MI_BATCH_NON_SECURE);
558 			OUT_RING(batch->start + batch->used - 4);
559 			OUT_RING(0);
560 		}
561 		ADVANCE_LP_RING();
562 	}
563 
564 	i915_emit_breadcrumb(dev);
565 	return 0;
566 }
567 
i915_dispatch_flip(struct drm_device * dev)568 static int i915_dispatch_flip(struct drm_device * dev)
569 {
570 	drm_i915_private_t *dev_priv = dev->dev_private;
571 	struct drm_i915_master_private *master_priv =
572 		dev->primary->master->driver_priv;
573 	int ret;
574 
575 	if (!master_priv->sarea_priv)
576 		return -EINVAL;
577 
578 	DRM_DEBUG_DRIVER("%s: page=%d pfCurrentPage=%d\n",
579 			  __func__,
580 			 dev_priv->current_page,
581 			 master_priv->sarea_priv->pf_current_page);
582 
583 	i915_kernel_lost_context(dev);
584 
585 	ret = BEGIN_LP_RING(10);
586 	if (ret)
587 		return ret;
588 
589 	OUT_RING(MI_FLUSH | MI_READ_FLUSH);
590 	OUT_RING(0);
591 
592 	OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP);
593 	OUT_RING(0);
594 	if (dev_priv->current_page == 0) {
595 		OUT_RING(dev_priv->back_offset);
596 		dev_priv->current_page = 1;
597 	} else {
598 		OUT_RING(dev_priv->front_offset);
599 		dev_priv->current_page = 0;
600 	}
601 	OUT_RING(0);
602 
603 	OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP);
604 	OUT_RING(0);
605 
606 	ADVANCE_LP_RING();
607 
608 	master_priv->sarea_priv->last_enqueue = dev_priv->counter++;
609 
610 	if (BEGIN_LP_RING(4) == 0) {
611 		OUT_RING(MI_STORE_DWORD_INDEX);
612 		OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
613 		OUT_RING(dev_priv->counter);
614 		OUT_RING(0);
615 		ADVANCE_LP_RING();
616 	}
617 
618 	master_priv->sarea_priv->pf_current_page = dev_priv->current_page;
619 	return 0;
620 }
621 
i915_quiescent(struct drm_device * dev)622 static int i915_quiescent(struct drm_device *dev)
623 {
624 	i915_kernel_lost_context(dev);
625 	return intel_wait_ring_idle(LP_RING(dev->dev_private));
626 }
627 
i915_flush_ioctl(struct drm_device * dev,void * data,struct drm_file * file_priv)628 static int i915_flush_ioctl(struct drm_device *dev, void *data,
629 			    struct drm_file *file_priv)
630 {
631 	int ret;
632 
633 	if (drm_core_check_feature(dev, DRIVER_MODESET))
634 		return -ENODEV;
635 
636 	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
637 
638 	DRM_LOCK(dev);
639 	ret = i915_quiescent(dev);
640 	DRM_UNLOCK(dev);
641 
642 	return ret;
643 }
644 
i915_batchbuffer(struct drm_device * dev,void * data,struct drm_file * file_priv)645 int i915_batchbuffer(struct drm_device *dev, void *data,
646 			    struct drm_file *file_priv)
647 {
648 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
649 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
650 	drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
651 	    master_priv->sarea_priv;
652 	drm_i915_batchbuffer_t *batch = data;
653 	size_t cliplen;
654 	int ret;
655 	struct drm_clip_rect *cliprects = NULL;
656 
657 	if (!dev_priv->dri1.allow_batchbuffer) {
658 		DRM_ERROR("Batchbuffer ioctl disabled\n");
659 		return -EINVAL;
660 	}
661 
662 	DRM_DEBUG_DRIVER("i915 batchbuffer, start %x used %d cliprects %d\n",
663 			batch->start, batch->used, batch->num_cliprects);
664 
665 	cliplen = batch->num_cliprects * sizeof(struct drm_clip_rect);
666 	if (batch->num_cliprects < 0)
667 		return -EFAULT;
668 	if (batch->num_cliprects != 0) {
669 		cliprects = malloc(batch->num_cliprects *
670 				    sizeof(struct drm_clip_rect),
671 				    DRM_MEM_DMA, M_WAITOK | M_ZERO);
672 
673 		ret = -copyin(batch->cliprects, cliprects,
674 				     batch->num_cliprects *
675 				     sizeof(struct drm_clip_rect));
676 		if (ret != 0)
677 			goto fail_free;
678 	} else
679 		cliprects = NULL;
680 
681 	DRM_LOCK(dev);
682 	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
683 	ret = i915_dispatch_batchbuffer(dev, batch, cliprects);
684 	DRM_UNLOCK(dev);
685 
686 	if (sarea_priv)
687 		sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
688 
689 fail_free:
690 	free(cliprects, DRM_MEM_DMA);
691 
692 	return ret;
693 }
694 
i915_cmdbuffer(struct drm_device * dev,void * data,struct drm_file * file_priv)695 int i915_cmdbuffer(struct drm_device *dev, void *data,
696 			  struct drm_file *file_priv)
697 {
698 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
699 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
700 	drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
701 	    master_priv->sarea_priv;
702 	drm_i915_cmdbuffer_t *cmdbuf = data;
703 	struct drm_clip_rect *cliprects = NULL;
704 	void *batch_data;
705 	int ret;
706 
707 	DRM_DEBUG_DRIVER("i915 cmdbuffer, buf %p sz %d cliprects %d\n",
708 			cmdbuf->buf, cmdbuf->sz, cmdbuf->num_cliprects);
709 
710 	if (drm_core_check_feature(dev, DRIVER_MODESET))
711 		return -ENODEV;
712 
713 	if (cmdbuf->num_cliprects < 0)
714 		return -EINVAL;
715 
716 	batch_data = malloc(cmdbuf->sz, DRM_MEM_DMA, M_WAITOK);
717 
718 	ret = -copyin(cmdbuf->buf, batch_data, cmdbuf->sz);
719 	if (ret != 0)
720 		goto fail_batch_free;
721 
722 	if (cmdbuf->num_cliprects) {
723 		cliprects = malloc(cmdbuf->num_cliprects *
724 				    sizeof(struct drm_clip_rect), DRM_MEM_DMA, M_WAITOK | M_ZERO);
725 		ret = -copyin(cmdbuf->cliprects, cliprects,
726 				     cmdbuf->num_cliprects *
727 				     sizeof(struct drm_clip_rect));
728 		if (ret != 0)
729 			goto fail_clip_free;
730 	}
731 
732 	DRM_LOCK(dev);
733 	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
734 	ret = i915_dispatch_cmdbuffer(dev, cmdbuf, cliprects, batch_data);
735 	DRM_UNLOCK(dev);
736 	if (ret) {
737 		DRM_ERROR("i915_dispatch_cmdbuffer failed\n");
738 		goto fail_clip_free;
739 	}
740 
741 	if (sarea_priv)
742 		sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
743 
744 fail_clip_free:
745 	free(cliprects, DRM_MEM_DMA);
746 fail_batch_free:
747 	free(batch_data, DRM_MEM_DMA);
748 
749 	return ret;
750 }
751 
i915_emit_irq(struct drm_device * dev)752 static int i915_emit_irq(struct drm_device * dev)
753 {
754 	drm_i915_private_t *dev_priv = dev->dev_private;
755 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
756 
757 	i915_kernel_lost_context(dev);
758 
759 	DRM_DEBUG_DRIVER("\n");
760 
761 	dev_priv->counter++;
762 	if (dev_priv->counter > 0x7FFFFFFFUL)
763 		dev_priv->counter = 1;
764 	if (master_priv->sarea_priv)
765 		master_priv->sarea_priv->last_enqueue = dev_priv->counter;
766 
767 	if (BEGIN_LP_RING(4) == 0) {
768 		OUT_RING(MI_STORE_DWORD_INDEX);
769 		OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
770 		OUT_RING(dev_priv->counter);
771 		OUT_RING(MI_USER_INTERRUPT);
772 		ADVANCE_LP_RING();
773 	}
774 
775 	return dev_priv->counter;
776 }
777 
i915_wait_irq(struct drm_device * dev,int irq_nr)778 static int i915_wait_irq(struct drm_device * dev, int irq_nr)
779 {
780 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
781 	struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
782 	int ret = 0;
783 	struct intel_ring_buffer *ring = LP_RING(dev_priv);
784 
785 	DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr,
786 		  READ_BREADCRUMB(dev_priv));
787 
788 	if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
789 		if (master_priv->sarea_priv)
790 			master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
791 		return 0;
792 	}
793 
794 	if (master_priv->sarea_priv)
795 		master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
796 
797 	ret = 0;
798 	mtx_lock(&dev_priv->irq_lock);
799 	if (ring->irq_get(ring)) {
800 		while (ret == 0 && READ_BREADCRUMB(dev_priv) < irq_nr) {
801 			ret = -msleep(ring, &dev_priv->irq_lock, PCATCH,
802 			    "915wtq", 3 * hz);
803 			if (ret == -ERESTART)
804 				ret = -ERESTARTSYS;
805 		}
806 		ring->irq_put(ring);
807 		mtx_unlock(&dev_priv->irq_lock);
808 	} else {
809 		mtx_unlock(&dev_priv->irq_lock);
810 		if (_intel_wait_for(dev, READ_BREADCRUMB(dev_priv) >= irq_nr,
811 		     3000, 1, "915wir"))
812 			ret = -EBUSY;
813 	}
814 
815 	if (ret == -EBUSY) {
816 		DRM_ERROR("EBUSY -- rec: %d emitted: %d\n",
817 			  READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
818 	}
819 
820 	return ret;
821 }
822 
823 /* Needs the lock as it touches the ring.
824  */
i915_irq_emit(struct drm_device * dev,void * data,struct drm_file * file_priv)825 int i915_irq_emit(struct drm_device *dev, void *data,
826 			 struct drm_file *file_priv)
827 {
828 	drm_i915_private_t *dev_priv = dev->dev_private;
829 	drm_i915_irq_emit_t *emit = data;
830 	int result;
831 
832 	if (drm_core_check_feature(dev, DRIVER_MODESET))
833 		return -ENODEV;
834 
835 	if (!dev_priv || !LP_RING(dev_priv)->virtual_start) {
836 		DRM_ERROR("called with no initialization\n");
837 		return -EINVAL;
838 	}
839 
840 	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
841 
842 	DRM_LOCK(dev);
843 	result = i915_emit_irq(dev);
844 	DRM_UNLOCK(dev);
845 
846 	if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
847 		DRM_ERROR("copy_to_user\n");
848 		return -EFAULT;
849 	}
850 
851 	return 0;
852 }
853 
854 /* Doesn't need the hardware lock.
855  */
i915_irq_wait(struct drm_device * dev,void * data,struct drm_file * file_priv)856 static int i915_irq_wait(struct drm_device *dev, void *data,
857 			 struct drm_file *file_priv)
858 {
859 	drm_i915_private_t *dev_priv = dev->dev_private;
860 	drm_i915_irq_wait_t *irqwait = data;
861 
862 	if (drm_core_check_feature(dev, DRIVER_MODESET))
863 		return -ENODEV;
864 
865 	if (!dev_priv) {
866 		DRM_ERROR("called with no initialization\n");
867 		return -EINVAL;
868 	}
869 
870 	return i915_wait_irq(dev, irqwait->irq_seq);
871 }
872 
i915_vblank_pipe_get(struct drm_device * dev,void * data,struct drm_file * file_priv)873 static int i915_vblank_pipe_get(struct drm_device *dev, void *data,
874 			 struct drm_file *file_priv)
875 {
876 	drm_i915_private_t *dev_priv = dev->dev_private;
877 	drm_i915_vblank_pipe_t *pipe = data;
878 
879 	if (drm_core_check_feature(dev, DRIVER_MODESET))
880 		return -ENODEV;
881 
882 	if (!dev_priv) {
883 		DRM_ERROR("called with no initialization\n");
884 		return -EINVAL;
885 	}
886 
887 	pipe->pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
888 
889 	return 0;
890 }
891 
892 /**
893  * Schedule buffer swap at given vertical blank.
894  */
i915_vblank_swap(struct drm_device * dev,void * data,struct drm_file * file_priv)895 static int i915_vblank_swap(struct drm_device *dev, void *data,
896 		     struct drm_file *file_priv)
897 {
898 	/* The delayed swap mechanism was fundamentally racy, and has been
899 	 * removed.  The model was that the client requested a delayed flip/swap
900 	 * from the kernel, then waited for vblank before continuing to perform
901 	 * rendering.  The problem was that the kernel might wake the client
902 	 * up before it dispatched the vblank swap (since the lock has to be
903 	 * held while touching the ringbuffer), in which case the client would
904 	 * clear and start the next frame before the swap occurred, and
905 	 * flicker would occur in addition to likely missing the vblank.
906 	 *
907 	 * In the absence of this ioctl, userland falls back to a correct path
908 	 * of waiting for a vblank, then dispatching the swap on its own.
909 	 * Context switching to userland and back is plenty fast enough for
910 	 * meeting the requirements of vblank swapping.
911 	 */
912 	return -EINVAL;
913 }
914 
i915_flip_bufs(struct drm_device * dev,void * data,struct drm_file * file_priv)915 static int i915_flip_bufs(struct drm_device *dev, void *data,
916 			  struct drm_file *file_priv)
917 {
918 	int ret;
919 
920 	if (drm_core_check_feature(dev, DRIVER_MODESET))
921 		return -ENODEV;
922 
923 	DRM_DEBUG_DRIVER("%s\n", __func__);
924 
925 	RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
926 
927 	DRM_LOCK(dev);
928 	ret = i915_dispatch_flip(dev);
929 	DRM_UNLOCK(dev);
930 
931 	return ret;
932 }
933 
i915_getparam(struct drm_device * dev,void * data,struct drm_file * file_priv)934 int i915_getparam(struct drm_device *dev, void *data,
935 			 struct drm_file *file_priv)
936 {
937 	drm_i915_private_t *dev_priv = dev->dev_private;
938 	drm_i915_getparam_t *param = data;
939 	int value;
940 
941 	if (!dev_priv) {
942 		DRM_ERROR("called with no initialization\n");
943 		return -EINVAL;
944 	}
945 
946 	switch (param->param) {
947 	case I915_PARAM_IRQ_ACTIVE:
948 		value = dev->irq_enabled ? 1 : 0;
949 		break;
950 	case I915_PARAM_ALLOW_BATCHBUFFER:
951 		value = dev_priv->dri1.allow_batchbuffer ? 1 : 0;
952 		break;
953 	case I915_PARAM_LAST_DISPATCH:
954 		value = READ_BREADCRUMB(dev_priv);
955 		break;
956 	case I915_PARAM_CHIPSET_ID:
957 		value = dev->pci_device;
958 		break;
959 	case I915_PARAM_HAS_GEM:
960 		value = 1;
961 		break;
962 	case I915_PARAM_NUM_FENCES_AVAIL:
963 		value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
964 		break;
965 	case I915_PARAM_HAS_OVERLAY:
966 		value = dev_priv->overlay ? 1 : 0;
967 		break;
968 	case I915_PARAM_HAS_PAGEFLIPPING:
969 		value = 1;
970 		break;
971 	case I915_PARAM_HAS_EXECBUF2:
972 		value = 1;
973 		break;
974 	case I915_PARAM_HAS_BSD:
975 		value = intel_ring_initialized(&dev_priv->rings[VCS]);
976 		break;
977 	case I915_PARAM_HAS_BLT:
978 		value = intel_ring_initialized(&dev_priv->rings[BCS]);
979 		break;
980 	case I915_PARAM_HAS_RELAXED_FENCING:
981 		value = 1;
982 		break;
983 	case I915_PARAM_HAS_COHERENT_RINGS:
984 		value = 1;
985 		break;
986 	case I915_PARAM_HAS_EXEC_CONSTANTS:
987 		value = INTEL_INFO(dev)->gen >= 4;
988 		break;
989 	case I915_PARAM_HAS_RELAXED_DELTA:
990 		value = 1;
991 		break;
992 	case I915_PARAM_HAS_GEN7_SOL_RESET:
993 		value = 1;
994 		break;
995 	case I915_PARAM_HAS_LLC:
996 		value = HAS_LLC(dev);
997 		break;
998 	case I915_PARAM_HAS_ALIASING_PPGTT:
999 		value = dev_priv->mm.aliasing_ppgtt ? 1 : 0;
1000 		break;
1001 	default:
1002 		DRM_DEBUG_DRIVER("Unknown parameter %d\n",
1003 				 param->param);
1004 		return -EINVAL;
1005 	}
1006 
1007 	if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) {
1008 		DRM_ERROR("DRM_COPY_TO_USER failed\n");
1009 		return -EFAULT;
1010 	}
1011 
1012 	return 0;
1013 }
1014 
i915_setparam(struct drm_device * dev,void * data,struct drm_file * file_priv)1015 static int i915_setparam(struct drm_device *dev, void *data,
1016 			 struct drm_file *file_priv)
1017 {
1018 	drm_i915_private_t *dev_priv = dev->dev_private;
1019 	drm_i915_setparam_t *param = data;
1020 
1021 	if (!dev_priv) {
1022 		DRM_ERROR("called with no initialization\n");
1023 		return -EINVAL;
1024 	}
1025 
1026 	switch (param->param) {
1027 	case I915_SETPARAM_USE_MI_BATCHBUFFER_START:
1028 		break;
1029 	case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY:
1030 		break;
1031 	case I915_SETPARAM_ALLOW_BATCHBUFFER:
1032 		dev_priv->dri1.allow_batchbuffer = param->value ? 1 : 0;
1033 		break;
1034 	case I915_SETPARAM_NUM_USED_FENCES:
1035 		if (param->value > dev_priv->num_fence_regs ||
1036 		    param->value < 0)
1037 			return -EINVAL;
1038 		/* Userspace can use first N regs */
1039 		dev_priv->fence_reg_start = param->value;
1040 		break;
1041 	default:
1042 		DRM_DEBUG_DRIVER("unknown parameter %d\n",
1043 					param->param);
1044 		return -EINVAL;
1045 	}
1046 
1047 	return 0;
1048 }
1049 
i915_set_status_page(struct drm_device * dev,void * data,struct drm_file * file_priv)1050 static int i915_set_status_page(struct drm_device *dev, void *data,
1051 				struct drm_file *file_priv)
1052 {
1053 	drm_i915_private_t *dev_priv = dev->dev_private;
1054 	drm_i915_hws_addr_t *hws = data;
1055 	struct intel_ring_buffer *ring;
1056 
1057 	if (drm_core_check_feature(dev, DRIVER_MODESET))
1058 		return -ENODEV;
1059 
1060 	if (!I915_NEED_GFX_HWS(dev))
1061 		return -EINVAL;
1062 
1063 	if (!dev_priv) {
1064 		DRM_ERROR("called with no initialization\n");
1065 		return -EINVAL;
1066 	}
1067 
1068 	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1069 		DRM_ERROR("tried to set status page when mode setting active\n");
1070 		return 0;
1071 	}
1072 
1073 	DRM_DEBUG_DRIVER("set status page addr 0x%08x\n", (u32)hws->addr);
1074 
1075 	ring = LP_RING(dev_priv);
1076 	ring->status_page.gfx_addr = dev_priv->status_gfx_addr =
1077 	    hws->addr & (0x1ffff<<12);
1078 
1079 	dev_priv->dri1.gfx_hws_cpu_addr =
1080 		pmap_mapdev_attr(dev->agp->base + hws->addr, PAGE_SIZE,
1081 		    VM_MEMATTR_WRITE_COMBINING);
1082 	if (dev_priv->dri1.gfx_hws_cpu_addr == NULL) {
1083 		i915_dma_cleanup(dev);
1084 		ring->status_page.gfx_addr = dev_priv->status_gfx_addr = 0;
1085 		DRM_ERROR("can not ioremap virtual address for"
1086 				" G33 hw status page\n");
1087 		return -ENOMEM;
1088 	}
1089 
1090 	memset(dev_priv->dri1.gfx_hws_cpu_addr, 0, PAGE_SIZE);
1091 	I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);
1092 
1093 	DRM_DEBUG_DRIVER("load hws HWS_PGA with gfx mem 0x%x\n",
1094 			 dev_priv->status_gfx_addr);
1095 	DRM_DEBUG_DRIVER("load hws at %p\n",
1096 			 dev_priv->hw_status_page);
1097 	return 0;
1098 }
1099 
i915_get_bridge_dev(struct drm_device * dev)1100 static int i915_get_bridge_dev(struct drm_device *dev)
1101 {
1102 	struct drm_i915_private *dev_priv = dev->dev_private;
1103 
1104 	dev_priv->bridge_dev = intel_gtt_get_bridge_device();
1105 	if (!dev_priv->bridge_dev) {
1106 		DRM_ERROR("bridge device not found\n");
1107 		return -1;
1108 	}
1109 	return 0;
1110 }
1111 
1112 #define MCHBAR_I915 0x44
1113 #define MCHBAR_I965 0x48
1114 #define MCHBAR_SIZE (4*4096)
1115 
1116 #define DEVEN_REG 0x54
1117 #define   DEVEN_MCHBAR_EN (1 << 28)
1118 
1119 /* Allocate space for the MCH regs if needed, return nonzero on error */
1120 static int
intel_alloc_mchbar_resource(struct drm_device * dev)1121 intel_alloc_mchbar_resource(struct drm_device *dev)
1122 {
1123 	drm_i915_private_t *dev_priv = dev->dev_private;
1124 	int reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
1125 	u32 temp_lo, temp_hi = 0;
1126 	u64 mchbar_addr, temp;
1127 
1128 	if (INTEL_INFO(dev)->gen >= 4)
1129 		temp_hi = pci_read_config(dev_priv->bridge_dev, reg + 4, 4);
1130 	temp_lo = pci_read_config(dev_priv->bridge_dev, reg, 4);
1131 	mchbar_addr = ((u64)temp_hi << 32) | temp_lo;
1132 
1133 	/* If ACPI doesn't have it, assume we need to allocate it ourselves */
1134 #ifdef XXX_CONFIG_PNP
1135 	if (mchbar_addr &&
1136 	    pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE))
1137 		return 0;
1138 #endif
1139 
1140 	/* Get some space for it */
1141 	device_t vga;
1142 	vga = device_get_parent(dev->dev);
1143 	dev_priv->mch_res_rid = 0x100;
1144 	dev_priv->mch_res = BUS_ALLOC_RESOURCE(device_get_parent(vga),
1145 	    dev->dev, SYS_RES_MEMORY, &dev_priv->mch_res_rid, 0, ~0UL,
1146 	    MCHBAR_SIZE, RF_ACTIVE | RF_SHAREABLE);
1147 	if (dev_priv->mch_res == NULL) {
1148 		DRM_DEBUG_DRIVER("failed bus alloc\n");
1149 		return -ENOMEM;
1150 	}
1151 
1152 	if (INTEL_INFO(dev)->gen >= 4) {
1153 		temp = rman_get_start(dev_priv->mch_res);
1154 		temp >>= 32;
1155 		pci_write_config(dev_priv->bridge_dev, reg + 4, temp, 4);
1156 	}
1157 	pci_write_config(dev_priv->bridge_dev, reg,
1158 	    rman_get_start(dev_priv->mch_res) & UINT32_MAX, 4);
1159 	return 0;
1160 }
1161 
1162 static void
intel_setup_mchbar(struct drm_device * dev)1163 intel_setup_mchbar(struct drm_device *dev)
1164 {
1165 	drm_i915_private_t *dev_priv = dev->dev_private;
1166 	int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
1167 	u32 temp;
1168 	bool enabled;
1169 
1170 	dev_priv->mchbar_need_disable = false;
1171 
1172 	if (IS_I915G(dev) || IS_I915GM(dev)) {
1173 		temp = pci_read_config(dev_priv->bridge_dev, DEVEN_REG, 4);
1174 		enabled = (temp & DEVEN_MCHBAR_EN) != 0;
1175 	} else {
1176 		temp = pci_read_config(dev_priv->bridge_dev, mchbar_reg, 4);
1177 		enabled = temp & 1;
1178 	}
1179 
1180 	/* If it's already enabled, don't have to do anything */
1181 	if (enabled) {
1182 		DRM_DEBUG("mchbar already enabled\n");
1183 		return;
1184 	}
1185 
1186 	if (intel_alloc_mchbar_resource(dev))
1187 		return;
1188 
1189 	dev_priv->mchbar_need_disable = true;
1190 
1191 	/* Space is allocated or reserved, so enable it. */
1192 	if (IS_I915G(dev) || IS_I915GM(dev)) {
1193 		pci_write_config(dev_priv->bridge_dev, DEVEN_REG,
1194 		    temp | DEVEN_MCHBAR_EN, 4);
1195 	} else {
1196 		temp = pci_read_config(dev_priv->bridge_dev, mchbar_reg, 4);
1197 		pci_write_config(dev_priv->bridge_dev, mchbar_reg, temp | 1, 4);
1198 	}
1199 }
1200 
1201 static void
intel_teardown_mchbar(struct drm_device * dev)1202 intel_teardown_mchbar(struct drm_device *dev)
1203 {
1204 	drm_i915_private_t *dev_priv = dev->dev_private;
1205 	int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
1206 	u32 temp;
1207 
1208 	if (dev_priv->mchbar_need_disable) {
1209 		if (IS_I915G(dev) || IS_I915GM(dev)) {
1210 			temp = pci_read_config(dev_priv->bridge_dev,
1211 			    DEVEN_REG, 4);
1212 			temp &= ~DEVEN_MCHBAR_EN;
1213 			pci_write_config(dev_priv->bridge_dev, DEVEN_REG,
1214 			    temp, 4);
1215 		} else {
1216 			temp = pci_read_config(dev_priv->bridge_dev,
1217 			    mchbar_reg, 4);
1218 			temp &= ~1;
1219 			pci_write_config(dev_priv->bridge_dev, mchbar_reg,
1220 			    temp, 4);
1221 		}
1222 	}
1223 
1224 	if (dev_priv->mch_res != NULL) {
1225 		device_t vga;
1226 		vga = device_get_parent(dev->dev);
1227 		BUS_DEACTIVATE_RESOURCE(device_get_parent(vga), dev->dev,
1228 		    SYS_RES_MEMORY, dev_priv->mch_res_rid, dev_priv->mch_res);
1229 		BUS_RELEASE_RESOURCE(device_get_parent(vga), dev->dev,
1230 		    SYS_RES_MEMORY, dev_priv->mch_res_rid, dev_priv->mch_res);
1231 		dev_priv->mch_res = NULL;
1232 	}
1233 }
1234 
i915_load_modeset_init(struct drm_device * dev)1235 static int i915_load_modeset_init(struct drm_device *dev)
1236 {
1237 	struct drm_i915_private *dev_priv = dev->dev_private;
1238 	int ret;
1239 
1240 	ret = intel_parse_bios(dev);
1241 	if (ret)
1242 		DRM_INFO("failed to find VBIOS tables\n");
1243 
1244 #if 0
1245 	intel_register_dsm_handler();
1246 #endif
1247 
1248 	/* Initialise stolen first so that we may reserve preallocated
1249 	 * objects for the BIOS to KMS transition.
1250 	 */
1251 	ret = i915_gem_init_stolen(dev);
1252 	if (ret)
1253 		goto cleanup_vga_switcheroo;
1254 
1255 	intel_modeset_init(dev);
1256 
1257 	ret = i915_gem_init(dev);
1258 	if (ret)
1259 		goto cleanup_gem_stolen;
1260 
1261 	intel_modeset_gem_init(dev);
1262 
1263 	ret = drm_irq_install(dev);
1264 	if (ret)
1265 		goto cleanup_gem;
1266 
1267 	dev->vblank_disable_allowed = 1;
1268 
1269 	ret = intel_fbdev_init(dev);
1270 	if (ret)
1271 		goto cleanup_gem;
1272 
1273 	drm_kms_helper_poll_init(dev);
1274 
1275 	/* We're off and running w/KMS */
1276 	dev_priv->mm.suspended = 0;
1277 
1278 	return 0;
1279 
1280 cleanup_gem:
1281 	DRM_LOCK(dev);
1282 	i915_gem_cleanup_ringbuffer(dev);
1283 	DRM_UNLOCK(dev);
1284 	i915_gem_cleanup_aliasing_ppgtt(dev);
1285 cleanup_gem_stolen:
1286 	i915_gem_cleanup_stolen(dev);
1287 cleanup_vga_switcheroo:
1288 	return ret;
1289 }
1290 
i915_master_create(struct drm_device * dev,struct drm_master * master)1291 int i915_master_create(struct drm_device *dev, struct drm_master *master)
1292 {
1293 	struct drm_i915_master_private *master_priv;
1294 
1295 	master_priv = malloc(sizeof(*master_priv), DRM_MEM_DMA, M_NOWAIT | M_ZERO);
1296 	if (!master_priv)
1297 		return -ENOMEM;
1298 
1299 	master->driver_priv = master_priv;
1300 	return 0;
1301 }
1302 
i915_master_destroy(struct drm_device * dev,struct drm_master * master)1303 void i915_master_destroy(struct drm_device *dev, struct drm_master *master)
1304 {
1305 	struct drm_i915_master_private *master_priv = master->driver_priv;
1306 
1307 	if (!master_priv)
1308 		return;
1309 
1310 	free(master_priv, DRM_MEM_DMA);
1311 
1312 	master->driver_priv = NULL;
1313 }
1314 
1315 /**
1316  * i915_driver_load - setup chip and create an initial config
1317  * @dev: DRM device
1318  * @flags: startup flags
1319  *
1320  * The driver load routine has to do several things:
1321  *   - drive output discovery via intel_modeset_init()
1322  *   - initialize the memory manager
1323  *   - allocate initial config memory
1324  *   - setup the DRM framebuffer with the allocated memory
1325  */
i915_driver_load(struct drm_device * dev,unsigned long flags)1326 int i915_driver_load(struct drm_device *dev, unsigned long flags)
1327 {
1328 	struct drm_i915_private *dev_priv;
1329 	const struct intel_device_info *info;
1330 	unsigned long base, size;
1331 	int ret = 0, mmio_bar;
1332 
1333 	info = i915_get_device_id(dev->pci_device);
1334 
1335 	/* Refuse to load on gen6+ without kms enabled. */
1336 	if (info->gen >= 6 && !drm_core_check_feature(dev, DRIVER_MODESET))
1337 		return -ENODEV;
1338 
1339 	/* i915 has 4 more counters */
1340 	dev->counters += 4;
1341 	dev->types[6] = _DRM_STAT_IRQ;
1342 	dev->types[7] = _DRM_STAT_PRIMARY;
1343 	dev->types[8] = _DRM_STAT_SECONDARY;
1344 	dev->types[9] = _DRM_STAT_DMA;
1345 
1346 	dev_priv = malloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER,
1347 	    M_WAITOK | M_ZERO);
1348 
1349 	dev->dev_private = (void *)dev_priv;
1350 	dev_priv->dev = dev;
1351 	dev_priv->info = info;
1352 
1353 	if (i915_get_bridge_dev(dev)) {
1354 		free(dev_priv, DRM_MEM_DRIVER);
1355 		return -EIO;
1356 	}
1357 	dev_priv->mm.gtt = intel_gtt_get();
1358 
1359 	/* Add register map (needed for suspend/resume) */
1360 	mmio_bar = IS_GEN2(dev) ? 1 : 0;
1361 	base = drm_get_resource_start(dev, mmio_bar);
1362 	size = drm_get_resource_len(dev, mmio_bar);
1363 
1364 	ret = drm_addmap(dev,
1365 	    base, size,
1366 	    _DRM_REGISTERS, _DRM_KERNEL | _DRM_DRIVER, &dev_priv->mmio_map);
1367 	if (ret != 0) {
1368 		DRM_ERROR("Failed to allocate mmio_map: %d\n", ret);
1369 		free(dev_priv, DRM_MEM_DRIVER);
1370 		return ret;
1371 	}
1372 
1373 	dev_priv->tq = taskqueue_create("915", M_WAITOK,
1374 	    taskqueue_thread_enqueue, &dev_priv->tq);
1375 	taskqueue_start_threads(&dev_priv->tq, 1, PWAIT, "i915 taskq");
1376 	mtx_init(&dev_priv->gt_lock, "915gt", NULL, MTX_DEF);
1377 	mtx_init(&dev_priv->error_lock, "915err", NULL, MTX_DEF);
1378 	mtx_init(&dev_priv->error_completion_lock, "915cmp", NULL, MTX_DEF);
1379 	mtx_init(&dev_priv->rps_lock, "915rps", NULL, MTX_DEF);
1380 	mtx_init(&dev_priv->dpio_lock, "915dpi", NULL, MTX_DEF);
1381 
1382 	intel_irq_init(dev);
1383 
1384 	intel_setup_mchbar(dev);
1385 	intel_setup_gmbus(dev);
1386 	intel_opregion_setup(dev);
1387 
1388 	intel_setup_bios(dev);
1389 
1390 	i915_gem_load(dev);
1391 
1392 	/* On the 945G/GM, the chipset reports the MSI capability on the
1393 	 * integrated graphics even though the support isn't actually there
1394 	 * according to the published specs.  It doesn't appear to function
1395 	 * correctly in testing on 945G.
1396 	 * This may be a side effect of MSI having been made available for PEG
1397 	 * and the registers being closely associated.
1398 	 *
1399 	 * According to chipset errata, on the 965GM, MSI interrupts may
1400 	 * be lost or delayed, but we use them anyways to avoid
1401 	 * stuck interrupts on some machines.
1402 	 */
1403 	if (!IS_I945G(dev) && !IS_I945GM(dev))
1404 		drm_pci_enable_msi(dev);
1405 
1406 	/* Init HWS */
1407 	if (!I915_NEED_GFX_HWS(dev)) {
1408 		ret = i915_init_phys_hws(dev);
1409 		if (ret != 0) {
1410 			drm_rmmap(dev, dev_priv->mmio_map);
1411 			free(dev_priv, DRM_MEM_DRIVER);
1412 			return ret;
1413 		}
1414 	}
1415 
1416 	mtx_init(&dev_priv->irq_lock, "userirq", NULL, MTX_DEF);
1417 
1418 	if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
1419 		dev_priv->num_pipe = 3;
1420 	else if (IS_MOBILE(dev) || !IS_GEN2(dev))
1421 		dev_priv->num_pipe = 2;
1422 	else
1423 		dev_priv->num_pipe = 1;
1424 
1425 	ret = drm_vblank_init(dev, dev_priv->num_pipe);
1426 	if (ret)
1427 		goto out_gem_unload;
1428 
1429 	/* Start out suspended */
1430 	dev_priv->mm.suspended = 1;
1431 
1432 	intel_detect_pch(dev);
1433 
1434 	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1435 		ret = i915_load_modeset_init(dev);
1436 		if (ret < 0) {
1437 			DRM_ERROR("failed to init modeset\n");
1438 			goto out_gem_unload;
1439 		}
1440 	}
1441 
1442 	pci_enable_busmaster(dev->dev);
1443 
1444 	intel_opregion_init(dev);
1445 
1446 	callout_init(&dev_priv->hangcheck_timer, 1);
1447 	callout_reset(&dev_priv->hangcheck_timer, DRM_I915_HANGCHECK_PERIOD,
1448 	    i915_hangcheck_elapsed, dev);
1449 
1450 	if (IS_GEN5(dev))
1451 		intel_gpu_ips_init(dev_priv);
1452 
1453 	return 0;
1454 
1455 out_gem_unload:
1456 	/* XXXKIB */
1457 	(void) i915_driver_unload(dev);
1458 	return (ret);
1459 }
1460 
i915_driver_unload(struct drm_device * dev)1461 int i915_driver_unload(struct drm_device *dev)
1462 {
1463 	struct drm_i915_private *dev_priv = dev->dev_private;
1464 	int ret;
1465 
1466 	DRM_LOCK(dev);
1467 	ret = i915_gpu_idle(dev);
1468 	if (ret)
1469 		DRM_ERROR("failed to idle hardware: %d\n", ret);
1470 	i915_gem_retire_requests(dev);
1471 	DRM_UNLOCK(dev);
1472 
1473 	i915_free_hws(dev);
1474 
1475 	intel_teardown_mchbar(dev);
1476 
1477 	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1478 		intel_fbdev_fini(dev);
1479 		intel_modeset_cleanup(dev);
1480 	}
1481 
1482 	/* Free error state after interrupts are fully disabled. */
1483 	callout_stop(&dev_priv->hangcheck_timer);
1484 	callout_drain(&dev_priv->hangcheck_timer);
1485 
1486 	i915_destroy_error_state(dev);
1487 
1488 	if (dev->msi_enabled)
1489 		drm_pci_disable_msi(dev);
1490 
1491 	intel_opregion_fini(dev);
1492 
1493 	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1494 		DRM_LOCK(dev);
1495 		i915_gem_free_all_phys_object(dev);
1496 		i915_gem_cleanup_ringbuffer(dev);
1497 		i915_gem_context_fini(dev);
1498 		DRM_UNLOCK(dev);
1499 		i915_gem_cleanup_aliasing_ppgtt(dev);
1500 #if 1
1501 		KIB_NOTYET();
1502 #else
1503 		if (I915_HAS_FBC(dev) && i915_powersave)
1504 			i915_cleanup_compression(dev);
1505 #endif
1506 		drm_mm_takedown(&dev_priv->mm.stolen);
1507 
1508 		intel_cleanup_overlay(dev);
1509 
1510 		if (!I915_NEED_GFX_HWS(dev))
1511 			i915_free_hws(dev);
1512 	}
1513 
1514 	i915_gem_unload(dev);
1515 
1516 	mtx_destroy(&dev_priv->irq_lock);
1517 
1518 	if (dev_priv->tq != NULL)
1519 		taskqueue_free(dev_priv->tq);
1520 
1521 	bus_generic_detach(dev->dev);
1522 	drm_rmmap(dev, dev_priv->mmio_map);
1523 	intel_teardown_gmbus(dev);
1524 
1525 	mtx_destroy(&dev_priv->dpio_lock);
1526 	mtx_destroy(&dev_priv->error_lock);
1527 	mtx_destroy(&dev_priv->error_completion_lock);
1528 	mtx_destroy(&dev_priv->rps_lock);
1529 	free(dev->dev_private, DRM_MEM_DRIVER);
1530 
1531 	return 0;
1532 }
1533 
i915_driver_open(struct drm_device * dev,struct drm_file * file)1534 int i915_driver_open(struct drm_device *dev, struct drm_file *file)
1535 {
1536 	struct drm_i915_file_private *file_priv;
1537 
1538 	file_priv = malloc(sizeof(*file_priv), DRM_MEM_FILES, M_WAITOK | M_ZERO);
1539 
1540 	file->driver_priv = file_priv;
1541 
1542 	mtx_init(&file_priv->mm.lck, "915fp", NULL, MTX_DEF);
1543 	INIT_LIST_HEAD(&file_priv->mm.request_list);
1544 
1545 	drm_gem_names_init(&file_priv->context_idr);
1546 
1547 	return 0;
1548 }
1549 
1550 /**
1551  * i915_driver_lastclose - clean up after all DRM clients have exited
1552  * @dev: DRM device
1553  *
1554  * Take care of cleaning up after all DRM clients have exited.  In the
1555  * mode setting case, we want to restore the kernel's initial mode (just
1556  * in case the last client left us in a bad state).
1557  *
1558  * Additionally, in the non-mode setting case, we'll tear down the GTT
1559  * and DMA structures, since the kernel won't be using them, and clea
1560  * up any GEM state.
1561  */
i915_driver_lastclose(struct drm_device * dev)1562 void i915_driver_lastclose(struct drm_device * dev)
1563 {
1564 	drm_i915_private_t *dev_priv = dev->dev_private;
1565 
1566 	/* On gen6+ we refuse to init without kms enabled, but then the drm core
1567 	 * goes right around and calls lastclose. Check for this and don't clean
1568 	 * up anything. */
1569 	if (!dev_priv)
1570 		return;
1571 
1572 	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1573 #if 1
1574 		KIB_NOTYET();
1575 #else
1576 		drm_fb_helper_restore();
1577 		vga_switcheroo_process_delayed_switch();
1578 #endif
1579 		return;
1580 	}
1581 
1582 	i915_gem_lastclose(dev);
1583 
1584 	i915_dma_cleanup(dev);
1585 }
1586 
i915_driver_preclose(struct drm_device * dev,struct drm_file * file_priv)1587 void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
1588 {
1589 	i915_gem_context_close(dev, file_priv);
1590 	i915_gem_release(dev, file_priv);
1591 }
1592 
i915_driver_postclose(struct drm_device * dev,struct drm_file * file)1593 void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
1594 {
1595 	struct drm_i915_file_private *file_priv = file->driver_priv;
1596 
1597 	mtx_destroy(&file_priv->mm.lck);
1598 	free(file_priv, DRM_MEM_FILES);
1599 }
1600 
1601 struct drm_ioctl_desc i915_ioctls[] = {
1602 	DRM_IOCTL_DEF(DRM_I915_INIT, i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1603 	DRM_IOCTL_DEF(DRM_I915_FLUSH, i915_flush_ioctl, DRM_AUTH),
1604 	DRM_IOCTL_DEF(DRM_I915_FLIP, i915_flip_bufs, DRM_AUTH),
1605 	DRM_IOCTL_DEF(DRM_I915_BATCHBUFFER, i915_batchbuffer, DRM_AUTH),
1606 	DRM_IOCTL_DEF(DRM_I915_IRQ_EMIT, i915_irq_emit, DRM_AUTH),
1607 	DRM_IOCTL_DEF(DRM_I915_IRQ_WAIT, i915_irq_wait, DRM_AUTH),
1608 	DRM_IOCTL_DEF(DRM_I915_GETPARAM, i915_getparam, DRM_AUTH),
1609 	DRM_IOCTL_DEF(DRM_I915_SETPARAM, i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1610 	DRM_IOCTL_DEF(DRM_I915_ALLOC, drm_noop, DRM_AUTH),
1611 	DRM_IOCTL_DEF(DRM_I915_FREE, drm_noop, DRM_AUTH),
1612 	DRM_IOCTL_DEF(DRM_I915_INIT_HEAP, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1613 	DRM_IOCTL_DEF(DRM_I915_CMDBUFFER, i915_cmdbuffer, DRM_AUTH),
1614 	DRM_IOCTL_DEF(DRM_I915_DESTROY_HEAP,  drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
1615 	DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE,  drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
1616 	DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE,  i915_vblank_pipe_get, DRM_AUTH ),
1617 	DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
1618 	DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
1619 	DRM_IOCTL_DEF(DRM_I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1620 	DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH | DRM_UNLOCKED),
1621 	DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER2, i915_gem_execbuffer2, DRM_AUTH | DRM_UNLOCKED),
1622 	DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),
1623 	DRM_IOCTL_DEF(DRM_I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY|DRM_UNLOCKED),
1624 	DRM_IOCTL_DEF(DRM_I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED),
1625 	DRM_IOCTL_DEF(DRM_I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH|DRM_UNLOCKED),
1626 	DRM_IOCTL_DEF(DRM_I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1627 	DRM_IOCTL_DEF(DRM_I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1628 	DRM_IOCTL_DEF(DRM_I915_GEM_CREATE, i915_gem_create_ioctl, DRM_UNLOCKED),
1629 	DRM_IOCTL_DEF(DRM_I915_GEM_PREAD, i915_gem_pread_ioctl, DRM_UNLOCKED),
1630 	DRM_IOCTL_DEF(DRM_I915_GEM_PWRITE, i915_gem_pwrite_ioctl, DRM_UNLOCKED),
1631 	DRM_IOCTL_DEF(DRM_I915_GEM_MMAP, i915_gem_mmap_ioctl, DRM_UNLOCKED),
1632 	DRM_IOCTL_DEF(DRM_I915_GEM_MMAP_GTT, i915_gem_mmap_gtt_ioctl, DRM_UNLOCKED),
1633 	DRM_IOCTL_DEF(DRM_I915_GEM_SET_DOMAIN, i915_gem_set_domain_ioctl, DRM_UNLOCKED),
1634 	DRM_IOCTL_DEF(DRM_I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, DRM_UNLOCKED),
1635 	DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, DRM_UNLOCKED),
1636 	DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, DRM_UNLOCKED),
1637 	DRM_IOCTL_DEF(DRM_I915_GEM_GET_APERTURE, i915_gem_get_aperture_ioctl, DRM_UNLOCKED),
1638 	DRM_IOCTL_DEF(DRM_I915_GET_PIPE_FROM_CRTC_ID, intel_get_pipe_from_crtc_id, DRM_UNLOCKED),
1639 	DRM_IOCTL_DEF(DRM_I915_GEM_MADVISE, i915_gem_madvise_ioctl, DRM_UNLOCKED),
1640 	DRM_IOCTL_DEF(DRM_I915_OVERLAY_PUT_IMAGE, intel_overlay_put_image, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1641 	DRM_IOCTL_DEF(DRM_I915_OVERLAY_ATTRS, intel_overlay_attrs, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1642 	DRM_IOCTL_DEF(DRM_I915_SET_SPRITE_COLORKEY, intel_sprite_set_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1643 	DRM_IOCTL_DEF(DRM_I915_GET_SPRITE_COLORKEY, intel_sprite_get_colorkey, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
1644 	DRM_IOCTL_DEF(DRM_I915_GEM_CONTEXT_CREATE, i915_gem_context_create_ioctl, DRM_UNLOCKED),
1645 	DRM_IOCTL_DEF(DRM_I915_GEM_CONTEXT_DESTROY, i915_gem_context_destroy_ioctl, DRM_UNLOCKED),
1646 };
1647 
1648 #ifdef COMPAT_FREEBSD32
1649 extern struct drm_ioctl_desc i915_compat_ioctls[];
1650 extern int i915_compat_ioctls_nr;
1651 #endif
1652 
1653 struct drm_driver i915_driver_info = {
1654 	/*
1655 	 * FIXME Linux<->FreeBSD: DRIVER_USE_MTRR is commented out on
1656 	 * Linux.
1657 	 */
1658 	.driver_features =
1659 	    DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR |
1660 	    DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM | DRIVER_PRIME,
1661 
1662 	.buf_priv_size	= sizeof(drm_i915_private_t),
1663 	.load		= i915_driver_load,
1664 	.open		= i915_driver_open,
1665 	.unload		= i915_driver_unload,
1666 	.preclose	= i915_driver_preclose,
1667 	.lastclose	= i915_driver_lastclose,
1668 	.postclose	= i915_driver_postclose,
1669 	.device_is_agp	= i915_driver_device_is_agp,
1670 	.master_create	= i915_master_create,
1671 	.master_destroy	= i915_master_destroy,
1672 	.gem_init_object = i915_gem_init_object,
1673 	.gem_free_object = i915_gem_free_object,
1674 	.gem_pager_ops	= &i915_gem_pager_ops,
1675 	.dumb_create	= i915_gem_dumb_create,
1676 	.dumb_map_offset = i915_gem_mmap_gtt,
1677 	.dumb_destroy	= i915_gem_dumb_destroy,
1678 	.sysctl_init	= i915_sysctl_init,
1679 	.sysctl_cleanup	= i915_sysctl_cleanup,
1680 
1681 	.ioctls		= i915_ioctls,
1682 #ifdef COMPAT_FREEBSD32
1683 	.compat_ioctls  = i915_compat_ioctls,
1684 	.num_compat_ioctls = &i915_compat_ioctls_nr,
1685 #endif
1686 	.num_ioctls	= ARRAY_SIZE(i915_ioctls),
1687 
1688 	.name		= DRIVER_NAME,
1689 	.desc		= DRIVER_DESC,
1690 	.date		= DRIVER_DATE,
1691 	.major		= DRIVER_MAJOR,
1692 	.minor		= DRIVER_MINOR,
1693 	.patchlevel	= DRIVER_PATCHLEVEL,
1694 };
1695 
1696 /*
1697  * This is really ugly: Because old userspace abused the linux agp interface to
1698  * manage the gtt, we need to claim that all intel devices are agp.  For
1699  * otherwise the drm core refuses to initialize the agp support code.
1700  */
i915_driver_device_is_agp(struct drm_device * dev)1701 int i915_driver_device_is_agp(struct drm_device * dev)
1702 {
1703 	return 1;
1704 }
1705