summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2024-02-04 18:54:59 -0800
committerSecurityBot <android-nexus-securitybot@system.gserviceaccount.com>2024-02-04 18:54:59 -0800
commitc835ea1dc0c1b5f7bbf7557f811caab7bfa57939 (patch)
tree23b02126271ba1af3043d7b4826c6a819536a209
parentb7c474e559432b331183c869198c50c0e8abeae2 (diff)
parent78d5d68e86e0b0e5b86fcc2d864d022acb10f132 (diff)
downloadtrusty-android-gs-shusky-5.15-android15-beta.tar.gz
SBMerger: 603054162 Change-Id: If5003a4fc8a4f2675a0beb57016c168eb235a752 Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r--drivers/trusty/trusty-ipc.c2
-rw-r--r--drivers/trusty/trusty.c16
-rw-r--r--include/linux/trusty/arm_ffa.h7
3 files changed, 20 insertions, 5 deletions
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 @@ static struct tipc_msg_buf *vds_alloc_msg_buf(struct tipc_virtio_dev *vds,
{
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 @@ int trusty_transfer_memory(struct device *dev, u64 *id,
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 @@ int trusty_transfer_memory(struct device *dev, u64 *id,
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 @@ static int trusty_init_msg_buf(struct trusty_state *s, struct device *dev)
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 @@ static int trusty_init_msg_buf(struct trusty_state *s, struct device *dev)
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