From 733eda6bbe9ec0c0a2ed50f615504759be98f081 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Tue, 6 Oct 2026 21:02:59 -0400 Subject: vgsp: mode 35 F2c - hObjectError as a real class-0x40 FBMEM memory object (registered list object failed the promote resolver lookup 0x57) --- kernel/gsp_phys_booter.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) (limited to 'kernel/gsp_phys_booter.c') diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index 3c8ca20..5579f8f 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -2031,6 +2031,7 @@ static struct gsp_phys_boot_stage { u32 rmcall_notifier_mem; /* FBMEM error-notifier object handle */ u64 rmcall_notifier_base; /* its returned frame-buffer address */ bool rmcall_notifier_valid; /* the FBMEM notifier alloc succeeded */ + u64 rmcall_user_lane_notifier_pa; /* mode-35 FBMEM error-notifier base */ u64 rmcall_va_base; /* channel PDB VA window base */ u64 rmcall_va_gpfifo; /* GPFIFO GPU VA in that window */ u64 rmcall_va_pb; /* pushbuffer GPU VA in that window */ @@ -12600,36 +12601,29 @@ static int gsp_phys_rmcall_tsg_fault_buffers(void __iomem *bar0) /* * Mode 35 step 4a: the V7 error-notifier page. The capture's hObjectError - * 0x5c000018 is a client-local memory object holding the 0x1000-byte - * notifier page (it is referenced by #825 but never appears as an alloc in - * the capture); the ladder's closest equivalent is a registered host sysmem - * page (NV01_MEMORY_LIST_SYSTEM, addressSpace=1 like the captured - * errorNotifierMem) whose handle becomes hObjectError. + * 0x5c000018 is a client-local MEMORY object holding the notifier page (it is + * referenced by #825 but never appears as an alloc on the wire); the server's + * promote resolver looks the handle up as a memory resource, so the ladder + * allocates a real class-0x40 FBMEM memory object (the registered sysmem + * list object of F2 did not satisfy the lookup: 0x57). */ static int gsp_phys_rmcall_user_lane_notifier(void __iomem *bar0) { - struct gsp_phys_boot_chunk *c = &boot_stage.rmcall_user_lane_notifier; + u64 base = 0; int ret; - if (!boot_stage.pdev) - return -EINVAL; - if (!c->pages) { - ret = gsp_phys_chunk_alloc(boot_stage.pdev, c, 1u); - if (ret) { - pr_err("vgsp-boot: rm-call: mode 35 user-lane error-notifier page allocation failed (%d); no V7 channel is allocated and the ladder aborts with no retry\n", - ret); - return ret; - } - } - gsp_phys_chunk_zero(c); - ret = gsp_phys_rmcall_register_chunk(bar0, c, + ret = gsp_phys_rmcall_alloc_fb_mem(bar0, GSP_PHYS_RMCALL_HANDLE_USER_LANE_NOTIFIER, - "user-lane error-notifier (sysmem)"); - if (ret) + GSP_PHYS_RMCALL_NOTIFIER_SIZE, &base, + "mode 35 user-lane error notifier"); + if (ret) { + pr_err("vgsp-boot: rm-call: mode 35 user-lane FBMEM error-notifier alloc failed (%d); no V7 channel is allocated and the ladder aborts with no retry\n", + ret); return ret; - pr_info("vgsp-boot: rm-call: mode 35 user-lane error notifier: hObject=0x%x sysmem pa=0x%llx size=0x%x (closest equivalent of the capture's hObjectError 0x5c000018 object, which the capture never allocated; deviation logged)\n", - GSP_PHYS_RMCALL_HANDLE_USER_LANE_NOTIFIER, - (u64)gsp_phys_chunk_page_dma(c, 0), + } + boot_stage.rmcall_user_lane_notifier_pa = base; + pr_info("vgsp-boot: rm-call: mode 35 user-lane error notifier: hObject=0x%x FBMEM pa=0x%llx size=0x%x (class 0x40 memory object; the captured hObjectError object is never allocated on the wire)\n", + GSP_PHYS_RMCALL_HANDLE_USER_LANE_NOTIFIER, base, GSP_PHYS_RMCALL_NOTIFIER_SIZE); return 0; } @@ -12713,12 +12707,11 @@ static int gsp_phys_rmcall_alloc_user_lane_channel(void __iomem *bar0) cpu_to_le32(GSP_PHYS_RMCALL_HANDLE_USER_LANE_USERD); ch.mthdbuf_mem = gsp_phys_rmcall_mem_desc(GSP_PHYS_RMCALL_BUF_MTHDBUF); ch.error_notifier_mem.base = cpu_to_le64( - (u64)gsp_phys_chunk_page_dma( - &boot_stage.rmcall_user_lane_notifier, 0)); + boot_stage.rmcall_user_lane_notifier_pa); ch.error_notifier_mem.size = cpu_to_le64(GSP_PHYS_RMCALL_NOTIFIER_SIZE); ch.error_notifier_mem.address_space = - cpu_to_le32(GSP_PHYS_RMCALL_ADDR_SYSMEM); + cpu_to_le32(GSP_PHYS_RMCALL_ADDR_FBMEM); ch.error_notifier_mem.cache_attrib = cpu_to_le32(GSP_PHYS_RMCALL_CACHE_UNCACHED); -- cgit v1.2.3