summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_phys_booter.c34
-rw-r--r--kernel/gsp_phys_gpu.c19
-rw-r--r--kernel/gsp_phys_gpu.h7
3 files changed, 60 insertions, 0 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index fae657c..3a65361 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -7249,6 +7249,40 @@ static int gsp_phys_rmcall_alloc_channel(void __iomem *bar0)
vars = &gsp_phys_rmcall_channel_variants[0];
attempts = 1;
}
+ /*
+ * Optional explicit force (gsp_phys_rmcall_channel=N): pin the walk to
+ * one variant after the mode-based selection so a bisection can pair
+ * any promote shape with any channel shape (e.g. V6 skip-ctxbuffer +
+ * the srvctx VA-only promote).
+ */
+ if (gsp_phys_rmcall_engine_is_gr() &&
+ gsp_phys_rmcall_channel_value() != 0) {
+ u32 force = (u32)gsp_phys_rmcall_channel_value();
+ u32 j;
+ bool found = false;
+
+ for (j = 0; j < ARRAY_SIZE(gsp_phys_rmcall_channel_variants);
+ j++) {
+ if (gsp_phys_rmcall_channel_variants[j].id != force)
+ continue;
+ vars = &gsp_phys_rmcall_channel_variants[j];
+ found = true;
+ break;
+ }
+ if (!found &&
+ gsp_phys_rmcall_channel_variant_skipctx.id == force) {
+ vars = &gsp_phys_rmcall_channel_variant_skipctx;
+ found = true;
+ }
+ if (!found) {
+ pr_err("vgsp-boot: rm-call: gsp_phys_rmcall_channel=%u is not a known variant id (1/3/4/5/6); aborting the ladder\n",
+ force);
+ return -EINVAL;
+ }
+ attempts = 1;
+ pr_info("vgsp-boot: rm-call: gsp_phys_rmcall_channel=%u forces channel variant V%u (%s) alone\n",
+ force, vars[0].id, vars[0].name);
+ }
ret = -EIO;
for (i = 0; i < attempts; i++) {
diff --git a/kernel/gsp_phys_gpu.c b/kernel/gsp_phys_gpu.c
index 94d6652..54fa84a 100644
--- a/kernel/gsp_phys_gpu.c
+++ b/kernel/gsp_phys_gpu.c
@@ -201,6 +201,25 @@ bool gsp_phys_srv_ctxcommit_value(void)
EXPORT_SYMBOL_GPL(gsp_phys_srv_ctxcommit_value);
/*
+ * Force one channel-alloc variant id on the GR ladder (default 0 = the
+ * promote-mode-selected default). 5 = V5 (client memdescs, no skip-ctxbuffer;
+ * the server books its managed engine context), 6 = V6 (SKIP_CTXBUFFER_ALLOC,
+ * KMD-managed: the server skips the ctx-buffer map/book, so a client VA-only
+ * promote can add and commit the engine context VA).
+ */
+static int gsp_phys_rmcall_channel_param;
+module_param_named(gsp_phys_rmcall_channel, gsp_phys_rmcall_channel_param,
+ int, 0644);
+MODULE_PARM_DESC(gsp_phys_rmcall_channel,
+ "Force one GR channel-alloc variant id (1/3/4/5/6); 0 = mode-selected default walk");
+
+int gsp_phys_rmcall_channel_value(void)
+{
+ return gsp_phys_rmcall_channel_param;
+}
+EXPORT_SYMBOL_GPL(gsp_phys_rmcall_channel_value);
+
+/*
* P5 wave-1 shadow work forwarding (default 0). When set, the sema service
* requests one real CE copy on the debugfs ladder's channel for each decoded
* guest CE push, using only the ladder's module-owned buffers; the software
diff --git a/kernel/gsp_phys_gpu.h b/kernel/gsp_phys_gpu.h
index a270df8..925bfb2 100644
--- a/kernel/gsp_phys_gpu.h
+++ b/kernel/gsp_phys_gpu.h
@@ -90,6 +90,13 @@ bool gsp_phys_srv_ctxbuf_value(void);
bool gsp_phys_srv_ctxcommit_value(void);
/*
+ * gsp_phys_rmcall_channel: force one channel-alloc variant id on the GR
+ * ladder (0 = the promote-mode-selected default). 5 = V5 (client memdescs,
+ * no skip-ctxbuffer), 6 = V6 (SKIP_CTXBUFFER_ALLOC, KMD-managed ctx).
+ */
+int gsp_phys_rmcall_channel_value(void);
+
+/*
* True when the gsp_phys_work_forward module parameter is set (default 0: the
* guest's CE pushes stay software-emulated exactly as before). When set, the
* sema service shadows each decoded CE push as one copy on the debugfs ladder's