summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_phys_booter.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_phys_booter.c')
-rw-r--r--kernel/gsp_phys_booter.c45
1 files changed, 19 insertions, 26 deletions
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);