xref: /linux/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
1 /**************************************************************************
2  *
3  * Copyright © 2011-2014 VMware, Inc., Palo Alto, CA., USA
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27 
28 #include <drm/drmP.h>
29 #include "vmwgfx_drv.h"
30 
31 #define VMW_FENCE_WRAP (1 << 31)
32 
33 struct vmw_fence_manager {
34 	int num_fence_objects;
35 	struct vmw_private *dev_priv;
36 	spinlock_t lock;
37 	struct list_head fence_list;
38 	struct work_struct work;
39 	u32 user_fence_size;
40 	u32 fence_size;
41 	u32 event_fence_action_size;
42 	bool fifo_down;
43 	struct list_head cleanup_list;
44 	uint32_t pending_actions[VMW_ACTION_MAX];
45 	struct mutex goal_irq_mutex;
46 	bool goal_irq_on; /* Protected by @goal_irq_mutex */
47 	bool seqno_valid; /* Protected by @lock, and may not be set to true
48 			     without the @goal_irq_mutex held. */
49 	u64 ctx;
50 };
51 
52 struct vmw_user_fence {
53 	struct ttm_base_object base;
54 	struct vmw_fence_obj fence;
55 };
56 
57 /**
58  * struct vmw_event_fence_action - fence action that delivers a drm event.
59  *
60  * @e: A struct drm_pending_event that controls the event delivery.
61  * @action: A struct vmw_fence_action to hook up to a fence.
62  * @fence: A referenced pointer to the fence to keep it alive while @action
63  * hangs on it.
64  * @dev: Pointer to a struct drm_device so we can access the event stuff.
65  * @kref: Both @e and @action has destructors, so we need to refcount.
66  * @size: Size accounted for this object.
67  * @tv_sec: If non-null, the variable pointed to will be assigned
68  * current time tv_sec val when the fence signals.
69  * @tv_usec: Must be set if @tv_sec is set, and the variable pointed to will
70  * be assigned the current time tv_usec val when the fence signals.
71  */
72 struct vmw_event_fence_action {
73 	struct vmw_fence_action action;
74 
75 	struct drm_pending_event *event;
76 	struct vmw_fence_obj *fence;
77 	struct drm_device *dev;
78 
79 	uint32_t *tv_sec;
80 	uint32_t *tv_usec;
81 };
82 
83 static struct vmw_fence_manager *
84 fman_from_fence(struct vmw_fence_obj *fence)
85 {
86 	return container_of(fence->base.lock, struct vmw_fence_manager, lock);
87 }
88 
89 /**
90  * Note on fencing subsystem usage of irqs:
91  * Typically the vmw_fences_update function is called
92  *
93  * a) When a new fence seqno has been submitted by the fifo code.
94  * b) On-demand when we have waiters. Sleeping waiters will switch on the
95  * ANY_FENCE irq and call vmw_fences_update function each time an ANY_FENCE
96  * irq is received. When the last fence waiter is gone, that IRQ is masked
97  * away.
98  *
99  * In situations where there are no waiters and we don't submit any new fences,
100  * fence objects may not be signaled. This is perfectly OK, since there are
101  * no consumers of the signaled data, but that is NOT ok when there are fence
102  * actions attached to a fence. The fencing subsystem then makes use of the
103  * FENCE_GOAL irq and sets the fence goal seqno to that of the next fence
104  * which has an action attached, and each time vmw_fences_update is called,
105  * the subsystem makes sure the fence goal seqno is updated.
106  *
107  * The fence goal seqno irq is on as long as there are unsignaled fence
108  * objects with actions attached to them.
109  */
110 
111 static void vmw_fence_obj_destroy(struct dma_fence *f)
112 {
113 	struct vmw_fence_obj *fence =
114 		container_of(f, struct vmw_fence_obj, base);
115 
116 	struct vmw_fence_manager *fman = fman_from_fence(fence);
117 	unsigned long irq_flags;
118 
119 	spin_lock_irqsave(&fman->lock, irq_flags);
120 	list_del_init(&fence->head);
121 	--fman->num_fence_objects;
122 	spin_unlock_irqrestore(&fman->lock, irq_flags);
123 	fence->destroy(fence);
124 }
125 
126 static const char *vmw_fence_get_driver_name(struct dma_fence *f)
127 {
128 	return "vmwgfx";
129 }
130 
131 static const char *vmw_fence_get_timeline_name(struct dma_fence *f)
132 {
133 	return "svga";
134 }
135 
136 static bool vmw_fence_enable_signaling(struct dma_fence *f)
137 {
138 	struct vmw_fence_obj *fence =
139 		container_of(f, struct vmw_fence_obj, base);
140 
141 	struct vmw_fence_manager *fman = fman_from_fence(fence);
142 	struct vmw_private *dev_priv = fman->dev_priv;
143 
144 	u32 *fifo_mem = dev_priv->mmio_virt;
145 	u32 seqno = vmw_mmio_read(fifo_mem + SVGA_FIFO_FENCE);
146 	if (seqno - fence->base.seqno < VMW_FENCE_WRAP)
147 		return false;
148 
149 	vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
150 
151 	return true;
152 }
153 
154 struct vmwgfx_wait_cb {
155 	struct dma_fence_cb base;
156 	struct task_struct *task;
157 };
158 
159 static void
160 vmwgfx_wait_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
161 {
162 	struct vmwgfx_wait_cb *wait =
163 		container_of(cb, struct vmwgfx_wait_cb, base);
164 
165 	wake_up_process(wait->task);
166 }
167 
168 static void __vmw_fences_update(struct vmw_fence_manager *fman);
169 
170 static long vmw_fence_wait(struct dma_fence *f, bool intr, signed long timeout)
171 {
172 	struct vmw_fence_obj *fence =
173 		container_of(f, struct vmw_fence_obj, base);
174 
175 	struct vmw_fence_manager *fman = fman_from_fence(fence);
176 	struct vmw_private *dev_priv = fman->dev_priv;
177 	struct vmwgfx_wait_cb cb;
178 	long ret = timeout;
179 	unsigned long irq_flags;
180 
181 	if (likely(vmw_fence_obj_signaled(fence)))
182 		return timeout;
183 
184 	vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
185 	vmw_seqno_waiter_add(dev_priv);
186 
187 	spin_lock_irqsave(f->lock, irq_flags);
188 
189 	if (intr && signal_pending(current)) {
190 		ret = -ERESTARTSYS;
191 		goto out;
192 	}
193 
194 	cb.base.func = vmwgfx_wait_cb;
195 	cb.task = current;
196 	list_add(&cb.base.node, &f->cb_list);
197 
198 	while (ret > 0) {
199 		__vmw_fences_update(fman);
200 		if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &f->flags))
201 			break;
202 
203 		if (intr)
204 			__set_current_state(TASK_INTERRUPTIBLE);
205 		else
206 			__set_current_state(TASK_UNINTERRUPTIBLE);
207 		spin_unlock_irqrestore(f->lock, irq_flags);
208 
209 		ret = schedule_timeout(ret);
210 
211 		spin_lock_irqsave(f->lock, irq_flags);
212 		if (ret > 0 && intr && signal_pending(current))
213 			ret = -ERESTARTSYS;
214 	}
215 
216 	if (!list_empty(&cb.base.node))
217 		list_del(&cb.base.node);
218 	__set_current_state(TASK_RUNNING);
219 
220 out:
221 	spin_unlock_irqrestore(f->lock, irq_flags);
222 
223 	vmw_seqno_waiter_remove(dev_priv);
224 
225 	return ret;
226 }
227 
228 static struct dma_fence_ops vmw_fence_ops = {
229 	.get_driver_name = vmw_fence_get_driver_name,
230 	.get_timeline_name = vmw_fence_get_timeline_name,
231 	.enable_signaling = vmw_fence_enable_signaling,
232 	.wait = vmw_fence_wait,
233 	.release = vmw_fence_obj_destroy,
234 };
235 
236 
237 /**
238  * Execute signal actions on fences recently signaled.
239  * This is done from a workqueue so we don't have to execute
240  * signal actions from atomic context.
241  */
242 
243 static void vmw_fence_work_func(struct work_struct *work)
244 {
245 	struct vmw_fence_manager *fman =
246 		container_of(work, struct vmw_fence_manager, work);
247 	struct list_head list;
248 	struct vmw_fence_action *action, *next_action;
249 	bool seqno_valid;
250 
251 	do {
252 		INIT_LIST_HEAD(&list);
253 		mutex_lock(&fman->goal_irq_mutex);
254 
255 		spin_lock_irq(&fman->lock);
256 		list_splice_init(&fman->cleanup_list, &list);
257 		seqno_valid = fman->seqno_valid;
258 		spin_unlock_irq(&fman->lock);
259 
260 		if (!seqno_valid && fman->goal_irq_on) {
261 			fman->goal_irq_on = false;
262 			vmw_goal_waiter_remove(fman->dev_priv);
263 		}
264 		mutex_unlock(&fman->goal_irq_mutex);
265 
266 		if (list_empty(&list))
267 			return;
268 
269 		/*
270 		 * At this point, only we should be able to manipulate the
271 		 * list heads of the actions we have on the private list.
272 		 * hence fman::lock not held.
273 		 */
274 
275 		list_for_each_entry_safe(action, next_action, &list, head) {
276 			list_del_init(&action->head);
277 			if (action->cleanup)
278 				action->cleanup(action);
279 		}
280 	} while (1);
281 }
282 
283 struct vmw_fence_manager *vmw_fence_manager_init(struct vmw_private *dev_priv)
284 {
285 	struct vmw_fence_manager *fman = kzalloc(sizeof(*fman), GFP_KERNEL);
286 
287 	if (unlikely(fman == NULL))
288 		return NULL;
289 
290 	fman->dev_priv = dev_priv;
291 	spin_lock_init(&fman->lock);
292 	INIT_LIST_HEAD(&fman->fence_list);
293 	INIT_LIST_HEAD(&fman->cleanup_list);
294 	INIT_WORK(&fman->work, &vmw_fence_work_func);
295 	fman->fifo_down = true;
296 	fman->user_fence_size = ttm_round_pot(sizeof(struct vmw_user_fence));
297 	fman->fence_size = ttm_round_pot(sizeof(struct vmw_fence_obj));
298 	fman->event_fence_action_size =
299 		ttm_round_pot(sizeof(struct vmw_event_fence_action));
300 	mutex_init(&fman->goal_irq_mutex);
301 	fman->ctx = dma_fence_context_alloc(1);
302 
303 	return fman;
304 }
305 
306 void vmw_fence_manager_takedown(struct vmw_fence_manager *fman)
307 {
308 	unsigned long irq_flags;
309 	bool lists_empty;
310 
311 	(void) cancel_work_sync(&fman->work);
312 
313 	spin_lock_irqsave(&fman->lock, irq_flags);
314 	lists_empty = list_empty(&fman->fence_list) &&
315 		list_empty(&fman->cleanup_list);
316 	spin_unlock_irqrestore(&fman->lock, irq_flags);
317 
318 	BUG_ON(!lists_empty);
319 	kfree(fman);
320 }
321 
322 static int vmw_fence_obj_init(struct vmw_fence_manager *fman,
323 			      struct vmw_fence_obj *fence, u32 seqno,
324 			      void (*destroy) (struct vmw_fence_obj *fence))
325 {
326 	unsigned long irq_flags;
327 	int ret = 0;
328 
329 	dma_fence_init(&fence->base, &vmw_fence_ops, &fman->lock,
330 		       fman->ctx, seqno);
331 	INIT_LIST_HEAD(&fence->seq_passed_actions);
332 	fence->destroy = destroy;
333 
334 	spin_lock_irqsave(&fman->lock, irq_flags);
335 	if (unlikely(fman->fifo_down)) {
336 		ret = -EBUSY;
337 		goto out_unlock;
338 	}
339 	list_add_tail(&fence->head, &fman->fence_list);
340 	++fman->num_fence_objects;
341 
342 out_unlock:
343 	spin_unlock_irqrestore(&fman->lock, irq_flags);
344 	return ret;
345 
346 }
347 
348 static void vmw_fences_perform_actions(struct vmw_fence_manager *fman,
349 				struct list_head *list)
350 {
351 	struct vmw_fence_action *action, *next_action;
352 
353 	list_for_each_entry_safe(action, next_action, list, head) {
354 		list_del_init(&action->head);
355 		fman->pending_actions[action->type]--;
356 		if (action->seq_passed != NULL)
357 			action->seq_passed(action);
358 
359 		/*
360 		 * Add the cleanup action to the cleanup list so that
361 		 * it will be performed by a worker task.
362 		 */
363 
364 		list_add_tail(&action->head, &fman->cleanup_list);
365 	}
366 }
367 
368 /**
369  * vmw_fence_goal_new_locked - Figure out a new device fence goal
370  * seqno if needed.
371  *
372  * @fman: Pointer to a fence manager.
373  * @passed_seqno: The seqno the device currently signals as passed.
374  *
375  * This function should be called with the fence manager lock held.
376  * It is typically called when we have a new passed_seqno, and
377  * we might need to update the fence goal. It checks to see whether
378  * the current fence goal has already passed, and, in that case,
379  * scans through all unsignaled fences to get the next fence object with an
380  * action attached, and sets the seqno of that fence as a new fence goal.
381  *
382  * returns true if the device goal seqno was updated. False otherwise.
383  */
384 static bool vmw_fence_goal_new_locked(struct vmw_fence_manager *fman,
385 				      u32 passed_seqno)
386 {
387 	u32 goal_seqno;
388 	u32 *fifo_mem;
389 	struct vmw_fence_obj *fence;
390 
391 	if (likely(!fman->seqno_valid))
392 		return false;
393 
394 	fifo_mem = fman->dev_priv->mmio_virt;
395 	goal_seqno = vmw_mmio_read(fifo_mem + SVGA_FIFO_FENCE_GOAL);
396 	if (likely(passed_seqno - goal_seqno >= VMW_FENCE_WRAP))
397 		return false;
398 
399 	fman->seqno_valid = false;
400 	list_for_each_entry(fence, &fman->fence_list, head) {
401 		if (!list_empty(&fence->seq_passed_actions)) {
402 			fman->seqno_valid = true;
403 			vmw_mmio_write(fence->base.seqno,
404 				       fifo_mem + SVGA_FIFO_FENCE_GOAL);
405 			break;
406 		}
407 	}
408 
409 	return true;
410 }
411 
412 
413 /**
414  * vmw_fence_goal_check_locked - Replace the device fence goal seqno if
415  * needed.
416  *
417  * @fence: Pointer to a struct vmw_fence_obj the seqno of which should be
418  * considered as a device fence goal.
419  *
420  * This function should be called with the fence manager lock held.
421  * It is typically called when an action has been attached to a fence to
422  * check whether the seqno of that fence should be used for a fence
423  * goal interrupt. This is typically needed if the current fence goal is
424  * invalid, or has a higher seqno than that of the current fence object.
425  *
426  * returns true if the device goal seqno was updated. False otherwise.
427  */
428 static bool vmw_fence_goal_check_locked(struct vmw_fence_obj *fence)
429 {
430 	struct vmw_fence_manager *fman = fman_from_fence(fence);
431 	u32 goal_seqno;
432 	u32 *fifo_mem;
433 
434 	if (dma_fence_is_signaled_locked(&fence->base))
435 		return false;
436 
437 	fifo_mem = fman->dev_priv->mmio_virt;
438 	goal_seqno = vmw_mmio_read(fifo_mem + SVGA_FIFO_FENCE_GOAL);
439 	if (likely(fman->seqno_valid &&
440 		   goal_seqno - fence->base.seqno < VMW_FENCE_WRAP))
441 		return false;
442 
443 	vmw_mmio_write(fence->base.seqno, fifo_mem + SVGA_FIFO_FENCE_GOAL);
444 	fman->seqno_valid = true;
445 
446 	return true;
447 }
448 
449 static void __vmw_fences_update(struct vmw_fence_manager *fman)
450 {
451 	struct vmw_fence_obj *fence, *next_fence;
452 	struct list_head action_list;
453 	bool needs_rerun;
454 	uint32_t seqno, new_seqno;
455 	u32 *fifo_mem = fman->dev_priv->mmio_virt;
456 
457 	seqno = vmw_mmio_read(fifo_mem + SVGA_FIFO_FENCE);
458 rerun:
459 	list_for_each_entry_safe(fence, next_fence, &fman->fence_list, head) {
460 		if (seqno - fence->base.seqno < VMW_FENCE_WRAP) {
461 			list_del_init(&fence->head);
462 			dma_fence_signal_locked(&fence->base);
463 			INIT_LIST_HEAD(&action_list);
464 			list_splice_init(&fence->seq_passed_actions,
465 					 &action_list);
466 			vmw_fences_perform_actions(fman, &action_list);
467 		} else
468 			break;
469 	}
470 
471 	/*
472 	 * Rerun if the fence goal seqno was updated, and the
473 	 * hardware might have raced with that update, so that
474 	 * we missed a fence_goal irq.
475 	 */
476 
477 	needs_rerun = vmw_fence_goal_new_locked(fman, seqno);
478 	if (unlikely(needs_rerun)) {
479 		new_seqno = vmw_mmio_read(fifo_mem + SVGA_FIFO_FENCE);
480 		if (new_seqno != seqno) {
481 			seqno = new_seqno;
482 			goto rerun;
483 		}
484 	}
485 
486 	if (!list_empty(&fman->cleanup_list))
487 		(void) schedule_work(&fman->work);
488 }
489 
490 void vmw_fences_update(struct vmw_fence_manager *fman)
491 {
492 	unsigned long irq_flags;
493 
494 	spin_lock_irqsave(&fman->lock, irq_flags);
495 	__vmw_fences_update(fman);
496 	spin_unlock_irqrestore(&fman->lock, irq_flags);
497 }
498 
499 bool vmw_fence_obj_signaled(struct vmw_fence_obj *fence)
500 {
501 	struct vmw_fence_manager *fman = fman_from_fence(fence);
502 
503 	if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->base.flags))
504 		return 1;
505 
506 	vmw_fences_update(fman);
507 
508 	return dma_fence_is_signaled(&fence->base);
509 }
510 
511 int vmw_fence_obj_wait(struct vmw_fence_obj *fence, bool lazy,
512 		       bool interruptible, unsigned long timeout)
513 {
514 	long ret = dma_fence_wait_timeout(&fence->base, interruptible, timeout);
515 
516 	if (likely(ret > 0))
517 		return 0;
518 	else if (ret == 0)
519 		return -EBUSY;
520 	else
521 		return ret;
522 }
523 
524 void vmw_fence_obj_flush(struct vmw_fence_obj *fence)
525 {
526 	struct vmw_private *dev_priv = fman_from_fence(fence)->dev_priv;
527 
528 	vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
529 }
530 
531 static void vmw_fence_destroy(struct vmw_fence_obj *fence)
532 {
533 	dma_fence_free(&fence->base);
534 }
535 
536 int vmw_fence_create(struct vmw_fence_manager *fman,
537 		     uint32_t seqno,
538 		     struct vmw_fence_obj **p_fence)
539 {
540 	struct vmw_fence_obj *fence;
541  	int ret;
542 
543 	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
544 	if (unlikely(fence == NULL))
545 		return -ENOMEM;
546 
547 	ret = vmw_fence_obj_init(fman, fence, seqno,
548 				 vmw_fence_destroy);
549 	if (unlikely(ret != 0))
550 		goto out_err_init;
551 
552 	*p_fence = fence;
553 	return 0;
554 
555 out_err_init:
556 	kfree(fence);
557 	return ret;
558 }
559 
560 
561 static void vmw_user_fence_destroy(struct vmw_fence_obj *fence)
562 {
563 	struct vmw_user_fence *ufence =
564 		container_of(fence, struct vmw_user_fence, fence);
565 	struct vmw_fence_manager *fman = fman_from_fence(fence);
566 
567 	ttm_base_object_kfree(ufence, base);
568 	/*
569 	 * Free kernel space accounting.
570 	 */
571 	ttm_mem_global_free(vmw_mem_glob(fman->dev_priv),
572 			    fman->user_fence_size);
573 }
574 
575 static void vmw_user_fence_base_release(struct ttm_base_object **p_base)
576 {
577 	struct ttm_base_object *base = *p_base;
578 	struct vmw_user_fence *ufence =
579 		container_of(base, struct vmw_user_fence, base);
580 	struct vmw_fence_obj *fence = &ufence->fence;
581 
582 	*p_base = NULL;
583 	vmw_fence_obj_unreference(&fence);
584 }
585 
586 int vmw_user_fence_create(struct drm_file *file_priv,
587 			  struct vmw_fence_manager *fman,
588 			  uint32_t seqno,
589 			  struct vmw_fence_obj **p_fence,
590 			  uint32_t *p_handle)
591 {
592 	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
593 	struct vmw_user_fence *ufence;
594 	struct vmw_fence_obj *tmp;
595 	struct ttm_mem_global *mem_glob = vmw_mem_glob(fman->dev_priv);
596 	int ret;
597 
598 	/*
599 	 * Kernel memory space accounting, since this object may
600 	 * be created by a user-space request.
601 	 */
602 
603 	ret = ttm_mem_global_alloc(mem_glob, fman->user_fence_size,
604 				   false, false);
605 	if (unlikely(ret != 0))
606 		return ret;
607 
608 	ufence = kzalloc(sizeof(*ufence), GFP_KERNEL);
609 	if (unlikely(ufence == NULL)) {
610 		ret = -ENOMEM;
611 		goto out_no_object;
612 	}
613 
614 	ret = vmw_fence_obj_init(fman, &ufence->fence, seqno,
615 				 vmw_user_fence_destroy);
616 	if (unlikely(ret != 0)) {
617 		kfree(ufence);
618 		goto out_no_object;
619 	}
620 
621 	/*
622 	 * The base object holds a reference which is freed in
623 	 * vmw_user_fence_base_release.
624 	 */
625 	tmp = vmw_fence_obj_reference(&ufence->fence);
626 	ret = ttm_base_object_init(tfile, &ufence->base, false,
627 				   VMW_RES_FENCE,
628 				   &vmw_user_fence_base_release, NULL);
629 
630 
631 	if (unlikely(ret != 0)) {
632 		/*
633 		 * Free the base object's reference
634 		 */
635 		vmw_fence_obj_unreference(&tmp);
636 		goto out_err;
637 	}
638 
639 	*p_fence = &ufence->fence;
640 	*p_handle = ufence->base.hash.key;
641 
642 	return 0;
643 out_err:
644 	tmp = &ufence->fence;
645 	vmw_fence_obj_unreference(&tmp);
646 out_no_object:
647 	ttm_mem_global_free(mem_glob, fman->user_fence_size);
648 	return ret;
649 }
650 
651 
652 /**
653  * vmw_fence_fifo_down - signal all unsignaled fence objects.
654  */
655 
656 void vmw_fence_fifo_down(struct vmw_fence_manager *fman)
657 {
658 	struct list_head action_list;
659 	int ret;
660 
661 	/*
662 	 * The list may be altered while we traverse it, so always
663 	 * restart when we've released the fman->lock.
664 	 */
665 
666 	spin_lock_irq(&fman->lock);
667 	fman->fifo_down = true;
668 	while (!list_empty(&fman->fence_list)) {
669 		struct vmw_fence_obj *fence =
670 			list_entry(fman->fence_list.prev, struct vmw_fence_obj,
671 				   head);
672 		dma_fence_get(&fence->base);
673 		spin_unlock_irq(&fman->lock);
674 
675 		ret = vmw_fence_obj_wait(fence, false, false,
676 					 VMW_FENCE_WAIT_TIMEOUT);
677 
678 		if (unlikely(ret != 0)) {
679 			list_del_init(&fence->head);
680 			dma_fence_signal(&fence->base);
681 			INIT_LIST_HEAD(&action_list);
682 			list_splice_init(&fence->seq_passed_actions,
683 					 &action_list);
684 			vmw_fences_perform_actions(fman, &action_list);
685 		}
686 
687 		BUG_ON(!list_empty(&fence->head));
688 		dma_fence_put(&fence->base);
689 		spin_lock_irq(&fman->lock);
690 	}
691 	spin_unlock_irq(&fman->lock);
692 }
693 
694 void vmw_fence_fifo_up(struct vmw_fence_manager *fman)
695 {
696 	unsigned long irq_flags;
697 
698 	spin_lock_irqsave(&fman->lock, irq_flags);
699 	fman->fifo_down = false;
700 	spin_unlock_irqrestore(&fman->lock, irq_flags);
701 }
702 
703 
704 /**
705  * vmw_fence_obj_lookup - Look up a user-space fence object
706  *
707  * @tfile: A struct ttm_object_file identifying the caller.
708  * @handle: A handle identifying the fence object.
709  * @return: A struct vmw_user_fence base ttm object on success or
710  * an error pointer on failure.
711  *
712  * The fence object is looked up and type-checked. The caller needs
713  * to have opened the fence object first, but since that happens on
714  * creation and fence objects aren't shareable, that's not an
715  * issue currently.
716  */
717 static struct ttm_base_object *
718 vmw_fence_obj_lookup(struct ttm_object_file *tfile, u32 handle)
719 {
720 	struct ttm_base_object *base = ttm_base_object_lookup(tfile, handle);
721 
722 	if (!base) {
723 		pr_err("Invalid fence object handle 0x%08lx.\n",
724 		       (unsigned long)handle);
725 		return ERR_PTR(-EINVAL);
726 	}
727 
728 	if (base->refcount_release != vmw_user_fence_base_release) {
729 		pr_err("Invalid fence object handle 0x%08lx.\n",
730 		       (unsigned long)handle);
731 		ttm_base_object_unref(&base);
732 		return ERR_PTR(-EINVAL);
733 	}
734 
735 	return base;
736 }
737 
738 
739 int vmw_fence_obj_wait_ioctl(struct drm_device *dev, void *data,
740 			     struct drm_file *file_priv)
741 {
742 	struct drm_vmw_fence_wait_arg *arg =
743 	    (struct drm_vmw_fence_wait_arg *)data;
744 	unsigned long timeout;
745 	struct ttm_base_object *base;
746 	struct vmw_fence_obj *fence;
747 	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
748 	int ret;
749 	uint64_t wait_timeout = ((uint64_t)arg->timeout_us * HZ);
750 
751 	/*
752 	 * 64-bit division not present on 32-bit systems, so do an
753 	 * approximation. (Divide by 1000000).
754 	 */
755 
756 	wait_timeout = (wait_timeout >> 20) + (wait_timeout >> 24) -
757 	  (wait_timeout >> 26);
758 
759 	if (!arg->cookie_valid) {
760 		arg->cookie_valid = 1;
761 		arg->kernel_cookie = jiffies + wait_timeout;
762 	}
763 
764 	base = vmw_fence_obj_lookup(tfile, arg->handle);
765 	if (IS_ERR(base))
766 		return PTR_ERR(base);
767 
768 	fence = &(container_of(base, struct vmw_user_fence, base)->fence);
769 
770 	timeout = jiffies;
771 	if (time_after_eq(timeout, (unsigned long)arg->kernel_cookie)) {
772 		ret = ((vmw_fence_obj_signaled(fence)) ?
773 		       0 : -EBUSY);
774 		goto out;
775 	}
776 
777 	timeout = (unsigned long)arg->kernel_cookie - timeout;
778 
779 	ret = vmw_fence_obj_wait(fence, arg->lazy, true, timeout);
780 
781 out:
782 	ttm_base_object_unref(&base);
783 
784 	/*
785 	 * Optionally unref the fence object.
786 	 */
787 
788 	if (ret == 0 && (arg->wait_options & DRM_VMW_WAIT_OPTION_UNREF))
789 		return ttm_ref_object_base_unref(tfile, arg->handle,
790 						 TTM_REF_USAGE);
791 	return ret;
792 }
793 
794 int vmw_fence_obj_signaled_ioctl(struct drm_device *dev, void *data,
795 				 struct drm_file *file_priv)
796 {
797 	struct drm_vmw_fence_signaled_arg *arg =
798 		(struct drm_vmw_fence_signaled_arg *) data;
799 	struct ttm_base_object *base;
800 	struct vmw_fence_obj *fence;
801 	struct vmw_fence_manager *fman;
802 	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
803 	struct vmw_private *dev_priv = vmw_priv(dev);
804 
805 	base = vmw_fence_obj_lookup(tfile, arg->handle);
806 	if (IS_ERR(base))
807 		return PTR_ERR(base);
808 
809 	fence = &(container_of(base, struct vmw_user_fence, base)->fence);
810 	fman = fman_from_fence(fence);
811 
812 	arg->signaled = vmw_fence_obj_signaled(fence);
813 
814 	arg->signaled_flags = arg->flags;
815 	spin_lock_irq(&fman->lock);
816 	arg->passed_seqno = dev_priv->last_read_seqno;
817 	spin_unlock_irq(&fman->lock);
818 
819 	ttm_base_object_unref(&base);
820 
821 	return 0;
822 }
823 
824 
825 int vmw_fence_obj_unref_ioctl(struct drm_device *dev, void *data,
826 			      struct drm_file *file_priv)
827 {
828 	struct drm_vmw_fence_arg *arg =
829 		(struct drm_vmw_fence_arg *) data;
830 
831 	return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile,
832 					 arg->handle,
833 					 TTM_REF_USAGE);
834 }
835 
836 /**
837  * vmw_event_fence_action_seq_passed
838  *
839  * @action: The struct vmw_fence_action embedded in a struct
840  * vmw_event_fence_action.
841  *
842  * This function is called when the seqno of the fence where @action is
843  * attached has passed. It queues the event on the submitter's event list.
844  * This function is always called from atomic context, and may be called
845  * from irq context.
846  */
847 static void vmw_event_fence_action_seq_passed(struct vmw_fence_action *action)
848 {
849 	struct vmw_event_fence_action *eaction =
850 		container_of(action, struct vmw_event_fence_action, action);
851 	struct drm_device *dev = eaction->dev;
852 	struct drm_pending_event *event = eaction->event;
853 	struct drm_file *file_priv;
854 	unsigned long irq_flags;
855 
856 	if (unlikely(event == NULL))
857 		return;
858 
859 	file_priv = event->file_priv;
860 	spin_lock_irqsave(&dev->event_lock, irq_flags);
861 
862 	if (likely(eaction->tv_sec != NULL)) {
863 		struct timeval tv;
864 
865 		do_gettimeofday(&tv);
866 		*eaction->tv_sec = tv.tv_sec;
867 		*eaction->tv_usec = tv.tv_usec;
868 	}
869 
870 	drm_send_event_locked(dev, eaction->event);
871 	eaction->event = NULL;
872 	spin_unlock_irqrestore(&dev->event_lock, irq_flags);
873 }
874 
875 /**
876  * vmw_event_fence_action_cleanup
877  *
878  * @action: The struct vmw_fence_action embedded in a struct
879  * vmw_event_fence_action.
880  *
881  * This function is the struct vmw_fence_action destructor. It's typically
882  * called from a workqueue.
883  */
884 static void vmw_event_fence_action_cleanup(struct vmw_fence_action *action)
885 {
886 	struct vmw_event_fence_action *eaction =
887 		container_of(action, struct vmw_event_fence_action, action);
888 
889 	vmw_fence_obj_unreference(&eaction->fence);
890 	kfree(eaction);
891 }
892 
893 
894 /**
895  * vmw_fence_obj_add_action - Add an action to a fence object.
896  *
897  * @fence - The fence object.
898  * @action - The action to add.
899  *
900  * Note that the action callbacks may be executed before this function
901  * returns.
902  */
903 static void vmw_fence_obj_add_action(struct vmw_fence_obj *fence,
904 			      struct vmw_fence_action *action)
905 {
906 	struct vmw_fence_manager *fman = fman_from_fence(fence);
907 	unsigned long irq_flags;
908 	bool run_update = false;
909 
910 	mutex_lock(&fman->goal_irq_mutex);
911 	spin_lock_irqsave(&fman->lock, irq_flags);
912 
913 	fman->pending_actions[action->type]++;
914 	if (dma_fence_is_signaled_locked(&fence->base)) {
915 		struct list_head action_list;
916 
917 		INIT_LIST_HEAD(&action_list);
918 		list_add_tail(&action->head, &action_list);
919 		vmw_fences_perform_actions(fman, &action_list);
920 	} else {
921 		list_add_tail(&action->head, &fence->seq_passed_actions);
922 
923 		/*
924 		 * This function may set fman::seqno_valid, so it must
925 		 * be run with the goal_irq_mutex held.
926 		 */
927 		run_update = vmw_fence_goal_check_locked(fence);
928 	}
929 
930 	spin_unlock_irqrestore(&fman->lock, irq_flags);
931 
932 	if (run_update) {
933 		if (!fman->goal_irq_on) {
934 			fman->goal_irq_on = true;
935 			vmw_goal_waiter_add(fman->dev_priv);
936 		}
937 		vmw_fences_update(fman);
938 	}
939 	mutex_unlock(&fman->goal_irq_mutex);
940 
941 }
942 
943 /**
944  * vmw_event_fence_action_create - Post an event for sending when a fence
945  * object seqno has passed.
946  *
947  * @file_priv: The file connection on which the event should be posted.
948  * @fence: The fence object on which to post the event.
949  * @event: Event to be posted. This event should've been alloced
950  * using k[mz]alloc, and should've been completely initialized.
951  * @interruptible: Interruptible waits if possible.
952  *
953  * As a side effect, the object pointed to by @event may have been
954  * freed when this function returns. If this function returns with
955  * an error code, the caller needs to free that object.
956  */
957 
958 int vmw_event_fence_action_queue(struct drm_file *file_priv,
959 				 struct vmw_fence_obj *fence,
960 				 struct drm_pending_event *event,
961 				 uint32_t *tv_sec,
962 				 uint32_t *tv_usec,
963 				 bool interruptible)
964 {
965 	struct vmw_event_fence_action *eaction;
966 	struct vmw_fence_manager *fman = fman_from_fence(fence);
967 
968 	eaction = kzalloc(sizeof(*eaction), GFP_KERNEL);
969 	if (unlikely(eaction == NULL))
970 		return -ENOMEM;
971 
972 	eaction->event = event;
973 
974 	eaction->action.seq_passed = vmw_event_fence_action_seq_passed;
975 	eaction->action.cleanup = vmw_event_fence_action_cleanup;
976 	eaction->action.type = VMW_ACTION_EVENT;
977 
978 	eaction->fence = vmw_fence_obj_reference(fence);
979 	eaction->dev = fman->dev_priv->dev;
980 	eaction->tv_sec = tv_sec;
981 	eaction->tv_usec = tv_usec;
982 
983 	vmw_fence_obj_add_action(fence, &eaction->action);
984 
985 	return 0;
986 }
987 
988 struct vmw_event_fence_pending {
989 	struct drm_pending_event base;
990 	struct drm_vmw_event_fence event;
991 };
992 
993 static int vmw_event_fence_action_create(struct drm_file *file_priv,
994 				  struct vmw_fence_obj *fence,
995 				  uint32_t flags,
996 				  uint64_t user_data,
997 				  bool interruptible)
998 {
999 	struct vmw_event_fence_pending *event;
1000 	struct vmw_fence_manager *fman = fman_from_fence(fence);
1001 	struct drm_device *dev = fman->dev_priv->dev;
1002 	int ret;
1003 
1004 	event = kzalloc(sizeof(*event), GFP_KERNEL);
1005 	if (unlikely(event == NULL)) {
1006 		DRM_ERROR("Failed to allocate an event.\n");
1007 		ret = -ENOMEM;
1008 		goto out_no_space;
1009 	}
1010 
1011 	event->event.base.type = DRM_VMW_EVENT_FENCE_SIGNALED;
1012 	event->event.base.length = sizeof(*event);
1013 	event->event.user_data = user_data;
1014 
1015 	ret = drm_event_reserve_init(dev, file_priv, &event->base, &event->event.base);
1016 
1017 	if (unlikely(ret != 0)) {
1018 		DRM_ERROR("Failed to allocate event space for this file.\n");
1019 		kfree(event);
1020 		goto out_no_space;
1021 	}
1022 
1023 	if (flags & DRM_VMW_FE_FLAG_REQ_TIME)
1024 		ret = vmw_event_fence_action_queue(file_priv, fence,
1025 						   &event->base,
1026 						   &event->event.tv_sec,
1027 						   &event->event.tv_usec,
1028 						   interruptible);
1029 	else
1030 		ret = vmw_event_fence_action_queue(file_priv, fence,
1031 						   &event->base,
1032 						   NULL,
1033 						   NULL,
1034 						   interruptible);
1035 	if (ret != 0)
1036 		goto out_no_queue;
1037 
1038 	return 0;
1039 
1040 out_no_queue:
1041 	drm_event_cancel_free(dev, &event->base);
1042 out_no_space:
1043 	return ret;
1044 }
1045 
1046 int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
1047 			  struct drm_file *file_priv)
1048 {
1049 	struct vmw_private *dev_priv = vmw_priv(dev);
1050 	struct drm_vmw_fence_event_arg *arg =
1051 		(struct drm_vmw_fence_event_arg *) data;
1052 	struct vmw_fence_obj *fence = NULL;
1053 	struct vmw_fpriv *vmw_fp = vmw_fpriv(file_priv);
1054 	struct ttm_object_file *tfile = vmw_fp->tfile;
1055 	struct drm_vmw_fence_rep __user *user_fence_rep =
1056 		(struct drm_vmw_fence_rep __user *)(unsigned long)
1057 		arg->fence_rep;
1058 	uint32_t handle;
1059 	int ret;
1060 
1061 	/*
1062 	 * Look up an existing fence object,
1063 	 * and if user-space wants a new reference,
1064 	 * add one.
1065 	 */
1066 	if (arg->handle) {
1067 		struct ttm_base_object *base =
1068 			vmw_fence_obj_lookup(tfile, arg->handle);
1069 
1070 		if (IS_ERR(base))
1071 			return PTR_ERR(base);
1072 
1073 		fence = &(container_of(base, struct vmw_user_fence,
1074 				       base)->fence);
1075 		(void) vmw_fence_obj_reference(fence);
1076 
1077 		if (user_fence_rep != NULL) {
1078 			ret = ttm_ref_object_add(vmw_fp->tfile, base,
1079 						 TTM_REF_USAGE, NULL, false);
1080 			if (unlikely(ret != 0)) {
1081 				DRM_ERROR("Failed to reference a fence "
1082 					  "object.\n");
1083 				goto out_no_ref_obj;
1084 			}
1085 			handle = base->hash.key;
1086 		}
1087 		ttm_base_object_unref(&base);
1088 	}
1089 
1090 	/*
1091 	 * Create a new fence object.
1092 	 */
1093 	if (!fence) {
1094 		ret = vmw_execbuf_fence_commands(file_priv, dev_priv,
1095 						 &fence,
1096 						 (user_fence_rep) ?
1097 						 &handle : NULL);
1098 		if (unlikely(ret != 0)) {
1099 			DRM_ERROR("Fence event failed to create fence.\n");
1100 			return ret;
1101 		}
1102 	}
1103 
1104 	BUG_ON(fence == NULL);
1105 
1106 	ret = vmw_event_fence_action_create(file_priv, fence,
1107 					    arg->flags,
1108 					    arg->user_data,
1109 					    true);
1110 	if (unlikely(ret != 0)) {
1111 		if (ret != -ERESTARTSYS)
1112 			DRM_ERROR("Failed to attach event to fence.\n");
1113 		goto out_no_create;
1114 	}
1115 
1116 	vmw_execbuf_copy_fence_user(dev_priv, vmw_fp, 0, user_fence_rep, fence,
1117 				    handle);
1118 	vmw_fence_obj_unreference(&fence);
1119 	return 0;
1120 out_no_create:
1121 	if (user_fence_rep != NULL)
1122 		ttm_ref_object_base_unref(tfile, handle, TTM_REF_USAGE);
1123 out_no_ref_obj:
1124 	vmw_fence_obj_unreference(&fence);
1125 	return ret;
1126 }
1127