diff --git a/src/asahi/genxml/cmdbuf.xml b/src/asahi/genxml/cmdbuf.xml
index d83a17cc343..85e5973ccbf 100644
--- a/src/asahi/genxml/cmdbuf.xml
+++ b/src/asahi/genxml/cmdbuf.xml
@@ -984,6 +984,7 @@
+
@@ -1065,6 +1066,7 @@
+
@@ -1072,6 +1074,10 @@
+
+
+
+
diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c
index cf44dc78e06..6ded648fbc0 100644
--- a/src/asahi/lib/decode.c
+++ b/src/asahi/lib/decode.c
@@ -569,7 +569,7 @@ agxdecode_cdm(struct agxdecode_ctx *ctx, const uint8_t *map, uint64_t *link,
agx_unpack(agxdecode_dump_stream, map, CDM_STREAM_LINK, hdr);
DUMP_UNPACKED(CDM_STREAM_LINK, hdr, "Stream Link\n");
*link = hdr.target_lo | (((uint64_t)hdr.target_hi) << 32);
- return STATE_LINK;
+ return hdr.with_return ? STATE_CALL : STATE_LINK;
}
case AGX_CDM_BLOCK_TYPE_STREAM_TERMINATE: {
@@ -577,6 +577,11 @@ agxdecode_cdm(struct agxdecode_ctx *ctx, const uint8_t *map, uint64_t *link,
return STATE_DONE;
}
+ case AGX_CDM_BLOCK_TYPE_STREAM_RETURN: {
+ DUMP_CL(CDM_STREAM_RETURN, map, "Stream Return");
+ return STATE_RET;
+ }
+
case AGX_CDM_BLOCK_TYPE_BARRIER: {
DUMP_CL(CDM_BARRIER, map, "Barrier");
return AGX_CDM_BARRIER_LENGTH;