Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2c24b83 authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

drm/ttm: flip the switch, and convert to dma_fence

parent 2f453ed4
Loading
Loading
Loading
Loading
+6 −42
Original line number Diff line number Diff line
@@ -88,13 +88,13 @@ nv10_bo_get_tile_region(struct drm_device *dev, int i)

static void
nv10_bo_put_tile_region(struct drm_device *dev, struct nouveau_drm_tile *tile,
			struct nouveau_fence *fence)
			struct fence *fence)
{
	struct nouveau_drm *drm = nouveau_drm(dev);

	if (tile) {
		spin_lock(&drm->tile.lock);
		tile->fence = nouveau_fence_ref(fence);
		tile->fence = nouveau_fence_ref((struct nouveau_fence *)fence);
		tile->used = false;
		spin_unlock(&drm->tile.lock);
	}
@@ -976,7 +976,8 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
		if (ret == 0) {
			ret = nouveau_fence_new(chan, false, &fence);
			if (ret == 0) {
				ret = ttm_bo_move_accel_cleanup(bo, fence,
				ret = ttm_bo_move_accel_cleanup(bo,
								&fence->base,
								evict,
								no_wait_gpu,
								new_mem);
@@ -1167,8 +1168,9 @@ nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo,
{
	struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
	struct drm_device *dev = drm->dev;
	struct fence *fence = reservation_object_get_excl(bo->resv);

	nv10_bo_put_tile_region(dev, *old_tile, bo->sync_obj);
	nv10_bo_put_tile_region(dev, *old_tile, fence);
	*old_tile = new_tile;
}

@@ -1455,47 +1457,14 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm)
	ttm_pool_unpopulate(ttm);
}

static void
nouveau_bo_fence_unref(void **sync_obj)
{
	nouveau_fence_unref((struct nouveau_fence **)sync_obj);
}

void
nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence)
{
	struct reservation_object *resv = nvbo->bo.resv;

	nouveau_bo_fence_unref(&nvbo->bo.sync_obj);
	nvbo->bo.sync_obj = nouveau_fence_ref(fence);

	reservation_object_add_excl_fence(resv, &fence->base);
}

static void *
nouveau_bo_fence_ref(void *sync_obj)
{
	return nouveau_fence_ref(sync_obj);
}

static bool
nouveau_bo_fence_signalled(void *sync_obj)
{
	return nouveau_fence_done(sync_obj);
}

static int
nouveau_bo_fence_wait(void *sync_obj, bool lazy, bool intr)
{
	return nouveau_fence_wait(sync_obj, lazy, intr);
}

static int
nouveau_bo_fence_flush(void *sync_obj)
{
	return 0;
}

struct ttm_bo_driver nouveau_bo_driver = {
	.ttm_tt_create = &nouveau_ttm_tt_create,
	.ttm_tt_populate = &nouveau_ttm_tt_populate,
@@ -1506,11 +1475,6 @@ struct ttm_bo_driver nouveau_bo_driver = {
	.move_notify = nouveau_bo_move_ntfy,
	.move = nouveau_bo_move,
	.verify_access = nouveau_bo_verify_access,
	.sync_obj_signaled = nouveau_bo_fence_signalled,
	.sync_obj_wait = nouveau_bo_fence_wait,
	.sync_obj_flush = nouveau_bo_fence_flush,
	.sync_obj_unref = nouveau_bo_fence_unref,
	.sync_obj_ref = nouveau_bo_fence_ref,
	.fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
	.io_mem_reserve = &nouveau_ttm_io_mem_reserve,
	.io_mem_free = &nouveau_ttm_io_mem_free,
+8 −16
Original line number Diff line number Diff line
@@ -185,17 +185,18 @@ static void nouveau_fence_work_cb(struct fence *fence, struct fence_cb *cb)
}

void
nouveau_fence_work(struct nouveau_fence *fence,
nouveau_fence_work(struct fence *fence,
		   void (*func)(void *), void *data)
{
	struct nouveau_fence_work *work;

	if (fence_is_signaled(&fence->base))
	if (fence_is_signaled(fence))
		goto err;

	work = kmalloc(sizeof(*work), GFP_KERNEL);
	if (!work) {
		WARN_ON(nouveau_fence_wait(fence, false, false));
		WARN_ON(nouveau_fence_wait((struct nouveau_fence *)fence,
					   false, false));
		goto err;
	}

@@ -203,7 +204,7 @@ nouveau_fence_work(struct nouveau_fence *fence,
	work->func = func;
	work->data = data;

	if (fence_add_callback(&fence->base, &work->cb, nouveau_fence_work_cb) < 0)
	if (fence_add_callback(fence, &work->cb, nouveau_fence_work_cb) < 0)
		goto err_free;
	return;

@@ -349,14 +350,9 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan)
	struct reservation_object_list *fobj;
	int ret = 0, i;

	fence = nvbo->bo.sync_obj;
	if (fence && fence_is_signaled(fence)) {
		nouveau_fence_unref((struct nouveau_fence **)
				    &nvbo->bo.sync_obj);
		fence = NULL;
	}
	fence = reservation_object_get_excl(resv);

	if (fence) {
	if (fence && !fence_is_signaled(fence)) {
		struct nouveau_fence *f = from_fence(fence);
		struct nouveau_channel *prev = f->channel;

@@ -370,12 +366,8 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan)
	if (ret)
		return ret;

	fence = reservation_object_get_excl(resv);
	if (fence && !nouveau_local_fence(fence, chan->drm))
		ret = fence_wait(fence, true);

	fobj = reservation_object_get_list(resv);
	if (!fobj || ret)
	if (!fobj)
		return ret;

	for (i = 0; i < fobj->shared_count && !ret; ++i) {
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ void nouveau_fence_unref(struct nouveau_fence **);

int  nouveau_fence_emit(struct nouveau_fence *, struct nouveau_channel *);
bool nouveau_fence_done(struct nouveau_fence *);
void nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
void nouveau_fence_work(struct fence *, void (*)(void *), void *);
int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *);

+9 −7
Original line number Diff line number Diff line
@@ -98,13 +98,12 @@ static void
nouveau_gem_object_unmap(struct nouveau_bo *nvbo, struct nouveau_vma *vma)
{
	const bool mapped = nvbo->bo.mem.mem_type != TTM_PL_SYSTEM;
	struct nouveau_fence *fence = NULL;
	struct fence *fence = NULL;

	list_del(&vma->head);

	if (mapped) {
		fence = nouveau_fence_ref(nvbo->bo.sync_obj);
	}
	if (mapped)
		fence = reservation_object_get_excl(nvbo->bo.resv);

	if (fence) {
		nouveau_fence_work(fence, nouveau_gem_object_delete, vma);
@@ -114,7 +113,6 @@ nouveau_gem_object_unmap(struct nouveau_bo *nvbo, struct nouveau_vma *vma)
		nouveau_vm_put(vma);
		kfree(vma);
	}
	nouveau_fence_unref(&fence);
}

void
@@ -874,8 +872,12 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data,
	ret = ttm_bo_reserve(&nvbo->bo, true, false, false, NULL);
	if (!ret) {
		ret = ttm_bo_wait(&nvbo->bo, true, true, true);
		if (!no_wait && ret)
			fence = nouveau_fence_ref(nvbo->bo.sync_obj);
		if (!no_wait && ret) {
			struct fence *excl;

			excl = reservation_object_get_excl(nvbo->bo.resv);
			fence = nouveau_fence_ref((struct nouveau_fence *)excl);
		}

		ttm_bo_unreserve(&nvbo->bo);
	}
+3 −3
Original line number Diff line number Diff line
@@ -67,9 +67,9 @@ qxl_debugfs_buffers_info(struct seq_file *m, void *data)
		rel = fobj ? fobj->shared_count : 0;
		rcu_read_unlock();

		seq_printf(m, "size %ld, pc %d, sync obj %p, num releases %d\n",
			   (unsigned long)bo->gem_base.size, bo->pin_count,
			   bo->tbo.sync_obj, rel);
		seq_printf(m, "size %ld, pc %d, num releases %d\n",
			   (unsigned long)bo->gem_base.size,
			   bo->pin_count, rel);
	}
	spin_unlock(&qdev->release_lock);
	return 0;
Loading