refactor: statically define information of VMs

The driver is used to test hypervisor implementation.
For now drop use of FFA_PARTITION_INFO_GET in the driver's
initalisation. All FF-A partitions are expected to have an
UUID, which was not enforced until FF-A v1.2 updates.

As such, statically define the hf_vms array. For the vcpus
structures malloc is still used.

Signed-off-by: J-Alves <joao.alves@arm.com>
Change-Id: I669da31ffebc7ad9938124c57c3cc2ea6ae53d06
diff --git a/main.c b/main.c
index d5cfe55..0b1eb76 100644
--- a/main.c
+++ b/main.c
@@ -12,7 +12,12 @@
  * GNU General Public License for more details.
  */
 
+#include "uapi/hf/socket.h"
 #include <clocksource/arm_arch_timer.h>
+#include <hf/call.h>
+#include <hf/ffa.h>
+#include <hf/transport.h>
+#include <hf/vm_ids.h>
 #include <linux/atomic.h>
 #include <linux/cpuhotplug.h>
 #include <linux/hrtimer.h>
@@ -30,16 +35,9 @@
 #include <linux/slab.h>
 #include <net/sock.h>
 
-#include <hf/call.h>
-#include <hf/ffa.h>
-#include <hf/transport.h>
-#include <hf/vm_ids.h>
-
-#include "uapi/hf/socket.h"
-
 #define HYPERVISOR_TIMER_NAME "el2_timer"
 
-#define CONFIG_HAFNIUM_MAX_VMS   16
+#define CONFIG_HAFNIUM_MAX_VMS 16
 #define CONFIG_HAFNIUM_MAX_VCPUS 32
 
 #define HF_VM_ID_BASE 0
@@ -80,8 +78,12 @@
 	.obj_size = sizeof(struct hf_sock),
 };
 
-static struct hf_vm *hf_vms;
-static ffa_vm_count_t hf_vm_count;
+static struct hf_vm hf_vms[] = {{
+	.id = 2,
+	.vcpu_count = 1,
+}};
+const ffa_vm_count_t hf_vm_count = ARRAY_SIZE(hf_vms);
+
 static struct page *hf_send_page;
 static struct page *hf_recv_page;
 static atomic64_t hf_next_port = ATOMIC64_INIT(0);
@@ -158,8 +160,7 @@
  *
  * It wakes up the thread if it's sleeping, or kicks it if it's already running.
  */
-static void hf_handle_wake_up_request(ffa_id_t vm_id,
-				      ffa_vcpu_index_t vcpu)
+static void hf_handle_wake_up_request(ffa_id_t vm_id, ffa_vcpu_index_t vcpu)
 {
 	struct hf_vm *vm = hf_vm_from_id(vm_id);
 
@@ -169,8 +170,8 @@
 	}
 
 	if (vcpu >= vm->vcpu_count) {
-		pr_warn("Request to wake up non-existent vCPU: %u.%u\n",
-			vm_id, vcpu);
+		pr_warn("Request to wake up non-existent vCPU: %u.%u\n", vm_id,
+			vcpu);
 		return;
 	}
 
@@ -364,8 +365,7 @@
 
 		switch (ret.func) {
 		/* Preempted, or wants to wake up another vCPU. */
-		case FFA_INTERRUPT_32:
-		{
+		case FFA_INTERRUPT_32: {
 			ffa_id_t vm_id = ffa_vm_id(ret);
 			ffa_vcpu_index_t vcpu_index = ffa_vcpu_index(ret);
 
@@ -833,8 +833,6 @@
 		kfree(vm->vcpu);
 	}
 
-	kfree(hf_vms);
-
 	ffa_rx_release();
 	ffa_rxtx_unmap();
 	if (hf_send_page) {
@@ -910,8 +908,8 @@
 	ret = request_percpu_irq(irq, hf_nop_irq_handler, HYPERVISOR_TIMER_NAME,
 				 pdev);
 	if (ret != 0) {
-		pr_err("Error registering hypervisor timer IRQ %d: %d\n",
-		       irq, ret);
+		pr_err("Error registering hypervisor timer IRQ %d: %d\n", irq,
+		       ret);
 		return ret;
 	}
 	pr_info("Hafnium registered for IRQ %d\n", irq);
@@ -946,15 +944,14 @@
 static const struct of_device_id hf_int_driver_id[] = {
 	{.compatible = "arm,armv7-timer"},
 	{.compatible = "arm,armv8-timer"},
-	{}
-};
+	{}};
 
 static struct platform_driver hf_int_driver = {
 	.driver = {
-		.name = HYPERVISOR_TIMER_NAME,
-		.owner = THIS_MODULE,
-		.of_match_table = of_match_ptr(hf_int_driver_id),
-	},
+			.name = HYPERVISOR_TIMER_NAME,
+			.owner = THIS_MODULE,
+			.of_match_table = of_match_ptr(hf_int_driver_id),
+		},
 	.probe = hf_int_driver_probe,
 	.remove = hf_int_driver_remove,
 };
@@ -986,9 +983,6 @@
 	struct ffa_value ffa_ret;
 	ffa_id_t i;
 	ffa_vcpu_index_t j;
-	struct ffa_uuid null_uuid;
-	ffa_vm_count_t secondary_vm_count;
-	const struct ffa_partition_info *partition_info;
 	uint32_t total_vcpu_count;
 
 	/* Allocate a page for send and receive buffers. */
@@ -1010,7 +1004,7 @@
 	 * Map RX/TX buffers to hypervisor.
 	 */
 	ffa_ret = ffa_rxtx_map(page_to_phys(hf_send_page),
-				 page_to_phys(hf_recv_page));
+			       page_to_phys(hf_recv_page));
 	if (ffa_ret.func != FFA_SUCCESS_32) {
 		pr_err("Unable to configure VM mailbox.\n");
 		print_ffa_error(ffa_ret);
@@ -1018,50 +1012,31 @@
 		goto fail_with_cleanup;
 	}
 
-	/* Get information about secondary VMs. */
-	ffa_uuid_init(0, 0, 0, 0, &null_uuid);
-	ffa_ret = ffa_partition_info_get(&null_uuid, 0);
-	if (ffa_ret.func != FFA_SUCCESS_32) {
-		pr_err("Unable to get VM information.\n");
-		print_ffa_error(ffa_ret);
-		ret = -EIO;
-		goto fail_with_cleanup;
-	}
-	secondary_vm_count = ffa_ret.arg2 - 1;
-	partition_info = page_address(hf_recv_page);
-
 	/* Confirm the maximum number of VMs looks sane. */
 	BUILD_BUG_ON(CONFIG_HAFNIUM_MAX_VMS < 1);
 	BUILD_BUG_ON(CONFIG_HAFNIUM_MAX_VMS > U16_MAX);
 
 	/* Validate the number of VMs. There must at least be the primary. */
-	if (secondary_vm_count > CONFIG_HAFNIUM_MAX_VMS - 1) {
-		pr_err("Number of VMs is out of range: %d\n",
-		       secondary_vm_count);
+	if (hf_vm_count > CONFIG_HAFNIUM_MAX_VMS - 1) {
+		pr_err("Number of VMs is out of range: %d\n", hf_vm_count);
 		ret = -EDQUOT;
 		goto fail_with_cleanup;
 	}
 
-	/* Only track the secondary VMs. */
-	hf_vms = kmalloc_array(secondary_vm_count, sizeof(struct hf_vm),
-			       GFP_KERNEL);
-	if (!hf_vms) {
-		ret = -ENOMEM;
-		goto fail_with_cleanup;
-	}
-
 	/* Cache the VM id for later usage. */
 	current_vm_id = hf_vm_get_id();
 
 	/* Initialize each VM. */
 	total_vcpu_count = 0;
-	for (i = 0; i < secondary_vm_count; i++) {
+	for (i = 0; i < hf_vm_count; i++) {
 		struct hf_vm *vm = &hf_vms[i];
 		ffa_vcpu_count_t vcpu_count;
 
 		/* Adjust the index as only the secondaries are tracked. */
-		vm->id = partition_info[i + 1].vm_id;
-		vcpu_count = partition_info[i + 1].vcpu_count;
+		vcpu_count = vm->vcpu_count;
+
+		pr_info("%s: info Id: %x vcpu count: %x\n", __func__, vm->id,
+			vcpu_count);
 
 		/* Avoid overflowing the vcpu count. */
 		if (vcpu_count > (U32_MAX - total_vcpu_count)) {
@@ -1090,11 +1065,8 @@
 			goto fail_with_cleanup;
 		}
 
-		/* Update the number of initialized VMs. */
-		hf_vm_count = i + 1;
-
 		/* Create a kernel thread for each vcpu. */
-		for (j = 0; j < vm->vcpu_count; j++) {
+		for (j = 0; j < vcpu_count; j++) {
 			struct hf_vcpu *vcpu = &vm->vcpu[j];
 
 			vcpu->task =
@@ -1116,14 +1088,6 @@
 		}
 	}
 
-	ffa_ret = ffa_rx_release();
-	if (ffa_ret.func != FFA_SUCCESS_32) {
-		pr_err("Unable to release RX buffer.\n");
-		print_ffa_error(ffa_ret);
-		ret = -EIO;
-		goto fail_with_cleanup;
-	}
-
 	/* Register protocol and socket family. */
 	ret = proto_register(&hf_sock_proto, 0);
 	if (ret) {