summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_phys_booter.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-06 12:15:50 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-06 12:15:50 -0400
commita1f9d3f7b77e954a1a9ee36c7f787fe2083b544a (patch)
treec0f3fe61bacb4b20478ddd5d0bf63041a3f1aea8 /kernel/gsp_phys_booter.c
parent3f892b2924c0bdd15aaa04899b879601bd263981 (diff)
downloadopen-iov-a1f9d3f7b77e954a1a9ee36c7f787fe2083b544a.tar.gz
open-iov-a1f9d3f7b77e954a1a9ee36c7f787fe2083b544a.zip
vgsp: PRIV VA-only booking bit + verify the exact slot before consuming unreadable CE entries
- fwclient mask bit 15 (0x8000): book the PRIV_ACCESS_MAP VA (the FWCLIENT entry form is init-only; the golden9 form carries the VA at VA_GOLDEN9_PRIV). Accepted on V6 (status 0), completing the maximal promoted context. - gsp_sema_service: svc_entry_want_reached() verifies the exact tracking slot against entry_want before the three unreadable-CE consume shortcuts treat the entry as delivered; when the slot lags, re-seed the expectation and let svc_fake_release author or queue the exact slot (UVM registration stall pair with the pool-VA verified-resolver queue).
Diffstat (limited to 'kernel/gsp_phys_booter.c')
-rw-r--r--kernel/gsp_phys_booter.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index 3383b35..c049c44 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -701,6 +701,12 @@ bool gsp_phys_boot_requested(void)
*/
#define GSP_PHYS_RMCALL_FWCLIENT_MASK_FECS_PA_ONLY (1u << 13)
#define GSP_PHYS_RMCALL_FWCLIENT_MASK_FECS_VA_ONLY (1u << 14)
+/*
+ * Mode-25 bisection bit 15: book the PRIV_ACCESS_MAP VA (the FWCLIENT entry
+ * form is init-only with no VA, while the golden9 form is combined PA+VA at
+ * VA_GOLDEN9_PRIV). One VA-only booking entry, like the accepted globals.
+ */
+#define GSP_PHYS_RMCALL_FWCLIENT_MASK_PRIV_VA_ONLY (1u << 15)
#define GSP_PHYS_RMCALL_GR_PROMOTE_MAX \
(GSP_PHYS_RMCALL_GR_PROMOTE_GOLDEN_EXEC)
@@ -11079,6 +11085,27 @@ static int gsp_phys_rmcall_gr_ctx_promote(void __iomem *bar0)
GSP_PHYS_RMCALL_VA_GOLDEN9_FECS, status,
rpc_result, boot_stage.rmcall_channel);
}
+
+ /*
+ * Bit 15: the PRIV_ACCESS_MAP VA booking the FWCLIENT entry
+ * form omits (it is init-only with no VA). One VA-only entry.
+ */
+ if (mask & GSP_PHYS_RMCALL_FWCLIENT_MASK_PRIV_VA_ONLY) {
+ gsp_phys_rmcall_promote_entry_fill(p, 0, 10, 0,
+ GSP_PHYS_RMCALL_VA_GOLDEN9_PRIV, 0, 0, 0, 0);
+ p->entry_count = cpu_to_le32(1);
+ rpc_result = 0;
+ status = 0;
+ ret = gsp_phys_rmcall_control(bar0,
+ boot_stage.rmcall_subdevice,
+ GSP_PHYS_RMCALL_CTRL_GPU_PROMOTE_CTX,
+ p, sizeof(*p), 24, NULL, 0,
+ &rpc_result, &status,
+ "GPU_PROMOTE_CTX (PRIV VA-only)");
+ pr_info("vgsp-boot: rm-call: PROMOTE_CTX PRIV VA-only: bufferId=10 va=0x%llx status=0x%x rpc_result=0x%x (hObject=0x%x)\n",
+ GSP_PHYS_RMCALL_VA_GOLDEN9_PRIV, status,
+ rpc_result, boot_stage.rmcall_channel);
+ }
} else {
pr_err("vgsp-boot: rm-call: unknown gr_promote_param=%u reached the promote step; no PROMOTE_CTX is sent and the ladder aborts with no retry\n",
mode);