summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/gsp_phys_booter.c77
1 files changed, 63 insertions, 14 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index 9f4bd53..9c19efb 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -1437,9 +1437,58 @@ enum gsp_phys_rmcall_buf {
GSP_PHYS_RMCALL_BUF_GUEST_PT13,
GSP_PHYS_RMCALL_BUF_GUEST_PT14,
GSP_PHYS_RMCALL_BUF_GUEST_PT15,
- /* m152: extension pool PT pages (GSP_PHYS_RMCALL_GUEST_PT_EXT_PAGES
- * pages; allocated multi-page in alloc_chunks). */
- GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT,
+ /* m152: extension pool PT pages: 48 separate single-page chunks
+ * (GUEST_PT_EXT0..47). The server only accepts single-page memdescs
+ * for client buffers (a 48-page chunk was refused with rpc_result
+ * 0x1f + a firmware ASSERT in stage 2). */
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT0,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT1,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT2,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT3,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT4,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT5,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT6,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT7,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT8,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT9,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT10,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT11,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT12,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT13,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT14,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT15,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT16,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT17,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT18,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT19,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT20,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT21,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT22,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT23,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT24,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT25,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT26,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT27,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT28,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT29,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT30,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT31,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT32,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT33,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT34,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT35,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT36,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT37,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT38,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT39,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT40,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT41,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT42,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT43,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT44,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT45,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT46,
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT47,
/*
* Golden9g: the three client page-table levels the real golden VAS
* hands to the server with VASPACE_COPY_SERVER_RESERVED_PDES
@@ -7360,8 +7409,9 @@ static u8 *gsp_phys_rmcall_guest_pt_page_va(u32 page)
page], 0);
if (page < GSP_PHYS_RMCALL_GUEST_PT_TOTAL_PAGES)
return gsp_phys_chunk_page_va(
- &boot_stage.rmcall_chunks[GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT],
- page - GSP_PHYS_RMCALL_GUEST_PT_PAGES);
+ &boot_stage.rmcall_chunks[
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT0 +
+ (page - GSP_PHYS_RMCALL_GUEST_PT_PAGES)], 0);
return NULL;
}
@@ -7372,8 +7422,9 @@ static u64 gsp_phys_rmcall_guest_pt_page_dma(u32 page)
&boot_stage.rmcall_chunks[GSP_PHYS_RMCALL_BUF_GUEST_PT0 +
page], 0);
return (u64)gsp_phys_chunk_page_dma(
- &boot_stage.rmcall_chunks[GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT],
- page - GSP_PHYS_RMCALL_GUEST_PT_PAGES);
+ &boot_stage.rmcall_chunks[
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT0 +
+ (page - GSP_PHYS_RMCALL_GUEST_PT_PAGES)], 0);
}
/*
@@ -7948,9 +7999,6 @@ static int gsp_phys_rmcall_alloc_chunks(void)
for (i = 0; i < GSP_PHYS_RMCALL_BUF_COUNT; i++) {
struct gsp_phys_boot_chunk *c = &boot_stage.rmcall_chunks[i];
- u32 npages =
- (i == GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT) ?
- GSP_PHYS_RMCALL_GUEST_PT_EXT_PAGES : 1u;
if (c->pages)
continue;
@@ -7959,7 +8007,7 @@ static int gsp_phys_rmcall_alloc_chunks(void)
i);
return -EINVAL;
}
- if (gsp_phys_chunk_alloc(boot_stage.pdev, c, npages)) {
+ if (gsp_phys_chunk_alloc(boot_stage.pdev, c, 1u)) {
pr_err("vgsp-boot: rm-call: buffer %u allocation failed\n",
i);
return -ENOMEM;
@@ -9732,7 +9780,8 @@ static void gsp_phys_rmcall_pdb_build(void)
u64 guest_pt_pde = gsp_phys_rmcall_pde(
(u64)gsp_phys_chunk_page_dma(
&boot_stage.rmcall_chunks[
- GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT], i));
+ GSP_PHYS_RMCALL_BUF_GUEST_PT_EXT0 + i],
+ 0));
u32 pd0_idx = (u32)(GSP_PHYS_RMCALL_VA_GUEST_PT_EXT_BASE >> 21) +
i;
@@ -21193,8 +21242,8 @@ static_assert(offsetof(struct gsp_phys_rmcall_channel_params, process_id) == 296
"NV_CHANNEL_ALLOC_PARAMS.ProcessID must be at offset 296");
static_assert(offsetof(struct gsp_phys_rmcall_channel_params, tpc_config_id) == 360,
"NV_CHANNEL_ALLOC_PARAMS.tpcConfigID must be at offset 360");
-static_assert(GSP_PHYS_RMCALL_BUF_COUNT == 34,
- "the rm-call ladder registers exactly thirty-four DMA buffers (14 ladder + 16 single-page guest scratch PTs + 1 extension scratch-PT chunk + 3 golden9g VAS levels)");
+static_assert(GSP_PHYS_RMCALL_BUF_COUNT == 81,
+ "the rm-call ladder registers exactly eighty-one DMA buffers (14 ladder + 16 single-page guest scratch PTs + 48 single-page extension scratch PTs + 3 golden9g VAS levels)");
static_assert((GSP_PHYS_RMCALL_HANDLE_MEM_BASE +
(GSP_PHYS_RMCALL_BUF_COUNT - 1) *
GSP_PHYS_RMCALL_HANDLE_MEM_STRIDE) < 0xcaf80000u,