x86_64/msi: Add hw.ioapic.msi_start tunable
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 26 Dec 2011 13:26:34 +0000 (21:26 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 27 Dec 2011 05:44:43 +0000 (13:44 +0800)
This is mainly used to test MSI allocation over the whole valid
hardware interrupt space.

sys/platform/pc64/apic/ioapic_abi.c

index ee809ed..2fec2cb 100644 (file)
@@ -532,6 +532,7 @@ struct machintr_abi MachIntrABI_IOAPIC = {
 static int     ioapic_abi_extint_irq = -1;
 static int     ioapic_abi_line_irq_max;
 static int     ioapic_abi_gsi_balance;
+static int     ioapic_abi_msi_start;   /* NOTE: for testing only */
 
 struct ioapic_irqinfo  ioapic_irqs[IOAPIC_HWI_VECTORS];
 
@@ -732,6 +733,9 @@ ioapic_abi_initmap(void)
 
        kgetenv_int("hw.ioapic.gsi.balance", &ioapic_abi_gsi_balance);
 
+       kgetenv_int("hw.ioapic.msi_start", &ioapic_abi_msi_start);
+       ioapic_abi_msi_start &= ~0x1f;  /* MUST be 32 aligned */
+
        /*
         * NOTE: ncpus is not ready yet
         */
@@ -1162,7 +1166,7 @@ ioapic_abi_msi_alloc(int intrs[], int count, int cpuid)
         */
 
        error = ENOENT;
-       for (i = 0; i < IOAPIC_HWI_VECTORS; i += count) {
+       for (i = ioapic_abi_msi_start; i < IOAPIC_HWI_VECTORS; i += count) {
                int j;
 
                if (ioapic_irqmaps[cpuid][i].im_type != IOAPIC_IMT_UNUSED)