pci: Utilize device_getenv_int
[dragonfly.git] / sys / bus / pci / pci.c
index 86081ad..f752fa1 100644 (file)
@@ -28,7 +28,6 @@
  * $FreeBSD: src/sys/dev/pci/pci.c,v 1.355.2.9.2.1 2009/04/15 03:14:26 kensmith Exp $
  */
 
-#include "opt_bus.h"
 #include "opt_acpi.h"
 #include "opt_compat_oldpci.h"
 
@@ -296,12 +295,10 @@ TUNABLE_INT("hw.pci.enable_msi", &pci_do_msi);
 SYSCTL_INT(_hw_pci, OID_AUTO, enable_msi, CTLFLAG_RW, &pci_do_msi, 1,
     "Enable support for MSI interrupts");
 
-static int pci_do_msix = 0;
-#if 0
+static int pci_do_msix = 1;
 TUNABLE_INT("hw.pci.enable_msix", &pci_do_msix);
 SYSCTL_INT(_hw_pci, OID_AUTO, enable_msix, CTLFLAG_RW, &pci_do_msix, 1,
     "Enable support for MSI-X interrupts");
-#endif
 
 static int pci_honor_msi_blacklist = 1;
 TUNABLE_INT("hw.pci.honor_msi_blacklist", &pci_honor_msi_blacklist);
@@ -1448,7 +1445,7 @@ pci_resume_msix(device_t dev)
        struct pci_devinfo *dinfo = device_get_ivars(dev);
        struct pcicfg_msix *msix = &dinfo->cfg.msix;
 
-       if (msix->msix_alloc > 0) {
+       if (msix->msix_table_res != NULL) {
                const struct msix_vector *mv;
 
                pci_mask_msix_allvectors(dev);
@@ -1614,6 +1611,10 @@ pci_setup_msix(device_t dev)
            !pci_do_msix)
                return (ENODEV);
 
+       KASSERT(cfg->msix.msix_alloc == 0 &&
+           TAILQ_EMPTY(&cfg->msix.msix_vectors),
+           ("MSI-X vector has been allocated\n"));
+
        /* Make sure the appropriate BARs are mapped. */
        rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY,
            cfg->msix.msix_table_bar);
@@ -1646,6 +1647,8 @@ pci_teardown_msix(device_t dev)
 
        KASSERT(msix->msix_table_res != NULL &&
            msix->msix_pba_res != NULL, ("MSI-X is not setup yet\n"));
+       KASSERT(msix->msix_alloc == 0 && TAILQ_EMPTY(&msix->msix_vectors),
+           ("MSI-X vector is still allocated\n"));
 
        pci_mask_msix_allvectors(dev);
 
@@ -1899,7 +1902,7 @@ pci_alloc_msi_method(device_t dev, device_t child, int *rid, int count,
                return (ENXIO);
 
        /* Already have allocated messages? */
-       if (cfg->msi.msi_alloc != 0 || cfg->msix.msix_alloc != 0)
+       if (cfg->msi.msi_alloc != 0 || cfg->msix.msix_table_res != NULL)
                return (ENXIO);
 
        /* If MSI is blacklisted for this system, fail. */
@@ -1916,8 +1919,8 @@ pci_alloc_msi_method(device_t dev, device_t child, int *rid, int count,
 
        if (bootverbose) {
                device_printf(child,
-                   "attempting to allocate %d MSI vectors (%d supported)\n",
-                   count, cfg->msi.msi_msgnum);
+                   "attempting to allocate %d MSI vector%s (%d supported)\n",
+                   count, count > 1 ? "s" : "", cfg->msi.msi_msgnum);
        }
 
        if (start_cpuid < 0)
@@ -2686,10 +2689,16 @@ pci_assign_interrupt(device_t bus, device_t dev, int force_route)
        /* Let the user override the IRQ with a tunable. */
        irq = PCI_INVALID_IRQ;
        ksnprintf(tunable_name, sizeof(tunable_name),
-           "hw.pci%d.%d.%d.INT%c.irq",
-           cfg->domain, cfg->bus, cfg->slot, cfg->intpin + 'A' - 1);
-       if (TUNABLE_INT_FETCH(tunable_name, &irq) && (irq >= 255 || irq <= 0))
-               irq = PCI_INVALID_IRQ;
+           "hw.pci%d.%d.%d.%d.INT%c.irq",
+           cfg->domain, cfg->bus, cfg->slot, cfg->func, cfg->intpin + 'A' - 1);
+       if (TUNABLE_INT_FETCH(tunable_name, &irq)) {
+               if (irq >= 255 || irq <= 0) {
+                       irq = PCI_INVALID_IRQ;
+               } else {
+                       BUS_CONFIG_INTR(bus, dev, irq,
+                           INTR_TRIGGER_LEVEL, INTR_POLARITY_LOW);
+               }
+       }
 
        /*
         * If we didn't get an IRQ via the tunable, then we either use the
@@ -2982,13 +2991,14 @@ pci_child_detached(device_t parent __unused, device_t child)
 
 int
 pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
-    driver_intr_t *intr, void *arg, void **cookiep, lwkt_serialize_t serializer)
+    driver_intr_t *intr, void *arg, void **cookiep,
+    lwkt_serialize_t serializer, const char *desc)
 {
        int rid, error;
        void *cookie;
 
        error = bus_generic_setup_intr(dev, child, irq, flags, intr,
-           arg, &cookie, serializer);
+           arg, &cookie, serializer, desc);
        if (error)
                return (error);
 
@@ -4088,22 +4098,16 @@ pci_alloc_1intr(device_t dev, int msi_enable, int *rid0, u_int *flags0)
 {
        int rid, type;
        u_int flags;
-       char env[64];
 
        rid = 0;
        type = PCI_INTR_TYPE_LEGACY;
        flags = RF_SHAREABLE | RF_ACTIVE;
 
-       ksnprintf(env, sizeof(env), "hw.%s.msi.enable",
-           device_get_nameunit(dev));
-       kgetenv_int(env, &msi_enable);
-
+       device_getenv_int(dev, "msi.enable", &msi_enable);
        if (msi_enable) {
                int cpu = -1;
 
-               ksnprintf(env, sizeof(env), "hw.%s.msi.cpu",
-                   device_get_nameunit(dev));
-               kgetenv_int(env, &cpu);
+               device_getenv_int(dev, "msi.cpu", &cpu);
                if (cpu >= ncpus)
                        cpu = ncpus - 1;