Merge tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyper...
[platform/kernel/linux-rpi.git] / drivers / hv / vmbus_drv.c
index 7b8816c..4fad3e6 100644 (file)
@@ -48,6 +48,10 @@ static int hyperv_cpuhp_online;
 
 static void *hv_panic_page;
 
+/* Values parsed from ACPI DSDT */
+static int vmbus_irq;
+int vmbus_interrupt;
+
 /*
  * Boolean to control whether to report panic messages over Hyper-V.
  *
@@ -1347,7 +1351,7 @@ static void vmbus_isr(void)
                        tasklet_schedule(&hv_cpu->msg_dpc);
        }
 
-       add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0);
+       add_interrupt_randomness(hv_get_vector(), 0);
 }
 
 /*
@@ -1430,7 +1434,9 @@ static int vmbus_bus_init(void)
        if (ret)
                return ret;
 
-       hv_setup_vmbus_irq(vmbus_isr);
+       ret = hv_setup_vmbus_irq(vmbus_irq, vmbus_isr);
+       if (ret)
+               goto err_setup;
 
        ret = hv_synic_alloc();
        if (ret)
@@ -1505,7 +1511,7 @@ err_cpuhp:
        hv_synic_free();
 err_alloc:
        hv_remove_vmbus_irq();
-
+err_setup:
        bus_unregister(&hv_bus);
        unregister_sysctl_table(hv_ctl_table_hdr);
        hv_ctl_table_hdr = NULL;
@@ -2070,6 +2076,7 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
        struct resource *new_res;
        struct resource **old_res = &hyperv_mmio;
        struct resource **prev_res = NULL;
+       struct resource r;
 
        switch (res->type) {
 
@@ -2088,6 +2095,23 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx)
                end = res->data.address64.address.maximum;
                break;
 
+       /*
+        * The IRQ information is needed only on ARM64, which Hyper-V
+        * sets up in the extended format. IRQ information is present
+        * on x86/x64 in the non-extended format but it is not used by
+        * Linux. So don't bother checking for the non-extended format.
+        */
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+               if (!acpi_dev_resource_interrupt(res, 0, &r)) {
+                       pr_err("Unable to parse Hyper-V ACPI interrupt\n");
+                       return AE_ERROR;
+               }
+               /* ARM64 INTID for VMbus */
+               vmbus_interrupt = res->data.extended_irq.interrupts[0];
+               /* Linux IRQ number */
+               vmbus_irq = r.start;
+               return AE_OK;
+
        default:
                /* Unused resource type */
                return AE_OK;