summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-05 22:28:15 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-05 22:28:15 -0400
commit524ee34fc2e899aabb71fe9d6e71b0732627aa28 (patch)
tree2069576e4b7fb7f671cfca4722ae80c70aa9afc0 /kernel
parent2e443a7daa9c759f3a4d2bd36bc9ca9f0d84293c (diff)
downloadopen-iov-524ee34fc2e899aabb71fe9d6e71b0732627aa28.tar.gz
open-iov-524ee34fc2e899aabb71fe9d6e71b0732627aa28.zip
vgsp: mode 26 - full golden9 context promote on the V6 execution channel
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_phys_booter.c64
1 files changed, 51 insertions, 13 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index 26f297d..e3805ca 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -598,6 +598,16 @@ bool gsp_phys_boot_requested(void)
*/
#define GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 25u
/*
+ * Mode 26 (2026-10-05, experiment): mode 25's golden construct plus the
+ * SAME nine-entry, sized-buffer GPU_PROMOTE_CTX on the ladder's V6
+ * execution channel (boot_stage.rmcall_channel) instead of only its
+ * one-entry FWCLIENT MAIN, so the channel the forwarded launch actually
+ * runs on carries the full golden context set. Hypothesis under test: the
+ * engine never processes the V6 channel's compute methods because its
+ * committed context is incomplete (PATCH/FECS/PRIV/UNR absent).
+ */
+#define GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6 26u
+/*
* Existing fwclient mask bit 8: mode-25 gate for the captured VAS
* COPY_SERVER_RESERVED_PDES control. The captured control copies three
* server-RM-internal page-table levels the ladder cannot source safely, so
@@ -624,7 +634,7 @@ bool gsp_phys_boot_requested(void)
*/
#define GSP_PHYS_RMCALL_GOLDEN9_MASK_SIZED_BUFFERS (1u << 10)
#define GSP_PHYS_RMCALL_GR_PROMOTE_MAX \
- (GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9)
+ (GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6)
/*
* Work-submit token notifier slot. The default index is
@@ -8078,8 +8088,10 @@ static int gsp_phys_rmcall_golden_replay(void __iomem *bar0)
* the PTETABLE_HEAP_MANAGED golden VAS and skips the walker install
* (refused 0x1f on a client-managed VAS).
*/
- if (boot_stage.rmcall_gr_promote ==
- GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 &&
+ if ((boot_stage.rmcall_gr_promote ==
+ GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 ||
+ boot_stage.rmcall_gr_promote ==
+ GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6) &&
gsp_phys_rmcall_engine_is_gr()) {
if (gsp_phys_rmcall_fwclient_mask_value() &
GSP_PHYS_RMCALL_GOLDEN9_MASK_LADDER_VAS) {
@@ -8178,8 +8190,10 @@ static int gsp_phys_rmcall_golden_replay(void __iomem *bar0)
* allocations (FBMEM in the capture); the ladder substitutes the
* registered host sysmem chunks and documents the deviation.
*/
- if (boot_stage.rmcall_gr_promote ==
- GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 &&
+ if ((boot_stage.rmcall_gr_promote ==
+ GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 ||
+ boot_stage.rmcall_gr_promote ==
+ GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6) &&
gsp_phys_rmcall_engine_is_gr()) {
ch.flags = cpu_to_le32(GSP_PHYS_RMCALL_CHANNEL_FLAG_GOLDEN9);
ch.internal_flags = cpu_to_le32(
@@ -8260,8 +8274,10 @@ static int gsp_phys_rmcall_golden_replay(void __iomem *bar0)
* no follow-up promote; the golden VAS/channel/3D objects stay alive
* for the ladder's own V6 FWCLIENT follow-on promote.
*/
- if (boot_stage.rmcall_gr_promote ==
- GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 &&
+ if ((boot_stage.rmcall_gr_promote ==
+ GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 ||
+ boot_stage.rmcall_gr_promote ==
+ GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6) &&
gsp_phys_rmcall_engine_is_gr()) {
ret = gsp_phys_rmcall_golden9_promote(bar0);
if (ret)
@@ -9437,7 +9453,8 @@ static void gsp_phys_rmcall_gr_fwclient_small_prepare(void)
* present; a short set or a rejected control aborts the whole replay with no
* retry and never a partial accept followed by another promote.
*/
-static int gsp_phys_rmcall_golden9_promote(void __iomem *bar0)
+static int gsp_phys_rmcall_golden9_promote_on(void __iomem *bar0,
+ u32 h_channel)
{
struct gsp_phys_rmcall_promote_params *p;
u32 attr = GSP_PHYS_RMCALL_GR_CTX_PHYS_ATTR;
@@ -9480,7 +9497,7 @@ static int gsp_phys_rmcall_golden9_promote(void __iomem *bar0)
p->h_client = cpu_to_le32(0);
p->ch_id = cpu_to_le32(0);
p->h_chan_client = cpu_to_le32(boot_stage.rmcall_client);
- p->h_object = cpu_to_le32(GSP_PHYS_RMCALL_HANDLE_GOLDEN_CHANNEL);
+ p->h_object = cpu_to_le32(h_channel);
p->entry_count = cpu_to_le32(9);
gsp_phys_rmcall_promote_entry_fill(p, 0,
@@ -9533,8 +9550,8 @@ static int gsp_phys_rmcall_golden9_promote(void __iomem *bar0)
GSP_PHYS_RMCALL_CTRL_GPU_PROMOTE_CTX,
p, sizeof(*p), 24, NULL, 0, &rpc_result, &status,
"GPU_PROMOTE_CTX (golden9, 9 entries, atomic)");
- pr_info("vgsp-boot: rm-call: PROMOTE_CTX golden9: entryCount=9 status=0x%x rpc_result=0x%x (hObject=golden channel 0x%x hChanClient=0x%x engineType=0x%x MAIN pa=0x%llx va=0x%llx size=0x%x; gr_promote_param=%u)\n",
- status, rpc_result, GSP_PHYS_RMCALL_HANDLE_GOLDEN_CHANNEL,
+ pr_info("vgsp-boot: rm-call: PROMOTE_CTX golden9: entryCount=9 status=0x%x rpc_result=0x%x (hObject=0x%x hChanClient=0x%x engineType=0x%x MAIN pa=0x%llx va=0x%llx size=0x%x; gr_promote_param=%u)\n",
+ status, rpc_result, h_channel,
boot_stage.rmcall_client, GSP_PHYS_RMCALL_ENGINE_GR0,
boot_stage.rmcall_ctx_pa, boot_stage.rmcall_ctx_va,
boot_stage.rmcall_ctx_size,
@@ -9551,6 +9568,12 @@ static int gsp_phys_rmcall_golden9_promote(void __iomem *bar0)
return 0;
}
+static int gsp_phys_rmcall_golden9_promote(void __iomem *bar0)
+{
+ return gsp_phys_rmcall_golden9_promote_on(bar0,
+ GSP_PHYS_RMCALL_HANDLE_GOLDEN_CHANNEL);
+}
+
/*
* Fill one MAIN promote entry with the prepared PA/VA and the snapshot's
* entry size. initialize/nonmapped carry the bisection shape: modes 1/3/5
@@ -10433,7 +10456,8 @@ static int gsp_phys_rmcall_gr_ctx_promote(void __iomem *bar0)
}
boot_stage.rmcall_gr_promote_step = 1;
} else if (mode == GSP_PHYS_RMCALL_GR_PROMOTE_FWCLIENT ||
- mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9) {
+ mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 ||
+ mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6) {
/*
* Mode 24: the reference FWCLIENT non-3D set as ONE control.
* Order and bufferIds follow kgrobjGetPromoteIds_FWCLIENT
@@ -10523,7 +10547,21 @@ static int gsp_phys_rmcall_gr_ctx_promote(void __iomem *bar0)
}
}
- if (mask & BIT(0)) {
+ if (mask & BIT(0) &&
+ mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6) {
+ /*
+ * Mode 26: the full golden9 set on the execution
+ * channel (V6) - the hypothesis test for the engine
+ * never processing the forwarded launch.
+ */
+ ret = gsp_phys_rmcall_golden9_promote_on(
+ bar0, boot_stage.rmcall_channel);
+ if (ret) {
+ kvfree(p);
+ return ret;
+ }
+ boot_stage.rmcall_gr_promote_step = 1;
+ } else if (mask & BIT(0)) {
if (mask & BIT(6)) {
gsp_phys_rmcall_promote_entry_fill(p, 0,
GSP_PHYS_RMCALL_GR_CTX_BUFFER_ID_MAIN,