Lines Matching full:fman

128 	struct vmw_fence_manager *fman = fman_from_fence(fence);  in vmw_fence_obj_destroy()  local
130 spin_lock(&fman->lock); in vmw_fence_obj_destroy()
132 --fman->num_fence_objects; in vmw_fence_obj_destroy()
133 spin_unlock(&fman->lock); in vmw_fence_obj_destroy()
152 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_fence_enable_signaling() local
153 struct vmw_private *dev_priv = fman->dev_priv; in vmw_fence_enable_signaling()
176 static void __vmw_fences_update(struct vmw_fence_manager *fman);
183 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_fence_wait() local
184 struct vmw_private *dev_priv = fman->dev_priv; in vmw_fence_wait()
208 __vmw_fences_update(fman); in vmw_fence_wait()
269 struct vmw_fence_manager *fman = in vmw_fence_work_func() local
277 mutex_lock(&fman->goal_irq_mutex); in vmw_fence_work_func()
279 spin_lock(&fman->lock); in vmw_fence_work_func()
280 list_splice_init(&fman->cleanup_list, &list); in vmw_fence_work_func()
281 seqno_valid = fman->seqno_valid; in vmw_fence_work_func()
282 spin_unlock(&fman->lock); in vmw_fence_work_func()
284 if (!seqno_valid && fman->goal_irq_on) { in vmw_fence_work_func()
285 fman->goal_irq_on = false; in vmw_fence_work_func()
286 vmw_goal_waiter_remove(fman->dev_priv); in vmw_fence_work_func()
288 mutex_unlock(&fman->goal_irq_mutex); in vmw_fence_work_func()
296 * hence fman::lock not held. in vmw_fence_work_func()
309 struct vmw_fence_manager *fman = kzalloc(sizeof(*fman), GFP_KERNEL); in vmw_fence_manager_init() local
311 if (unlikely(!fman)) in vmw_fence_manager_init()
314 fman->dev_priv = dev_priv; in vmw_fence_manager_init()
315 spin_lock_init(&fman->lock); in vmw_fence_manager_init()
316 INIT_LIST_HEAD(&fman->fence_list); in vmw_fence_manager_init()
317 INIT_LIST_HEAD(&fman->cleanup_list); in vmw_fence_manager_init()
318 INIT_WORK(&fman->work, &vmw_fence_work_func); in vmw_fence_manager_init()
319 fman->fifo_down = true; in vmw_fence_manager_init()
320 mutex_init(&fman->goal_irq_mutex); in vmw_fence_manager_init()
321 fman->ctx = dma_fence_context_alloc(1); in vmw_fence_manager_init()
323 return fman; in vmw_fence_manager_init()
326 void vmw_fence_manager_takedown(struct vmw_fence_manager *fman) in vmw_fence_manager_takedown() argument
330 (void) cancel_work_sync(&fman->work); in vmw_fence_manager_takedown()
332 spin_lock(&fman->lock); in vmw_fence_manager_takedown()
333 lists_empty = list_empty(&fman->fence_list) && in vmw_fence_manager_takedown()
334 list_empty(&fman->cleanup_list); in vmw_fence_manager_takedown()
335 spin_unlock(&fman->lock); in vmw_fence_manager_takedown()
338 kfree(fman); in vmw_fence_manager_takedown()
341 static int vmw_fence_obj_init(struct vmw_fence_manager *fman, in vmw_fence_obj_init() argument
347 dma_fence_init(&fence->base, &vmw_fence_ops, &fman->lock, in vmw_fence_obj_init()
348 fman->ctx, seqno); in vmw_fence_obj_init()
352 spin_lock(&fman->lock); in vmw_fence_obj_init()
353 if (unlikely(fman->fifo_down)) { in vmw_fence_obj_init()
357 list_add_tail(&fence->head, &fman->fence_list); in vmw_fence_obj_init()
358 ++fman->num_fence_objects; in vmw_fence_obj_init()
361 spin_unlock(&fman->lock); in vmw_fence_obj_init()
366 static void vmw_fences_perform_actions(struct vmw_fence_manager *fman, in vmw_fences_perform_actions() argument
373 fman->pending_actions[action->type]--; in vmw_fences_perform_actions()
382 list_add_tail(&action->head, &fman->cleanup_list); in vmw_fences_perform_actions()
390 * @fman: Pointer to a fence manager.
402 static bool vmw_fence_goal_new_locked(struct vmw_fence_manager *fman, in vmw_fence_goal_new_locked() argument
408 if (likely(!fman->seqno_valid)) in vmw_fence_goal_new_locked()
411 goal_seqno = vmw_fence_goal_read(fman->dev_priv); in vmw_fence_goal_new_locked()
415 fman->seqno_valid = false; in vmw_fence_goal_new_locked()
416 list_for_each_entry(fence, &fman->fence_list, head) { in vmw_fence_goal_new_locked()
418 fman->seqno_valid = true; in vmw_fence_goal_new_locked()
419 vmw_fence_goal_write(fman->dev_priv, in vmw_fence_goal_new_locked()
446 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_fence_goal_check_locked() local
452 goal_seqno = vmw_fence_goal_read(fman->dev_priv); in vmw_fence_goal_check_locked()
453 if (likely(fman->seqno_valid && in vmw_fence_goal_check_locked()
457 vmw_fence_goal_write(fman->dev_priv, fence->base.seqno); in vmw_fence_goal_check_locked()
458 fman->seqno_valid = true; in vmw_fence_goal_check_locked()
463 static void __vmw_fences_update(struct vmw_fence_manager *fman) in __vmw_fences_update() argument
470 seqno = vmw_fence_read(fman->dev_priv); in __vmw_fences_update()
472 list_for_each_entry_safe(fence, next_fence, &fman->fence_list, head) { in __vmw_fences_update()
479 vmw_fences_perform_actions(fman, &action_list); in __vmw_fences_update()
490 needs_rerun = vmw_fence_goal_new_locked(fman, seqno); in __vmw_fences_update()
492 new_seqno = vmw_fence_read(fman->dev_priv); in __vmw_fences_update()
499 if (!list_empty(&fman->cleanup_list)) in __vmw_fences_update()
500 (void) schedule_work(&fman->work); in __vmw_fences_update()
503 void vmw_fences_update(struct vmw_fence_manager *fman) in vmw_fences_update() argument
505 spin_lock(&fman->lock); in vmw_fences_update()
506 __vmw_fences_update(fman); in vmw_fences_update()
507 spin_unlock(&fman->lock); in vmw_fences_update()
512 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_fence_obj_signaled() local
517 vmw_fences_update(fman); in vmw_fence_obj_signaled()
540 int vmw_fence_create(struct vmw_fence_manager *fman, in vmw_fence_create() argument
551 ret = vmw_fence_obj_init(fman, fence, seqno, in vmw_fence_create()
585 struct vmw_fence_manager *fman, in vmw_user_fence_create() argument
601 ret = vmw_fence_obj_init(fman, &ufence->fence, seqno, in vmw_user_fence_create()
642 void vmw_fence_fifo_down(struct vmw_fence_manager *fman) in vmw_fence_fifo_down() argument
649 * restart when we've released the fman->lock. in vmw_fence_fifo_down()
652 spin_lock(&fman->lock); in vmw_fence_fifo_down()
653 fman->fifo_down = true; in vmw_fence_fifo_down()
654 while (!list_empty(&fman->fence_list)) { in vmw_fence_fifo_down()
656 list_entry(fman->fence_list.prev, struct vmw_fence_obj, in vmw_fence_fifo_down()
659 spin_unlock(&fman->lock); in vmw_fence_fifo_down()
670 vmw_fences_perform_actions(fman, &action_list); in vmw_fence_fifo_down()
675 spin_lock(&fman->lock); in vmw_fence_fifo_down()
677 spin_unlock(&fman->lock); in vmw_fence_fifo_down()
680 void vmw_fence_fifo_up(struct vmw_fence_manager *fman) in vmw_fence_fifo_up() argument
682 spin_lock(&fman->lock); in vmw_fence_fifo_up()
683 fman->fifo_down = false; in vmw_fence_fifo_up()
684 spin_unlock(&fman->lock); in vmw_fence_fifo_up()
784 struct vmw_fence_manager *fman; in vmw_fence_obj_signaled_ioctl() local
793 fman = fman_from_fence(fence); in vmw_fence_obj_signaled_ioctl()
798 spin_lock(&fman->lock); in vmw_fence_obj_signaled_ioctl()
800 spin_unlock(&fman->lock); in vmw_fence_obj_signaled_ioctl()
885 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_fence_obj_add_action() local
888 mutex_lock(&fman->goal_irq_mutex); in vmw_fence_obj_add_action()
889 spin_lock(&fman->lock); in vmw_fence_obj_add_action()
891 fman->pending_actions[action->type]++; in vmw_fence_obj_add_action()
897 vmw_fences_perform_actions(fman, &action_list); in vmw_fence_obj_add_action()
902 * This function may set fman::seqno_valid, so it must in vmw_fence_obj_add_action()
908 spin_unlock(&fman->lock); in vmw_fence_obj_add_action()
911 if (!fman->goal_irq_on) { in vmw_fence_obj_add_action()
912 fman->goal_irq_on = true; in vmw_fence_obj_add_action()
913 vmw_goal_waiter_add(fman->dev_priv); in vmw_fence_obj_add_action()
915 vmw_fences_update(fman); in vmw_fence_obj_add_action()
917 mutex_unlock(&fman->goal_irq_mutex); in vmw_fence_obj_add_action()
948 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_event_fence_action_queue() local
961 eaction->dev = &fman->dev_priv->drm; in vmw_event_fence_action_queue()
982 struct vmw_fence_manager *fman = fman_from_fence(fence); in vmw_event_fence_action_create() local
983 struct drm_device *dev = &fman->dev_priv->drm; in vmw_event_fence_action_create()