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