]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware: arm_ffa: Remove vm_id argument in ffa_rxtx_unmap()
authorYeoreum Yun <yeoreum.yun@arm.com>
Wed, 4 Mar 2026 12:09:53 +0000 (12:09 +0000)
committerSudeep Holla <sudeep.holla@kernel.org>
Fri, 6 Mar 2026 16:26:08 +0000 (16:26 +0000)
According to the FF-A specification (DEN0077, v1.1, ยง13.7), when
FFA_RXTX_UNMAP is invoked from any instance other than non-secure
physical, the w1 register must be zero (MBZ). If a non-zero value is
supplied in this context, the SPMC must return FFA_INVALID_PARAMETER.

The Arm FF-A driver operates exclusively as a guest or non-secure
physical instance where the partition ID is always zero and is not
invoked from a hypervisor context where w1 carries a VM ID. In this
execution model, the partition ID observed by the driver is always zero,
and passing a VM ID is unnecessary and potentially invalid.

Remove the vm_id parameter from ffa_rxtx_unmap() and ensure that the
SMC call is issued with w1 implicitly zeroed, as required by the
specification. This prevents invalid parameter errors and aligns the
implementation with the defined FF-A ABI behavior.

Fixes: 3bbfe9871005 ("firmware: arm_ffa: Add initial Arm FFA driver support")
Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
Message-Id: <20260304120953.847671-1-yeoreum.yun@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@kernel.org>
drivers/firmware/arm_ffa/driver.c

index 12a625387d6e6ba3e870d86276f81cfcaf979b93..f2f94d4d533e8d46d3d7165a9250854f8ea64f71 100644 (file)
@@ -205,12 +205,12 @@ static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt)
        return 0;
 }
 
-static int ffa_rxtx_unmap(u16 vm_id)
+static int ffa_rxtx_unmap(void)
 {
        ffa_value_t ret;
 
        invoke_ffa_fn((ffa_value_t){
-                     .a0 = FFA_RXTX_UNMAP, .a1 = PACK_TARGET_INFO(vm_id, 0),
+                     .a0 = FFA_RXTX_UNMAP,
                      }, &ret);
 
        if (ret.a0 == FFA_ERROR)
@@ -2097,7 +2097,7 @@ static int __init ffa_init(void)
 
        pr_err("failed to setup partitions\n");
        ffa_notifications_cleanup();
-       ffa_rxtx_unmap(drv_info->vm_id);
+       ffa_rxtx_unmap();
 free_pages:
        if (drv_info->tx_buffer)
                free_pages_exact(drv_info->tx_buffer, rxtx_bufsz);
@@ -2112,7 +2112,7 @@ static void __exit ffa_exit(void)
 {
        ffa_notifications_cleanup();
        ffa_partitions_cleanup();
-       ffa_rxtx_unmap(drv_info->vm_id);
+       ffa_rxtx_unmap();
        free_pages_exact(drv_info->tx_buffer, drv_info->rxtx_bufsz);
        free_pages_exact(drv_info->rx_buffer, drv_info->rxtx_bufsz);
        kfree(drv_info);