nouveau/gsp: use rpc sequence numbers properly.
authorDave Airlie <airlied@redhat.com>
Tue, 3 Feb 2026 05:21:11 +0000 (15:21 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 4 Feb 2026 02:17:34 +0000 (12:17 +1000)
There are two layers of sequence numbers, one at the msg level
and one at the rpc level.

570 firmware started asserting on the sequence numbers being
in the right order, and we would see nocat records with asserts
in them.

Add the rpc level sequence number support.

Fixes: 53dac0623853 ("drm/nouveau/gsp: add support for 570.144")
Cc: <stable@vger.kernel.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Tested-by: Lyude Paul <lyude@redhat.com>
Link: https://patch.msgid.link/20260203052431.2219998-2-airlied@gmail.com
drivers/gpu/drm/nouveau/include/nvkm/subdev/gsp.h
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rpc.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c

index b8b97e1..64fed20 100644 (file)
@@ -44,6 +44,9 @@ typedef void (*nvkm_gsp_event_func)(struct nvkm_gsp_event *, void *repv, u32 rep
  * NVKM_GSP_RPC_REPLY_NOWAIT - If specified, immediately return to the
  * caller after the GSP RPC command is issued.
  *
+ * NVKM_GSP_RPC_REPLY_NOSEQ - If specified, exactly like NOWAIT
+ * but don't emit RPC sequence number.
+ *
  * NVKM_GSP_RPC_REPLY_RECV - If specified, wait and receive the entire GSP
  * RPC message after the GSP RPC command is issued.
  *
@@ -53,6 +56,7 @@ typedef void (*nvkm_gsp_event_func)(struct nvkm_gsp_event *, void *repv, u32 rep
  */
 enum nvkm_gsp_rpc_reply_policy {
        NVKM_GSP_RPC_REPLY_NOWAIT = 0,
+       NVKM_GSP_RPC_REPLY_NOSEQ,
        NVKM_GSP_RPC_REPLY_RECV,
        NVKM_GSP_RPC_REPLY_POLL,
 };
@@ -242,6 +246,8 @@ struct nvkm_gsp {
        /* The size of the registry RPC */
        size_t registry_rpc_size;
 
+       u32 rpc_seq;
+
 #ifdef CONFIG_DEBUG_FS
        /*
         * Logging buffers in debugfs. The wrapper objects need to remain
index 2a7e80c..6e7af2f 100644 (file)
@@ -704,7 +704,7 @@ r535_gsp_rpc_set_registry(struct nvkm_gsp *gsp)
 
        build_registry(gsp, rpc);
 
-       return nvkm_gsp_rpc_wr(gsp, rpc, NVKM_GSP_RPC_REPLY_NOWAIT);
+       return nvkm_gsp_rpc_wr(gsp, rpc, NVKM_GSP_RPC_REPLY_NOSEQ);
 
 fail:
        clean_registry(gsp);
@@ -921,7 +921,7 @@ r535_gsp_set_system_info(struct nvkm_gsp *gsp)
        info->pciConfigMirrorSize = device->pci->func->cfg.size;
        r535_gsp_acpi_info(gsp, &info->acpiMethodData);
 
-       return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOWAIT);
+       return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOSEQ);
 }
 
 static int
index 0dc4782..3ca3de8 100644 (file)
@@ -557,6 +557,7 @@ r535_gsp_rpc_handle_reply(struct nvkm_gsp *gsp, u32 fn,
 
        switch (policy) {
        case NVKM_GSP_RPC_REPLY_NOWAIT:
+       case NVKM_GSP_RPC_REPLY_NOSEQ:
                break;
        case NVKM_GSP_RPC_REPLY_RECV:
                reply = r535_gsp_msg_recv(gsp, fn, gsp_rpc_len);
@@ -588,6 +589,11 @@ r535_gsp_rpc_send(struct nvkm_gsp *gsp, void *payload,
                               rpc->data, rpc->length - sizeof(*rpc), true);
        }
 
+       if (policy == NVKM_GSP_RPC_REPLY_NOSEQ)
+               rpc->sequence = 0;
+       else
+               rpc->sequence = gsp->rpc_seq++;
+
        ret = r535_gsp_cmdq_push(gsp, rpc);
        if (ret)
                return ERR_PTR(ret);
index 9d2fa4e..996941c 100644 (file)
@@ -176,7 +176,7 @@ r570_gsp_set_system_info(struct nvkm_gsp *gsp)
        info->bIsPrimary = video_is_primary_device(device->dev);
        info->bPreserveVideoMemoryAllocations = false;
 
-       return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOWAIT);
+       return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOSEQ);
 }
 
 static void