Merge tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyper...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Oct 2020 22:48:06 +0000 (15:48 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Oct 2020 22:48:06 +0000 (15:48 -0700)
Pull another Hyper-V update from Wei Liu:
 "One patch from Michael to get VMbus interrupt from ACPI DSDT"

* tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux:
  Drivers: hv: vmbus: Add parsing of VMbus interrupt in ACPI DSDT

1  2 
drivers/hv/vmbus_drv.c

diff --combined drivers/hv/vmbus_drv.c
@@@ -48,6 -48,10 +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 +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 +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 +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 +2076,7 @@@ static acpi_status vmbus_walk_resources
        struct resource *new_res;
        struct resource **old_res = &hyperv_mmio;
        struct resource **prev_res = NULL;
+       struct resource r;
  
        switch (res->type) {
  
                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;
@@@ -2382,10 -2406,7 +2406,10 @@@ static int vmbus_bus_suspend(struct dev
        if (atomic_read(&vmbus_connection.nr_chan_close_on_suspend) > 0)
                wait_for_completion(&vmbus_connection.ready_for_suspend_event);
  
 -      WARN_ON(atomic_read(&vmbus_connection.nr_chan_fixup_on_resume) != 0);
 +      if (atomic_read(&vmbus_connection.nr_chan_fixup_on_resume) != 0) {
 +              pr_err("Can not suspend due to a previous failed resuming\n");
 +              return -EBUSY;
 +      }
  
        mutex_lock(&vmbus_connection.channel_mutex);
  
@@@ -2459,9 -2480,7 +2483,9 @@@ static int vmbus_bus_resume(struct devi
  
        vmbus_request_offers();
  
 -      wait_for_completion(&vmbus_connection.ready_for_resume_event);
 +      if (wait_for_completion_timeout(
 +              &vmbus_connection.ready_for_resume_event, 10 * HZ) == 0)
 +              pr_err("Some vmbus device is missing after suspending?\n");
  
        /* Reset the event for the next suspend. */
        reinit_completion(&vmbus_connection.ready_for_suspend_event);