Skip to content

Commit 933db70

Browse files
committed
firmware: arm_ffa: Implement the notification bind and unbind interface
A receiver endpoint must bind a notification to any sender endpoint before the latter can signal the notification to the former. The receiver assigns one or more doorbells to a specific sender. Only the sender can ring these doorbells. A receiver uses the FFA_NOTIFICATION_BIND interface to bind one or more notifications to the sender. A receiver un-binds a notification from a sender endpoint to stop the notification from being signaled. It uses the FFA_NOTIFICATION_UNBIND interface to do this. Allow the FF-A driver to be able to bind and unbind a given notification ID to a specific partition ID. This will be used to register and unregister notification callbacks from the FF-A client drivers. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sudeep Holla <[email protected]>
1 parent 192e88c commit 933db70

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

drivers/firmware/arm_ffa/driver.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,35 @@ static int ffa_notification_bitmap_destroy(void)
587587
return 0;
588588
}
589589

590+
#define NOTIFICATION_LOW_MASK GENMASK(31, 0)
591+
#define NOTIFICATION_HIGH_MASK GENMASK(63, 32)
592+
#define NOTIFICATION_BITMAP_HIGH(x) \
593+
((u32)(FIELD_GET(NOTIFICATION_HIGH_MASK, (x))))
594+
#define NOTIFICATION_BITMAP_LOW(x) \
595+
((u32)(FIELD_GET(NOTIFICATION_LOW_MASK, (x))))
596+
597+
static int ffa_notification_bind_common(u16 dst_id, u64 bitmap,
598+
u32 flags, bool is_bind)
599+
{
600+
ffa_value_t ret;
601+
u32 func, src_dst_ids = PACK_TARGET_INFO(dst_id, drv_info->vm_id);
602+
603+
func = is_bind ? FFA_NOTIFICATION_BIND : FFA_NOTIFICATION_UNBIND;
604+
605+
invoke_ffa_fn((ffa_value_t){
606+
.a0 = func, .a1 = src_dst_ids, .a2 = flags,
607+
.a3 = NOTIFICATION_BITMAP_LOW(bitmap),
608+
.a4 = NOTIFICATION_BITMAP_HIGH(bitmap),
609+
}, &ret);
610+
611+
if (ret.a0 == FFA_ERROR)
612+
return ffa_to_linux_errno((int)ret.a2);
613+
else if (ret.a0 != FFA_SUCCESS)
614+
return -EINVAL;
615+
616+
return 0;
617+
}
618+
590619
static void ffa_set_up_mem_ops_native_flag(void)
591620
{
592621
if (!ffa_features(FFA_FN_NATIVE(MEM_LEND), 0, NULL, NULL) ||

0 commit comments

Comments
 (0)