1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include "drmP.h"
31#include "drm.h"
32#include "i915_drv.h"
33#include "i915_drm.h"
34#include "i915_trace.h"
35#include "intel_drv.h"
36
37
38
39
40
41struct pipe_control {
42 struct drm_i915_gem_object *obj;
43 volatile u32 *cpu_page;
44 u32 gtt_offset;
45};
46
47static inline int ring_space(struct intel_ring_buffer *ring)
48{
49 int space = (ring->head & HEAD_ADDR) - (ring->tail + 8);
50 if (space < 0)
51 space += ring->size;
52 return space;
53}
54
55static u32 i915_gem_get_seqno(struct drm_device *dev)
56{
57 drm_i915_private_t *dev_priv = dev->dev_private;
58 u32 seqno;
59
60 seqno = dev_priv->next_seqno;
61
62
63 if (++dev_priv->next_seqno == 0)
64 dev_priv->next_seqno = 1;
65
66 return seqno;
67}
68
69static int
70render_ring_flush(struct intel_ring_buffer *ring,
71 u32 invalidate_domains,
72 u32 flush_domains)
73{
74 struct drm_device *dev = ring->dev;
75 u32 cmd;
76 int ret;
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
107 if ((invalidate_domains|flush_domains) &
108 I915_GEM_DOMAIN_RENDER)
109 cmd &= ~MI_NO_WRITE_FLUSH;
110 if (INTEL_INFO(dev)->gen < 4) {
111
112
113
114
115 if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
116 cmd |= MI_READ_FLUSH;
117 }
118 if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
119 cmd |= MI_EXE_FLUSH;
120
121 if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
122 (IS_G4X(dev) || IS_GEN5(dev)))
123 cmd |= MI_INVALIDATE_ISP;
124
125 ret = intel_ring_begin(ring, 2);
126 if (ret)
127 return ret;
128
129 intel_ring_emit(ring, cmd);
130 intel_ring_emit(ring, MI_NOOP);
131 intel_ring_advance(ring);
132
133 return 0;
134}
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173static int
174intel_emit_post_sync_nonzero_flush(struct intel_ring_buffer *ring)
175{
176 struct pipe_control *pc = ring->private;
177 u32 scratch_addr = pc->gtt_offset + 128;
178 int ret;
179
180
181 ret = intel_ring_begin(ring, 6);
182 if (ret)
183 return ret;
184
185 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
186 intel_ring_emit(ring, PIPE_CONTROL_CS_STALL |
187 PIPE_CONTROL_STALL_AT_SCOREBOARD);
188 intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
189 intel_ring_emit(ring, 0);
190 intel_ring_emit(ring, 0);
191 intel_ring_emit(ring, MI_NOOP);
192 intel_ring_advance(ring);
193
194 ret = intel_ring_begin(ring, 6);
195 if (ret)
196 return ret;
197
198 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
199 intel_ring_emit(ring, PIPE_CONTROL_QW_WRITE);
200 intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
201 intel_ring_emit(ring, 0);
202 intel_ring_emit(ring, 0);
203 intel_ring_emit(ring, MI_NOOP);
204 intel_ring_advance(ring);
205
206 return 0;
207}
208
209static int
210gen6_render_ring_flush(struct intel_ring_buffer *ring,
211 u32 invalidate_domains, u32 flush_domains)
212{
213 u32 flags = 0;
214 struct pipe_control *pc = ring->private;
215 u32 scratch_addr = pc->gtt_offset + 128;
216 int ret;
217
218
219 intel_emit_post_sync_nonzero_flush(ring);
220
221
222
223
224
225 flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
226 flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
227 flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
228 flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
229 flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
230 flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
231 flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
232
233 ret = intel_ring_begin(ring, 6);
234 if (ret)
235 return ret;
236
237 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
238 intel_ring_emit(ring, flags);
239 intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
240 intel_ring_emit(ring, 0);
241 intel_ring_emit(ring, 0);
242 intel_ring_emit(ring, MI_NOOP);
243 intel_ring_advance(ring);
244
245 return 0;
246}
247
248static void ring_write_tail(struct intel_ring_buffer *ring,
249 u32 value)
250{
251 drm_i915_private_t *dev_priv = ring->dev->dev_private;
252 I915_WRITE_TAIL(ring, value);
253}
254
255u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
256{
257 drm_i915_private_t *dev_priv = ring->dev->dev_private;
258 u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
259 RING_ACTHD(ring->mmio_base) : ACTHD;
260
261 return I915_READ(acthd_reg);
262}
263
264static int init_ring_common(struct intel_ring_buffer *ring)
265{
266 drm_i915_private_t *dev_priv = ring->dev->dev_private;
267 struct drm_i915_gem_object *obj = ring->obj;
268 u32 head;
269
270
271 I915_WRITE_CTL(ring, 0);
272 I915_WRITE_HEAD(ring, 0);
273 ring->write_tail(ring, 0);
274
275
276 I915_WRITE_START(ring, obj->gtt_offset);
277 head = I915_READ_HEAD(ring) & HEAD_ADDR;
278
279
280 if (head != 0) {
281 DRM_DEBUG_KMS("%s head not reset to zero "
282 "ctl %08x head %08x tail %08x start %08x\n",
283 ring->name,
284 I915_READ_CTL(ring),
285 I915_READ_HEAD(ring),
286 I915_READ_TAIL(ring),
287 I915_READ_START(ring));
288
289 I915_WRITE_HEAD(ring, 0);
290
291 if (I915_READ_HEAD(ring) & HEAD_ADDR) {
292 DRM_ERROR("failed to set %s head to zero "
293 "ctl %08x head %08x tail %08x start %08x\n",
294 ring->name,
295 I915_READ_CTL(ring),
296 I915_READ_HEAD(ring),
297 I915_READ_TAIL(ring),
298 I915_READ_START(ring));
299 }
300 }
301
302 I915_WRITE_CTL(ring,
303 ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
304 | RING_REPORT_64K | RING_VALID);
305
306
307 if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
308 I915_READ_START(ring) != obj->gtt_offset ||
309 (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
310 DRM_ERROR("%s initialization failed "
311 "ctl %08x head %08x tail %08x start %08x\n",
312 ring->name,
313 I915_READ_CTL(ring),
314 I915_READ_HEAD(ring),
315 I915_READ_TAIL(ring),
316 I915_READ_START(ring));
317 return -EIO;
318 }
319
320 if (!drm_core_check_feature(ring->dev, DRIVER_MODESET))
321 i915_kernel_lost_context(ring->dev);
322 else {
323 ring->head = I915_READ_HEAD(ring);
324 ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
325 ring->space = ring_space(ring);
326 }
327
328 return 0;
329}
330
331static int
332init_pipe_control(struct intel_ring_buffer *ring)
333{
334 struct pipe_control *pc;
335 struct drm_i915_gem_object *obj;
336 int ret;
337
338 if (ring->private)
339 return 0;
340
341 pc = kmalloc(sizeof(*pc), GFP_KERNEL);
342 if (!pc)
343 return -ENOMEM;
344
345 obj = i915_gem_alloc_object(ring->dev, 4096);
346 if (obj == NULL) {
347 DRM_ERROR("Failed to allocate seqno page\n");
348 ret = -ENOMEM;
349 goto err;
350 }
351
352 i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
353
354 ret = i915_gem_object_pin(obj, 4096, true);
355 if (ret)
356 goto err_unref;
357
358 pc->gtt_offset = obj->gtt_offset;
359 pc->cpu_page = kmap(obj->pages[0]);
360 if (pc->cpu_page == NULL)
361 goto err_unpin;
362
363 pc->obj = obj;
364 ring->private = pc;
365 return 0;
366
367err_unpin:
368 i915_gem_object_unpin(obj);
369err_unref:
370 drm_gem_object_unreference(&obj->base);
371err:
372 kfree(pc);
373 return ret;
374}
375
376static void
377cleanup_pipe_control(struct intel_ring_buffer *ring)
378{
379 struct pipe_control *pc = ring->private;
380 struct drm_i915_gem_object *obj;
381
382 if (!ring->private)
383 return;
384
385 obj = pc->obj;
386 kunmap(obj->pages[0]);
387 i915_gem_object_unpin(obj);
388 drm_gem_object_unreference(&obj->base);
389
390 kfree(pc);
391 ring->private = NULL;
392}
393
394static int init_render_ring(struct intel_ring_buffer *ring)
395{
396 struct drm_device *dev = ring->dev;
397 struct drm_i915_private *dev_priv = dev->dev_private;
398 int ret = init_ring_common(ring);
399
400 if (INTEL_INFO(dev)->gen > 3) {
401 int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
402 if (IS_GEN6(dev) || IS_GEN7(dev))
403 mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
404 I915_WRITE(MI_MODE, mode);
405 if (IS_GEN7(dev))
406 I915_WRITE(GFX_MODE_GEN7,
407 GFX_MODE_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
408 GFX_MODE_ENABLE(GFX_REPLAY_MODE));
409 }
410
411 if (INTEL_INFO(dev)->gen >= 5) {
412 ret = init_pipe_control(ring);
413 if (ret)
414 return ret;
415 }
416
417 return ret;
418}
419
420static void render_ring_cleanup(struct intel_ring_buffer *ring)
421{
422 if (!ring->private)
423 return;
424
425 cleanup_pipe_control(ring);
426}
427
428static void
429update_mboxes(struct intel_ring_buffer *ring,
430 u32 seqno,
431 u32 mmio_offset)
432{
433 intel_ring_emit(ring, MI_SEMAPHORE_MBOX |
434 MI_SEMAPHORE_GLOBAL_GTT |
435 MI_SEMAPHORE_REGISTER |
436 MI_SEMAPHORE_UPDATE);
437 intel_ring_emit(ring, seqno);
438 intel_ring_emit(ring, mmio_offset);
439}
440
441
442
443
444
445
446
447
448
449
450static int
451gen6_add_request(struct intel_ring_buffer *ring,
452 u32 *seqno)
453{
454 u32 mbox1_reg;
455 u32 mbox2_reg;
456 int ret;
457
458 ret = intel_ring_begin(ring, 10);
459 if (ret)
460 return ret;
461
462 mbox1_reg = ring->signal_mbox[0];
463 mbox2_reg = ring->signal_mbox[1];
464
465 *seqno = i915_gem_get_seqno(ring->dev);
466
467 update_mboxes(ring, *seqno, mbox1_reg);
468 update_mboxes(ring, *seqno, mbox2_reg);
469 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
470 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
471 intel_ring_emit(ring, *seqno);
472 intel_ring_emit(ring, MI_USER_INTERRUPT);
473 intel_ring_advance(ring);
474
475 return 0;
476}
477
478
479
480
481
482
483
484
485static int
486intel_ring_sync(struct intel_ring_buffer *waiter,
487 struct intel_ring_buffer *signaller,
488 int ring,
489 u32 seqno)
490{
491 int ret;
492 u32 dw1 = MI_SEMAPHORE_MBOX |
493 MI_SEMAPHORE_COMPARE |
494 MI_SEMAPHORE_REGISTER;
495
496 ret = intel_ring_begin(waiter, 4);
497 if (ret)
498 return ret;
499
500 intel_ring_emit(waiter, dw1 | signaller->semaphore_register[ring]);
501 intel_ring_emit(waiter, seqno);
502 intel_ring_emit(waiter, 0);
503 intel_ring_emit(waiter, MI_NOOP);
504 intel_ring_advance(waiter);
505
506 return 0;
507}
508
509
510int
511render_ring_sync_to(struct intel_ring_buffer *waiter,
512 struct intel_ring_buffer *signaller,
513 u32 seqno)
514{
515 WARN_ON(signaller->semaphore_register[RCS] == MI_SEMAPHORE_SYNC_INVALID);
516 return intel_ring_sync(waiter,
517 signaller,
518 RCS,
519 seqno);
520}
521
522
523int
524gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter,
525 struct intel_ring_buffer *signaller,
526 u32 seqno)
527{
528 WARN_ON(signaller->semaphore_register[VCS] == MI_SEMAPHORE_SYNC_INVALID);
529 return intel_ring_sync(waiter,
530 signaller,
531 VCS,
532 seqno);
533}
534
535
536int
537gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter,
538 struct intel_ring_buffer *signaller,
539 u32 seqno)
540{
541 WARN_ON(signaller->semaphore_register[BCS] == MI_SEMAPHORE_SYNC_INVALID);
542 return intel_ring_sync(waiter,
543 signaller,
544 BCS,
545 seqno);
546}
547
548
549
550#define PIPE_CONTROL_FLUSH(ring__, addr__) \
551do { \
552 intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE | \
553 PIPE_CONTROL_DEPTH_STALL); \
554 intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT); \
555 intel_ring_emit(ring__, 0); \
556 intel_ring_emit(ring__, 0); \
557} while (0)
558
559static int
560pc_render_add_request(struct intel_ring_buffer *ring,
561 u32 *result)
562{
563 struct drm_device *dev = ring->dev;
564 u32 seqno = i915_gem_get_seqno(dev);
565 struct pipe_control *pc = ring->private;
566 u32 scratch_addr = pc->gtt_offset + 128;
567 int ret;
568
569
570
571
572
573
574
575
576
577 ret = intel_ring_begin(ring, 32);
578 if (ret)
579 return ret;
580
581 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
582 PIPE_CONTROL_WRITE_FLUSH |
583 PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);
584 intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
585 intel_ring_emit(ring, seqno);
586 intel_ring_emit(ring, 0);
587 PIPE_CONTROL_FLUSH(ring, scratch_addr);
588 scratch_addr += 128;
589 PIPE_CONTROL_FLUSH(ring, scratch_addr);
590 scratch_addr += 128;
591 PIPE_CONTROL_FLUSH(ring, scratch_addr);
592 scratch_addr += 128;
593 PIPE_CONTROL_FLUSH(ring, scratch_addr);
594 scratch_addr += 128;
595 PIPE_CONTROL_FLUSH(ring, scratch_addr);
596 scratch_addr += 128;
597 PIPE_CONTROL_FLUSH(ring, scratch_addr);
598 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
599 PIPE_CONTROL_WRITE_FLUSH |
600 PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
601 PIPE_CONTROL_NOTIFY);
602 intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
603 intel_ring_emit(ring, seqno);
604 intel_ring_emit(ring, 0);
605 intel_ring_advance(ring);
606
607 *result = seqno;
608 return 0;
609}
610
611static int
612render_ring_add_request(struct intel_ring_buffer *ring,
613 u32 *result)
614{
615 struct drm_device *dev = ring->dev;
616 u32 seqno = i915_gem_get_seqno(dev);
617 int ret;
618
619 ret = intel_ring_begin(ring, 4);
620 if (ret)
621 return ret;
622
623 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
624 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
625 intel_ring_emit(ring, seqno);
626 intel_ring_emit(ring, MI_USER_INTERRUPT);
627 intel_ring_advance(ring);
628
629 *result = seqno;
630 return 0;
631}
632
633static u32
634gen6_ring_get_seqno(struct intel_ring_buffer *ring)
635{
636 struct drm_device *dev = ring->dev;
637
638
639
640
641 if (IS_GEN7(dev))
642 intel_ring_get_active_head(ring);
643 return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
644}
645
646static u32
647ring_get_seqno(struct intel_ring_buffer *ring)
648{
649 return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
650}
651
652static u32
653pc_render_get_seqno(struct intel_ring_buffer *ring)
654{
655 struct pipe_control *pc = ring->private;
656 return pc->cpu_page[0];
657}
658
659static void
660ironlake_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
661{
662 dev_priv->gt_irq_mask &= ~mask;
663 I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
664 POSTING_READ(GTIMR);
665}
666
667static void
668ironlake_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
669{
670 dev_priv->gt_irq_mask |= mask;
671 I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
672 POSTING_READ(GTIMR);
673}
674
675static void
676i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
677{
678 dev_priv->irq_mask &= ~mask;
679 I915_WRITE(IMR, dev_priv->irq_mask);
680 POSTING_READ(IMR);
681}
682
683static void
684i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
685{
686 dev_priv->irq_mask |= mask;
687 I915_WRITE(IMR, dev_priv->irq_mask);
688 POSTING_READ(IMR);
689}
690
691static bool
692render_ring_get_irq(struct intel_ring_buffer *ring)
693{
694 struct drm_device *dev = ring->dev;
695 drm_i915_private_t *dev_priv = dev->dev_private;
696
697 if (!dev->irq_enabled)
698 return false;
699
700 spin_lock(&ring->irq_lock);
701 if (ring->irq_refcount++ == 0) {
702 if (HAS_PCH_SPLIT(dev))
703 ironlake_enable_irq(dev_priv,
704 GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
705 else
706 i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
707 }
708 spin_unlock(&ring->irq_lock);
709
710 return true;
711}
712
713static void
714render_ring_put_irq(struct intel_ring_buffer *ring)
715{
716 struct drm_device *dev = ring->dev;
717 drm_i915_private_t *dev_priv = dev->dev_private;
718
719 spin_lock(&ring->irq_lock);
720 if (--ring->irq_refcount == 0) {
721 if (HAS_PCH_SPLIT(dev))
722 ironlake_disable_irq(dev_priv,
723 GT_USER_INTERRUPT |
724 GT_PIPE_NOTIFY);
725 else
726 i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
727 }
728 spin_unlock(&ring->irq_lock);
729}
730
731void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
732{
733 struct drm_device *dev = ring->dev;
734 drm_i915_private_t *dev_priv = ring->dev->dev_private;
735 u32 mmio = 0;
736
737
738
739
740 if (IS_GEN7(dev)) {
741 switch (ring->id) {
742 case RING_RENDER:
743 mmio = RENDER_HWS_PGA_GEN7;
744 break;
745 case RING_BLT:
746 mmio = BLT_HWS_PGA_GEN7;
747 break;
748 case RING_BSD:
749 mmio = BSD_HWS_PGA_GEN7;
750 break;
751 }
752 } else if (IS_GEN6(ring->dev)) {
753 mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
754 } else {
755 mmio = RING_HWS_PGA(ring->mmio_base);
756 }
757
758 I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
759 POSTING_READ(mmio);
760}
761
762static int
763bsd_ring_flush(struct intel_ring_buffer *ring,
764 u32 invalidate_domains,
765 u32 flush_domains)
766{
767 int ret;
768
769 ret = intel_ring_begin(ring, 2);
770 if (ret)
771 return ret;
772
773 intel_ring_emit(ring, MI_FLUSH);
774 intel_ring_emit(ring, MI_NOOP);
775 intel_ring_advance(ring);
776 return 0;
777}
778
779static int
780ring_add_request(struct intel_ring_buffer *ring,
781 u32 *result)
782{
783 u32 seqno;
784 int ret;
785
786 ret = intel_ring_begin(ring, 4);
787 if (ret)
788 return ret;
789
790 seqno = i915_gem_get_seqno(ring->dev);
791
792 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
793 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
794 intel_ring_emit(ring, seqno);
795 intel_ring_emit(ring, MI_USER_INTERRUPT);
796 intel_ring_advance(ring);
797
798 *result = seqno;
799 return 0;
800}
801
802static bool
803gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
804{
805 struct drm_device *dev = ring->dev;
806 drm_i915_private_t *dev_priv = dev->dev_private;
807
808 if (!dev->irq_enabled)
809 return false;
810
811
812
813
814 if (IS_GEN7(dev))
815 gen6_gt_force_wake_get(dev_priv);
816
817 spin_lock(&ring->irq_lock);
818 if (ring->irq_refcount++ == 0) {
819 ring->irq_mask &= ~rflag;
820 I915_WRITE_IMR(ring, ring->irq_mask);
821 ironlake_enable_irq(dev_priv, gflag);
822 }
823 spin_unlock(&ring->irq_lock);
824
825 return true;
826}
827
828static void
829gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
830{
831 struct drm_device *dev = ring->dev;
832 drm_i915_private_t *dev_priv = dev->dev_private;
833
834 spin_lock(&ring->irq_lock);
835 if (--ring->irq_refcount == 0) {
836 ring->irq_mask |= rflag;
837 I915_WRITE_IMR(ring, ring->irq_mask);
838 ironlake_disable_irq(dev_priv, gflag);
839 }
840 spin_unlock(&ring->irq_lock);
841
842 if (IS_GEN7(dev))
843 gen6_gt_force_wake_put(dev_priv);
844}
845
846static bool
847bsd_ring_get_irq(struct intel_ring_buffer *ring)
848{
849 struct drm_device *dev = ring->dev;
850 drm_i915_private_t *dev_priv = dev->dev_private;
851
852 if (!dev->irq_enabled)
853 return false;
854
855 spin_lock(&ring->irq_lock);
856 if (ring->irq_refcount++ == 0) {
857 if (IS_G4X(dev))
858 i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
859 else
860 ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
861 }
862 spin_unlock(&ring->irq_lock);
863
864 return true;
865}
866static void
867bsd_ring_put_irq(struct intel_ring_buffer *ring)
868{
869 struct drm_device *dev = ring->dev;
870 drm_i915_private_t *dev_priv = dev->dev_private;
871
872 spin_lock(&ring->irq_lock);
873 if (--ring->irq_refcount == 0) {
874 if (IS_G4X(dev))
875 i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
876 else
877 ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
878 }
879 spin_unlock(&ring->irq_lock);
880}
881
882static int
883ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
884{
885 int ret;
886
887 ret = intel_ring_begin(ring, 2);
888 if (ret)
889 return ret;
890
891 intel_ring_emit(ring,
892 MI_BATCH_BUFFER_START | (2 << 6) |
893 MI_BATCH_NON_SECURE_I965);
894 intel_ring_emit(ring, offset);
895 intel_ring_advance(ring);
896
897 return 0;
898}
899
900static int
901render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
902 u32 offset, u32 len)
903{
904 struct drm_device *dev = ring->dev;
905 int ret;
906
907 if (IS_I830(dev) || IS_845G(dev)) {
908 ret = intel_ring_begin(ring, 4);
909 if (ret)
910 return ret;
911
912 intel_ring_emit(ring, MI_BATCH_BUFFER);
913 intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
914 intel_ring_emit(ring, offset + len - 8);
915 intel_ring_emit(ring, 0);
916 } else {
917 ret = intel_ring_begin(ring, 2);
918 if (ret)
919 return ret;
920
921 if (INTEL_INFO(dev)->gen >= 4) {
922 intel_ring_emit(ring,
923 MI_BATCH_BUFFER_START | (2 << 6) |
924 MI_BATCH_NON_SECURE_I965);
925 intel_ring_emit(ring, offset);
926 } else {
927 intel_ring_emit(ring,
928 MI_BATCH_BUFFER_START | (2 << 6));
929 intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
930 }
931 }
932 intel_ring_advance(ring);
933
934 return 0;
935}
936
937static void cleanup_status_page(struct intel_ring_buffer *ring)
938{
939 drm_i915_private_t *dev_priv = ring->dev->dev_private;
940 struct drm_i915_gem_object *obj;
941
942 obj = ring->status_page.obj;
943 if (obj == NULL)
944 return;
945
946 kunmap(obj->pages[0]);
947 i915_gem_object_unpin(obj);
948 drm_gem_object_unreference(&obj->base);
949 ring->status_page.obj = NULL;
950
951 memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
952}
953
954static int init_status_page(struct intel_ring_buffer *ring)
955{
956 struct drm_device *dev = ring->dev;
957 drm_i915_private_t *dev_priv = dev->dev_private;
958 struct drm_i915_gem_object *obj;
959 int ret;
960
961 obj = i915_gem_alloc_object(dev, 4096);
962 if (obj == NULL) {
963 DRM_ERROR("Failed to allocate status page\n");
964 ret = -ENOMEM;
965 goto err;
966 }
967
968 i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
969
970 ret = i915_gem_object_pin(obj, 4096, true);
971 if (ret != 0) {
972 goto err_unref;
973 }
974
975 ring->status_page.gfx_addr = obj->gtt_offset;
976 ring->status_page.page_addr = kmap(obj->pages[0]);
977 if (ring->status_page.page_addr == NULL) {
978 memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
979 goto err_unpin;
980 }
981 ring->status_page.obj = obj;
982 memset(ring->status_page.page_addr, 0, PAGE_SIZE);
983
984 intel_ring_setup_status_page(ring);
985 DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
986 ring->name, ring->status_page.gfx_addr);
987
988 return 0;
989
990err_unpin:
991 i915_gem_object_unpin(obj);
992err_unref:
993 drm_gem_object_unreference(&obj->base);
994err:
995 return ret;
996}
997
998int intel_init_ring_buffer(struct drm_device *dev,
999 struct intel_ring_buffer *ring)
1000{
1001 struct drm_i915_gem_object *obj;
1002 int ret;
1003
1004 ring->dev = dev;
1005 INIT_LIST_HEAD(&ring->active_list);
1006 INIT_LIST_HEAD(&ring->request_list);
1007 INIT_LIST_HEAD(&ring->gpu_write_list);
1008
1009 init_waitqueue_head(&ring->irq_queue);
1010 spin_lock_init(&ring->irq_lock);
1011 ring->irq_mask = ~0;
1012
1013 if (I915_NEED_GFX_HWS(dev)) {
1014 ret = init_status_page(ring);
1015 if (ret)
1016 return ret;
1017 }
1018
1019 obj = i915_gem_alloc_object(dev, ring->size);
1020 if (obj == NULL) {
1021 DRM_ERROR("Failed to allocate ringbuffer\n");
1022 ret = -ENOMEM;
1023 goto err_hws;
1024 }
1025
1026 ring->obj = obj;
1027
1028 ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
1029 if (ret)
1030 goto err_unref;
1031
1032 ring->map.size = ring->size;
1033 ring->map.offset = dev->agp->base + obj->gtt_offset;
1034 ring->map.type = 0;
1035 ring->map.flags = 0;
1036 ring->map.mtrr = 0;
1037
1038 drm_core_ioremap_wc(&ring->map, dev);
1039 if (ring->map.handle == NULL) {
1040 DRM_ERROR("Failed to map ringbuffer.\n");
1041 ret = -EINVAL;
1042 goto err_unpin;
1043 }
1044
1045 ring->virtual_start = ring->map.handle;
1046 ret = ring->init(ring);
1047 if (ret)
1048 goto err_unmap;
1049
1050
1051
1052
1053
1054 ring->effective_size = ring->size;
1055 if (IS_I830(ring->dev))
1056 ring->effective_size -= 128;
1057
1058 return 0;
1059
1060err_unmap:
1061 drm_core_ioremapfree(&ring->map, dev);
1062err_unpin:
1063 i915_gem_object_unpin(obj);
1064err_unref:
1065 drm_gem_object_unreference(&obj->base);
1066 ring->obj = NULL;
1067err_hws:
1068 cleanup_status_page(ring);
1069 return ret;
1070}
1071
1072void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
1073{
1074 struct drm_i915_private *dev_priv;
1075 int ret;
1076
1077 if (ring->obj == NULL)
1078 return;
1079
1080
1081 dev_priv = ring->dev->dev_private;
1082 ret = intel_wait_ring_idle(ring);
1083 if (ret)
1084 DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
1085 ring->name, ret);
1086
1087 I915_WRITE_CTL(ring, 0);
1088
1089 drm_core_ioremapfree(&ring->map, ring->dev);
1090
1091 i915_gem_object_unpin(ring->obj);
1092 drm_gem_object_unreference(&ring->obj->base);
1093 ring->obj = NULL;
1094
1095 if (ring->cleanup)
1096 ring->cleanup(ring);
1097
1098 cleanup_status_page(ring);
1099}
1100
1101static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
1102{
1103 unsigned int *virt;
1104 int rem = ring->size - ring->tail;
1105
1106 if (ring->space < rem) {
1107 int ret = intel_wait_ring_buffer(ring, rem);
1108 if (ret)
1109 return ret;
1110 }
1111
1112 virt = (unsigned int *)(ring->virtual_start + ring->tail);
1113 rem /= 8;
1114 while (rem--) {
1115 *virt++ = MI_NOOP;
1116 *virt++ = MI_NOOP;
1117 }
1118
1119 ring->tail = 0;
1120 ring->space = ring_space(ring);
1121
1122 return 0;
1123}
1124
1125int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
1126{
1127 struct drm_device *dev = ring->dev;
1128 struct drm_i915_private *dev_priv = dev->dev_private;
1129 unsigned long end;
1130 u32 head;
1131
1132
1133
1134
1135 head = intel_read_status_page(ring, 4);
1136 if (head > ring->head) {
1137 ring->head = head;
1138 ring->space = ring_space(ring);
1139 if (ring->space >= n)
1140 return 0;
1141 }
1142
1143 trace_i915_ring_wait_begin(ring);
1144 end = jiffies + 3 * HZ;
1145 do {
1146 ring->head = I915_READ_HEAD(ring);
1147 ring->space = ring_space(ring);
1148 if (ring->space >= n) {
1149 trace_i915_ring_wait_end(ring);
1150 return 0;
1151 }
1152
1153 if (dev->primary->master) {
1154 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1155 if (master_priv->sarea_priv)
1156 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
1157 }
1158
1159 msleep(1);
1160 if (atomic_read(&dev_priv->mm.wedged))
1161 return -EAGAIN;
1162 } while (!time_after(jiffies, end));
1163 trace_i915_ring_wait_end(ring);
1164 return -EBUSY;
1165}
1166
1167int intel_ring_begin(struct intel_ring_buffer *ring,
1168 int num_dwords)
1169{
1170 struct drm_i915_private *dev_priv = ring->dev->dev_private;
1171 int n = 4*num_dwords;
1172 int ret;
1173
1174 if (unlikely(atomic_read(&dev_priv->mm.wedged)))
1175 return -EIO;
1176
1177 if (unlikely(ring->tail + n > ring->effective_size)) {
1178 ret = intel_wrap_ring_buffer(ring);
1179 if (unlikely(ret))
1180 return ret;
1181 }
1182
1183 if (unlikely(ring->space < n)) {
1184 ret = intel_wait_ring_buffer(ring, n);
1185 if (unlikely(ret))
1186 return ret;
1187 }
1188
1189 ring->space -= n;
1190 return 0;
1191}
1192
1193void intel_ring_advance(struct intel_ring_buffer *ring)
1194{
1195 ring->tail &= ring->size - 1;
1196 ring->write_tail(ring, ring->tail);
1197}
1198
1199static const struct intel_ring_buffer render_ring = {
1200 .name = "render ring",
1201 .id = RING_RENDER,
1202 .mmio_base = RENDER_RING_BASE,
1203 .size = 32 * PAGE_SIZE,
1204 .init = init_render_ring,
1205 .write_tail = ring_write_tail,
1206 .flush = render_ring_flush,
1207 .add_request = render_ring_add_request,
1208 .get_seqno = ring_get_seqno,
1209 .irq_get = render_ring_get_irq,
1210 .irq_put = render_ring_put_irq,
1211 .dispatch_execbuffer = render_ring_dispatch_execbuffer,
1212 .cleanup = render_ring_cleanup,
1213 .sync_to = render_ring_sync_to,
1214 .semaphore_register = {MI_SEMAPHORE_SYNC_INVALID,
1215 MI_SEMAPHORE_SYNC_RV,
1216 MI_SEMAPHORE_SYNC_RB},
1217 .signal_mbox = {GEN6_VRSYNC, GEN6_BRSYNC},
1218};
1219
1220
1221
1222static const struct intel_ring_buffer bsd_ring = {
1223 .name = "bsd ring",
1224 .id = RING_BSD,
1225 .mmio_base = BSD_RING_BASE,
1226 .size = 32 * PAGE_SIZE,
1227 .init = init_ring_common,
1228 .write_tail = ring_write_tail,
1229 .flush = bsd_ring_flush,
1230 .add_request = ring_add_request,
1231 .get_seqno = ring_get_seqno,
1232 .irq_get = bsd_ring_get_irq,
1233 .irq_put = bsd_ring_put_irq,
1234 .dispatch_execbuffer = ring_dispatch_execbuffer,
1235};
1236
1237
1238static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1239 u32 value)
1240{
1241 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1242
1243
1244 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1245 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1246 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
1247 I915_WRITE(GEN6_BSD_RNCID, 0x0);
1248
1249 if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
1250 GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
1251 50))
1252 DRM_ERROR("timed out waiting for IDLE Indicator\n");
1253
1254 I915_WRITE_TAIL(ring, value);
1255 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1256 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1257 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1258}
1259
1260static int gen6_ring_flush(struct intel_ring_buffer *ring,
1261 u32 invalidate, u32 flush)
1262{
1263 uint32_t cmd;
1264 int ret;
1265
1266 ret = intel_ring_begin(ring, 4);
1267 if (ret)
1268 return ret;
1269
1270 cmd = MI_FLUSH_DW;
1271 if (invalidate & I915_GEM_GPU_DOMAINS)
1272 cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
1273 intel_ring_emit(ring, cmd);
1274 intel_ring_emit(ring, 0);
1275 intel_ring_emit(ring, 0);
1276 intel_ring_emit(ring, MI_NOOP);
1277 intel_ring_advance(ring);
1278 return 0;
1279}
1280
1281static int
1282gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
1283 u32 offset, u32 len)
1284{
1285 int ret;
1286
1287 ret = intel_ring_begin(ring, 2);
1288 if (ret)
1289 return ret;
1290
1291 intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
1292
1293 intel_ring_emit(ring, offset);
1294 intel_ring_advance(ring);
1295
1296 return 0;
1297}
1298
1299static bool
1300gen6_render_ring_get_irq(struct intel_ring_buffer *ring)
1301{
1302 return gen6_ring_get_irq(ring,
1303 GT_USER_INTERRUPT,
1304 GEN6_RENDER_USER_INTERRUPT);
1305}
1306
1307static void
1308gen6_render_ring_put_irq(struct intel_ring_buffer *ring)
1309{
1310 return gen6_ring_put_irq(ring,
1311 GT_USER_INTERRUPT,
1312 GEN6_RENDER_USER_INTERRUPT);
1313}
1314
1315static bool
1316gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
1317{
1318 return gen6_ring_get_irq(ring,
1319 GT_GEN6_BSD_USER_INTERRUPT,
1320 GEN6_BSD_USER_INTERRUPT);
1321}
1322
1323static void
1324gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
1325{
1326 return gen6_ring_put_irq(ring,
1327 GT_GEN6_BSD_USER_INTERRUPT,
1328 GEN6_BSD_USER_INTERRUPT);
1329}
1330
1331
1332static const struct intel_ring_buffer gen6_bsd_ring = {
1333 .name = "gen6 bsd ring",
1334 .id = RING_BSD,
1335 .mmio_base = GEN6_BSD_RING_BASE,
1336 .size = 32 * PAGE_SIZE,
1337 .init = init_ring_common,
1338 .write_tail = gen6_bsd_ring_write_tail,
1339 .flush = gen6_ring_flush,
1340 .add_request = gen6_add_request,
1341 .get_seqno = gen6_ring_get_seqno,
1342 .irq_get = gen6_bsd_ring_get_irq,
1343 .irq_put = gen6_bsd_ring_put_irq,
1344 .dispatch_execbuffer = gen6_ring_dispatch_execbuffer,
1345 .sync_to = gen6_bsd_ring_sync_to,
1346 .semaphore_register = {MI_SEMAPHORE_SYNC_VR,
1347 MI_SEMAPHORE_SYNC_INVALID,
1348 MI_SEMAPHORE_SYNC_VB},
1349 .signal_mbox = {GEN6_RVSYNC, GEN6_BVSYNC},
1350};
1351
1352
1353
1354static bool
1355blt_ring_get_irq(struct intel_ring_buffer *ring)
1356{
1357 return gen6_ring_get_irq(ring,
1358 GT_BLT_USER_INTERRUPT,
1359 GEN6_BLITTER_USER_INTERRUPT);
1360}
1361
1362static void
1363blt_ring_put_irq(struct intel_ring_buffer *ring)
1364{
1365 gen6_ring_put_irq(ring,
1366 GT_BLT_USER_INTERRUPT,
1367 GEN6_BLITTER_USER_INTERRUPT);
1368}
1369
1370
1371
1372
1373
1374
1375
1376#define NEED_BLT_WORKAROUND(dev) \
1377 (IS_GEN6(dev) && (dev->pdev->revision < 8))
1378
1379static inline struct drm_i915_gem_object *
1380to_blt_workaround(struct intel_ring_buffer *ring)
1381{
1382 return ring->private;
1383}
1384
1385static int blt_ring_init(struct intel_ring_buffer *ring)
1386{
1387 if (NEED_BLT_WORKAROUND(ring->dev)) {
1388 struct drm_i915_gem_object *obj;
1389 u32 *ptr;
1390 int ret;
1391
1392 obj = i915_gem_alloc_object(ring->dev, 4096);
1393 if (obj == NULL)
1394 return -ENOMEM;
1395
1396 ret = i915_gem_object_pin(obj, 4096, true);
1397 if (ret) {
1398 drm_gem_object_unreference(&obj->base);
1399 return ret;
1400 }
1401
1402 ptr = kmap(obj->pages[0]);
1403 *ptr++ = MI_BATCH_BUFFER_END;
1404 *ptr++ = MI_NOOP;
1405 kunmap(obj->pages[0]);
1406
1407 ret = i915_gem_object_set_to_gtt_domain(obj, false);
1408 if (ret) {
1409 i915_gem_object_unpin(obj);
1410 drm_gem_object_unreference(&obj->base);
1411 return ret;
1412 }
1413
1414 ring->private = obj;
1415 }
1416
1417 return init_ring_common(ring);
1418}
1419
1420static int blt_ring_begin(struct intel_ring_buffer *ring,
1421 int num_dwords)
1422{
1423 if (ring->private) {
1424 int ret = intel_ring_begin(ring, num_dwords+2);
1425 if (ret)
1426 return ret;
1427
1428 intel_ring_emit(ring, MI_BATCH_BUFFER_START);
1429 intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);
1430
1431 return 0;
1432 } else
1433 return intel_ring_begin(ring, 4);
1434}
1435
1436static int blt_ring_flush(struct intel_ring_buffer *ring,
1437 u32 invalidate, u32 flush)
1438{
1439 uint32_t cmd;
1440 int ret;
1441
1442 ret = blt_ring_begin(ring, 4);
1443 if (ret)
1444 return ret;
1445
1446 cmd = MI_FLUSH_DW;
1447 if (invalidate & I915_GEM_DOMAIN_RENDER)
1448 cmd |= MI_INVALIDATE_TLB;
1449 intel_ring_emit(ring, cmd);
1450 intel_ring_emit(ring, 0);
1451 intel_ring_emit(ring, 0);
1452 intel_ring_emit(ring, MI_NOOP);
1453 intel_ring_advance(ring);
1454 return 0;
1455}
1456
1457static void blt_ring_cleanup(struct intel_ring_buffer *ring)
1458{
1459 if (!ring->private)
1460 return;
1461
1462 i915_gem_object_unpin(ring->private);
1463 drm_gem_object_unreference(ring->private);
1464 ring->private = NULL;
1465}
1466
1467static const struct intel_ring_buffer gen6_blt_ring = {
1468 .name = "blt ring",
1469 .id = RING_BLT,
1470 .mmio_base = BLT_RING_BASE,
1471 .size = 32 * PAGE_SIZE,
1472 .init = blt_ring_init,
1473 .write_tail = ring_write_tail,
1474 .flush = blt_ring_flush,
1475 .add_request = gen6_add_request,
1476 .get_seqno = gen6_ring_get_seqno,
1477 .irq_get = blt_ring_get_irq,
1478 .irq_put = blt_ring_put_irq,
1479 .dispatch_execbuffer = gen6_ring_dispatch_execbuffer,
1480 .cleanup = blt_ring_cleanup,
1481 .sync_to = gen6_blt_ring_sync_to,
1482 .semaphore_register = {MI_SEMAPHORE_SYNC_BR,
1483 MI_SEMAPHORE_SYNC_BV,
1484 MI_SEMAPHORE_SYNC_INVALID},
1485 .signal_mbox = {GEN6_RBSYNC, GEN6_VBSYNC},
1486};
1487
1488int intel_init_render_ring_buffer(struct drm_device *dev)
1489{
1490 drm_i915_private_t *dev_priv = dev->dev_private;
1491 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1492
1493 *ring = render_ring;
1494 if (INTEL_INFO(dev)->gen >= 6) {
1495 ring->add_request = gen6_add_request;
1496 ring->flush = gen6_render_ring_flush;
1497 ring->irq_get = gen6_render_ring_get_irq;
1498 ring->irq_put = gen6_render_ring_put_irq;
1499 ring->get_seqno = gen6_ring_get_seqno;
1500 } else if (IS_GEN5(dev)) {
1501 ring->add_request = pc_render_add_request;
1502 ring->get_seqno = pc_render_get_seqno;
1503 }
1504
1505 if (!I915_NEED_GFX_HWS(dev)) {
1506 ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1507 memset(ring->status_page.page_addr, 0, PAGE_SIZE);
1508 }
1509
1510 return intel_init_ring_buffer(dev, ring);
1511}
1512
1513int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
1514{
1515 drm_i915_private_t *dev_priv = dev->dev_private;
1516 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1517
1518 *ring = render_ring;
1519 if (INTEL_INFO(dev)->gen >= 6) {
1520 ring->add_request = gen6_add_request;
1521 ring->irq_get = gen6_render_ring_get_irq;
1522 ring->irq_put = gen6_render_ring_put_irq;
1523 } else if (IS_GEN5(dev)) {
1524 ring->add_request = pc_render_add_request;
1525 ring->get_seqno = pc_render_get_seqno;
1526 }
1527
1528 if (!I915_NEED_GFX_HWS(dev))
1529 ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1530
1531 ring->dev = dev;
1532 INIT_LIST_HEAD(&ring->active_list);
1533 INIT_LIST_HEAD(&ring->request_list);
1534 INIT_LIST_HEAD(&ring->gpu_write_list);
1535
1536 ring->size = size;
1537 ring->effective_size = ring->size;
1538 if (IS_I830(ring->dev))
1539 ring->effective_size -= 128;
1540
1541 ring->map.offset = start;
1542 ring->map.size = size;
1543 ring->map.type = 0;
1544 ring->map.flags = 0;
1545 ring->map.mtrr = 0;
1546
1547 drm_core_ioremap_wc(&ring->map, dev);
1548 if (ring->map.handle == NULL) {
1549 DRM_ERROR("can not ioremap virtual address for"
1550 " ring buffer\n");
1551 return -ENOMEM;
1552 }
1553
1554 ring->virtual_start = (void __force __iomem *)ring->map.handle;
1555 return 0;
1556}
1557
1558int intel_init_bsd_ring_buffer(struct drm_device *dev)
1559{
1560 drm_i915_private_t *dev_priv = dev->dev_private;
1561 struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
1562
1563 if (IS_GEN6(dev) || IS_GEN7(dev))
1564 *ring = gen6_bsd_ring;
1565 else
1566 *ring = bsd_ring;
1567
1568 return intel_init_ring_buffer(dev, ring);
1569}
1570
1571int intel_init_blt_ring_buffer(struct drm_device *dev)
1572{
1573 drm_i915_private_t *dev_priv = dev->dev_private;
1574 struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
1575
1576 *ring = gen6_blt_ring;
1577
1578 return intel_init_ring_buffer(dev, ring);
1579}
1580