|
@@ -90,6 +90,31 @@ nvkm_fifo_chan_chid(struct nvkm_fifo *fifo, int chid, unsigned long *rflags)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+void
|
|
|
+nvkm_fifo_kevent(struct nvkm_fifo *fifo, int chid)
|
|
|
+{
|
|
|
+ nvkm_event_send(&fifo->kevent, 1, chid, NULL, 0);
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+nvkm_fifo_kevent_ctor(struct nvkm_object *object, void *data, u32 size,
|
|
|
+ struct nvkm_notify *notify)
|
|
|
+{
|
|
|
+ struct nvkm_fifo_chan *chan = nvkm_fifo_chan(object);
|
|
|
+ if (size == 0) {
|
|
|
+ notify->size = 0;
|
|
|
+ notify->types = 1;
|
|
|
+ notify->index = chan->chid;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return -ENOSYS;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct nvkm_event_func
|
|
|
+nvkm_fifo_kevent_func = {
|
|
|
+ .ctor = nvkm_fifo_kevent_ctor,
|
|
|
+};
|
|
|
+
|
|
|
static int
|
|
|
nvkm_fifo_cevent_ctor(struct nvkm_object *object, void *data, u32 size,
|
|
|
struct nvkm_notify *notify)
|
|
@@ -247,6 +272,7 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
|
|
|
void *data = fifo;
|
|
|
if (fifo->func->dtor)
|
|
|
data = fifo->func->dtor(fifo);
|
|
|
+ nvkm_event_fini(&fifo->kevent);
|
|
|
nvkm_event_fini(&fifo->cevent);
|
|
|
nvkm_event_fini(&fifo->uevent);
|
|
|
return data;
|
|
@@ -289,5 +315,9 @@ nvkm_fifo_ctor(const struct nvkm_fifo_func *func, struct nvkm_device *device,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- return nvkm_event_init(&nvkm_fifo_cevent_func, 1, 1, &fifo->cevent);
|
|
|
+ ret = nvkm_event_init(&nvkm_fifo_cevent_func, 1, 1, &fifo->cevent);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ return nvkm_event_init(&nvkm_fifo_kevent_func, 1, nr, &fifo->kevent);
|
|
|
}
|