Wed Jul 24 03:06:00 2013 UTC ()
Convert struct intel_ringbuffer::irq_queue to drm waitqueues.


(riastradh)
diff -r1.1.1.1.2.7 -r1.1.1.1.2.8 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
diff -r1.1.1.1.2.4 -r1.1.1.1.2.5 src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c
diff -r1.1.1.1.2.5 -r1.1.1.1.2.6 src/sys/external/bsd/drm2/dist/drm/i915/intel_ringbuffer.h

cvs diff -r1.1.1.1.2.7 -r1.1.1.1.2.8 src/sys/external/bsd/drm2/dist/drm/i915/Attic/i915_dma.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/i915_dma.c 2013/07/24 03:05:41 1.1.1.1.2.7
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/i915_dma.c 2013/07/24 03:06:00 1.1.1.1.2.8
@@ -792,28 +792,34 @@ static int i915_wait_irq(struct drm_devi @@ -792,28 +792,34 @@ static int i915_wait_irq(struct drm_devi
792 DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr, 792 DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr,
793 READ_BREADCRUMB(dev_priv)); 793 READ_BREADCRUMB(dev_priv));
794 794
795 if (READ_BREADCRUMB(dev_priv) >= irq_nr) { 795 if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
796 if (master_priv->sarea_priv) 796 if (master_priv->sarea_priv)
797 master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv); 797 master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
798 return 0; 798 return 0;
799 } 799 }
800 800
801 if (master_priv->sarea_priv) 801 if (master_priv->sarea_priv)
802 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; 802 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
803 803
804 if (ring->irq_get(ring)) { 804 if (ring->irq_get(ring)) {
 805#ifdef __NetBSD__
 806 DRM_TIMED_WAIT_UNTIL(ret, &ring->irq_queue, &drm_global_mutex,
 807 3 * DRM_HZ,
 808 READ_BREADCRUMB(dev_priv) >= irq_nr);
 809#else
805 DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ, 810 DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ,
806 READ_BREADCRUMB(dev_priv) >= irq_nr); 811 READ_BREADCRUMB(dev_priv) >= irq_nr);
 812#endif
807 ring->irq_put(ring); 813 ring->irq_put(ring);
808 } else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000)) 814 } else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000))
809 ret = -EBUSY; 815 ret = -EBUSY;
810 816
811 if (ret == -EBUSY) { 817 if (ret == -EBUSY) {
812 DRM_ERROR("EBUSY -- rec: %d emitted: %d\n", 818 DRM_ERROR("EBUSY -- rec: %d emitted: %d\n",
813 READ_BREADCRUMB(dev_priv), (int)dev_priv->dri1.counter); 819 READ_BREADCRUMB(dev_priv), (int)dev_priv->dri1.counter);
814 } 820 }
815 821
816 return ret; 822 return ret;
817} 823}
818 824
819/* Needs the lock as it touches the ring. 825/* Needs the lock as it touches the ring.

cvs diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c 2013/07/23 21:28:22 1.1.1.1.2.2
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c 2013/07/24 03:06:00 1.1.1.1.2.3
@@ -1018,34 +1018,44 @@ static int __wait_seqno(struct intel_rin @@ -1018,34 +1018,44 @@ static int __wait_seqno(struct intel_rin
1018 1018
1019 timeout_jiffies = timespec_to_jiffies(&wait_time); 1019 timeout_jiffies = timespec_to_jiffies(&wait_time);
1020 1020
1021 if (WARN_ON(!ring->irq_get(ring))) 1021 if (WARN_ON(!ring->irq_get(ring)))
1022 return -ENODEV; 1022 return -ENODEV;
1023 1023
1024 /* Record current time in case interrupted by signal, or wedged * */ 1024 /* Record current time in case interrupted by signal, or wedged * */
1025 getrawmonotonic(&before); 1025 getrawmonotonic(&before);
1026 1026
1027#define EXIT_COND \ 1027#define EXIT_COND \
1028 (i915_seqno_passed(ring->get_seqno(ring, false), seqno) || \ 1028 (i915_seqno_passed(ring->get_seqno(ring, false), seqno) || \
1029 atomic_read(&dev_priv->mm.wedged)) 1029 atomic_read(&dev_priv->mm.wedged))
1030 do { 1030 do {
 1031#ifdef __NetBSD__
 1032 /*
 1033 * XXX This wait is always interruptible; we should
 1034 * heed the flag `interruptible'.
 1035 */
 1036 DRM_TIMED_WAIT_UNTIL(end, &ring->irq_queue, &drm_global_mutex,
 1037 timeout_jiffies,
 1038 EXIT_COND);
 1039#else
1031 if (interruptible) 1040 if (interruptible)
1032 end = wait_event_interruptible_timeout(ring->irq_queue, 1041 end = wait_event_interruptible_timeout(ring->irq_queue,
1033 EXIT_COND, 1042 EXIT_COND,
1034 timeout_jiffies); 1043 timeout_jiffies);
1035 else 1044 else
1036 end = wait_event_timeout(ring->irq_queue, EXIT_COND, 1045 end = wait_event_timeout(ring->irq_queue, EXIT_COND,
1037 timeout_jiffies); 1046 timeout_jiffies);
1038 1047
 1048#endif
1039 ret = i915_gem_check_wedge(dev_priv, interruptible); 1049 ret = i915_gem_check_wedge(dev_priv, interruptible);
1040 if (ret) 1050 if (ret)
1041 end = ret; 1051 end = ret;
1042 } while (end == 0 && wait_forever); 1052 } while (end == 0 && wait_forever);
1043 1053
1044 getrawmonotonic(&now); 1054 getrawmonotonic(&now);
1045 1055
1046 ring->irq_put(ring); 1056 ring->irq_put(ring);
1047 trace_i915_gem_request_wait_end(ring, seqno); 1057 trace_i915_gem_request_wait_end(ring, seqno);
1048#undef EXIT_COND 1058#undef EXIT_COND
1049 1059
1050 if (timeout) { 1060 if (timeout) {
1051 struct timespec sleep_time = timespec_sub(now, before); 1061 struct timespec sleep_time = timespec_sub(now, before);

cvs diff -r1.1.1.1.2.2 -r1.1.1.1.2.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c 2013/07/23 21:28:22 1.1.1.1.2.2
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c 2013/07/24 03:06:00 1.1.1.1.2.3
@@ -343,27 +343,31 @@ static void ironlake_handle_rps_change(s @@ -343,27 +343,31 @@ static void ironlake_handle_rps_change(s
343 return; 343 return;
344} 344}
345 345
346static void notify_ring(struct drm_device *dev, 346static void notify_ring(struct drm_device *dev,
347 struct intel_ring_buffer *ring) 347 struct intel_ring_buffer *ring)
348{ 348{
349 struct drm_i915_private *dev_priv = dev->dev_private; 349 struct drm_i915_private *dev_priv = dev->dev_private;
350 350
351 if (ring->obj == NULL) 351 if (ring->obj == NULL)
352 return; 352 return;
353 353
354 trace_i915_gem_request_complete(ring, ring->get_seqno(ring, false)); 354 trace_i915_gem_request_complete(ring, ring->get_seqno(ring, false));
355 355
 356#ifdef __NetBSD__
 357 DRM_WAKEUP_ALL(&ring->irq_queue, &drm_global_mutex);
 358#else
356 wake_up_all(&ring->irq_queue); 359 wake_up_all(&ring->irq_queue);
 360#endif
357 if (i915_enable_hangcheck) { 361 if (i915_enable_hangcheck) {
358 dev_priv->hangcheck_count = 0; 362 dev_priv->hangcheck_count = 0;
359 mod_timer(&dev_priv->hangcheck_timer, 363 mod_timer(&dev_priv->hangcheck_timer,
360 round_jiffies_up(jiffies + DRM_I915_HANGCHECK_JIFFIES)); 364 round_jiffies_up(jiffies + DRM_I915_HANGCHECK_JIFFIES));
361 } 365 }
362} 366}
363 367
364static void gen6_pm_rps_work(struct work_struct *work) 368static void gen6_pm_rps_work(struct work_struct *work)
365{ 369{
366 drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, 370 drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t,
367 rps.work); 371 rps.work);
368 u32 pm_iir, pm_imr; 372 u32 pm_iir, pm_imr;
369 u8 new_delay; 373 u8 new_delay;
@@ -1141,27 +1145,32 @@ static void i915_record_ring_state(struc @@ -1141,27 +1145,32 @@ static void i915_record_ring_state(struc
1141 error->ipeir[ring->id] = I915_READ(RING_IPEIR(ring->mmio_base)); 1145 error->ipeir[ring->id] = I915_READ(RING_IPEIR(ring->mmio_base));
1142 error->ipehr[ring->id] = I915_READ(RING_IPEHR(ring->mmio_base)); 1146 error->ipehr[ring->id] = I915_READ(RING_IPEHR(ring->mmio_base));
1143 error->instdone[ring->id] = I915_READ(RING_INSTDONE(ring->mmio_base)); 1147 error->instdone[ring->id] = I915_READ(RING_INSTDONE(ring->mmio_base));
1144 error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base)); 1148 error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base));
1145 if (ring->id == RCS) 1149 if (ring->id == RCS)
1146 error->bbaddr = I915_READ64(BB_ADDR); 1150 error->bbaddr = I915_READ64(BB_ADDR);
1147 } else { 1151 } else {
1148 error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX); 1152 error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX);
1149 error->ipeir[ring->id] = I915_READ(IPEIR); 1153 error->ipeir[ring->id] = I915_READ(IPEIR);
1150 error->ipehr[ring->id] = I915_READ(IPEHR); 1154 error->ipehr[ring->id] = I915_READ(IPEHR);
1151 error->instdone[ring->id] = I915_READ(INSTDONE); 1155 error->instdone[ring->id] = I915_READ(INSTDONE);
1152 } 1156 }
1153 1157
 1158#ifdef __NetBSD__
 1159 error->waiting[ring->id] = DRM_WAITERS_P(&ring->irq_queue,
 1160 &drm_global_mutex);
 1161#else
1154 error->waiting[ring->id] = waitqueue_active(&ring->irq_queue); 1162 error->waiting[ring->id] = waitqueue_active(&ring->irq_queue);
 1163#endif
1155 error->instpm[ring->id] = I915_READ(RING_INSTPM(ring->mmio_base)); 1164 error->instpm[ring->id] = I915_READ(RING_INSTPM(ring->mmio_base));
1156 error->seqno[ring->id] = ring->get_seqno(ring, false); 1165 error->seqno[ring->id] = ring->get_seqno(ring, false);
1157 error->acthd[ring->id] = intel_ring_get_active_head(ring); 1166 error->acthd[ring->id] = intel_ring_get_active_head(ring);
1158 error->head[ring->id] = I915_READ_HEAD(ring); 1167 error->head[ring->id] = I915_READ_HEAD(ring);
1159 error->tail[ring->id] = I915_READ_TAIL(ring); 1168 error->tail[ring->id] = I915_READ_TAIL(ring);
1160 error->ctl[ring->id] = I915_READ_CTL(ring); 1169 error->ctl[ring->id] = I915_READ_CTL(ring);
1161 1170
1162 error->cpu_ring_head[ring->id] = ring->head; 1171 error->cpu_ring_head[ring->id] = ring->head;
1163 error->cpu_ring_tail[ring->id] = ring->tail; 1172 error->cpu_ring_tail[ring->id] = ring->tail;
1164} 1173}
1165 1174
1166static void i915_gem_record_rings(struct drm_device *dev, 1175static void i915_gem_record_rings(struct drm_device *dev,
1167 struct drm_i915_error_state *error) 1176 struct drm_i915_error_state *error)
@@ -1456,27 +1465,31 @@ void i915_handle_error(struct drm_device @@ -1456,27 +1465,31 @@ void i915_handle_error(struct drm_device
1456 int i; 1465 int i;
1457 1466
1458 i915_capture_error_state(dev); 1467 i915_capture_error_state(dev);
1459 i915_report_and_clear_eir(dev); 1468 i915_report_and_clear_eir(dev);
1460 1469
1461 if (wedged) { 1470 if (wedged) {
1462 INIT_COMPLETION(dev_priv->error_completion); 1471 INIT_COMPLETION(dev_priv->error_completion);
1463 atomic_set(&dev_priv->mm.wedged, 1); 1472 atomic_set(&dev_priv->mm.wedged, 1);
1464 1473
1465 /* 1474 /*
1466 * Wakeup waiting processes so they don't hang 1475 * Wakeup waiting processes so they don't hang
1467 */ 1476 */
1468 for_each_ring(ring, dev_priv, i) 1477 for_each_ring(ring, dev_priv, i)
 1478#ifdef __NetBSD__
 1479 DRM_WAKEUP_ALL(&ring->irq_queue, &drm_global_mutex);
 1480#else
1469 wake_up_all(&ring->irq_queue); 1481 wake_up_all(&ring->irq_queue);
 1482#endif
1470 } 1483 }
1471 1484
1472 queue_work(dev_priv->wq, &dev_priv->error_work); 1485 queue_work(dev_priv->wq, &dev_priv->error_work);
1473} 1486}
1474 1487
1475static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) 1488static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
1476{ 1489{
1477 drm_i915_private_t *dev_priv = dev->dev_private; 1490 drm_i915_private_t *dev_priv = dev->dev_private;
1478 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; 1491 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
1479 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1492 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1480 struct drm_i915_gem_object *obj; 1493 struct drm_i915_gem_object *obj;
1481 struct intel_unpin_work *work; 1494 struct intel_unpin_work *work;
1482 unsigned long flags; 1495 unsigned long flags;
@@ -1661,32 +1674,41 @@ static void valleyview_disable_vblank(st @@ -1661,32 +1674,41 @@ static void valleyview_disable_vblank(st
1661static u32 1674static u32
1662ring_last_seqno(struct intel_ring_buffer *ring) 1675ring_last_seqno(struct intel_ring_buffer *ring)
1663{ 1676{
1664 return list_entry(ring->request_list.prev, 1677 return list_entry(ring->request_list.prev,
1665 struct drm_i915_gem_request, list)->seqno; 1678 struct drm_i915_gem_request, list)->seqno;
1666} 1679}
1667 1680
1668static bool i915_hangcheck_ring_idle(struct intel_ring_buffer *ring, bool *err) 1681static bool i915_hangcheck_ring_idle(struct intel_ring_buffer *ring, bool *err)
1669{ 1682{
1670 if (list_empty(&ring->request_list) || 1683 if (list_empty(&ring->request_list) ||
1671 i915_seqno_passed(ring->get_seqno(ring, false), 1684 i915_seqno_passed(ring->get_seqno(ring, false),
1672 ring_last_seqno(ring))) { 1685 ring_last_seqno(ring))) {
1673 /* Issue a wake-up to catch stuck h/w. */ 1686 /* Issue a wake-up to catch stuck h/w. */
 1687#ifdef __NetBSD__
 1688 if (DRM_WAITERS_P(&ring->irq_queue, &drm_global_mutex)) {
 1689 DRM_ERROR("Hangcheck timer elapsed... %s idle\n",
 1690 ring->name);
 1691 DRM_WAKEUP_ALL(&ring->irq_queue, &drm_global_mutex);
 1692 *err = true;
 1693 }
 1694#else
1674 if (waitqueue_active(&ring->irq_queue)) { 1695 if (waitqueue_active(&ring->irq_queue)) {
1675 DRM_ERROR("Hangcheck timer elapsed... %s idle\n", 1696 DRM_ERROR("Hangcheck timer elapsed... %s idle\n",
1676 ring->name); 1697 ring->name);
1677 wake_up_all(&ring->irq_queue); 1698 wake_up_all(&ring->irq_queue);
1678 *err = true; 1699 *err = true;
1679 } 1700 }
 1701#endif
1680 return true; 1702 return true;
1681 } 1703 }
1682 return false; 1704 return false;
1683} 1705}
1684 1706
1685static bool kick_ring(struct intel_ring_buffer *ring) 1707static bool kick_ring(struct intel_ring_buffer *ring)
1686{ 1708{
1687 struct drm_device *dev = ring->dev; 1709 struct drm_device *dev = ring->dev;
1688 struct drm_i915_private *dev_priv = dev->dev_private; 1710 struct drm_i915_private *dev_priv = dev->dev_private;
1689 u32 tmp = I915_READ_CTL(ring); 1711 u32 tmp = I915_READ_CTL(ring);
1690 if (tmp & RING_WAIT) { 1712 if (tmp & RING_WAIT) {
1691 DRM_ERROR("Kicking stuck wait on %s\n", 1713 DRM_ERROR("Kicking stuck wait on %s\n",
1692 ring->name); 1714 ring->name);

cvs diff -r1.1.1.1.2.4 -r1.1.1.1.2.5 src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.c 2013/07/24 03:05:41 1.1.1.1.2.4
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.c 2013/07/24 03:06:00 1.1.1.1.2.5
@@ -1141,27 +1141,31 @@ static int init_phys_hws_pga(struct inte @@ -1141,27 +1141,31 @@ static int init_phys_hws_pga(struct inte
1141static int intel_init_ring_buffer(struct drm_device *dev, 1141static int intel_init_ring_buffer(struct drm_device *dev,
1142 struct intel_ring_buffer *ring) 1142 struct intel_ring_buffer *ring)
1143{ 1143{
1144 struct drm_i915_gem_object *obj; 1144 struct drm_i915_gem_object *obj;
1145 struct drm_i915_private *dev_priv = dev->dev_private; 1145 struct drm_i915_private *dev_priv = dev->dev_private;
1146 int ret; 1146 int ret;
1147 1147
1148 ring->dev = dev; 1148 ring->dev = dev;
1149 INIT_LIST_HEAD(&ring->active_list); 1149 INIT_LIST_HEAD(&ring->active_list);
1150 INIT_LIST_HEAD(&ring->request_list); 1150 INIT_LIST_HEAD(&ring->request_list);
1151 ring->size = 32 * PAGE_SIZE; 1151 ring->size = 32 * PAGE_SIZE;
1152 memset(ring->sync_seqno, 0, sizeof(ring->sync_seqno)); 1152 memset(ring->sync_seqno, 0, sizeof(ring->sync_seqno));
1153 1153
 1154#ifdef __NetBSD__
 1155 DRM_INIT_WAITQUEUE(&ring->irq_queue, "i915irq");
 1156#else
1154 init_waitqueue_head(&ring->irq_queue); 1157 init_waitqueue_head(&ring->irq_queue);
 1158#endif
1155 1159
1156 if (I915_NEED_GFX_HWS(dev)) { 1160 if (I915_NEED_GFX_HWS(dev)) {
1157 ret = init_status_page(ring); 1161 ret = init_status_page(ring);
1158 if (ret) 1162 if (ret)
1159 return ret; 1163 return ret;
1160 } else { 1164 } else {
1161 BUG_ON(ring->id != RCS); 1165 BUG_ON(ring->id != RCS);
1162 ret = init_phys_hws_pga(ring); 1166 ret = init_phys_hws_pga(ring);
1163 if (ret) 1167 if (ret)
1164 return ret; 1168 return ret;
1165 } 1169 }
1166 1170
1167 obj = i915_gem_alloc_object(dev, ring->size); 1171 obj = i915_gem_alloc_object(dev, ring->size);

cvs diff -r1.1.1.1.2.5 -r1.1.1.1.2.6 src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.h (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.h 2013/07/24 03:05:41 1.1.1.1.2.5
+++ src/sys/external/bsd/drm2/dist/drm/i915/Attic/intel_ringbuffer.h 2013/07/24 03:06:00 1.1.1.1.2.6
@@ -123,27 +123,31 @@ struct intel_ring_buffer { @@ -123,27 +123,31 @@ struct intel_ring_buffer {
123 123
124 /** 124 /**
125 * List of breadcrumbs associated with GPU requests currently 125 * List of breadcrumbs associated with GPU requests currently
126 * outstanding. 126 * outstanding.
127 */ 127 */
128 struct list_head request_list; 128 struct list_head request_list;
129 129
130 /** 130 /**
131 * Do we have some not yet emitted requests outstanding? 131 * Do we have some not yet emitted requests outstanding?
132 */ 132 */
133 u32 outstanding_lazy_request; 133 u32 outstanding_lazy_request;
134 bool gpu_caches_dirty; 134 bool gpu_caches_dirty;
135 135
 136#ifdef __NetBSD__
 137 drm_waitqueue_t irq_queue;
 138#else
136 wait_queue_head_t irq_queue; 139 wait_queue_head_t irq_queue;
 140#endif
137 141
138 /** 142 /**
139 * Do an explicit TLB flush before MI_SET_CONTEXT 143 * Do an explicit TLB flush before MI_SET_CONTEXT
140 */ 144 */
141 bool itlb_before_ctx_switch; 145 bool itlb_before_ctx_switch;
142 struct i915_hw_context *default_context; 146 struct i915_hw_context *default_context;
143 struct drm_i915_gem_object *last_context_obj; 147 struct drm_i915_gem_object *last_context_obj;
144 148
145 void *private; 149 void *private;
146}; 150};
147 151
148static inline bool 152static inline bool
149intel_ring_initialized(struct intel_ring_buffer *ring) 153intel_ring_initialized(struct intel_ring_buffer *ring)