diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-05 22:28:15 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-05 22:28:15 -0400 |
| commit | 524ee34fc2e899aabb71fe9d6e71b0732627aa28 (patch) | |
| tree | 2069576e4b7fb7f671cfca4722ae80c70aa9afc0 /kernel/gsp_phys_booter.c | |
| parent | 2e443a7daa9c759f3a4d2bd36bc9ca9f0d84293c (diff) | |
| download | open-iov-524ee34fc2e899aabb71fe9d6e71b0732627aa28.tar.gz open-iov-524ee34fc2e899aabb71fe9d6e71b0732627aa28.zip | |
vgsp: mode 26 - full golden9 context promote on the V6 execution channel
Diffstat (limited to 'kernel/gsp_phys_booter.c')
| -rw-r--r-- | kernel/gsp_phys_booter.c | 64 |
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, |
