feat(ffa-svc): add `ffa_func_name` and `ffa_error_name`

Adds helper functions for getting string representations of function
identifiers and error codes. This makes debug logs more readable than
printing the integer value.

Change-Id: I9e74c197686dc08e0c71886f641c60829587bad6
Signed-off-by: Karl Meakin <karl.meakin@arm.com>
diff --git a/include/runtime_services/ffa_svc.h b/include/runtime_services/ffa_svc.h
index 226bbd1..0e6081e 100644
--- a/include/runtime_services/ffa_svc.h
+++ b/include/runtime_services/ffa_svc.h
@@ -11,7 +11,10 @@
 #include <smccc.h>
 #include <uuid.h>
 
-/* FFA error codes. */
+/**
+ * FFA error codes.
+ * Don't forget to update `ffa_error_name` if you add a new one.
+ */
 #define FFA_ERROR_NOT_SUPPORTED		-1
 #define FFA_ERROR_INVALID_PARAMETER	-2
 #define FFA_ERROR_NO_MEMORY		-3
@@ -22,6 +25,33 @@
 #define FFA_ERROR_ABORTED		-8
 #define FFA_ERROR_NO_DATA		-9
 
+/* Return the name of the error code. */
+static inline const char *ffa_error_name(int32_t error)
+{
+	switch (error) {
+	case FFA_ERROR_NOT_SUPPORTED:
+		return "FFA_ERROR_NOT_SUPPORTED";
+	case FFA_ERROR_INVALID_PARAMETER:
+		return "FFA_ERROR_INVALID_PARAMETER";
+	case FFA_ERROR_NO_MEMORY:
+		return "FFA_ERROR_NO_MEMORY";
+	case FFA_ERROR_BUSY:
+		return "FFA_ERROR_BUSY";
+	case FFA_ERROR_INTERRUPTED:
+		return "FFA_ERROR_INTERRUPTED";
+	case FFA_ERROR_DENIED:
+		return "FFA_ERROR_DENIED";
+	case FFA_ERROR_RETRY:
+		return "FFA_ERROR_RETRY";
+	case FFA_ERROR_ABORTED:
+		return "FFA_ERROR_ABORTED";
+	case FFA_ERROR_NO_DATA:
+		return "FFA_ERROR_NO_DATA";
+	default:
+		return "UNKNOWN";
+	}
+}
+
 /* The macros below are used to identify FFA calls from the SMC function ID */
 #define FFA_FNUM_MIN_VALUE	U(0x60)
 #define FFA_FNUM_MAX_VALUE	U(0x8C)
@@ -61,7 +91,10 @@
 		 (OEN_STD_START << FUNCID_OEN_SHIFT) |	\
 		 ((func_num) << FUNCID_NUM_SHIFT))
 
-/* FFA function numbers */
+/**
+ * FFA function numbers.
+ * Don't forget to update `ffa_func_name` if you add a new one.
+ */
 #define FFA_FNUM_ERROR				U(0x60)
 #define FFA_FNUM_SUCCESS			U(0x61)
 #define FFA_FNUM_INTERRUPT			U(0x62)
@@ -176,6 +209,103 @@
 
 /* Implementation defined SMC64 FIDs */
 #define FFA_CONSOLE_LOG_SMC64	FFA_FID(SMC_64, FFA_FNUM_CONSOLE_LOG)
+
+static inline const char *ffa_func_name(uint32_t func)
+{
+	switch (func) {
+	case FFA_ERROR:
+		return "FFA_ERROR";
+	case FFA_SUCCESS_SMC32:
+		return "FFA_SUCCESS_SMC32";
+	case FFA_INTERRUPT:
+		return "FFA_INTERRUPT";
+	case FFA_VERSION:
+		return "FFA_VERSION";
+	case FFA_FEATURES:
+		return "FFA_FEATURES";
+	case FFA_RX_RELEASE:
+		return "FFA_RX_RELEASE";
+	case FFA_RXTX_MAP_SMC32:
+		return "FFA_RXTX_MAP_SMC32";
+	case FFA_RXTX_UNMAP:
+		return "FFA_RXTX_UNMAP";
+	case FFA_PARTITION_INFO_GET:
+		return "FFA_PARTITION_INFO_GET";
+	case FFA_ID_GET:
+		return "FFA_ID_GET";
+	case FFA_MSG_POLL:
+		return "FFA_MSG_POLL";
+	case FFA_MSG_WAIT:
+		return "FFA_MSG_WAIT";
+	case FFA_MSG_YIELD:
+		return "FFA_MSG_YIELD";
+	case FFA_RUN:
+		return "FFA_RUN";
+	case FFA_MSG_SEND:
+		return "FFA_MSG_SEND";
+	case FFA_MSG_SEND_DIRECT_RESP_SMC32:
+		return "FFA_MSG_SEND_DIRECT_RESP_SMC32";
+	case FFA_MEM_DONATE_SMC32:
+		return "FFA_MEM_DONATE_SMC32";
+	case FFA_MEM_LEND_SMC32:
+		return "FFA_MEM_LEND_SMC32";
+	case FFA_MEM_SHARE_SMC32:
+		return "FFA_MEM_SHARE_SMC32";
+	case FFA_MEM_RETRIEVE_REQ_SMC32:
+		return "FFA_MEM_RETRIEVE_REQ_SMC32";
+	case FFA_MEM_RETRIEVE_RESP:
+		return "FFA_MEM_RETRIEVE_RESP";
+	case FFA_MEM_RELINQUISH:
+		return "FFA_MEM_RELINQUISH";
+	case FFA_MEM_RECLAIM:
+		return "FFA_MEM_RECLAIM";
+	case FFA_NOTIFICATION_BITMAP_CREATE:
+		return "FFA_NOTIFICATION_BITMAP_CREATE";
+	case FFA_NOTIFICATION_BITMAP_DESTROY:
+		return "FFA_NOTIFICATION_BITMAP_DESTROY";
+	case FFA_NOTIFICATION_BIND:
+		return "FFA_NOTIFICATION_BIND";
+	case FFA_NOTIFICATION_UNBIND:
+		return "FFA_NOTIFICATION_UNBIND";
+	case FFA_NOTIFICATION_SET:
+		return "FFA_NOTIFICATION_SET";
+	case FFA_NOTIFICATION_GET:
+		return "FFA_NOTIFICATION_GET";
+	case FFA_NOTIFICATION_INFO_GET:
+		return "FFA_NOTIFICATION_INFO_GET";
+	case FFA_SPM_ID_GET:
+		return "FFA_SPM_ID_GET";
+	case FFA_SUCCESS_SMC64:
+		return "FFA_SUCCESS_SMC64";
+	case FFA_RXTX_MAP_SMC64:
+		return "FFA_RXTX_MAP_SMC64";
+	case FFA_MSG_SEND_DIRECT_REQ_SMC64:
+		return "FFA_MSG_SEND_DIRECT_REQ_SMC64";
+	case FFA_MSG_SEND_DIRECT_RESP_SMC64:
+		return "FFA_MSG_SEND_DIRECT_RESP_SMC64";
+	case FFA_MEM_DONATE_SMC64:
+		return "FFA_MEM_DONATE_SMC64";
+	case FFA_MEM_LEND_SMC64:
+		return "FFA_MEM_LEND_SMC64";
+	case FFA_MEM_SHARE_SMC64:
+		return "FFA_MEM_SHARE_SMC64";
+	case FFA_MEM_RETRIEVE_REQ_SMC64:
+		return "FFA_MEM_RETRIEVE_REQ_SMC64";
+	case FFA_SECONDARY_EP_REGISTER_SMC64:
+		return "FFA_SECONDARY_EP_REGISTER_SMC64";
+	case FFA_NOTIFICATION_INFO_GET_SMC64:
+		return "FFA_NOTIFICATION_INFO_GET_SMC64";
+	case FFA_FEATURES_MEM_RETRIEVE_REQ_NS_SUPPORT:
+		return "FFA_FEATURES_MEM_RETRIEVE_REQ_NS_SUPPORT";
+	case FFA_PARTITION_INFO_GET_REGS_SMC64:
+		return "FFA_PARTITION_INFO_GET_REGS_SMC64";
+	case FFA_CONSOLE_LOG_SMC64:
+		return "FFA_CONSOLE_LOG_SMC64";
+	default:
+		return "UNKNOWN";
+	}
+}
+
 /*
  * Reserve a special value for traffic targeted to the Hypervisor or SPM.
  */
diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c
index b3f7451..141f1fe 100644
--- a/spm/cactus/cactus_main.c
+++ b/spm/cactus/cactus_main.c
@@ -61,10 +61,12 @@
 	ffa_ret = ffa_msg_wait();
 
 	for (;;) {
-		VERBOSE("Woke up with func id: %x\n", ffa_func_id(ffa_ret));
+		VERBOSE("Woke up with func id: %s\n",
+			ffa_func_name(ffa_func_id(ffa_ret)));
 
 		if (ffa_func_id(ffa_ret) == FFA_ERROR) {
-			ERROR("Error: %x\n", ffa_error_code(ffa_ret));
+			ERROR("Error: %s\n",
+			      ffa_error_name(ffa_error_code(ffa_ret)));
 			break;
 		}
 
@@ -72,8 +74,8 @@
 		    ffa_func_id(ffa_ret) != FFA_MSG_SEND_DIRECT_REQ_SMC64 &&
 		    ffa_func_id(ffa_ret) != FFA_INTERRUPT &&
 		    ffa_func_id(ffa_ret) != FFA_RUN) {
-			ERROR("%s(%u) unknown func id 0x%x\n",
-				__func__, vm_id, ffa_func_id(ffa_ret));
+			ERROR("%s(%u) unknown func id %s\n", __func__, vm_id,
+			      ffa_func_name(ffa_func_id(ffa_ret)));
 			break;
 		}
 
@@ -304,9 +306,8 @@
 		VERBOSE("Mapping RXTX Region\n");
 		CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret);
 		if (ffa_func_id(ret) != FFA_SUCCESS_SMC32) {
-			ERROR(
-			    "Failed to map RXTX buffers. Error: %x\n",
-			    ffa_error_code(ret));
+			ERROR("Failed to map RXTX buffers. Error: %s\n",
+			      ffa_error_name(ffa_error_code(ret)));
 			panic();
 		}
 	}
diff --git a/spm/common/sp_tests/sp_test_ffa.c b/spm/common/sp_tests/sp_test_ffa.c
index 219b149..63bf131 100644
--- a/spm/common/sp_tests/sp_test_ffa.c
+++ b/spm/common/sp_tests/sp_test_ffa.c
@@ -99,18 +99,20 @@
 				test_target.expected_ret : FFA_ERROR;
 
 		if (ffa_func_id(ffa_ret) != expected_ret) {
-			ERROR("Unexpected return: %x (expected %x)."
+			ERROR("Unexpected return: %s (expected %s)."
 			      " FFA_FEATURES test: %s.\n",
-			      ffa_func_id(ffa_ret), expected_ret,
+			      ffa_func_name(ffa_func_id(ffa_ret)),
+			      ffa_func_name(expected_ret),
 			      test_target.test_name);
 		}
 
 		if (expected_ret == FFA_ERROR) {
 			if (ffa_error_code(ffa_ret) !=
 			    FFA_ERROR_NOT_SUPPORTED) {
-				ERROR("Unexpected error code: %x (expected %x)."
+				ERROR("Unexpected error code: %s (expected %s)."
 				      " FFA_FEATURES test: %s.\n",
-				      ffa_error_code(ffa_ret), expected_ret,
+				      ffa_error_name(ffa_error_code(ffa_ret)),
+				      ffa_error_name(expected_ret),
 				      test_target.test_name);
 			}
 		}
diff --git a/spm/ivy/app/ivy_main.c b/spm/ivy/app/ivy_main.c
index 1e2cd6a..861ef30 100644
--- a/spm/ivy/app/ivy_main.c
+++ b/spm/ivy/app/ivy_main.c
@@ -42,8 +42,8 @@
 	VERBOSE("Mapping RXTX Regions\n");
 	CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret);
 	if (ffa_func_id(ret) != FFA_SUCCESS_SMC32) {
-		ERROR("Failed to map RXTX buffers. Error %x\n",
-		      ffa_error_code(ret));
+		ERROR("Failed to map RXTX buffers. Error %s\n",
+		      ffa_error_name(ffa_error_code(ret)));
 		panic();
 	}
 
@@ -53,7 +53,8 @@
 
 	while (1) {
 		if (ffa_func_id(ret) != FFA_MSG_SEND_DIRECT_REQ_SMC32) {
-			ERROR("unknown FF-A request %x\n", ffa_func_id(ret));
+			ERROR("unknown FF-A request %s\n",
+			      ffa_func_name(ffa_func_id(ret)));
 			goto init;
 		}
 
diff --git a/tftf/tests/runtime_services/secure_service/spm_common.c b/tftf/tests/runtime_services/secure_service/spm_common.c
index ee25c82..45ab71a 100644
--- a/tftf/tests/runtime_services/secure_service/spm_common.c
+++ b/tftf/tests/runtime_services/secure_service/spm_common.c
@@ -21,24 +21,34 @@
 bool is_ffa_call_error(struct ffa_value ret)
 {
 	if (ffa_func_id(ret) == FFA_ERROR) {
-		VERBOSE("FF-A call returned error (%x): %d\n",
-		      ffa_func_id(ret), ffa_error_code(ret));
+		VERBOSE("FF-A call returned error: %s\n",
+			ffa_error_name(ffa_error_code(ret)));
 		return true;
 	}
 	return false;
 }
 
-bool is_expected_ffa_error(struct ffa_value ret, int32_t error_code)
+bool is_expected_ffa_error(struct ffa_value ret, int32_t expected_error)
 {
-	if (ffa_func_id(ret) == FFA_ERROR &&
-	    ffa_error_code(ret) == error_code) {
-		return true;
+	uint32_t received_func;
+	int32_t received_error;
+
+	received_func = ffa_func_id(ret);
+	if (received_func != FFA_ERROR) {
+		ERROR("Expected FFA_ERROR, got %s instead\n",
+		      ffa_func_name(received_func));
+		return false;
 	}
 
-	ERROR("Expected FFA_ERROR(%x), code: %d, got %x %d\n",
-	      FFA_ERROR, error_code, ffa_func_id(ret), ffa_error_code(ret));
+	received_error = ffa_error_code(ret);
+	if (received_error != expected_error) {
+		ERROR("Expected %s, got %s instead\n",
+		      ffa_error_name(expected_error),
+		      ffa_error_name(received_error));
+		return false;
+	}
 
-	return false;
+	return true;
 }
 
 /**
@@ -53,7 +63,7 @@
 		return true;
 	}
 
-	VERBOSE("%x is not FF-A response.\n", ffa_func_id(ret));
+	VERBOSE("%s is not FF-A response.\n", ffa_func_name(ffa_func_id(ret)));
 	/* To log error in case it is FFA_ERROR*/
 	is_ffa_call_error(ret);
 
@@ -69,7 +79,8 @@
 		return true;
 	}
 
-	VERBOSE("Expecting %x, FF-A return was %x\n", func_id, ffa_func_id(ret));
+	VERBOSE("Expecting %s, FF-A return was %s\n", ffa_func_name(func_id),
+		ffa_func_name(ffa_func_id(ret)));
 
 	return false;
 }
@@ -231,8 +242,8 @@
 	ret = ffa_mem_retrieve_req(descriptor_size, descriptor_size);
 
 	if (ffa_func_id(ret) != FFA_MEM_RETRIEVE_RESP) {
-		ERROR("%s: couldn't retrieve the memory page. Error: %d\n",
-		      __func__, ffa_error_code(ret));
+		ERROR("%s: couldn't retrieve the memory page. Error: %s\n",
+		      __func__, ffa_error_name(ffa_error_code(ret)));
 		return false;
 	}
 
@@ -417,8 +428,8 @@
 	ffa_mem_relinquish_init(m, handle, 0, id);
 	ret = ffa_mem_relinquish();
 	if (ffa_func_id(ret) != FFA_SUCCESS_SMC32) {
-		ERROR("%s failed to relinquish memory! error: %x\n",
-		      __func__, ffa_error_code(ret));
+		ERROR("%s failed to relinquish memory! error: %s\n", __func__,
+		      ffa_error_name(ffa_error_code(ret)));
 		return false;
 	}
 
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c b/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c
index 454ea05..d4c8048 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c
@@ -218,8 +218,10 @@
 
 	if ((ffa_func_id(ret_values) != FFA_ERROR) ||
 	    (ffa_error_code(ret_values) != FFA_ERROR_BUSY)) {
-		ERROR("Expected FFA_ERROR(BUSY)! Got %x(%x)\n",
-		      ffa_func_id(ret_values), ffa_error_code(ret_values));
+		ERROR("Expected FFA_ERROR(BUSY)! Got %s(%s)\n",
+		      ffa_func_name(ffa_func_id(ret_values)),
+		      ffa_error_name(ffa_error_code(ret_values)));
+
 		return TEST_RESULT_FAIL;
 	}
 
@@ -560,8 +562,9 @@
 
 	if ((ffa_func_id(ret_values) != FFA_ERROR) ||
 	    (ffa_error_code(ret_values) != FFA_ERROR_BUSY)) {
-		ERROR("Expected FFA_ERROR(BUSY)! Got %x(%x)\n",
-		      ffa_func_id(ret_values), ffa_error_code(ret_values));
+		ERROR("Expected FFA_ERROR(BUSY)! Got %s(%s)\n",
+		      ffa_func_name(ffa_func_id(ret_values)),
+		      ffa_error_name(ffa_error_code(ret_values)));
 		return TEST_RESULT_FAIL;
 	}
 
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
index 80a3015..567ac48 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
@@ -94,19 +94,20 @@
 			>= test_target.version_added ?
 			test_target.expected_ret : FFA_ERROR;
 		if (ffa_func_id(ffa_ret) != expected_ret) {
-			tftf_testcase_printf("%s returned %x, expected %x\n",
-					test_target.test_name,
-					ffa_func_id(ffa_ret),
-					expected_ret);
+			tftf_testcase_printf(
+				"%s returned %s, expected %s\n",
+				test_target.test_name,
+				ffa_func_name(ffa_func_id(ffa_ret)),
+				ffa_func_name(expected_ret));
 			return TEST_RESULT_FAIL;
 		}
 		if ((expected_ret == FFA_ERROR) &&
 				(ffa_error_code(ffa_ret) != FFA_ERROR_NOT_SUPPORTED)) {
-			tftf_testcase_printf("%s failed for the wrong reason: "
-					"returned %x, expected %x\n",
-					test_target.test_name,
-					ffa_error_code(ffa_ret),
-					FFA_ERROR_NOT_SUPPORTED);
+			tftf_testcase_printf(
+				"%s failed for the wrong reason: returned %s, expected %s\n",
+				test_target.test_name,
+				ffa_error_name(ffa_error_code(ffa_ret)),
+				ffa_error_name(FFA_ERROR_NOT_SUPPORTED));
 			return TEST_RESULT_FAIL;
 		}
 	}
@@ -225,7 +226,8 @@
 	 */
 	CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret);
 	if (ffa_func_id(ret) != expected_return) {
-		ERROR("Failed to map RXTX buffers %x!\n", ffa_error_code(ret));
+		ERROR("Failed to map RXTX buffers: %s!\n",
+		      ffa_error_name(ffa_error_code(ret)));
 		return TEST_RESULT_FAIL;
 	}
 
@@ -353,8 +355,8 @@
 	struct ffa_value ffa_ret = ffa_spm_id_get();
 
 	if (is_ffa_call_error(ffa_ret)) {
-		ERROR("FFA_SPM_ID_GET call failed! Error code: 0x%x\n",
-			ffa_error_code(ffa_ret));
+		ERROR("FFA_SPM_ID_GET call failed! Error code: %s\n",
+		      ffa_error_name(ffa_error_code(ffa_ret)));
 		return TEST_RESULT_FAIL;
 	}