Implement FFA ABI-s for notification handling
This change implements the listed FFA ABI-s:
- FFA_NOTIFICATION_BIND
- FFA_NOTIFICATION_UNBIND
- FFA_NOTIFICATION_SET
- FFA_NOTIFICATION_GET
Change-Id: Ifc231e3d60427b1c838cf622d8338d3e112209c1
Signed-off-by: Gabor Toth <gabor.toth2@arm.com>
diff --git a/components/messaging/ffa/libsp/ffa.c b/components/messaging/ffa/libsp/ffa.c
index cae246d..f648724 100644
--- a/components/messaging/ffa/libsp/ffa.c
+++ b/components/messaging/ffa/libsp/ffa.c
@@ -646,3 +646,89 @@
assert(result.a0 == FFA_SUCCESS_32);
return FFA_OK;
}
+
+/* Notification interfaces */
+ffa_result ffa_notification_bind(uint16_t sender, uint16_t receiver, uint32_t flags,
+ uint64_t notification_bitmap)
+{
+ struct ffa_params result = {0};
+ uint32_t notification_bitmap_hi = 0;
+ uint32_t notification_bitmap_lo = 0;
+
+ reg_pair_from_64(notification_bitmap, ¬ification_bitmap_hi, ¬ification_bitmap_lo);
+
+ ffa_svc(FFA_NOTIFICATION_BIND, SHIFT_U32(sender, FFA_NOTIF_SOURCE_ID_SHIFT) | receiver,
+ flags, notification_bitmap_lo, notification_bitmap_hi, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
+ FFA_PARAM_MBZ, &result);
+
+ if (result.a0 == FFA_ERROR)
+ return ffa_get_errorcode(&result);
+
+ assert(result.a0 == FFA_SUCCESS_32);
+ return FFA_OK;
+}
+
+ffa_result ffa_notification_unbind(uint16_t sender, uint16_t receiver, uint64_t notification_bitmap)
+{
+ struct ffa_params result = {0};
+ uint32_t notification_bitmap_hi = 0;
+ uint32_t notification_bitmap_lo = 0;
+
+ reg_pair_from_64(notification_bitmap, ¬ification_bitmap_hi, ¬ification_bitmap_lo);
+
+ ffa_svc(FFA_NOTIFICATION_UNBIND, SHIFT_U32(sender, FFA_NOTIF_SOURCE_ID_SHIFT) | receiver,
+ FFA_PARAM_MBZ, notification_bitmap_lo, notification_bitmap_hi, FFA_PARAM_MBZ,
+ FFA_PARAM_MBZ, FFA_PARAM_MBZ, &result);
+
+ if (result.a0 == FFA_ERROR)
+ return ffa_get_errorcode(&result);
+
+ assert(result.a0 == FFA_SUCCESS_32);
+ return FFA_OK;
+}
+
+ffa_result ffa_notification_set(uint16_t sender, uint16_t receiver, uint32_t flags,
+ uint64_t notification_bitmap)
+{
+ struct ffa_params result = {0};
+ uint32_t notification_bitmap_hi = 0;
+ uint32_t notification_bitmap_lo = 0;
+
+ if (!(flags & FFA_NOTIF_SET_FLAGS_PER_VCPU_NOTIFICATIONS) &&
+ (flags && FFA_NOTIF_SET_FLAGS_RECEIVER_VCPU_MASK))
+ return FFA_INVALID_PARAMETERS;
+
+ reg_pair_from_64(notification_bitmap, ¬ification_bitmap_hi, ¬ification_bitmap_lo);
+
+ ffa_svc(FFA_NOTIFICATION_SET, SHIFT_U32(sender, FFA_NOTIF_SOURCE_ID_SHIFT) | receiver,
+ flags, notification_bitmap_lo, notification_bitmap_hi, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
+ FFA_PARAM_MBZ, &result);
+
+ if (result.a0 == FFA_ERROR)
+ return ffa_get_errorcode(&result);
+
+ assert(result.a0 == FFA_SUCCESS_32);
+ return FFA_OK;
+}
+
+ffa_result ffa_notification_get(uint16_t sender, uint16_t receiver, uint32_t flags,
+ uint64_t *sp_notification_bitmap, uint64_t *vm_notification_bitmap,
+ uint64_t *framework_notification_bitmap)
+{
+ struct ffa_params result = {0};
+
+ ffa_svc(FFA_NOTIFICATION_GET, SHIFT_U32(sender, FFA_NOTIF_SOURCE_ID_SHIFT) | receiver,
+ flags, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
+ &result);
+
+ if (result.a0 == FFA_ERROR)
+ return ffa_get_errorcode(&result);
+
+ assert(result.a0 == FFA_SUCCESS_32);
+
+ *sp_notification_bitmap = reg_pair_to_64(result.a3, result.a2);
+ *vm_notification_bitmap = reg_pair_to_64(result.a5, result.a4);
+ *framework_notification_bitmap = reg_pair_to_64(result.a7, result.a6);
+
+ return FFA_OK;
+}