Merge branch 'vendor/TCSH'
[dragonfly.git] / sys / dev / drm / i915 / i915_dma.c
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 "dev/drm/drmP.h"
30 #include "dev/drm/drm.h"
31 #include "dev/drm/i915_drm.h"
32 #include "dev/drm/i915/i915_drv.h"
33
34 /* Really want an OS-independent resettable timer.  Would like to have
35  * this loop run for (eg) 3 sec, but have the timer reset every time
36  * the head pointer changes, so that EBUSY only happens if the ring
37  * actually stalls for (eg) 3 seconds.
38  */
39 int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
40 {
41         drm_i915_private_t *dev_priv = dev->dev_private;
42         drm_i915_ring_buffer_t *ring = &(dev_priv->ring);
43         u32 last_head = I915_READ(PRB0_HEAD) & HEAD_ADDR;
44         u32 acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD;
45         u32 last_acthd = I915_READ(acthd_reg);
46         u32 acthd;
47         int i;
48
49         for (i = 0; i < 100000; i++) {
50                 ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR;
51                 acthd = I915_READ(acthd_reg);
52                 ring->space = ring->head - (ring->tail + 8);
53                 if (ring->space < 0)
54                         ring->space += ring->Size;
55                 if (ring->space >= n)
56                         return 0;
57
58                 if (dev_priv->sarea_priv)
59                         dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
60
61                 if (ring->head != last_head)
62                         i = 0;
63
64                 if (acthd != last_acthd)
65                         i = 0;
66
67                 last_head = ring->head;
68                 last_acthd = acthd;
69                 DRM_UDELAY(10 * 1000);
70         }
71
72         return -EBUSY;
73 }
74
75 /**
76  * Sets up the hardware status page for devices that need a physical address
77  * in the register.
78  */
79 static int i915_init_phys_hws(struct drm_device *dev)
80 {
81         drm_i915_private_t *dev_priv = dev->dev_private;
82
83         /* Program Hardware Status Page */
84         DRM_UNLOCK();
85         dev_priv->status_page_dmah =
86                 drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 0xffffffff);
87         DRM_LOCK();
88         if (!dev_priv->status_page_dmah) {
89                 DRM_ERROR("Can not allocate hardware status page\n");
90                 return -ENOMEM;
91         }
92         dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
93         dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
94
95         memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
96
97         I915_WRITE(HWS_PGA, dev_priv->dma_status_page);
98         DRM_DEBUG("Enabled hardware status page\n");
99         return 0;
100 }
101
102 /**
103  * Frees the hardware status page, whether it's a physical address or a virtual
104  * address set up by the X Server.
105  */
106 static void i915_free_hws(struct drm_device *dev)
107 {
108         drm_i915_private_t *dev_priv = dev->dev_private;
109         if (dev_priv->status_page_dmah) {
110                 drm_pci_free(dev, dev_priv->status_page_dmah);
111                 dev_priv->status_page_dmah = NULL;
112         }
113
114         if (dev_priv->status_gfx_addr) {
115                 dev_priv->status_gfx_addr = 0;
116                 drm_core_ioremapfree(&dev_priv->hws_map, dev);
117         }
118
119         /* Need to rewrite hardware status page */
120         I915_WRITE(HWS_PGA, 0x1ffff000);
121 }
122
123 void i915_kernel_lost_context(struct drm_device * dev)
124 {
125         drm_i915_private_t *dev_priv = dev->dev_private;
126         drm_i915_ring_buffer_t *ring = &(dev_priv->ring);
127
128         ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR;
129         ring->tail = I915_READ(PRB0_TAIL) & TAIL_ADDR;
130         ring->space = ring->head - (ring->tail + 8);
131         if (ring->space < 0)
132                 ring->space += ring->Size;
133
134         if (ring->head == ring->tail && dev_priv->sarea_priv)
135                 dev_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY;
136 }
137
138 static int i915_dma_cleanup(struct drm_device * dev)
139 {
140         drm_i915_private_t *dev_priv = dev->dev_private;
141         /* Make sure interrupts are disabled here because the uninstall ioctl
142          * may not have been called from userspace and after dev_private
143          * is freed, it's too late.
144          */
145         if (dev->irq_enabled)
146                 drm_irq_uninstall(dev);
147
148         if (dev_priv->ring.virtual_start) {
149                 drm_core_ioremapfree(&dev_priv->ring.map, dev);
150                 dev_priv->ring.virtual_start = NULL;
151                 dev_priv->ring.map.handle = NULL;
152                 dev_priv->ring.map.size = 0;
153         }
154
155         /* Clear the HWS virtual address at teardown */
156         if (I915_NEED_GFX_HWS(dev))
157                 i915_free_hws(dev);
158
159         return 0;
160 }
161
162 static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
163 {
164         drm_i915_private_t *dev_priv = dev->dev_private;
165
166         dev_priv->sarea = drm_getsarea(dev);
167         if (!dev_priv->sarea) {
168                 DRM_ERROR("can not find sarea!\n");
169                 i915_dma_cleanup(dev);
170                 return -EINVAL;
171         }
172
173         dev_priv->sarea_priv = (drm_i915_sarea_t *)
174             ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset);
175
176         if (init->ring_size != 0) {
177                 if (dev_priv->ring.ring_obj != NULL) {
178                         i915_dma_cleanup(dev);
179                         DRM_ERROR("Client tried to initialize ringbuffer in "
180                                   "GEM mode\n");
181                         return -EINVAL;
182                 }
183
184                 dev_priv->ring.Size = init->ring_size;
185                 dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;
186
187                 dev_priv->ring.map.offset = init->ring_start;
188                 dev_priv->ring.map.size = init->ring_size;
189                 dev_priv->ring.map.type = 0;
190                 dev_priv->ring.map.flags = 0;
191                 dev_priv->ring.map.mtrr = 0;
192
193                 drm_core_ioremap_wc(&dev_priv->ring.map, dev);
194
195                 if (dev_priv->ring.map.handle == NULL) {
196                         i915_dma_cleanup(dev);
197                         DRM_ERROR("can not ioremap virtual address for"
198                                   " ring buffer\n");
199                         return -ENOMEM;
200                 }
201         }
202
203         dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
204
205         dev_priv->cpp = init->cpp;
206         dev_priv->back_offset = init->back_offset;
207         dev_priv->front_offset = init->front_offset;
208         dev_priv->current_page = 0;
209         dev_priv->sarea_priv->pf_current_page = 0;
210
211         /* Allow hardware batchbuffers unless told otherwise.
212          */
213         dev_priv->allow_batchbuffer = 1;
214
215         return 0;
216 }
217
218 static int i915_dma_resume(struct drm_device * dev)
219 {
220         drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
221
222         DRM_DEBUG("\n");
223
224         if (!dev_priv->sarea) {
225                 DRM_ERROR("can not find sarea!\n");
226                 return -EINVAL;
227         }
228
229         if (dev_priv->ring.map.handle == NULL) {
230                 DRM_ERROR("can not ioremap virtual address for"
231                           " ring buffer\n");
232                 return -ENOMEM;
233         }
234
235         /* Program Hardware Status Page */
236         if (!dev_priv->hw_status_page) {
237                 DRM_ERROR("Can not find hardware status page\n");
238                 return -EINVAL;
239         }
240         DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
241
242         if (dev_priv->status_gfx_addr != 0)
243                 I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);
244         else
245                 I915_WRITE(HWS_PGA, dev_priv->dma_status_page);
246         DRM_DEBUG("Enabled hardware status page\n");
247
248         return 0;
249 }
250
251 static int i915_dma_init(struct drm_device *dev, void *data,
252                          struct drm_file *file_priv)
253 {
254         drm_i915_init_t *init = data;
255         int retcode = 0;
256
257         switch (init->func) {
258         case I915_INIT_DMA:
259                 retcode = i915_initialize(dev, init);
260                 break;
261         case I915_CLEANUP_DMA:
262                 retcode = i915_dma_cleanup(dev);
263                 break;
264         case I915_RESUME_DMA:
265                 retcode = i915_dma_resume(dev);
266                 break;
267         default:
268                 retcode = -EINVAL;
269                 break;
270         }
271
272         return retcode;
273 }
274
275 /* Implement basically the same security restrictions as hardware does
276  * for MI_BATCH_NON_SECURE.  These can be made stricter at any time.
277  *
278  * Most of the calculations below involve calculating the size of a
279  * particular instruction.  It's important to get the size right as
280  * that tells us where the next instruction to check is.  Any illegal
281  * instruction detected will be given a size of zero, which is a
282  * signal to abort the rest of the buffer.
283  */
284 static int do_validate_cmd(int cmd)
285 {
286         switch (((cmd >> 29) & 0x7)) {
287         case 0x0:
288                 switch ((cmd >> 23) & 0x3f) {
289                 case 0x0:
290                         return 1;       /* MI_NOOP */
291                 case 0x4:
292                         return 1;       /* MI_FLUSH */
293                 default:
294                         return 0;       /* disallow everything else */
295                 }
296                 break;
297         case 0x1:
298                 return 0;       /* reserved */
299         case 0x2:
300                 return (cmd & 0xff) + 2;        /* 2d commands */
301         case 0x3:
302                 if (((cmd >> 24) & 0x1f) <= 0x18)
303                         return 1;
304
305                 switch ((cmd >> 24) & 0x1f) {
306                 case 0x1c:
307                         return 1;
308                 case 0x1d:
309                         switch ((cmd >> 16) & 0xff) {
310                         case 0x3:
311                                 return (cmd & 0x1f) + 2;
312                         case 0x4:
313                                 return (cmd & 0xf) + 2;
314                         default:
315                                 return (cmd & 0xffff) + 2;
316                         }
317                 case 0x1e:
318                         if (cmd & (1 << 23))
319                                 return (cmd & 0xffff) + 1;
320                         else
321                                 return 1;
322                 case 0x1f:
323                         if ((cmd & (1 << 23)) == 0)     /* inline vertices */
324                                 return (cmd & 0x1ffff) + 2;
325                         else if (cmd & (1 << 17))       /* indirect random */
326                                 if ((cmd & 0xffff) == 0)
327                                         return 0;       /* unknown length, too hard */
328                                 else
329                                         return (((cmd & 0xffff) + 1) / 2) + 1;
330                         else
331                                 return 2;       /* indirect sequential */
332                 default:
333                         return 0;
334                 }
335         default:
336                 return 0;
337         }
338
339         return 0;
340 }
341
342 static int validate_cmd(int cmd)
343 {
344         int ret = do_validate_cmd(cmd);
345
346 /*      printk("validate_cmd( %x ): %d\n", cmd, ret); */
347
348         return ret;
349 }
350
351 static int i915_emit_cmds(struct drm_device *dev, int __user *buffer,
352                           int dwords)
353 {
354         drm_i915_private_t *dev_priv = dev->dev_private;
355         int i;
356         RING_LOCALS;
357
358         if ((dwords+1) * sizeof(int) >= dev_priv->ring.Size - 8)
359                 return -EINVAL;
360
361         BEGIN_LP_RING((dwords+1)&~1);
362
363         for (i = 0; i < dwords;) {
364                 int cmd, sz;
365
366                 if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd)))
367                         return -EINVAL;
368
369                 if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords)
370                         return -EINVAL;
371
372                 OUT_RING(cmd);
373
374                 while (++i, --sz) {
375                         if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i],
376                                                          sizeof(cmd))) {
377                                 return -EINVAL;
378                         }
379                         OUT_RING(cmd);
380                 }
381         }
382
383         if (dwords & 1)
384                 OUT_RING(0);
385
386         ADVANCE_LP_RING();
387
388         return 0;
389 }
390
391 int i915_emit_box(struct drm_device * dev,
392                   struct drm_clip_rect __user * boxes,
393                   int i, int DR1, int DR4)
394 {
395         drm_i915_private_t *dev_priv = dev->dev_private;
396         struct drm_clip_rect box;
397         RING_LOCALS;
398
399         if (DRM_COPY_FROM_USER_UNCHECKED(&box, &boxes[i], sizeof(box))) {
400                 return -EFAULT;
401         }
402
403         if (box.y2 <= box.y1 || box.x2 <= box.x1 || box.y2 <= 0 || box.x2 <= 0) {
404                 DRM_ERROR("Bad box %d,%d..%d,%d\n",
405                           box.x1, box.y1, box.x2, box.y2);
406                 return -EINVAL;
407         }
408
409         if (IS_I965G(dev)) {
410                 BEGIN_LP_RING(4);
411                 OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
412                 OUT_RING((box.x1 & 0xffff) | (box.y1 << 16));
413                 OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16));
414                 OUT_RING(DR4);
415                 ADVANCE_LP_RING();
416         } else {
417                 BEGIN_LP_RING(6);
418                 OUT_RING(GFX_OP_DRAWRECT_INFO);
419                 OUT_RING(DR1);
420                 OUT_RING((box.x1 & 0xffff) | (box.y1 << 16));
421                 OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16));
422                 OUT_RING(DR4);
423                 OUT_RING(0);
424                 ADVANCE_LP_RING();
425         }
426
427         return 0;
428 }
429
430 /* XXX: Emitting the counter should really be moved to part of the IRQ
431  * emit. For now, do it in both places:
432  */
433
434 static void i915_emit_breadcrumb(struct drm_device *dev)
435 {
436         drm_i915_private_t *dev_priv = dev->dev_private;
437         RING_LOCALS;
438
439         if (++dev_priv->counter > 0x7FFFFFFFUL)
440                 dev_priv->counter = 0;
441         if (dev_priv->sarea_priv)
442                 dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
443
444         BEGIN_LP_RING(4);
445         OUT_RING(MI_STORE_DWORD_INDEX);
446         OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
447         OUT_RING(dev_priv->counter);
448         OUT_RING(0);
449         ADVANCE_LP_RING();
450 }
451
452 static int i915_dispatch_cmdbuffer(struct drm_device * dev,
453                                    drm_i915_cmdbuffer_t * cmd)
454 {
455         int nbox = cmd->num_cliprects;
456         int i = 0, count, ret;
457
458         if (cmd->sz & 0x3) {
459                 DRM_ERROR("alignment\n");
460                 return -EINVAL;
461         }
462
463         i915_kernel_lost_context(dev);
464
465         count = nbox ? nbox : 1;
466
467         for (i = 0; i < count; i++) {
468                 if (i < nbox) {
469                         ret = i915_emit_box(dev, cmd->cliprects, i,
470                                             cmd->DR1, cmd->DR4);
471                         if (ret)
472                                 return ret;
473                 }
474
475                 ret = i915_emit_cmds(dev, (int __user *)cmd->buf, cmd->sz / 4);
476                 if (ret)
477                         return ret;
478         }
479
480         i915_emit_breadcrumb(dev);
481         return 0;
482 }
483
484 static int i915_dispatch_batchbuffer(struct drm_device * dev,
485                                      drm_i915_batchbuffer_t * batch)
486 {
487         drm_i915_private_t *dev_priv = dev->dev_private;
488         struct drm_clip_rect __user *boxes = batch->cliprects;
489         int nbox = batch->num_cliprects;
490         int i = 0, count;
491         RING_LOCALS;
492
493         if ((batch->start | batch->used) & 0x7) {
494                 DRM_ERROR("alignment\n");
495                 return -EINVAL;
496         }
497
498         i915_kernel_lost_context(dev);
499
500         count = nbox ? nbox : 1;
501
502         for (i = 0; i < count; i++) {
503                 if (i < nbox) {
504                         int ret = i915_emit_box(dev, boxes, i,
505                                                 batch->DR1, batch->DR4);
506                         if (ret)
507                                 return ret;
508                 }
509
510                 if (!IS_I830(dev) && !IS_845G(dev)) {
511                         BEGIN_LP_RING(2);
512                         if (IS_I965G(dev)) {
513                                 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6) | MI_BATCH_NON_SECURE_I965);
514                                 OUT_RING(batch->start);
515                         } else {
516                                 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6));
517                                 OUT_RING(batch->start | MI_BATCH_NON_SECURE);
518                         }
519                         ADVANCE_LP_RING();
520                 } else {
521                         BEGIN_LP_RING(4);
522                         OUT_RING(MI_BATCH_BUFFER);
523                         OUT_RING(batch->start | MI_BATCH_NON_SECURE);
524                         OUT_RING(batch->start + batch->used - 4);
525                         OUT_RING(0);
526                         ADVANCE_LP_RING();
527                 }
528         }
529
530         i915_emit_breadcrumb(dev);
531
532         return 0;
533 }
534
535 static int i915_dispatch_flip(struct drm_device * dev)
536 {
537         drm_i915_private_t *dev_priv = dev->dev_private;
538         RING_LOCALS;
539
540         if (!dev_priv->sarea_priv)
541                 return -EINVAL;
542
543         DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n",
544                   __func__,
545                   dev_priv->current_page,
546                   dev_priv->sarea_priv->pf_current_page);
547
548         i915_kernel_lost_context(dev);
549
550         BEGIN_LP_RING(2);
551         OUT_RING(MI_FLUSH | MI_READ_FLUSH);
552         OUT_RING(0);
553         ADVANCE_LP_RING();
554
555         BEGIN_LP_RING(6);
556         OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP);
557         OUT_RING(0);
558         if (dev_priv->current_page == 0) {
559                 OUT_RING(dev_priv->back_offset);
560                 dev_priv->current_page = 1;
561         } else {
562                 OUT_RING(dev_priv->front_offset);
563                 dev_priv->current_page = 0;
564         }
565         OUT_RING(0);
566         ADVANCE_LP_RING();
567
568         BEGIN_LP_RING(2);
569         OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP);
570         OUT_RING(0);
571         ADVANCE_LP_RING();
572
573         if (++dev_priv->counter > 0x7FFFFFFFUL)
574                 dev_priv->counter = 0;
575         if (dev_priv->sarea_priv)
576                 dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
577
578         BEGIN_LP_RING(4);
579         OUT_RING(MI_STORE_DWORD_INDEX);
580         OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
581         OUT_RING(dev_priv->counter);
582         OUT_RING(0);
583         ADVANCE_LP_RING();
584
585         dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
586         return 0;
587 }
588
589 static int i915_quiescent(struct drm_device * dev)
590 {
591         drm_i915_private_t *dev_priv = dev->dev_private;
592
593         i915_kernel_lost_context(dev);
594         return i915_wait_ring(dev, dev_priv->ring.Size - 8, __func__);
595 }
596
597 static int i915_flush_ioctl(struct drm_device *dev, void *data,
598                             struct drm_file *file_priv)
599 {
600         int ret;
601
602         RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
603
604         ret = i915_quiescent(dev);
605
606         return ret;
607 }
608
609 static int i915_batchbuffer(struct drm_device *dev, void *data,
610                             struct drm_file *file_priv)
611 {
612         drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
613         drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
614             dev_priv->sarea_priv;
615         drm_i915_batchbuffer_t *batch = data;
616         size_t cliplen;
617         int ret;
618
619         if (!dev_priv->allow_batchbuffer) {
620                 DRM_ERROR("Batchbuffer ioctl disabled\n");
621                 return -EINVAL;
622         }
623
624         DRM_DEBUG("i915 batchbuffer, start %x used %d cliprects %d\n",
625                   batch->start, batch->used, batch->num_cliprects);
626
627         RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
628
629         DRM_UNLOCK();
630         cliplen = batch->num_cliprects * sizeof(struct drm_clip_rect);
631         if (batch->num_cliprects && DRM_VERIFYAREA_READ(batch->cliprects,
632             cliplen)) {
633                 DRM_LOCK();
634                 return -EFAULT;
635         }
636         if (batch->num_cliprects) {
637                 vslock((caddr_t)batch->cliprects, cliplen);
638         }
639
640         ret = i915_dispatch_batchbuffer(dev, batch);
641
642         if (batch->num_cliprects)
643                 vsunlock((caddr_t)batch->cliprects, cliplen);
644
645         if (sarea_priv)
646                 sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
647
648         DRM_LOCK();
649         return ret;
650 }
651
652 static int i915_cmdbuffer(struct drm_device *dev, void *data,
653                           struct drm_file *file_priv)
654 {
655         drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
656         drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
657             dev_priv->sarea_priv;
658         drm_i915_cmdbuffer_t *cmdbuf = data;
659         size_t cliplen;
660         int ret;
661
662         DRM_DEBUG("i915 cmdbuffer, buf %p sz %d cliprects %d\n",
663                   cmdbuf->buf, cmdbuf->sz, cmdbuf->num_cliprects);
664
665         RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
666
667         DRM_UNLOCK();
668         cliplen = cmdbuf->num_cliprects * sizeof(struct drm_clip_rect);
669         if (cmdbuf->num_cliprects && DRM_VERIFYAREA_READ(cmdbuf->cliprects,
670             cliplen)) {
671                 DRM_ERROR("Fault accessing cliprects\n");
672                 DRM_LOCK();
673                 return -EFAULT;
674         }
675         if (cmdbuf->num_cliprects) {
676                 vslock((caddr_t)cmdbuf->cliprects, cliplen);
677                 vslock((caddr_t)cmdbuf->buf, cmdbuf->sz);
678         }
679
680         ret = i915_dispatch_cmdbuffer(dev, cmdbuf);
681
682         if (cmdbuf->num_cliprects) {
683                 vsunlock((caddr_t)cmdbuf->buf, cmdbuf->sz);
684                 vsunlock((caddr_t)cmdbuf->cliprects, cliplen);
685         }
686         DRM_LOCK();
687         if (ret) {
688                 DRM_ERROR("i915_dispatch_cmdbuffer failed\n");
689                 return ret;
690         }
691
692         if (sarea_priv)
693                 sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
694         return 0;
695 }
696
697 static int i915_flip_bufs(struct drm_device *dev, void *data,
698                           struct drm_file *file_priv)
699 {
700         int ret;
701
702         DRM_DEBUG("%s\n", __func__);
703
704         RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
705
706         ret = i915_dispatch_flip(dev);
707
708         return ret;
709 }
710
711 static int i915_getparam(struct drm_device *dev, void *data,
712                          struct drm_file *file_priv)
713 {
714         drm_i915_private_t *dev_priv = dev->dev_private;
715         drm_i915_getparam_t *param = data;
716         int value;
717
718         if (!dev_priv) {
719                 DRM_ERROR("called with no initialization\n");
720                 return -EINVAL;
721         }
722
723         switch (param->param) {
724         case I915_PARAM_IRQ_ACTIVE:
725                 value = dev->irq_enabled ? 1 : 0;
726                 break;
727         case I915_PARAM_ALLOW_BATCHBUFFER:
728                 value = dev_priv->allow_batchbuffer ? 1 : 0;
729                 break;
730         case I915_PARAM_LAST_DISPATCH:
731                 value = READ_BREADCRUMB(dev_priv);
732                 break;
733         case I915_PARAM_CHIPSET_ID:
734                 value = dev->pci_device;
735                 break;
736         case I915_PARAM_HAS_GEM:
737                 /* We need to reset this to 1 once we have GEM */
738                 value = 0;
739                 break;
740         default:
741                 DRM_DEBUG("Unknown parameter %d\n", param->param);
742                 return -EINVAL;
743         }
744
745         if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) {
746                 DRM_ERROR("DRM_COPY_TO_USER failed\n");
747                 return -EFAULT;
748         }
749
750         return 0;
751 }
752
753 static int i915_setparam(struct drm_device *dev, void *data,
754                          struct drm_file *file_priv)
755 {
756         drm_i915_private_t *dev_priv = dev->dev_private;
757         drm_i915_setparam_t *param = data;
758
759         if (!dev_priv) {
760                 DRM_ERROR("called with no initialization\n");
761                 return -EINVAL;
762         }
763
764         switch (param->param) {
765         case I915_SETPARAM_USE_MI_BATCHBUFFER_START:
766                 break;
767         case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY:
768                 dev_priv->tex_lru_log_granularity = param->value;
769                 break;
770         case I915_SETPARAM_ALLOW_BATCHBUFFER:
771                 dev_priv->allow_batchbuffer = param->value;
772                 break;
773         default:
774                 DRM_DEBUG("unknown parameter %d\n", param->param);
775                 return -EINVAL;
776         }
777
778         return 0;
779 }
780
781 static int i915_set_status_page(struct drm_device *dev, void *data,
782                                 struct drm_file *file_priv)
783 {
784         drm_i915_private_t *dev_priv = dev->dev_private;
785         drm_i915_hws_addr_t *hws = data;
786
787         if (!I915_NEED_GFX_HWS(dev))
788                 return -EINVAL;
789
790         if (!dev_priv) {
791                 DRM_ERROR("called with no initialization\n");
792                 return -EINVAL;
793         }
794
795         DRM_DEBUG("set status page addr 0x%08x\n", (u32)hws->addr);
796
797         dev_priv->status_gfx_addr = hws->addr & (0x1ffff<<12);
798
799         dev_priv->hws_map.offset = dev->agp->base + hws->addr;
800         dev_priv->hws_map.size = 4*1024;
801         dev_priv->hws_map.type = 0;
802         dev_priv->hws_map.flags = 0;
803         dev_priv->hws_map.mtrr = 0;
804
805         drm_core_ioremap_wc(&dev_priv->hws_map, dev);
806         if (dev_priv->hws_map.handle == NULL) {
807                 i915_dma_cleanup(dev);
808                 dev_priv->status_gfx_addr = 0;
809                 DRM_ERROR("can not ioremap virtual address for"
810                                 " G33 hw status page\n");
811                 return -ENOMEM;
812         }
813         dev_priv->hw_status_page = dev_priv->hws_map.handle;
814
815         memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
816         I915_WRITE(HWS_PGA, dev_priv->status_gfx_addr);
817         DRM_DEBUG("load hws HWS_PGA with gfx mem 0x%x\n",
818                         dev_priv->status_gfx_addr);
819         DRM_DEBUG("load hws at %p\n", dev_priv->hw_status_page);
820         return 0;
821 }
822
823 int i915_driver_load(struct drm_device *dev, unsigned long flags)
824 {
825         struct drm_i915_private *dev_priv = dev->dev_private;
826         unsigned long base, size;
827         int ret = 0, mmio_bar = IS_I9XX(dev) ? 0 : 1;
828
829         /* i915 has 4 more counters */
830         dev->counters += 4;
831         dev->types[6] = _DRM_STAT_IRQ;
832         dev->types[7] = _DRM_STAT_PRIMARY;
833         dev->types[8] = _DRM_STAT_SECONDARY;
834         dev->types[9] = _DRM_STAT_DMA;
835
836         dev_priv = drm_alloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER);
837         if (dev_priv == NULL)
838                 return -ENOMEM;
839
840         memset(dev_priv, 0, sizeof(drm_i915_private_t));
841
842         dev->dev_private = (void *)dev_priv;
843         dev_priv->dev = dev;
844
845         /* Add register map (needed for suspend/resume) */
846         base = drm_get_resource_start(dev, mmio_bar);
847         size = drm_get_resource_len(dev, mmio_bar);
848
849         ret = drm_addmap(dev, base, size, _DRM_REGISTERS,
850             _DRM_KERNEL | _DRM_DRIVER, &dev_priv->mmio_map);
851
852         if (IS_G4X(dev)) {
853                 dev->driver->get_vblank_counter = g45_get_vblank_counter;
854                 dev->max_vblank_count = 0xffffffff; /* 32 bits of frame count */
855         } else {
856                 dev->driver->get_vblank_counter = i915_get_vblank_counter;
857                 dev->max_vblank_count = 0x00ffffff; /* 24 bits of frame count */
858         }
859
860 #ifdef I915_HAVE_GEM
861         i915_gem_load(dev);
862 #endif
863         /* Init HWS */
864         if (!I915_NEED_GFX_HWS(dev)) {
865                 ret = i915_init_phys_hws(dev);
866                 if (ret != 0) {
867                         drm_rmmap(dev, dev_priv->mmio_map);
868                         drm_free(dev_priv, sizeof(struct drm_i915_private),
869                             DRM_MEM_DRIVER);
870                         return ret;
871                 }
872         }
873 #ifdef __linux__
874         /* On the 945G/GM, the chipset reports the MSI capability on the
875          * integrated graphics even though the support isn't actually there
876          * according to the published specs.  It doesn't appear to function
877          * correctly in testing on 945G.
878          * This may be a side effect of MSI having been made available for PEG
879          * and the registers being closely associated.
880          *
881          * According to chipset errata, on the 965GM, MSI interrupts may
882          * be lost or delayed
883          */
884         if (!IS_I945G(dev) && !IS_I945GM(dev) && !IS_I965GM(dev))
885                 if (pci_enable_msi(dev->pdev))
886                         DRM_ERROR("failed to enable MSI\n");
887
888         intel_opregion_init(dev);
889 #endif
890         DRM_SPININIT(&dev_priv->user_irq_lock, "userirq");
891         dev_priv->user_irq_refcount = 0;
892
893         ret = drm_vblank_init(dev, I915_NUM_PIPE);
894
895         if (ret) {
896                 (void) i915_driver_unload(dev);
897                 return ret;
898         }
899
900         return ret;
901 }
902
903 int i915_driver_unload(struct drm_device *dev)
904 {
905         struct drm_i915_private *dev_priv = dev->dev_private;
906
907         i915_free_hws(dev);
908
909         drm_rmmap(dev, dev_priv->mmio_map);
910 #ifdef __linux__
911         intel_opregion_free(dev);
912 #endif
913         DRM_SPINUNINIT(&dev_priv->user_irq_lock);
914
915         drm_free(dev->dev_private, sizeof(drm_i915_private_t),
916                  DRM_MEM_DRIVER);
917
918         return 0;
919 }
920
921 int i915_driver_open(struct drm_device *dev, struct drm_file *file_priv)
922 {
923         struct drm_i915_file_private *i915_file_priv;
924
925         DRM_DEBUG("\n");
926         i915_file_priv = (struct drm_i915_file_private *)
927             drm_alloc(sizeof(*i915_file_priv), DRM_MEM_FILES);
928
929         if (!i915_file_priv)
930                 return -ENOMEM;
931
932         file_priv->driver_priv = i915_file_priv;
933
934         i915_file_priv->mm.last_gem_seqno = 0;
935         i915_file_priv->mm.last_gem_throttle_seqno = 0;
936
937         return 0;
938 }
939
940 void i915_driver_lastclose(struct drm_device * dev)
941 {
942         drm_i915_private_t *dev_priv = dev->dev_private;
943
944         if (!dev_priv)
945                 return;
946 #ifdef I915_HAVE_GEM
947         i915_gem_lastclose(dev);
948 #endif
949         if (dev_priv->agp_heap)
950                 i915_mem_takedown(&(dev_priv->agp_heap));
951
952         i915_dma_cleanup(dev);
953 }
954
955 void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
956 {
957         drm_i915_private_t *dev_priv = dev->dev_private;
958         i915_mem_release(dev, file_priv, dev_priv->agp_heap);
959 }
960
961 void i915_driver_postclose(struct drm_device *dev, struct drm_file *file_priv)
962 {
963         struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv;
964
965         drm_free(i915_file_priv, sizeof(*i915_file_priv), DRM_MEM_FILES);
966 }
967
968 struct drm_ioctl_desc i915_ioctls[] = {
969         DRM_IOCTL_DEF(DRM_I915_INIT, i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
970         DRM_IOCTL_DEF(DRM_I915_FLUSH, i915_flush_ioctl, DRM_AUTH),
971         DRM_IOCTL_DEF(DRM_I915_FLIP, i915_flip_bufs, DRM_AUTH),
972         DRM_IOCTL_DEF(DRM_I915_BATCHBUFFER, i915_batchbuffer, DRM_AUTH),
973         DRM_IOCTL_DEF(DRM_I915_IRQ_EMIT, i915_irq_emit, DRM_AUTH),
974         DRM_IOCTL_DEF(DRM_I915_IRQ_WAIT, i915_irq_wait, DRM_AUTH),
975         DRM_IOCTL_DEF(DRM_I915_GETPARAM, i915_getparam, DRM_AUTH),
976         DRM_IOCTL_DEF(DRM_I915_SETPARAM, i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
977         DRM_IOCTL_DEF(DRM_I915_ALLOC, i915_mem_alloc, DRM_AUTH),
978         DRM_IOCTL_DEF(DRM_I915_FREE, i915_mem_free, DRM_AUTH),
979         DRM_IOCTL_DEF(DRM_I915_INIT_HEAP, i915_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
980         DRM_IOCTL_DEF(DRM_I915_CMDBUFFER, i915_cmdbuffer, DRM_AUTH),
981         DRM_IOCTL_DEF(DRM_I915_DESTROY_HEAP,  i915_mem_destroy_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
982         DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE,  i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
983         DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE,  i915_vblank_pipe_get, DRM_AUTH ),
984         DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
985         DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
986 #ifdef I915_HAVE_GEM
987         DRM_IOCTL_DEF(DRM_I915_GEM_INIT, i915_gem_init_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
988         DRM_IOCTL_DEF(DRM_I915_GEM_EXECBUFFER, i915_gem_execbuffer, DRM_AUTH),
989         DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY),
990         DRM_IOCTL_DEF(DRM_I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY),
991         DRM_IOCTL_DEF(DRM_I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH),
992         DRM_IOCTL_DEF(DRM_I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH),
993         DRM_IOCTL_DEF(DRM_I915_GEM_ENTERVT, i915_gem_entervt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
994         DRM_IOCTL_DEF(DRM_I915_GEM_LEAVEVT, i915_gem_leavevt_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
995         DRM_IOCTL_DEF(DRM_I915_GEM_CREATE, i915_gem_create_ioctl, 0),
996         DRM_IOCTL_DEF(DRM_I915_GEM_PREAD, i915_gem_pread_ioctl, 0),
997         DRM_IOCTL_DEF(DRM_I915_GEM_PWRITE, i915_gem_pwrite_ioctl, 0),
998         DRM_IOCTL_DEF(DRM_I915_GEM_MMAP, i915_gem_mmap_ioctl, 0),
999         DRM_IOCTL_DEF(DRM_I915_GEM_SET_DOMAIN, i915_gem_set_domain_ioctl, 0),
1000         DRM_IOCTL_DEF(DRM_I915_GEM_SW_FINISH, i915_gem_sw_finish_ioctl, 0),
1001         DRM_IOCTL_DEF(DRM_I915_GEM_SET_TILING, i915_gem_set_tiling, 0),
1002         DRM_IOCTL_DEF(DRM_I915_GEM_GET_TILING, i915_gem_get_tiling, 0),
1003 #endif
1004 };
1005
1006 int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
1007
1008 /**
1009  * Determine if the device really is AGP or not.
1010  *
1011  * All Intel graphics chipsets are treated as AGP, even if they are really
1012  * PCI-e.
1013  *
1014  * \param dev   The device to be tested.
1015  *
1016  * \returns
1017  * A value of 1 is always retured to indictate every i9x5 is AGP.
1018  */
1019 int i915_driver_device_is_agp(struct drm_device * dev)
1020 {
1021         return 1;
1022 }