Lines Matching refs:blitq
318 drm_via_blitq_t *blitq = dev_priv->blit_queues + engine; in via_dmablit_handler() local
325 engine, from_irq, (unsigned long) blitq); in via_dmablit_handler()
328 spin_lock(&blitq->blit_lock); in via_dmablit_handler()
330 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_handler()
332 done_transfer = blitq->is_active && in via_dmablit_handler()
334 done_transfer = done_transfer || (blitq->aborting && !(status & VIA_DMA_CSR_DE)); in via_dmablit_handler()
336 cur = blitq->cur; in via_dmablit_handler()
339 blitq->blits[cur]->aborted = blitq->aborting; in via_dmablit_handler()
340 blitq->done_blit_handle++; in via_dmablit_handler()
341 DRM_WAKEUP(blitq->blit_queue + cur); in via_dmablit_handler()
346 blitq->cur = cur; in via_dmablit_handler()
354 blitq->is_active = 0; in via_dmablit_handler()
355 blitq->aborting = 0; in via_dmablit_handler()
356 schedule_work(&blitq->wq); in via_dmablit_handler()
358 } else if (blitq->is_active && time_after_eq(jiffies, blitq->end)) { in via_dmablit_handler()
365 blitq->aborting = 1; in via_dmablit_handler()
366 blitq->end = jiffies + DRM_HZ; in via_dmablit_handler()
369 if (!blitq->is_active) { in via_dmablit_handler()
370 if (blitq->num_outstanding) { in via_dmablit_handler()
371 via_fire_dmablit(dev, blitq->blits[cur], engine); in via_dmablit_handler()
372 blitq->is_active = 1; in via_dmablit_handler()
373 blitq->cur = cur; in via_dmablit_handler()
374 blitq->num_outstanding--; in via_dmablit_handler()
375 blitq->end = jiffies + DRM_HZ; in via_dmablit_handler()
376 if (!timer_pending(&blitq->poll_timer)) in via_dmablit_handler()
377 mod_timer(&blitq->poll_timer, jiffies + 1); in via_dmablit_handler()
379 if (timer_pending(&blitq->poll_timer)) in via_dmablit_handler()
380 del_timer(&blitq->poll_timer); in via_dmablit_handler()
386 spin_unlock(&blitq->blit_lock); in via_dmablit_handler()
388 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_handler()
398 via_dmablit_active(drm_via_blitq_t *blitq, int engine, uint32_t handle, wait_queue_head_t **queue) in via_dmablit_active() argument
404 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_active()
410 active = ((blitq->done_blit_handle - handle) > (1 << 23)) && in via_dmablit_active()
411 ((blitq->cur_blit_handle - handle) <= (1 << 23)); in via_dmablit_active()
414 slot = handle - blitq->done_blit_handle + blitq->cur - 1; in via_dmablit_active()
417 *queue = blitq->blit_queue + slot; in via_dmablit_active()
420 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_active()
434 drm_via_blitq_t *blitq = dev_priv->blit_queues + engine; in via_dmablit_sync() local
438 if (via_dmablit_active(blitq, engine, handle, &queue)) { in via_dmablit_sync()
440 !via_dmablit_active(blitq, engine, handle, NULL)); in via_dmablit_sync()
462 drm_via_blitq_t *blitq = (drm_via_blitq_t *) data; in via_dmablit_timer() local
463 struct drm_device *dev = blitq->dev; in via_dmablit_timer()
465 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues); in via_dmablit_timer()
472 if (!timer_pending(&blitq->poll_timer)) { in via_dmablit_timer()
473 mod_timer(&blitq->poll_timer, jiffies + 1); in via_dmablit_timer()
498 drm_via_blitq_t *blitq = container_of(work, drm_via_blitq_t, wq); in via_dmablit_workqueue() local
499 struct drm_device *dev = blitq->dev; in via_dmablit_workqueue()
506 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues)); in via_dmablit_workqueue()
508 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
510 while (blitq->serviced != blitq->cur) { in via_dmablit_workqueue()
512 cur_released = blitq->serviced++; in via_dmablit_workqueue()
516 if (blitq->serviced >= VIA_NUM_BLIT_SLOTS) in via_dmablit_workqueue()
517 blitq->serviced = 0; in via_dmablit_workqueue()
519 cur_sg = blitq->blits[cur_released]; in via_dmablit_workqueue()
520 blitq->num_free++; in via_dmablit_workqueue()
522 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
524 DRM_WAKEUP(&blitq->busy_queue); in via_dmablit_workqueue()
529 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
532 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_workqueue()
546 drm_via_blitq_t *blitq; in via_init_dmablit() local
551 blitq = dev_priv->blit_queues + i; in via_init_dmablit()
552 blitq->dev = dev; in via_init_dmablit()
553 blitq->cur_blit_handle = 0; in via_init_dmablit()
554 blitq->done_blit_handle = 0; in via_init_dmablit()
555 blitq->head = 0; in via_init_dmablit()
556 blitq->cur = 0; in via_init_dmablit()
557 blitq->serviced = 0; in via_init_dmablit()
558 blitq->num_free = VIA_NUM_BLIT_SLOTS - 1; in via_init_dmablit()
559 blitq->num_outstanding = 0; in via_init_dmablit()
560 blitq->is_active = 0; in via_init_dmablit()
561 blitq->aborting = 0; in via_init_dmablit()
562 spin_lock_init(&blitq->blit_lock); in via_init_dmablit()
564 DRM_INIT_WAITQUEUE(blitq->blit_queue + j); in via_init_dmablit()
565 DRM_INIT_WAITQUEUE(&blitq->busy_queue); in via_init_dmablit()
566 INIT_WORK(&blitq->wq, via_dmablit_workqueue); in via_init_dmablit()
567 setup_timer(&blitq->poll_timer, via_dmablit_timer, in via_init_dmablit()
568 (unsigned long)blitq); in via_init_dmablit()
681 via_dmablit_grab_slot(drm_via_blitq_t *blitq, int engine) in via_dmablit_grab_slot() argument
686 DRM_DEBUG("Num free is %d\n", blitq->num_free); in via_dmablit_grab_slot()
687 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
688 while (blitq->num_free == 0) { in via_dmablit_grab_slot()
689 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
691 DRM_WAIT_ON(ret, blitq->busy_queue, DRM_HZ, blitq->num_free > 0); in via_dmablit_grab_slot()
695 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
698 blitq->num_free--; in via_dmablit_grab_slot()
699 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_grab_slot()
709 via_dmablit_release_slot(drm_via_blitq_t *blitq) in via_dmablit_release_slot() argument
713 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit_release_slot()
714 blitq->num_free++; in via_dmablit_release_slot()
715 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit_release_slot()
716 DRM_WAKEUP(&blitq->busy_queue); in via_dmablit_release_slot()
729 drm_via_blitq_t *blitq; in via_dmablit() local
740 blitq = dev_priv->blit_queues + engine; in via_dmablit()
741 if (0 != (ret = via_dmablit_grab_slot(blitq, engine))) in via_dmablit()
744 via_dmablit_release_slot(blitq); in via_dmablit()
748 via_dmablit_release_slot(blitq); in via_dmablit()
752 spin_lock_irqsave(&blitq->blit_lock, irqsave); in via_dmablit()
754 blitq->blits[blitq->head++] = vsg; in via_dmablit()
755 if (blitq->head >= VIA_NUM_BLIT_SLOTS) in via_dmablit()
756 blitq->head = 0; in via_dmablit()
757 blitq->num_outstanding++; in via_dmablit()
758 xfer->sync.sync_handle = ++blitq->cur_blit_handle; in via_dmablit()
760 spin_unlock_irqrestore(&blitq->blit_lock, irqsave); in via_dmablit()