arm_ffa: Distinguish between uninitialized and failed

Add a new FF-A initialization state to distinguish
between not-yet-initialized (before calling arm_ffa_init)
and failed-to-initialize (after arm_ffa_init).

Bug: 284057071
Change-Id: Ib6c243a6490c6a35337b4c9fb53eeb36e769565c
diff --git a/lib/arm_ffa/arm_ffa.c b/lib/arm_ffa/arm_ffa.c
index b838423..c87c279 100644
--- a/lib/arm_ffa/arm_ffa.c
+++ b/lib/arm_ffa/arm_ffa.c
@@ -38,7 +38,7 @@
 #include <sys/types.h>
 #include <trace.h>
 
-static bool arm_ffa_init_is_success = false;
+static enum arm_ffa_init_state ffa_init_state = ARM_FFA_INIT_UNINIT;
 static uint16_t ffa_local_id;
 static size_t ffa_buf_size;
 static void* ffa_tx;
@@ -49,8 +49,8 @@
 
 static mutex_t ffa_rxtx_buffer_lock = MUTEX_INITIAL_VALUE(ffa_rxtx_buffer_lock);
 
-bool arm_ffa_is_init(void) {
-    return arm_ffa_init_is_success;
+enum arm_ffa_init_state arm_ffa_init_state(void) {
+    return ffa_init_state;
 }
 
 static status_t arm_ffa_call_id_get(uint16_t* id) {
@@ -1029,7 +1029,7 @@
     res = arm_ffa_setup();
 
     if (res == NO_ERROR) {
-        arm_ffa_init_is_success = true;
+        ffa_init_state = ARM_FFA_INIT_SUCCESS;
 
 #if WITH_SMP
         res = ffa_call_secondary_ep_register();
@@ -1042,6 +1042,7 @@
 #endif
     } else {
         TRACEF("Failed to initialize FF-A (err=%d)\n", res);
+        ffa_init_state = ARM_FFA_INIT_FAILED;
     }
 }
 
diff --git a/lib/arm_ffa/include/lib/arm_ffa/arm_ffa.h b/lib/arm_ffa/include/lib/arm_ffa/arm_ffa.h
index 273d4ba..c33437e 100644
--- a/lib/arm_ffa/include/lib/arm_ffa/arm_ffa.h
+++ b/lib/arm_ffa/include/lib/arm_ffa/arm_ffa.h
@@ -29,6 +29,25 @@
 #include <stdbool.h>
 
 /**
+ * enum arm_ffa_init_state - The current state of FF-A initialization.
+ * @ARM_FFA_INIT_UNINIT: FF-A has not been initialized yet.
+ * @ARM_FFA_INIT_SUCCESS: FF-A has been successfully initialized.
+ * @ARM_FFA_INIT_FAILED: Failed to initialize FF-A.
+ */
+enum arm_ffa_init_state {
+    ARM_FFA_INIT_UNINIT,
+    ARM_FFA_INIT_SUCCESS,
+    ARM_FFA_INIT_FAILED,
+};
+
+/**
+ * arm_ffa_init_state() - Return the current state of FF-A initialization.
+ *
+ * Return: one of the &enum arm_ffa_init_state values.
+ */
+enum arm_ffa_init_state arm_ffa_init_state(void);
+
+/**
  * arm_ffa_is_init() - Check whether this module initialized successfully.
  *
  * This should only be called once arm_ffa_init() is guaranteed to have
@@ -36,7 +55,9 @@
  *
  * Return: %true in case of success, %false otherwise.
  */
-bool arm_ffa_is_init(void);
+static inline bool arm_ffa_is_init(void) {
+    return arm_ffa_init_state() == ARM_FFA_INIT_SUCCESS;
+}
 
 /**
  * arm_ffa_mem_relinquish() - Relinquish Trusty's access to a memory region.