]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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 b8b97e10ae83ed058afb65db49b483ed64eeb9c3..64fed208e4cf8568805b5294e696d2d4d14104ef 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 2a7e80c6d70f391bccfcb7a58276dd95e1b2857e..6e7af2f737b746716ff9da903b0ac2e58d667dcc 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 0dc4782df8c0c117431508a450d14a5b6933a8b8..3ca3de8f434082d881675e49c6c08b2cdefdc60b 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 9d2fa4e66d5982103e8e0e8fb7c88e27ce4fab2e..996941c668ba9ed97099241531cd39ad7fdedda8 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