summaryrefslogtreecommitdiffstats
path: root/kernel/main.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-12 14:55:25 -0500
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-12 14:55:25 -0500
commit10c043a669fed5340eb953a17e341a35a4bce1b5 (patch)
treeb4fc5a197bd4ce7518ffe5356d420a0e9809caab /kernel/main.c
parent6260daa1eb66094e86a1d02128b97708242074e8 (diff)
downloadopen-iov-10c043a669fed5340eb953a17e341a35a4bce1b5.tar.gz
open-iov-10c043a669fed5340eb953a17e341a35a4bce1b5.zip
vgsp: direct-GL ring/push rescue, VAS/pdb scanners and PTIMER tick; r1780 cycle tooling
Diffstat (limited to 'kernel/main.c')
-rw-r--r--kernel/main.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/kernel/main.c b/kernel/main.c
index e17840a..cb296f6 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -2637,6 +2637,87 @@ MODULE_PARM_DESC(sema_scrubbuf_add,
"Register the PMA scrubber finish/host-sema PAs (hex fin,hex hsem)");
/*
+ * r1780 (V34): bounded page-directory scan for a content-verified pair:
+ * echo 0x<va>,0x<pa>[,0x<h_vas>[,0x<ram_lim>]] > .../parameters/sema_pdb_scan
+ * Walks every 4 KB candidate root in the FB shadow (then optional guest
+ * RAM) for `va` and registers the root that reproduces `pa` under `h_vas`.
+ */
+static int nv_vgpu_sema_pdb_scan_set(const char *val,
+ const struct kernel_param *kp)
+{
+ char buf[80];
+ char *fields[4] = { NULL };
+ u64 v[4] = { 0 };
+ int nf = 0, i;
+ char *p;
+
+ strscpy(buf, val, sizeof(buf));
+ p = buf;
+ for (i = 0; i < 4 && p; i++) {
+ fields[nf++] = p;
+ p = strchr(p, ',');
+ if (p)
+ *p++ = '\0';
+ }
+ for (i = 0; i < nf; i++)
+ if (kstrtoull(fields[i], 0, &v[i]))
+ return -EINVAL;
+ if (nf < 2)
+ return -EINVAL;
+ return gsp_sema_service_pdb_scan(v[0], v[1],
+ nf > 2 ? (u32)v[2] : 0xbeef0300u,
+ nf > 3 ? v[3] : 0);
+}
+
+static const struct kernel_param_ops nv_vgpu_sema_pdb_scan_ops = {
+ .set = nv_vgpu_sema_pdb_scan_set,
+};
+
+module_param_cb(sema_pdb_scan, &nv_vgpu_sema_pdb_scan_ops, NULL, 0200);
+MODULE_PARM_DESC(sema_pdb_scan,
+ "Scan FB/RAM roots for a content-verified VA->PA pair and register the VAS");
+
+/*
+ * r1780 (V34): direct VAS registration:
+ * echo 0x<h_vas>,0x<pdb>[,<entries>[,<vidmem>]] > .../parameters/sema_vas_force
+ */
+static int nv_vgpu_sema_vas_force_set(const char *val,
+ const struct kernel_param *kp)
+{
+ char buf[80];
+ char *fields[4] = { NULL };
+ u64 v[4] = { 0 };
+ int nf = 0, i;
+ char *p;
+
+ strscpy(buf, val, sizeof(buf));
+ p = buf;
+ for (i = 0; i < 4 && p; i++) {
+ fields[nf++] = p;
+ p = strchr(p, ',');
+ if (p)
+ *p++ = '\0';
+ }
+ for (i = 0; i < nf; i++)
+ if (kstrtoull(fields[i], 0, &v[i]))
+ return -EINVAL;
+ if (nf < 2 || !v[0] || !v[1])
+ return -EINVAL;
+ gsp_sema_service_vas_force((u32)v[0], v[1],
+ nf > 2 ? (u32)v[2] : 4u,
+ nf > 3 ? !!v[3] : false);
+ return 0;
+}
+
+static const struct kernel_param_ops nv_vgpu_sema_vas_force_ops = {
+ .set = nv_vgpu_sema_vas_force_set,
+};
+
+module_param_cb(sema_vas_force, &nv_vgpu_sema_vas_force_ops, NULL, 0200);
+MODULE_PARM_DESC(sema_vas_force,
+ "Register a VAS directory out-of-band (h,pdb,entries,vidmem)");
+
+/*
* Debug: run the page-table walks for a GPU VA with per-level tracing,
* bypassing the pin/lat/pair map (see gsp_sema_service_walk_probe):
* echo 0x20400f000 > .../parameters/walk_probe