]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/nouveau/gsp: add hal for fifo.rc_triggered()
authorBen Skeggs <bskeggs@nvidia.com>
Thu, 14 Nov 2024 03:02:39 +0000 (13:02 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 18 May 2025 20:29:26 +0000 (06:29 +1000)
565.57.01 has incompatible changes to rpc_rc_triggered_v17_02.

Signed-off-by: Ben Skeggs <bskeggs@nvidia.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Timur Tabi <ttabi@nvidia.com>
Tested-by: Timur Tabi <ttabi@nvidia.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h

index a480c1a5686d4270381063d6a44a0eb9acf6cf3e..1561b5a9b6fc3d91029c97df741c8fee4c6dc843 100644 (file)
@@ -339,6 +339,39 @@ r535_runl = {
        .allow = r535_runl_allow,
 };
 
+static void
+r535_fifo_rc_chid(struct nvkm_fifo *fifo, int chid)
+{
+       struct nvkm_chan *chan;
+       unsigned long flags;
+
+       chan = nvkm_chan_get_chid(&fifo->engine, chid, &flags);
+       if (!chan) {
+               nvkm_error(&fifo->engine.subdev, "rc: chid %d not found!\n", chid);
+               return;
+       }
+
+       nvkm_chan_error(chan, false);
+       nvkm_chan_put(&chan, flags);
+}
+
+static int
+r535_fifo_rc_triggered(void *priv, u32 fn, void *repv, u32 repc)
+{
+       rpc_rc_triggered_v17_02 *msg = repv;
+       struct nvkm_gsp *gsp = priv;
+
+       if (WARN_ON(repc < sizeof(*msg)))
+               return -EINVAL;
+
+       nvkm_error(&gsp->subdev, "rc: engn:%08x chid:%d type:%d scope:%d part:%d\n",
+                  msg->nv2080EngineType, msg->chid, msg->exceptType, msg->scope,
+                  msg->partitionAttributionId);
+
+       r535_fifo_rc_chid(gsp->subdev.device->fifo, msg->chid);
+       return 0;
+}
+
 static int
 r535_fifo_xlat_rm_engine_type(u32 rm, enum nvkm_subdev_type *ptype, int *p2080)
 {
@@ -558,6 +591,7 @@ const struct nvkm_rm_api_fifo
 r535_fifo = {
        .xlat_rm_engine_type = r535_fifo_xlat_rm_engine_type,
        .ectx_size = r535_fifo_ectx_size,
+       .rc_triggered = r535_fifo_rc_triggered,
        .chan = {
                .alloc = r535_chan_alloc,
        },
index 64e9ecf93441917912b7de0a6bdf67b8d0eed85f..b7c2a785bc58b4fda94267658d57a257364b995e 100644 (file)
@@ -926,33 +926,6 @@ r535_gsp_msg_os_error_log(void *priv, u32 fn, void *repv, u32 repc)
        return 0;
 }
 
-static int
-r535_gsp_msg_rc_triggered(void *priv, u32 fn, void *repv, u32 repc)
-{
-       rpc_rc_triggered_v17_02 *msg = repv;
-       struct nvkm_gsp *gsp = priv;
-       struct nvkm_subdev *subdev = &gsp->subdev;
-       struct nvkm_chan *chan;
-       unsigned long flags;
-
-       if (WARN_ON(repc < sizeof(*msg)))
-               return -EINVAL;
-
-       nvkm_error(subdev, "rc engn:%08x chid:%d type:%d scope:%d part:%d\n",
-                  msg->nv2080EngineType, msg->chid, msg->exceptType, msg->scope,
-                  msg->partitionAttributionId);
-
-       chan = nvkm_chan_get_chid(&subdev->device->fifo->engine, msg->chid, &flags);
-       if (!chan) {
-               nvkm_error(subdev, "rc chid:%d not found!\n", msg->chid);
-               return 0;
-       }
-
-       nvkm_chan_error(chan, false);
-       nvkm_chan_put(&chan, flags);
-       return 0;
-}
-
 static int
 r535_gsp_msg_mmu_fault_queued(void *priv, u32 fn, void *repv, u32 repc)
 {
@@ -2154,8 +2127,7 @@ r535_gsp_oneinit(struct nvkm_gsp *gsp)
        r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_GSP_RUN_CPU_SEQUENCER,
                              r535_gsp_msg_run_cpu_sequencer, gsp);
        r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_POST_EVENT, r535_gsp_msg_post_event, gsp);
-       r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_RC_TRIGGERED,
-                             r535_gsp_msg_rc_triggered, gsp);
+       r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_RC_TRIGGERED, rmapi->fifo->rc_triggered, gsp);
        r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_MMU_FAULT_QUEUED,
                              r535_gsp_msg_mmu_fault_queued, gsp);
        r535_gsp_msg_ntfy_add(gsp, NV_VGPU_MSG_EVENT_OS_ERROR_LOG, r535_gsp_msg_os_error_log, gsp);
index a370beda3c716cf0b215b6107c7660169dc449be..1ca5b025eeb4552aa03cb29925a35f25208ccfc1 100644 (file)
@@ -102,6 +102,7 @@ struct nvkm_rm_api {
                                           enum nvkm_subdev_type *, int *nv2080_type);
                int (*ectx_size)(struct nvkm_fifo *);
                unsigned rsvd_chids;
+               int (*rc_triggered)(void *priv, u32 fn, void *repv, u32 repc);
                struct {
                        int (*alloc)(struct nvkm_gsp_device *, u32 handle,
                                     u32 nv2080_engine_type, u8 runq, bool priv, int chid,