]> git.itanic.dy.fi Git - linux-stable/commitdiff
KVM: arm64: FFA: Remove access of endpoint memory access descriptor array
authorSudeep Holla <sudeep.holla@arm.com>
Thu, 5 Oct 2023 14:45:07 +0000 (15:45 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Sun, 8 Oct 2023 20:18:19 +0000 (21:18 +0100)
FF-A v1.1 removes the fixed location of endpoint memory access descriptor
array within the memory transaction descriptor structure. In preparation
to remove the ep_mem_access member from the ffa_mem_region structure,
provide the accessor to fetch the offset and use the same in FF-A proxy
implementation.

The accessor take the FF-A version as the argument from which the memory
access descriptor format can be determined. v1.0 uses the old format while
v1.1 onwards use the new format specified in the v1.1 specification.

Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Will Deacon <will@kernel.org>
Cc: Quentin Perret <qperret@google.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20231005-ffa_v1-1_notif-v4-14-cddd3237809c@arm.com
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
arch/arm64/kvm/hyp/nvhe/ffa.c
include/linux/arm_ffa.h

index ab4f5d160c58f9969f4820a479dbf3d119b2d617..5c7b345c2cd535627613e507b189ec7db2feff8a 100644 (file)
@@ -423,6 +423,7 @@ static __always_inline void do_ffa_mem_xfer(const u64 func_id,
        DECLARE_REG(u32, fraglen, ctxt, 2);
        DECLARE_REG(u64, addr_mbz, ctxt, 3);
        DECLARE_REG(u32, npages_mbz, ctxt, 4);
+       struct ffa_mem_region_attributes *ep_mem_access;
        struct ffa_composite_mem_region *reg;
        struct ffa_mem_region *buf;
        u32 offset, nr_ranges;
@@ -452,7 +453,9 @@ static __always_inline void do_ffa_mem_xfer(const u64 func_id,
        buf = hyp_buffers.tx;
        memcpy(buf, host_buffers.tx, fraglen);
 
-       offset = buf->ep_mem_access[0].composite_off;
+       ep_mem_access = (void *)buf +
+                       ffa_mem_desc_offset(buf, 0, FFA_VERSION_1_0);
+       offset = ep_mem_access->composite_off;
        if (!offset || buf->ep_count != 1 || buf->sender_id != HOST_FFA_ID) {
                ret = FFA_RET_INVALID_PARAMETERS;
                goto out_unlock;
@@ -504,6 +507,7 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
        DECLARE_REG(u32, handle_lo, ctxt, 1);
        DECLARE_REG(u32, handle_hi, ctxt, 2);
        DECLARE_REG(u32, flags, ctxt, 3);
+       struct ffa_mem_region_attributes *ep_mem_access;
        struct ffa_composite_mem_region *reg;
        u32 offset, len, fraglen, fragoff;
        struct ffa_mem_region *buf;
@@ -528,7 +532,9 @@ static void do_ffa_mem_reclaim(struct arm_smccc_res *res,
        len = res->a1;
        fraglen = res->a2;
 
-       offset = buf->ep_mem_access[0].composite_off;
+       ep_mem_access = (void *)buf +
+                       ffa_mem_desc_offset(buf, 0, FFA_VERSION_1_0);
+       offset = ep_mem_access->composite_off;
        /*
         * We can trust the SPMD to get this right, but let's at least
         * check that we end up with something that doesn't look _completely_
index 748d0a83a4bccf7a34cecce28914b7d3ef2d96ca..2444d596b70342eb5612f8de93940b9f8be5fae1 100644 (file)
@@ -357,6 +357,12 @@ struct ffa_mem_region {
 #define CONSTITUENTS_OFFSET(x) \
        (offsetof(struct ffa_composite_mem_region, constituents[x]))
 
+static inline u32
+ffa_mem_desc_offset(struct ffa_mem_region *buf, int count, u32 ffa_version)
+{
+       return COMPOSITE_OFFSET(0);
+}
+
 struct ffa_mem_ops_args {
        bool use_txbuf;
        u32 nattrs;