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

Commit 264ce192 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nv84-/fence: prepare for emit/sync support of sysram sequences



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 827520ce
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -561,7 +561,7 @@ nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan,
	struct nouveau_fence *fence = NULL;
	int ret;

	ret = nouveau_fence_new(chan, &fence);
	ret = nouveau_fence_new(chan, false, &fence);
	if (ret)
		return ret;

+1 −1
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ nouveau_channel_idle(struct nouveau_channel *chan)
	struct nouveau_fence *fence = NULL;
	int ret;

	ret = nouveau_fence_new(chan, &fence);
	ret = nouveau_fence_new(chan, false, &fence);
	if (!ret) {
		ret = nouveau_fence_wait(fence, false, false);
		nouveau_fence_unref(&fence);
+1 −1
Original line number Diff line number Diff line
@@ -540,7 +540,7 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
	}
	FIRE_RING (chan);

	ret = nouveau_fence_new(chan, pfence);
	ret = nouveau_fence_new(chan, false, pfence);
	if (ret)
		goto fail;

+4 −5
Original line number Diff line number Diff line
@@ -41,8 +41,6 @@ nouveau_fence_context_del(struct nouveau_fence_chan *fctx)
	struct nouveau_fence *fence, *fnext;
	spin_lock(&fctx->lock);
	list_for_each_entry_safe(fence, fnext, &fctx->pending, head) {
		if (fence->work)
			fence->work(fence->priv, false);
		fence->channel = NULL;
		list_del(&fence->head);
		nouveau_fence_unref(&fence);
@@ -69,8 +67,6 @@ nouveau_fence_update(struct nouveau_channel *chan)
		if (fctx->read(chan) < fence->sequence)
			break;

		if (fence->work)
			fence->work(fence->priv, true);
		fence->channel = NULL;
		list_del(&fence->head);
		nouveau_fence_unref(&fence);
@@ -256,7 +252,8 @@ nouveau_fence_ref(struct nouveau_fence *fence)
}

int
nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **pfence)
nouveau_fence_new(struct nouveau_channel *chan, bool sysmem,
		  struct nouveau_fence **pfence)
{
	struct nouveau_fence *fence;
	int ret = 0;
@@ -267,6 +264,8 @@ nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **pfence)
	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
	if (!fence)
		return -ENOMEM;

	fence->sysmem = sysmem;
	kref_init(&fence->kref);

	ret = nouveau_fence_emit(fence, chan);
+6 −12
Original line number Diff line number Diff line
@@ -7,15 +7,15 @@ struct nouveau_fence {
	struct list_head head;
	struct kref kref;

	bool sysmem;

	struct nouveau_channel *channel;
	unsigned long timeout;
	u32 sequence;

	void (*work)(void *priv, bool signalled);
	void *priv;
};

int  nouveau_fence_new(struct nouveau_channel *, struct nouveau_fence **);
int  nouveau_fence_new(struct nouveau_channel *, bool sysmem,
		       struct nouveau_fence **);
struct nouveau_fence *
nouveau_fence_ref(struct nouveau_fence *);
void nouveau_fence_unref(struct nouveau_fence **);
@@ -79,24 +79,18 @@ int nouveau_flip_complete(void *chan);
struct nv84_fence_chan {
	struct nouveau_fence_chan base;
	struct nouveau_vma vma;
	struct nouveau_vma vma_gart;
	struct nouveau_vma dispc_vma[4];
};

struct nv84_fence_priv {
	struct nouveau_fence_priv base;
	struct nouveau_bo *bo;
	struct nouveau_bo *bo_gart;
	u32 *suspend;
};

u64  nv84_fence_crtc(struct nouveau_channel *, int);
int  nv84_fence_emit(struct nouveau_fence *);
int  nv84_fence_sync(struct nouveau_fence *, struct nouveau_channel *,
		     struct nouveau_channel *);
u32  nv84_fence_read(struct nouveau_channel *);
int  nv84_fence_context_new(struct nouveau_channel *);
void nv84_fence_context_del(struct nouveau_channel *);
bool nv84_fence_suspend(struct nouveau_drm *);
void nv84_fence_resume(struct nouveau_drm *);
void nv84_fence_destroy(struct nouveau_drm *);

#endif
Loading