qemu: Track NS bit across SPMC shares and lends

Bug: 284057071
Change-Id: Ice3b2037e017ce40e47ac12f2c9b780585191ac6
diff --git a/plat/qemu/common/qemu_common.c b/plat/qemu/common/qemu_common.c
index 43bd376..35d6bb3 100644
--- a/plat/qemu/common/qemu_common.c
+++ b/plat/qemu/common/qemu_common.c
@@ -13,6 +13,7 @@
 #include <common/bl_common.h>
 #include <lib/xlat_tables/xlat_tables_v2.h>
 #include <services/el3_spmc_ffa_memory.h>
+#include <services/ffa_svc.h>
 #if ENABLE_RME
 #include <services/rmm_core_manifest.h>
 #endif
@@ -187,14 +188,36 @@
 	return 0;
 }
 
+static int qemu_spmc_mem_set_shared(struct ffa_mtd *desc, bool shared)
+{
+	struct ffa_emad_v1_0 *emad0;
+	struct ffa_comp_mrd *comp;
+	bool secure;
+	int ret;
+
+#if MAKE_FFA_VERSION(1, 1) > FFA_VERSION_COMPILED
+#error "TF-A was compiled for FF-A v1.0"
+#endif
+	assert(is_aligned(desc->emad_offset, 16));
+	emad0 = (struct ffa_emad_v1_0 *)((uint8_t *)desc + desc->emad_offset);
+	comp = (struct ffa_comp_mrd *)((uint8_t *)desc + emad0->comp_mrd_offset);
+	secure = (desc->flags & FFA_MTD_FLAG_TYPE_MASK) == FFA_MTD_FLAG_TYPE_LEND_MEMORY;
+
+	ret = qemu_ffa_comp_set_shared(comp, shared, secure);
+	if (!ret && secure) {
+		desc->memory_region_attributes &= ~FFA_MEM_ATTR_NS_BIT;
+	}
+	return ret;
+}
+
 int plat_spmc_shmem_begin(struct ffa_mtd *desc)
 {
-	return 0;
+	return qemu_spmc_mem_set_shared(desc, true);
 }
 
 int plat_spmc_shmem_reclaim(struct ffa_mtd *desc)
 {
-	return 0;
+	return qemu_spmc_mem_set_shared(desc, false);
 }
 #endif
 
diff --git a/plat/qemu/common/qemu_private.h b/plat/qemu/common/qemu_private.h
index 25b14e2..b38659d 100644
--- a/plat/qemu/common/qemu_private.h
+++ b/plat/qemu/common/qemu_private.h
@@ -42,4 +42,6 @@
 
 void qemu_bl2_sync_transfer_list(void);
 
+int qemu_ffa_comp_set_shared(void *compv, bool shared, bool secure);
+
 #endif /* QEMU_PRIVATE_H */
diff --git a/plat/qemu/common/shared_mem.c b/plat/qemu/common/shared_mem.c
index 174d564..0879c83 100644
--- a/plat/qemu/common/shared_mem.c
+++ b/plat/qemu/common/shared_mem.c
@@ -13,6 +13,8 @@
 #include <trusty/arm_ffa.h>
 #include <trusty/ffa_helpers.h>
 
+#include "qemu_private.h"
+
 #define NS_DRAM0_BITMAP_SIZE DIV_ROUND_UP_2EVAL(NS_DRAM0_SIZE, PAGE_SIZE * 8)
 static uint8_t trusty_shmem_shared[NS_DRAM0_BITMAP_SIZE];
 static uint8_t trusty_shmem_secure[NS_DRAM0_BITMAP_SIZE];
@@ -85,17 +87,13 @@
 	return -EBUSY;
 }
 
-
-int plat_mem_set_shared(struct ffa_mtd *mtd, bool shared)
+int qemu_ffa_comp_set_shared(void *compv, bool shared, bool secure)
 {
-	struct ffa_comp_mrd *comp = trusty_ffa_mtd_get_comp_mrd(mtd);
+	struct ffa_comp_mrd *comp = compv;
 	size_t count = comp->address_range_count;
 	struct ffa_cons_mrd *cons_mrd;
 	int ret = 0;
 	size_t i;
-	bool secure;
-
-	secure = trusty_ffa_should_be_secure(mtd);
 
 	for (i = 0, cons_mrd = comp->address_range_array; i < count;
 	     i++, cons_mrd++) {
@@ -106,9 +104,6 @@
 		}
 	}
 
-	if (secure) {
-		mtd->memory_region_attributes &= ~FFA_MEM_ATTR_NONSECURE;
-	}
 	return 0;
 
 err:
@@ -127,3 +122,16 @@
 	}
 	return ret;
 }
+
+int plat_mem_set_shared(struct ffa_mtd *mtd, bool shared)
+{
+	struct ffa_comp_mrd *comp = trusty_ffa_mtd_get_comp_mrd(mtd);
+	bool secure = trusty_ffa_should_be_secure(mtd);
+	int ret;
+
+	ret = qemu_ffa_comp_set_shared(comp, shared, secure);
+	if (!ret && secure) {
+		mtd->memory_region_attributes &= ~FFA_MEM_ATTR_NONSECURE;
+	}
+	return ret;
+}
diff --git a/plat/qemu/qemu/platform.mk b/plat/qemu/qemu/platform.mk
index e92415f..630496c 100644
--- a/plat/qemu/qemu/platform.mk
+++ b/plat/qemu/qemu/platform.mk
@@ -50,6 +50,9 @@
 ifeq (${SPD},trusty)
 PLAT_BL_COMMON_SOURCES	+=	${PLAT_QEMU_COMMON_PATH}/shared_mem.c
 endif
+ifeq (${SPMC_AT_EL3},1)
+PLAT_BL_COMMON_SOURCES	+=	${PLAT_QEMU_COMMON_PATH}/shared_mem.c
+endif
 
 ifneq (${TRUSTED_BOARD_BOOT},0)