]> git.itanic.dy.fi Git - linux-stable/commitdiff
firmware: arm_ffa: Use FFA_FEATURES to detect if native versions are supported
authorSudeep Holla <sudeep.holla@arm.com>
Wed, 7 Sep 2022 14:52:35 +0000 (15:52 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Thu, 8 Sep 2022 10:30:34 +0000 (11:30 +0100)
Currently, the ffa_dev->mode_32bit is use to detect if the native 64-bit
or 32-bit versions of FF-A ABI needs to be used. However for the FF-A
memory ABIs, it is not dependent on the ffa_device(i.e. the partition)
itself, but the partition manager(SPM).

So, the FFA_FEATURES can be use to detect if the native 64bit ABIs are
supported or not and appropriate calls can be made based on that.

Use FFA_FEATURES to detect if native versions of MEM_LEND or MEM_SHARE
are implemented and make of the same to use native memory ABIs later on.

Link: https://lore.kernel.org/r/20220907145240.1683088-6-sudeep.holla@arm.com
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_ffa/driver.c

index 81b8d578b6eacbff6476e82ac08aeee7f99c98f6..37a8ee304508b91a37e756fe18d36afefbf672c1 100644 (file)
@@ -163,6 +163,7 @@ struct ffa_drv_info {
        struct mutex tx_lock; /* lock to protect Tx buffer */
        void *rx_buffer;
        void *tx_buffer;
+       bool mem_ops_native;
 };
 
 static struct ffa_drv_info *drv_info;
@@ -597,6 +598,13 @@ static int ffa_features(u32 func_feat_id, u32 input_props,
        return 0;
 }
 
+static void ffa_set_up_mem_ops_native_flag(void)
+{
+       if (!ffa_features(FFA_FN_NATIVE(MEM_LEND), 0, NULL, NULL) ||
+           !ffa_features(FFA_FN_NATIVE(MEM_SHARE), 0, NULL, NULL))
+               drv_info->mem_ops_native = true;
+}
+
 static u32 ffa_api_version_get(void)
 {
        return drv_info->version;
@@ -638,10 +646,10 @@ static int ffa_sync_send_receive(struct ffa_device *dev,
 static int
 ffa_memory_share(struct ffa_device *dev, struct ffa_mem_ops_args *args)
 {
-       if (dev->mode_32bit)
-               return ffa_memory_ops(FFA_MEM_SHARE, args);
+       if (drv_info->mem_ops_native)
+               return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args);
 
-       return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args);
+       return ffa_memory_ops(FFA_MEM_SHARE, args);
 }
 
 static int
@@ -654,10 +662,10 @@ ffa_memory_lend(struct ffa_device *dev, struct ffa_mem_ops_args *args)
         * however on systems without a hypervisor the responsibility
         * falls to the calling kernel driver to prevent access.
         */
-       if (dev->mode_32bit)
-               return ffa_memory_ops(FFA_MEM_LEND, args);
+       if (drv_info->mem_ops_native)
+               return ffa_memory_ops(FFA_FN_NATIVE(MEM_LEND), args);
 
-       return ffa_memory_ops(FFA_FN_NATIVE(MEM_LEND), args);
+       return ffa_memory_ops(FFA_MEM_LEND, args);
 }
 
 static const struct ffa_dev_ops ffa_ops = {
@@ -768,6 +776,8 @@ static int __init ffa_init(void)
 
        ffa_setup_partitions();
 
+       ffa_set_up_mem_ops_native_flag();
+
        return 0;
 free_pages:
        if (drv_info->tx_buffer)