Move non-trivial SPCI helper functions to a source file.

Also stop manually copying hf_call.c to kernel module, instead
copying as part of build.

Change-Id: I646ac994b5dc3de0bb4ce501323ea36a8a6fe009
diff --git a/inc/vmapi/hf/spci.h b/inc/vmapi/hf/spci.h
index b00fb46..30feb0e 100644
--- a/inc/vmapi/hf/spci.h
+++ b/inc/vmapi/hf/spci.h
@@ -18,14 +18,6 @@
 
 #include "hf/types.h"
 
-/*
- * Copied from hf/arch/std.h because we can't include Hafnium internal headers
- * here.
- */
-#ifndef align_up
-#define align_up(v, a) (((uintptr_t)(v) + (a - 1)) & ~(a - 1))
-#endif
-
 /* clang-format off */
 
 #define SPCI_LOW_32_ID  0x84000060
@@ -310,8 +302,6 @@
 	struct spci_memory_region_attributes attributes[];
 };
 
-/* TODO: Move all the functions below this line to a support library. */
-
 /**
  * Gets the constituent array for an `spci_memory_region`.
  */
@@ -323,20 +313,7 @@
 			   memory_region->constituent_offset);
 }
 
-/**
- * Helper method to fill in the information about the architected message.
- */
-static inline void spci_architected_message_init(void *message,
-						 enum spci_memory_share type)
-{
-	/* Fill the architected header. */
-	struct spci_architected_message_header *architected_header =
-		(struct spci_architected_message_header *)message;
-	architected_header->type = type;
-	architected_header->reserved[0] = 0;
-	architected_header->reserved[1] = 0;
-	architected_header->reserved[2] = 0;
-}
+void spci_architected_message_init(void *message, enum spci_memory_share type);
 
 /** Gets the spci_memory_region within an architected message. */
 static inline struct spci_memory_region *spci_get_memory_region(void *message)
@@ -346,92 +323,21 @@
 	return (struct spci_memory_region *)architected_header->payload;
 }
 
-/**
- * Initialises the given `spci_memory_region` and copies the constituent
- * information to it. Returns the length in bytes occupied by the data copied to
- * `memory_region` (attributes, constituents and memory region header size).
- */
-static inline uint32_t spci_memory_region_init(
+uint32_t spci_memory_region_init(
 	struct spci_memory_region *memory_region, spci_vm_id_t receiver,
 	const struct spci_memory_region_constituent constituents[],
 	uint32_t constituent_count, uint32_t tag,
 	enum spci_memory_access access, enum spci_memory_type type,
 	enum spci_memory_cacheability cacheability,
-	enum spci_memory_shareability shareability)
-{
-	uint32_t constituents_length =
-		constituent_count *
-		sizeof(struct spci_memory_region_constituent);
-	uint32_t index;
-	struct spci_memory_region_constituent *region_constituents;
-	uint16_t attributes = 0;
+	enum spci_memory_shareability shareability);
 
-	/* Set memory region's page attributes. */
-	spci_set_memory_access_attr(&attributes, access);
-	spci_set_memory_type_attr(&attributes, type);
-	spci_set_memory_cacheability_attr(&attributes, cacheability);
-	spci_set_memory_shareability_attr(&attributes, shareability);
-
-	memory_region->tag = tag;
-	memory_region->flags = 0;
-	memory_region->page_count = 0;
-	memory_region->constituent_count = constituent_count;
-	memory_region->attribute_count = 1;
-	memory_region->attributes[0].receiver = receiver;
-	memory_region->attributes[0].memory_attributes = attributes;
-
-	/*
-	 * Constituent offset must be aligned to a 64-bit boundary so that
-	 * 64-bit addresses can be copied without alignment faults.
-	 */
-	memory_region->constituent_offset = align_up(
-		sizeof(struct spci_memory_region) +
-			memory_region->attribute_count *
-				sizeof(struct spci_memory_region_attributes),
-		8);
-	region_constituents =
-		spci_memory_region_get_constituents(memory_region);
-
-	for (index = 0; index < constituent_count; index++) {
-		region_constituents[index] = constituents[index];
-		region_constituents[index].reserved = 0;
-		memory_region->page_count += constituents[index].page_count;
-	}
-
-	/*
-	 * TODO: Add assert ensuring that the specified message
-	 * length is not greater than SPCI_MSG_PAYLOAD_MAX.
-	 */
-
-	return memory_region->constituent_offset + constituents_length;
-}
-
-/**
- * Constructs an 'architected message' for SPCI memory sharing of the given
- * type.
- */
-static inline uint32_t spci_memory_init(
+uint32_t spci_memory_init(
 	void *message, enum spci_memory_share share_type, spci_vm_id_t receiver,
 	struct spci_memory_region_constituent *region_constituents,
 	uint32_t constituent_count, uint32_t tag,
 	enum spci_memory_access access, enum spci_memory_type type,
 	enum spci_memory_cacheability cacheability,
-	enum spci_memory_shareability shareability)
-{
-	uint32_t message_length =
-		sizeof(struct spci_architected_message_header);
-	struct spci_memory_region *memory_region =
-		spci_get_memory_region(message);
-
-	/* Fill in the details on the common message header. */
-	spci_architected_message_init(message, share_type);
-
-	/* Fill in memory region. */
-	message_length += spci_memory_region_init(
-		memory_region, receiver, region_constituents, constituent_count,
-		tag, access, type, cacheability, shareability);
-	return message_length;
-}
+	enum spci_memory_shareability shareability);
 
 /** Constructs an SPCI donate memory region message. */
 static inline uint32_t spci_memory_donate_init(