diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-06 12:15:50 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-06 12:15:50 -0400 |
| commit | a1f9d3f7b77e954a1a9ee36c7f787fe2083b544a (patch) | |
| tree | c0f3fe61bacb4b20478ddd5d0bf63041a3f1aea8 /kernel/gsp_phys_booter.c | |
| parent | 3f892b2924c0bdd15aaa04899b879601bd263981 (diff) | |
| download | open-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.c | 27 |
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); |
