summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_sema_service.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-30 06:56:05 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-30 06:56:05 -0400
commit89aace067cb26865d0ffa36f995d6c9ff2a3fd17 (patch)
treeac14b82b68f6d3878e6dda09165033c278a706a6 /kernel/gsp_sema_service.c
parent19e61f2dddadf9ea7f17fbcdc23ed43d4d40ff72 (diff)
downloadopen-iov-89aace067cb26865d0ffa36f995d6c9ff2a3fd17.tar.gz
open-iov-89aace067cb26865d0ffa36f995d6c9ff2a3fd17.zip
sema-svc: CE op translation falls back to the GMMU walk for virtual operands
Diffstat (limited to 'kernel/gsp_sema_service.c')
-rw-r--r--kernel/gsp_sema_service.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index 04716a2..7a3b282 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -1960,6 +1960,24 @@ static int svc_op_translate(struct nv_vgpu_device *vgpu, u64 va, u64 *addr,
*aperture = CE_APERTURE_SYS;
return 0;
}
+ /*
+ * Virtual operands can also live in a page directory the driver
+ * published (the UVM client VA space). With the walk decode fixed,
+ * this resolves CE copies whose src/dst is a plain GPU VA that never
+ * entered the content-scanned map.
+ */
+ if (!svc_walk_vaspaces(vgpu, va & ~0xfffULL, &pa, &ap)) {
+ *addr = pa + (va & 0xfff);
+ *aperture = (ap == SVC_APERTURE_FB) ? CE_APERTURE_VID :
+ CE_APERTURE_SYS;
+ return 0;
+ }
+ if (!svc_walk_discovered(vgpu, va & ~0xfffULL, &pa, &ap)) {
+ *addr = pa + (va & 0xfff);
+ *aperture = (ap == SVC_APERTURE_FB) ? CE_APERTURE_VID :
+ CE_APERTURE_SYS;
+ return 0;
+ }
return -ENOENT;
}