Merge android14-gs-pixel-5.15-24Q2 into android14-gs-pixel-5.15

SBMerger: 603054162
Change-Id: If5003a4fc8a4f2675a0beb57016c168eb235a752
Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
diff --git a/drivers/trusty/trusty-ipc.c b/drivers/trusty/trusty-ipc.c
index 3a54663..b75d8ff 100644
--- a/drivers/trusty/trusty-ipc.c
+++ b/drivers/trusty/trusty-ipc.c
@@ -226,7 +226,7 @@
 {
 	int ret;
 	struct tipc_msg_buf *mb;
-	size_t sz = vds->msg_buf_max_sz;
+	size_t sz = ALIGN(vds->msg_buf_max_sz, PAGE_SIZE);
 	pgprot_t pgprot = share_write ? PAGE_KERNEL : PAGE_KERNEL_RO;
 
 	/* allocate tracking structure */
diff --git a/drivers/trusty/trusty.c b/drivers/trusty/trusty.c
index 6cfa5af..aa3b5b3 100644
--- a/drivers/trusty/trusty.c
+++ b/drivers/trusty/trusty.c
@@ -349,7 +349,7 @@
 		emad->comp_mrd_offset = comp_mrd_offset;
 		emad->reserved_8_15 = 0;
 	}
-	comp_mrd->total_page_count = len / PAGE_SIZE;
+	comp_mrd->total_page_count = len / FFA_PAGE_SIZE;
 	comp_mrd->address_range_count = nents;
 	comp_mrd->reserved_8_15 = 0;
 
@@ -364,7 +364,7 @@
 
 		for (i = 0; i < lcount; i++) {
 			cons_mrd[i].address = sg_dma_address(sg);
-			cons_mrd[i].page_count = sg_dma_len(sg) / PAGE_SIZE;
+			cons_mrd[i].page_count = sg_dma_len(sg) / FFA_PAGE_SIZE;
 			cons_mrd[i].reserved_12_15 = 0;
 			sg = sg_next(sg);
 		}
@@ -622,6 +622,14 @@
 	s->ffa_local_id = smc_ret.r2;
 	s->ffa_remote_id = 0x8000;
 
+	/*
+	 * The pKVM hypervisor uses the same page size as the host, including for
+	 * stage-2 mappings. So the rx/tx buffers need to be page-sized multiple,
+	 * and page-aligned.
+	 *
+	 * TODO: This can be made more generic by discovering the required size
+	 * through SMC_FC_FFA_FEATURES later.
+	 */
 	s->ffa_tx = kmalloc(PAGE_SIZE, GFP_KERNEL);
 	if (!s->ffa_tx) {
 		ret = -ENOMEM;
@@ -644,8 +652,8 @@
 		goto err_unaligned_rx_buf;
 	}
 
-	smc_ret = trusty_smc8(SMC_FCZ_FFA_RXTX_MAP, tx_paddr, rx_paddr, 1, 0,
-			      0, 0, 0);
+	smc_ret = trusty_smc8(SMC_FCZ_FFA_RXTX_MAP, tx_paddr, rx_paddr,
+				PAGE_SIZE / FFA_PAGE_SIZE, 0, 0, 0, 0);
 	if (smc_ret.r0 != SMC_FC_FFA_SUCCESS) {
 		dev_err(s->dev, "%s: SMC_FCZ_FFA_RXTX_MAP failed 0x%lx 0x%lx 0x%lx\n",
 			__func__, smc_ret.r0, smc_ret.r1, smc_ret.r2);
diff --git a/include/linux/trusty/arm_ffa.h b/include/linux/trusty/arm_ffa.h
index ab7b2af..95d31b3 100644
--- a/include/linux/trusty/arm_ffa.h
+++ b/include/linux/trusty/arm_ffa.h
@@ -36,6 +36,13 @@
 	SMC_FASTCALL64_NR(SMC_ENTITY_SHARED_MEMORY, nr)
 
 /**
+ * FF-A specification mentions explicitly about '4K pages'. This should
+ * not be confused with the kernel PAGE_SIZE, which is the translation
+ * granule kernel is configured and may be one among 4K, 16K and 64K.
+ */
+#define FFA_PAGE_SIZE		SZ_4K
+
+/**
  * typedef ffa_endpoint_id16_t - Endpoint ID
  *
  * Current implementation only supports VMIDs. FFA spec also support stream