Author: royger
Date: Thu Sep 13 07:14:11 2018
New Revision: 338631
URL: https://svnweb.freebsd.org/changeset/base/338631

Log:
  xen: legacy PVH fixes for the new interrupt count
  
  Register interrupts using the PIC pic_register_sources method instead
  of doing it in apic_setup_io. This is now required, since the internal
  interrupt structures are not yet setup when calling apic_setup_io.
  
  Approved by:          re (gjb)
  Sponsored by:         Citrix Systems R&D

Modified:
  head/sys/x86/xen/pvcpu_enum.c
  head/sys/x86/xen/xen_intr.c
  head/sys/xen/xen_intr.h

Modified: head/sys/x86/xen/pvcpu_enum.c
==============================================================================
--- head/sys/x86/xen/pvcpu_enum.c       Thu Sep 13 07:13:13 2018        
(r338630)
+++ head/sys/x86/xen/pvcpu_enum.c       Thu Sep 13 07:14:11 2018        
(r338631)
@@ -193,52 +193,65 @@ xenpv_setup_io(void)
 {
 
        if (xen_initial_domain()) {
-               int i, ret;
+               /*
+                * NB: we could iterate over the MADT IOAPIC entries in order
+                * to figure out the exact number of IOAPIC interrupts, but
+                * this is legacy code so just keep using the previous
+                * behaviour and assume a maximum of 256 interrupts.
+                */
+               num_io_irqs = max(MINIMUM_MSI_INT - 1, num_io_irqs);
 
-               /* Map MADT */
-               madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
-               madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
-               madt_length = madt->Header.Length;
+               acpi_SetDefaultIntrModel(ACPI_INTR_APIC);
+       }
+       return (0);
+}
 
-               /* Try to initialize ACPI so that we can access the FADT. */
-               i = acpi_Startup();
-               if (ACPI_FAILURE(i)) {
-                       printf("MADT: ACPI Startup failed with %s\n",
-                           AcpiFormatException(i));
-                       printf("Try disabling either ACPI or apic support.\n");
-                       panic("Using MADT but ACPI doesn't work");
-               }
+void
+xenpv_register_pirqs(struct pic *pic __unused)
+{
+       unsigned int i;
+       int ret;
 
-               /* Run through the table to see if there are any overrides. */
-               madt_walk_table(madt_parse_ints, NULL);
+       /* Map MADT */
+       madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
+       madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
+       madt_length = madt->Header.Length;
 
-               /*
-                * If there was not an explicit override entry for the SCI,
-                * force it to use level trigger and active-low polarity.
-                */
-               if (!madt_found_sci_override) {
-                       printf(
-       "MADT: Forcing active-low polarity and level trigger for SCI\n");
-                       ret = xen_register_pirq(AcpiGbl_FADT.SciInterrupt,
-                           INTR_TRIGGER_LEVEL, INTR_POLARITY_LOW);
-                       if (ret != 0)
-                               panic("Unable to register SCI IRQ");
-               }
+       /* Try to initialize ACPI so that we can access the FADT. */
+       ret = acpi_Startup();
+       if (ACPI_FAILURE(ret)) {
+               printf("MADT: ACPI Startup failed with %s\n",
+                   AcpiFormatException(ret));
+               printf("Try disabling either ACPI or apic support.\n");
+               panic("Using MADT but ACPI doesn't work");
+       }
 
-               /* Register legacy ISA IRQs */
-               for (i = 1; i < 16; i++) {
-                       if (intr_lookup_source(i) != NULL)
-                               continue;
-                       ret = xen_register_pirq(i, INTR_TRIGGER_EDGE,
-                           INTR_POLARITY_LOW);
-                       if (ret != 0 && bootverbose)
-                               printf("Unable to register legacy IRQ#%d: %d\n",
-                                   i, ret);
-               }
+       /* Run through the table to see if there are any overrides. */
+       madt_walk_table(madt_parse_ints, NULL);
 
-               acpi_SetDefaultIntrModel(ACPI_INTR_APIC);
+       /*
+        * If there was not an explicit override entry for the SCI,
+        * force it to use level trigger and active-low polarity.
+        */
+       if (!madt_found_sci_override) {
+               printf(
+"MADT: Forcing active-low polarity and level trigger for SCI\n");
+               ret = xen_register_pirq(AcpiGbl_FADT.SciInterrupt,
+                   INTR_TRIGGER_LEVEL, INTR_POLARITY_LOW);
+               if (ret != 0)
+                       panic("Unable to register SCI IRQ");
        }
-       return (0);
+
+       /* Register legacy ISA IRQs */
+       for (i = 1; i < 16; i++) {
+               if (intr_lookup_source(i) != NULL)
+                       continue;
+               ret = xen_register_pirq(i, INTR_TRIGGER_EDGE,
+                   INTR_POLARITY_LOW);
+               if (ret != 0 && bootverbose)
+                       printf("Unable to register legacy IRQ#%u: %d\n", i,
+                           ret);
+       }
 }
 
 static void

Modified: head/sys/x86/xen/xen_intr.c
==============================================================================
--- head/sys/x86/xen/xen_intr.c Thu Sep 13 07:13:13 2018        (r338630)
+++ head/sys/x86/xen/xen_intr.c Thu Sep 13 07:14:11 2018        (r338631)
@@ -178,6 +178,9 @@ struct pic xen_intr_pic = {
  * physical interrupt sources.
  */
 struct pic xen_intr_pirq_pic = {
+#ifdef __amd64__
+       .pic_register_sources = xenpv_register_pirqs,
+#endif
        .pic_enable_source  = xen_intr_pirq_enable_source,
        .pic_disable_source = xen_intr_pirq_disable_source,
        .pic_eoi_source     = xen_intr_pirq_eoi_source,

Modified: head/sys/xen/xen_intr.h
==============================================================================
--- head/sys/xen/xen_intr.h     Thu Sep 13 07:13:13 2018        (r338630)
+++ head/sys/xen/xen_intr.h     Thu Sep 13 07:14:11 2018        (r338631)
@@ -274,4 +274,14 @@ int xen_intr_add_handler(const char *name, driver_filt
 int xen_intr_get_evtchn_from_port(evtchn_port_t port,
        xen_intr_handle_t *handlep);
 
+/**
+ * Register the IO-APIC PIRQs when running in legacy PVH Dom0 mode.
+ *
+ * \param pic      PIC instance.
+ *
+ * NB: this should be removed together with the support for legacy PVH mode.
+ */
+struct pic;
+void xenpv_register_pirqs(struct pic *pic);
+
 #endif /* _XEN_INTR_H_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to