diff options
| -rw-r--r-- | kernel/gsp_phys_booter.c | 33 | ||||
| -rw-r--r-- | kernel/gsp_phys_gpu.c | 4 |
2 files changed, 29 insertions, 8 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index badf14f..913f1c8 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -608,6 +608,16 @@ bool gsp_phys_boot_requested(void) */ #define GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6 26u /* + * Mode 27 (2026-10-06, experiment): mode 25's golden construct (buffers + * prepared, golden channel allocated) but WITHOUT the golden channel's own + * 9-entry promote; the single atomic 9-entry promote targets the V6 + * execution channel instead. Mode 26's assert (0x52a8674) may have been the + * double binding of the same context buffers to two channels; with the + * golden channel promote skipped, the entries are bound to V6 for the first + * time. + */ +#define GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY 27u +/* * 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 @@ -634,7 +644,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_V6) + (GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY) /* * Work-submit token notifier slot. The default index is @@ -7463,6 +7473,10 @@ static const char *gsp_phys_rmcall_gr_promote_name(void) return "reference FWCLIENT non-3D set (MAIN/PM/PATCH/FECS_EVENT/PRIV_ACCESS_MAP/UNRESTRICTED_PRIV_ACCESS_MAP) on V6"; case GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9: return "real golden-client construct on the golden handles (captured channel 0x00200320 + single atomic 9-entry PROMOTE_CTX) then the V6 FWCLIENT follow-on promote"; + case GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6: + return "mode 26: golden9 9-entry promote on the V6 execution channel (plus the golden-channel promote)"; + case GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY: + return "mode 27: golden9 9-entry promote on the V6 execution channel only (no golden-channel promote)"; default: return "off (PROMOTE_CTX never sent)"; } @@ -8091,7 +8105,9 @@ static int gsp_phys_rmcall_golden_replay(void __iomem *bar0) 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_GR_PROMOTE_GOLDEN9_V6 || + boot_stage.rmcall_gr_promote == + GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY) && gsp_phys_rmcall_engine_is_gr()) { if (gsp_phys_rmcall_fwclient_mask_value() & GSP_PHYS_RMCALL_GOLDEN9_MASK_LADDER_VAS) { @@ -8193,7 +8209,9 @@ static int gsp_phys_rmcall_golden_replay(void __iomem *bar0) 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_GR_PROMOTE_GOLDEN9_V6 || + boot_stage.rmcall_gr_promote == + GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY) && gsp_phys_rmcall_engine_is_gr()) { ch.flags = cpu_to_le32(GSP_PHYS_RMCALL_CHANNEL_FLAG_GOLDEN9); ch.internal_flags = cpu_to_le32( @@ -9750,9 +9768,11 @@ static int gsp_phys_rmcall_gr_ctx_promote(void __iomem *bar0) * ran, so the follow-on FWCLIENT promote would have no golden-initialized * GR-instance state to consume. Abort instead of sending it blind. */ - if (mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 && + if ((mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9 || + mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY) && (!gsp_phys_rmcall_golden_enabled() || !gsp_phys_gpu_enabled())) { - pr_err("vgsp-boot: rm-call: mode 25 requires gsp_phys_rmcall_golden=1 and gsp_phys_gpu=1 (the golden replay did not run); no PROMOTE_CTX is sent and the ladder aborts with no retry\n"); + pr_err("vgsp-boot: rm-call: mode %u requires gsp_phys_rmcall_golden=1 and gsp_phys_gpu=1 (the golden replay did not run); no PROMOTE_CTX is sent and the ladder aborts with no retry\n", + mode); return -EINVAL; } /* @@ -10548,7 +10568,8 @@ static int gsp_phys_rmcall_gr_ctx_promote(void __iomem *bar0) } if (mask & BIT(0) && - mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6) { + (mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6 || + mode == GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN9_V6_ONLY)) { /* * Mode 26: the full golden9 set on the execution * channel (V6) - the hypothesis test for the engine diff --git a/kernel/gsp_phys_gpu.c b/kernel/gsp_phys_gpu.c index 21313a2..fa008a6 100644 --- a/kernel/gsp_phys_gpu.c +++ b/kernel/gsp_phys_gpu.c @@ -511,8 +511,8 @@ static int gsp_phys_rmcall_gr_promote_set(const char *val, return ret; if (gsp_phys_rmcall_gr_promote_param < 0 || - gsp_phys_rmcall_gr_promote_param > 25) { - pr_warn("vgsp: gsp_phys_rmcall_gr_promote=%d is outside 0..25; clamping to 0 (no PROMOTE_CTX)\n", + gsp_phys_rmcall_gr_promote_param > 27) { + pr_warn("vgsp: gsp_phys_rmcall_gr_promote=%d is outside 0..27; clamping to 0 (no PROMOTE_CTX)\n", gsp_phys_rmcall_gr_promote_param); gsp_phys_rmcall_gr_promote_param = 0; } |
