Lines Matching refs:blitq

461 	drm_via_blitq_t *blitq = dev_priv->blit_queues + engine;  in via_dmablit_handler()  local
468 engine, from_irq, (unsigned long) blitq); in via_dmablit_handler()
471 spin_lock(&blitq->blit_lock); in via_dmablit_handler()
473 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_handler()
475 done_transfer = blitq->is_active && in via_dmablit_handler()
477 done_transfer = done_transfer || (blitq->aborting && !(status & VIA_DMA_CSR_DE)); in via_dmablit_handler()
479 cur = blitq->cur; in via_dmablit_handler()
482 blitq->blits[cur]->aborted = blitq->aborting; in via_dmablit_handler()
483 blitq->done_blit_handle++; in via_dmablit_handler()
485 DRM_SPIN_WAKEUP_ALL(&blitq->blit_queue[cur], in via_dmablit_handler()
486 &blitq->blit_lock); in via_dmablit_handler()
488 wake_up(blitq->blit_queue + cur); in via_dmablit_handler()
494 blitq->cur = cur; in via_dmablit_handler()
502 blitq->is_active = 0; in via_dmablit_handler()
503 blitq->aborting = 0; in via_dmablit_handler()
504 schedule_work(&blitq->wq); in via_dmablit_handler()
506 } else if (blitq->is_active && time_after_eq(jiffies, blitq->end)) { in via_dmablit_handler()
513 blitq->aborting = 1; in via_dmablit_handler()
514 blitq->end = jiffies + HZ; in via_dmablit_handler()
517 if (!blitq->is_active) { in via_dmablit_handler()
518 if (blitq->num_outstanding) { in via_dmablit_handler()
519 via_fire_dmablit(dev, blitq->blits[cur], engine); in via_dmablit_handler()
520 blitq->is_active = 1; in via_dmablit_handler()
521 blitq->cur = cur; in via_dmablit_handler()
522 blitq->num_outstanding--; in via_dmablit_handler()
523 blitq->end = jiffies + HZ; in via_dmablit_handler()
524 if (!timer_pending(&blitq->poll_timer)) in via_dmablit_handler()
525 mod_timer(&blitq->poll_timer, jiffies + 1); in via_dmablit_handler()
527 if (timer_pending(&blitq->poll_timer)) in via_dmablit_handler()
528 del_timer(&blitq->poll_timer); in via_dmablit_handler()
534 spin_unlock(&blitq->blit_lock); in via_dmablit_handler()
536 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_handler()
547 via_dmablit_active(drm_via_blitq_t *blitq, int engine, uint32_t handle, drm_waitqueue_t **queue) in via_dmablit_active() argument
549 via_dmablit_active(drm_via_blitq_t *blitq, int engine, uint32_t handle, wait_queue_head_t **queue) in via_dmablit_active()
559 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_active()
566 active = ((blitq->done_blit_handle - handle) > (1 << 23)) && in via_dmablit_active()
567 ((blitq->cur_blit_handle - handle) <= (1 << 23)); in via_dmablit_active()
570 slot = handle - blitq->done_blit_handle + blitq->cur - 1; in via_dmablit_active()
573 *queue = blitq->blit_queue + slot; in via_dmablit_active()
577 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_active()
592 drm_via_blitq_t *blitq = dev_priv->blit_queues + engine; in via_dmablit_sync() local
601 spin_lock(&blitq->blit_lock); in via_dmablit_sync()
602 if (via_dmablit_active(blitq, engine, handle, &queue)) { in via_dmablit_sync()
603 DRM_SPIN_WAIT_ON(ret, queue, &blitq->blit_lock, 3*HZ, in via_dmablit_sync()
604 !via_dmablit_active(blitq, engine, handle, NULL)); in via_dmablit_sync()
606 spin_unlock(&blitq->blit_lock); in via_dmablit_sync()
608 if (via_dmablit_active(blitq, engine, handle, &queue)) { in via_dmablit_sync()
610 !via_dmablit_active(blitq, engine, handle, NULL)); in via_dmablit_sync()
633 drm_via_blitq_t *blitq = from_timer(blitq, t, poll_timer); in via_dmablit_timer() local
634 struct drm_device *dev = blitq->dev; in via_dmablit_timer()
636 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues); in via_dmablit_timer()
643 if (!timer_pending(&blitq->poll_timer)) { in via_dmablit_timer()
644 mod_timer(&blitq->poll_timer, jiffies + 1); in via_dmablit_timer()
669 drm_via_blitq_t *blitq = container_of(work, drm_via_blitq_t, wq); in via_dmablit_workqueue() local
670 struct drm_device *dev = blitq->dev; in via_dmablit_workqueue()
677 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues)); in via_dmablit_workqueue()
679 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
681 while (blitq->serviced != blitq->cur) { in via_dmablit_workqueue()
683 cur_released = blitq->serviced++; in via_dmablit_workqueue()
687 if (blitq->serviced >= VIA_NUM_BLIT_SLOTS) in via_dmablit_workqueue()
688 blitq->serviced = 0; in via_dmablit_workqueue()
690 cur_sg = blitq->blits[cur_released]; in via_dmablit_workqueue()
691 blitq->num_free++; in via_dmablit_workqueue()
694 DRM_SPIN_WAKEUP_ONE(&blitq->busy_queue, &blitq->blit_lock); in via_dmablit_workqueue()
697 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
700 wake_up(&blitq->busy_queue); in via_dmablit_workqueue()
714 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
717 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
731 drm_via_blitq_t *blitq; in via_init_dmablit() local
736 blitq = dev_priv->blit_queues + i; in via_init_dmablit()
737 blitq->dev = dev; in via_init_dmablit()
738 blitq->cur_blit_handle = 0; in via_init_dmablit()
739 blitq->done_blit_handle = 0; in via_init_dmablit()
740 blitq->head = 0; in via_init_dmablit()
741 blitq->cur = 0; in via_init_dmablit()
742 blitq->serviced = 0; in via_init_dmablit()
743 blitq->num_free = VIA_NUM_BLIT_SLOTS - 1; in via_init_dmablit()
744 blitq->num_outstanding = 0; in via_init_dmablit()
745 blitq->is_active = 0; in via_init_dmablit()
746 blitq->aborting = 0; in via_init_dmablit()
747 spin_lock_init(&blitq->blit_lock); in via_init_dmablit()
750 DRM_INIT_WAITQUEUE(blitq->blit_queue + j, "viablt"); in via_init_dmablit()
751 DRM_INIT_WAITQUEUE(&blitq->busy_queue, "viabusy"); in via_init_dmablit()
754 init_waitqueue_head(blitq->blit_queue + j); in via_init_dmablit()
755 init_waitqueue_head(&blitq->busy_queue); in via_init_dmablit()
757 INIT_WORK(&blitq->wq, via_dmablit_workqueue); in via_init_dmablit()
758 timer_setup(&blitq->poll_timer, via_dmablit_timer, 0); in via_init_dmablit()
870 via_dmablit_grab_slot(drm_via_blitq_t *blitq, int engine) in via_dmablit_grab_slot() argument
875 DRM_DEBUG("Num free is %d\n", blitq->num_free); in via_dmablit_grab_slot()
876 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
877 while (blitq->num_free == 0) { in via_dmablit_grab_slot()
879 DRM_SPIN_WAIT_ON(ret, &blitq->busy_queue, &blitq->blit_lock, in via_dmablit_grab_slot()
881 blitq->num_free > 0); in via_dmablit_grab_slot()
887 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
891 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
893 VIA_WAIT_ON(ret, blitq->busy_queue, HZ, blitq->num_free > 0); in via_dmablit_grab_slot()
897 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
901 blitq->num_free--; in via_dmablit_grab_slot()
902 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
912 via_dmablit_release_slot(drm_via_blitq_t *blitq) in via_dmablit_release_slot() argument
916 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_release_slot()
917 blitq->num_free++; in via_dmablit_release_slot()
919 DRM_SPIN_WAKEUP_ONE(&blitq->busy_queue, &blitq->blit_lock); in via_dmablit_release_slot()
921 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_release_slot()
923 wake_up(&blitq->busy_queue); in via_dmablit_release_slot()
937 drm_via_blitq_t *blitq; in via_dmablit() local
948 blitq = dev_priv->blit_queues + engine; in via_dmablit()
949 if (0 != (ret = via_dmablit_grab_slot(blitq, engine))) in via_dmablit()
952 via_dmablit_release_slot(blitq); in via_dmablit()
956 via_dmablit_release_slot(blitq); in via_dmablit()
968 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit()
970 blitq->blits[blitq->head++] = vsg; in via_dmablit()
971 if (blitq->head >= VIA_NUM_BLIT_SLOTS) in via_dmablit()
972 blitq->head = 0; in via_dmablit()
973 blitq->num_outstanding++; in via_dmablit()
974 xfer->sync.sync_handle = ++blitq->cur_blit_handle; in via_dmablit()
976 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit()