aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-04-26 17:28:08 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-03 05:18:27 -0400
commit9488867a67fda2310448e44a906f1a54faa72fb4 (patch)
tree83e322bf1a81fafd1ab180fa5593aa84da66d3b7 /drivers/gpu
parent647a3fb2f31298ad9d062cbb8019b5dc26e4ca69 (diff)
drm/i915: move dri1 irq ioctl code to i915_dma.c
Let's just get this out of the way. v2: Rebase against ENODEV changes. Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c110
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h4
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c110
3 files changed, 110 insertions, 114 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 4f1a9e864e03..6f6c4bda689c 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -721,6 +721,116 @@ fail_batch_free:
721 return ret; 721 return ret;
722} 722}
723 723
724static int i915_emit_irq(struct drm_device * dev)
725{
726 drm_i915_private_t *dev_priv = dev->dev_private;
727 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
728
729 i915_kernel_lost_context(dev);
730
731 DRM_DEBUG_DRIVER("\n");
732
733 dev_priv->counter++;
734 if (dev_priv->counter > 0x7FFFFFFFUL)
735 dev_priv->counter = 1;
736 if (master_priv->sarea_priv)
737 master_priv->sarea_priv->last_enqueue = dev_priv->counter;
738
739 if (BEGIN_LP_RING(4) == 0) {
740 OUT_RING(MI_STORE_DWORD_INDEX);
741 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
742 OUT_RING(dev_priv->counter);
743 OUT_RING(MI_USER_INTERRUPT);
744 ADVANCE_LP_RING();
745 }
746
747 return dev_priv->counter;
748}
749
750static int i915_wait_irq(struct drm_device * dev, int irq_nr)
751{
752 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
753 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
754 int ret = 0;
755 struct intel_ring_buffer *ring = LP_RING(dev_priv);
756
757 DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr,
758 READ_BREADCRUMB(dev_priv));
759
760 if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
761 if (master_priv->sarea_priv)
762 master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
763 return 0;
764 }
765
766 if (master_priv->sarea_priv)
767 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
768
769 if (ring->irq_get(ring)) {
770 DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ,
771 READ_BREADCRUMB(dev_priv) >= irq_nr);
772 ring->irq_put(ring);
773 } else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000))
774 ret = -EBUSY;
775
776 if (ret == -EBUSY) {
777 DRM_ERROR("EBUSY -- rec: %d emitted: %d\n",
778 READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
779 }
780
781 return ret;
782}
783
784/* Needs the lock as it touches the ring.
785 */
786static int i915_irq_emit(struct drm_device *dev, void *data,
787 struct drm_file *file_priv)
788{
789 drm_i915_private_t *dev_priv = dev->dev_private;
790 drm_i915_irq_emit_t *emit = data;
791 int result;
792
793 if (drm_core_check_feature(dev, DRIVER_MODESET))
794 return -ENODEV;
795
796 if (!dev_priv || !LP_RING(dev_priv)->virtual_start) {
797 DRM_ERROR("called with no initialization\n");
798 return -EINVAL;
799 }
800
801 RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
802
803 mutex_lock(&dev->struct_mutex);
804 result = i915_emit_irq(dev);
805 mutex_unlock(&dev->struct_mutex);
806
807 if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
808 DRM_ERROR("copy_to_user\n");
809 return -EFAULT;
810 }
811
812 return 0;
813}
814
815/* Doesn't need the hardware lock.
816 */
817static int i915_irq_wait(struct drm_device *dev, void *data,
818 struct drm_file *file_priv)
819{
820 drm_i915_private_t *dev_priv = dev->dev_private;
821 drm_i915_irq_wait_t *irqwait = data;
822
823 if (drm_core_check_feature(dev, DRIVER_MODESET))
824 return -ENODEV;
825
826 if (!dev_priv) {
827 DRM_ERROR("called with no initialization\n");
828 return -EINVAL;
829 }
830
831 return i915_wait_irq(dev, irqwait->irq_seq);
832}
833
724static int i915_vblank_pipe_get(struct drm_device *dev, void *data, 834static int i915_vblank_pipe_get(struct drm_device *dev, void *data,
725 struct drm_file *file_priv) 835 struct drm_file *file_priv)
726{ 836{
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index e7f428923733..b297812b8984 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1156,10 +1156,6 @@ extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
1156/* i915_irq.c */ 1156/* i915_irq.c */
1157void i915_hangcheck_elapsed(unsigned long data); 1157void i915_hangcheck_elapsed(unsigned long data);
1158void i915_handle_error(struct drm_device *dev, bool wedged); 1158void i915_handle_error(struct drm_device *dev, bool wedged);
1159extern int i915_irq_emit(struct drm_device *dev, void *data,
1160 struct drm_file *file_priv);
1161extern int i915_irq_wait(struct drm_device *dev, void *data,
1162 struct drm_file *file_priv);
1163 1159
1164extern void intel_irq_init(struct drm_device *dev); 1160extern void intel_irq_init(struct drm_device *dev);
1165 1161
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index ef2c23d7f48f..8675e433cd55 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1364,116 +1364,6 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
1364 } 1364 }
1365} 1365}
1366 1366
1367static int i915_emit_irq(struct drm_device * dev)
1368{
1369 drm_i915_private_t *dev_priv = dev->dev_private;
1370 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1371
1372 i915_kernel_lost_context(dev);
1373
1374 DRM_DEBUG_DRIVER("\n");
1375
1376 dev_priv->counter++;
1377 if (dev_priv->counter > 0x7FFFFFFFUL)
1378 dev_priv->counter = 1;
1379 if (master_priv->sarea_priv)
1380 master_priv->sarea_priv->last_enqueue = dev_priv->counter;
1381
1382 if (BEGIN_LP_RING(4) == 0) {
1383 OUT_RING(MI_STORE_DWORD_INDEX);
1384 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
1385 OUT_RING(dev_priv->counter);
1386 OUT_RING(MI_USER_INTERRUPT);
1387 ADVANCE_LP_RING();
1388 }
1389
1390 return dev_priv->counter;
1391}
1392
1393static int i915_wait_irq(struct drm_device * dev, int irq_nr)
1394{
1395 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1396 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1397 int ret = 0;
1398 struct intel_ring_buffer *ring = LP_RING(dev_priv);
1399
1400 DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr,
1401 READ_BREADCRUMB(dev_priv));
1402
1403 if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
1404 if (master_priv->sarea_priv)
1405 master_priv->sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
1406 return 0;
1407 }
1408
1409 if (master_priv->sarea_priv)
1410 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
1411
1412 if (ring->irq_get(ring)) {
1413 DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ,
1414 READ_BREADCRUMB(dev_priv) >= irq_nr);
1415 ring->irq_put(ring);
1416 } else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000))
1417 ret = -EBUSY;
1418
1419 if (ret == -EBUSY) {
1420 DRM_ERROR("EBUSY -- rec: %d emitted: %d\n",
1421 READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
1422 }
1423
1424 return ret;
1425}
1426
1427/* Needs the lock as it touches the ring.
1428 */
1429int i915_irq_emit(struct drm_device *dev, void *data,
1430 struct drm_file *file_priv)
1431{
1432 drm_i915_private_t *dev_priv = dev->dev_private;
1433 drm_i915_irq_emit_t *emit = data;
1434 int result;
1435
1436 if (drm_core_check_feature(dev, DRIVER_MODESET))
1437 return -ENODEV;
1438
1439 if (!dev_priv || !LP_RING(dev_priv)->virtual_start) {
1440 DRM_ERROR("called with no initialization\n");
1441 return -EINVAL;
1442 }
1443
1444 RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
1445
1446 mutex_lock(&dev->struct_mutex);
1447 result = i915_emit_irq(dev);
1448 mutex_unlock(&dev->struct_mutex);
1449
1450 if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
1451 DRM_ERROR("copy_to_user\n");
1452 return -EFAULT;
1453 }
1454
1455 return 0;
1456}
1457
1458/* Doesn't need the hardware lock.
1459 */
1460int i915_irq_wait(struct drm_device *dev, void *data,
1461 struct drm_file *file_priv)
1462{
1463 drm_i915_private_t *dev_priv = dev->dev_private;
1464 drm_i915_irq_wait_t *irqwait = data;
1465
1466 if (drm_core_check_feature(dev, DRIVER_MODESET))
1467 return -ENODEV;
1468
1469 if (!dev_priv) {
1470 DRM_ERROR("called with no initialization\n");
1471 return -EINVAL;
1472 }
1473
1474 return i915_wait_irq(dev, irqwait->irq_seq);
1475}
1476
1477/* Called from drm generic code, passed 'crtc' which 1367/* Called from drm generic code, passed 'crtc' which
1478 * we use as a pipe index 1368 * we use as a pipe index
1479 */ 1369 */