nouveau: add ioctl wrapper to check for dead channels
authorKarol Herbst <kherbst@redhat.com>
Tue, 3 Aug 2021 17:29:04 +0000 (19:29 +0200)
committerKarol Herbst <kherbst@redhat.com>
Tue, 3 May 2022 11:23:30 +0000 (11:23 +0000)
v2: explicitly set nr_push to 0 as well

Signed-off-by: Karol Herbst <kherbst@redhat.com>
nouveau/nouveau-symbols.txt
nouveau/nouveau.h
nouveau/pushbuf.c

index ef8032f..598465f 100644 (file)
@@ -12,6 +12,7 @@ nouveau_bufctx_mthd
 nouveau_bufctx_new
 nouveau_bufctx_refn
 nouveau_bufctx_reset
+nouveau_check_dead_channel
 nouveau_client_del
 nouveau_client_new
 nouveau_device_del
index 335ce77..0c632fe 100644 (file)
@@ -273,4 +273,8 @@ struct nv04_notify {
        uint32_t offset;
        uint32_t length;
 };
+
+bool
+nouveau_check_dead_channel(struct nouveau_drm *, struct nouveau_object *chan);
+
 #endif
index 5fadd7a..5d54f21 100644 (file)
@@ -782,3 +782,19 @@ nouveau_pushbuf_kick(struct nouveau_pushbuf *push, struct nouveau_object *chan)
        pushbuf_flush(push);
        return pushbuf_validate(push, false);
 }
+
+drm_public bool
+nouveau_check_dead_channel(struct nouveau_drm *drm, struct nouveau_object *chan)
+{
+       struct drm_nouveau_gem_pushbuf req = {};
+       struct nouveau_fifo *fifo = chan->data;
+       int ret;
+
+       req.channel = fifo->channel;
+       req.nr_push = 0;
+
+       ret = drmCommandWriteRead(drm->fd, DRM_NOUVEAU_GEM_PUSHBUF,
+                                 &req, sizeof(req));
+       /* nouveau returns ENODEV once the channel was killed */
+       return ret == -ENODEV;
+}