resource: Per-CPU hardware resources support, step 4 of many
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 9 Oct 2011 11:06:25 +0000 (19:06 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 9 Oct 2011 11:06:25 +0000 (19:06 +0800)
Add cpuid parameter to bus_alloc_resource DEVMETHOD, so cpuid
could be passed all the way to the nexus

33 files changed:
sys/bus/isa/i386/isa.c
sys/bus/isa/isa_common.h
sys/bus/isa/x86_64/isa.c
sys/bus/pccard/pccard.c
sys/bus/pci/hostb_pci.c
sys/bus/pci/i386/legacyvar.h
sys/bus/pci/i386/pci_bus.c
sys/bus/pci/pci.c
sys/bus/pci/pci_pci.c
sys/bus/pci/pci_private.h
sys/bus/pci/pcib_private.h
sys/bus/pci/vga_pci.c
sys/bus/pci/x86_64/legacyvar.h
sys/bus/pci/x86_64/pci_bus.c
sys/dev/acpica5/acpi.c
sys/dev/acpica5/acpi_cpu.c
sys/dev/acpica5/acpi_pcib_acpi.c
sys/dev/disk/ata/ata-pci.c
sys/dev/disk/nata/ata-pci.c
sys/dev/disk/nata/ata-pci.h
sys/dev/misc/puc/puc.c
sys/dev/pccard/pccbb/pccbb.c
sys/dev/pccard/pccbb/pccbbvar.h
sys/dev/sound/isa/gusc.c
sys/dev/sound/isa/sbc.c
sys/dev/sound/pci/csa.c
sys/dev/sound/pci/fm801.c
sys/kern/bus_if.m
sys/kern/subr_bus.c
sys/platform/pc32/i386/nexus.c
sys/platform/pc64/x86_64/nexus.c
sys/sys/bus.h
sys/sys/rman.h

index ebccf20..d635d09 100644 (file)
@@ -61,6 +61,7 @@
 #include <sys/bus.h>
 #include <sys/malloc.h>
 #include <sys/rman.h>
+#include <sys/machintr.h>
 
 #include "../isavar.h"
 #include "../isa_common.h"
@@ -85,7 +86,7 @@ isa_init(void)
  */
 struct resource *
 isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                  u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        /*
         * Consider adding a resource definition. We allow rid 0-1 for
@@ -107,6 +108,7 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
                        case SYS_RES_IRQ:
                                if (*rid >= ISA_NIRQ)
                                        return 0;
+                               cpuid = machintr_intr_cpuid(start);
                                break;
                        case SYS_RES_DRQ:
                                if (*rid >= ISA_NDRQ)
@@ -124,12 +126,12 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
                                return 0;
                        }
                        resource_list_add(rl, type, *rid, start, end,
-                           count, -1);
+                           count, cpuid);
                }
        }
 
        return resource_list_alloc(rl, bus, child, type, rid,
-                                  start, end, count, flags, -1);
+                                  start, end, count, flags, cpuid);
 }
 
 int
index 367868a..98e5c02 100644 (file)
@@ -69,7 +69,8 @@ extern void isa_init(void);
 extern struct resource *isa_alloc_resource(device_t bus, device_t child,
                                           int type, int *rid,
                                           u_long start, u_long end,
-                                          u_long count, u_int flags);
+                                          u_long count, u_int flags,
+                                          int cpuid);
 extern int isa_release_resource(device_t bus, device_t child,
                                int type, int rid,
                                struct resource *r);
index 72c9629..b91ca6a 100644 (file)
@@ -60,6 +60,7 @@
 #include <sys/bus.h>
 #include <sys/malloc.h>
 #include <sys/rman.h>
+#include <sys/machintr.h>
 
 #include "../isavar.h"
 #include "../isa_common.h"
@@ -79,7 +80,7 @@ isa_init(void)
  */
 struct resource *
 isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                  u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        /*
         * Consider adding a resource definition. We allow rid 0-1 for
@@ -101,6 +102,7 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
                        case SYS_RES_IRQ:
                                if (*rid >= ISA_NIRQ)
                                        return 0;
+                               cpuid = machintr_intr_cpuid(start);
                                break;
                        case SYS_RES_DRQ:
                                if (*rid >= ISA_NDRQ)
@@ -118,12 +120,12 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
                                return 0;
                        }
                        resource_list_add(rl, type, *rid, start, end,
-                           count, -1);
+                           count, cpuid);
                }
        }
 
        return resource_list_alloc(rl, bus, child, type, rid,
-                                  start, end, count, flags, -1);
+                                  start, end, count, flags, cpuid);
 }
 
 int
index d8da8f3..40d70d1 100644 (file)
@@ -113,7 +113,7 @@ static int  pccard_read_ivar(device_t bus, device_t child, int which,
 static void    pccard_driver_added(device_t dev, driver_t *driver);
 static struct resource *pccard_alloc_resource(device_t dev,
                    device_t child, int type, int *rid, u_long start,
-                   u_long end, u_long count, u_int flags);
+                   u_long end, u_long count, u_int flags, int cpuid);
 static int     pccard_release_resource(device_t dev, device_t child, int type,
                    int rid, struct resource *r);
 static void    pccard_child_detached(device_t parent, device_t dev);
@@ -1102,7 +1102,7 @@ pccard_driver_added(device_t dev, driver_t *driver)
 
 static struct resource *
 pccard_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct pccard_ivar *dinfo;
        struct resource_list_entry *rle = 0;
@@ -1113,7 +1113,7 @@ pccard_alloc_resource(device_t dev, device_t child, int type, int *rid,
        /* XXX I'm no longer sure this is right */
        if (passthrough) {
                return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                   type, rid, start, end, count, flags));
+                   type, rid, start, end, count, flags, cpuid));
        }
 
        dinfo = device_get_ivars(child);
@@ -1128,7 +1128,8 @@ pccard_alloc_resource(device_t dev, device_t child, int type, int *rid,
                if (r == NULL)
                    goto bad;
                resource_list_add(&dinfo->resources, type, *rid,
-                 rman_get_start(r), rman_get_end(r), count, -1);
+                 rman_get_start(r), rman_get_end(r), count, 
+                 rman_get_cpuid(r));
                rle = resource_list_find(&dinfo->resources, type, *rid);
                if (!rle)
                    goto bad;
index 75e71ce..7863bae 100644 (file)
@@ -103,7 +103,7 @@ pci_hostb_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
 
 static struct resource *
 pci_hostb_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
 
        return (bus_alloc_resource(dev, type, rid, start, end, count, flags));
index 721a5b7..bb78aaa 100644 (file)
@@ -52,6 +52,7 @@ void  legacy_pcib_write_config(device_t dev, int bus, int slot, int func,
 int    legacy_pcib_write_ivar(device_t dev, device_t child, int which,
     uintptr_t value);
 struct resource *legacy_pcib_alloc_resource(device_t dev, device_t child,
-    int type, int *rid, u_long start, u_long end, u_long count, u_int flags);
+    int type, int *rid, u_long start, u_long end, u_long count, u_int flags,
+    int cpuid);
 
 #endif /* !_MACHINE_LEGACYVAR_H_ */
index c48b446..3b1b0a4 100644 (file)
@@ -520,7 +520,7 @@ set at boot via a tunable.");
 
 struct resource *
 legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
     /*
      * If no memory preference is given, use upper 32MB slot most
@@ -539,7 +539,7 @@ legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
     if (type == SYS_RES_IOPORT && start == 0UL && end == ~0UL)
        start = 0x1000;
     return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
-       count, flags));
+       count, flags, cpuid));
 }
 
 static device_method_t legacy_pcib_methods[] = {
index 3efea2c..4537100 100644 (file)
@@ -3826,7 +3826,7 @@ pci_alloc_map(device_t dev, device_t child, int type, int *rid,
         * appropriate bar for that resource.
         */
        res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid,
-           start, end, count, flags);
+           start, end, count, flags, -1);
        if (res == NULL) {
                device_printf(child,
                    "%#lx bytes of rid %#x res %d failed (%#lx, %#lx).\n",
@@ -3856,7 +3856,7 @@ out:;
 
 struct resource *
 pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
-                  u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct pci_devinfo *dinfo = device_get_ivars(child);
        struct resource_list *rl = &dinfo->resources;
@@ -3930,7 +3930,7 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
                }
        }
        return (resource_list_alloc(rl, dev, child, type, rid,
-           start, end, count, flags, -1));
+           start, end, count, flags, cpuid));
 }
 
 void
index 8390423..8e4edcc 100644 (file)
@@ -380,7 +380,7 @@ pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
  */
 struct resource *
 pcib_alloc_resource(device_t dev, device_t child, int type, int *rid, 
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct pcib_softc       *sc = device_get_softc(dev);
        const char *name, *suffix;
@@ -529,7 +529,7 @@ pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
         * Bridge is OK decoding this resource, so pass it up.
         */
        return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
-           count, flags));
+           count, flags, cpuid));
 }
 
 /*
index ae6cff7..d87d899 100644 (file)
@@ -81,7 +81,7 @@ int           pci_msi_count_method(device_t dev, device_t child);
 int            pci_msix_count_method(device_t dev, device_t child);
 struct resource        *pci_alloc_resource(device_t dev, device_t child, 
                    int type, int *rid, u_long start, u_long end, u_long count,
-                   u_int flags);
+                   u_int flags, int cpuid);
 void           pci_delete_resource(device_t dev, device_t child, 
                    int type, int rid);
 struct resource_list *pci_get_resource_list (device_t dev, device_t child);
index 9cdf026..0aed54c 100644 (file)
@@ -71,8 +71,8 @@ int           pcib_attach(device_t dev);
 void           pcib_attach_common(device_t dev);
 int            pcib_read_ivar(device_t dev, device_t child, int which, uintptr_t *result);
 int            pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t value);
-struct resource *pcib_alloc_resource(device_t dev, device_t child, int type, int *rid, 
-                                           u_long start, u_long end, u_long count, u_int flags);
+struct resource *pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
+                   u_long start, u_long end, u_long count, u_int flags, int cpuid);
 int            pcib_maxslots(device_t dev);
 uint32_t       pcib_read_config(device_t dev, int b, int s, int f, int reg, int width);
 void           pcib_write_config(device_t dev, int b, int s, int f, int reg, uint32_t val, int width);
index 24f679b..33a7cec 100644 (file)
@@ -107,7 +107,7 @@ vga_pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
 
 static struct resource *
 vga_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
 
        return (bus_alloc_resource(dev, type, rid, start, end, count, flags));
index 721a5b7..bb78aaa 100644 (file)
@@ -52,6 +52,7 @@ void  legacy_pcib_write_config(device_t dev, int bus, int slot, int func,
 int    legacy_pcib_write_ivar(device_t dev, device_t child, int which,
     uintptr_t value);
 struct resource *legacy_pcib_alloc_resource(device_t dev, device_t child,
-    int type, int *rid, u_long start, u_long end, u_long count, u_int flags);
+    int type, int *rid, u_long start, u_long end, u_long count, u_int flags,
+    int cpuid);
 
 #endif /* !_MACHINE_LEGACYVAR_H_ */
index 5b3b084..0ad98ad 100644 (file)
@@ -517,7 +517,7 @@ set at boot via a tunable.");
 
 struct resource *
 legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
     /*
      * If no memory preference is given, use upper 32MB slot most
@@ -536,7 +536,7 @@ legacy_pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
     if (type == SYS_RES_IOPORT && start == 0UL && end == ~0UL)
        start = 0x1000;
     return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
-       count, flags));
+       count, flags, cpuid));
 }
 
 static device_method_t legacy_pcib_methods[] = {
index ac64234..833182c 100644 (file)
@@ -112,7 +112,7 @@ static struct resource_list *acpi_get_rlist(device_t dev, device_t child);
 static int     acpi_sysres_alloc(device_t dev);
 static struct resource *acpi_alloc_resource(device_t bus, device_t child,
                        int type, int *rid, u_long start, u_long end,
-                       u_long count, u_int flags);
+                       u_long count, u_int flags, int cpuid);
 static int     acpi_release_resource(device_t bus, device_t child, int type,
                        int rid, struct resource *r);
 static void    acpi_delete_resource(device_t bus, device_t child, int type,
@@ -1010,7 +1010,8 @@ acpi_sysres_alloc(device_t dev)
 
        /* Pre-allocate resource and add to our rman pool. */
        res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, rle->type,
-           &rle->rid, rle->start, rle->start + rle->count - 1, rle->count, 0);
+           &rle->rid, rle->start, rle->start + rle->count - 1, rle->count,
+           0, -1);
        if (res != NULL) {
            rman_manage_region(rm, rman_get_start(res), rman_get_end(res));
            rle->res = res;
@@ -1023,7 +1024,7 @@ acpi_sysres_alloc(device_t dev)
 
 static struct resource *
 acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
     ACPI_RESOURCE ares;
     struct acpi_device *ad = device_get_ivars(child);
@@ -1060,6 +1061,7 @@ acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
        start = rle->start;
        end = rle->end;
        count = rle->count;
+       cpuid = rle->cpuid;
     }
 
     /*
@@ -1072,7 +1074,7 @@ acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
            child);
     if (res == NULL) {
        res = BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, rid,
-           start, end, count, flags);
+           start, end, count, flags, cpuid);
     } else {
        rman_set_rid(res, *rid);
 
index e8c71b5..51631ab 100644 (file)
@@ -49,7 +49,7 @@ static struct resource_list *
                acpi_cpu_get_rlist(device_t, device_t);
 static struct resource *
                acpi_cpu_alloc_resource(device_t, device_t,
-                       int, int *, u_long, u_long, u_long, u_int);
+                       int, int *, u_long, u_long, u_long, u_int, int);
 static int     acpi_cpu_release_resource(device_t, device_t,
                        int, int, struct resource *);
 
@@ -210,10 +210,10 @@ acpi_cpu_get_rlist(device_t dev, device_t child __unused)
 static struct resource *
 acpi_cpu_alloc_resource(device_t dev, device_t child __unused,
                        int type, int *rid, u_long start, u_long end,
-                       u_long count, u_int flags)
+                       u_long count, u_int flags, int cpuid)
 {
     return BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, type, rid,
-                             start, end, count, flags);
+                             start, end, count, flags, cpuid);
 }
 
 static int
index 574c82f..4646c30 100644 (file)
@@ -84,7 +84,7 @@ static int            acpi_pcib_alloc_msix(device_t pcib, device_t dev,
 static struct resource *acpi_pcib_acpi_alloc_resource(device_t dev,
                            device_t child, int type, int *rid,
                            u_long start, u_long end, u_long count,
-                           u_int flags);
+                           u_int flags, int cpuid);
 
 static device_method_t acpi_pcib_acpi_methods[] = {
     /* Device interface */
@@ -366,7 +366,7 @@ TUNABLE_ULONG("hw.acpi.host_mem_start", &acpi_host_mem_start);
 
 struct resource *
 acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
     /*
      * If no memory preference is given, use upper 32MB slot most
@@ -382,5 +382,5 @@ acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
     if (type == SYS_RES_IOPORT && start == 0UL && end == ~0UL)
        start = 0x1000;
     return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
-       count, flags));
+       count, flags, cpuid));
 }
index c6c1014..c70fa6e 100644 (file)
@@ -746,7 +746,7 @@ ata_pci_print_child(device_t dev, device_t child)
 
 static struct resource *
 ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
-                      u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
     struct ata_pci_controller *controller = device_get_softc(dev);
     struct resource *res = NULL;
@@ -763,13 +763,13 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
                count = ATA_IOSIZE;
                res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
                                         SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags);
+                                        start, end, count, flags, cpuid);
            }
            else {
                myrid = 0x10 + 8 * unit;
                res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
                                         SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags);
+                                        start, end, count, flags, cpuid);
            }
            break;
 
@@ -781,13 +781,13 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
                count = ATA_ALTIOSIZE;
                res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
                                         SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags);
+                                        start, end, count, flags, cpuid);
            }
            else {
                myrid = 0x14 + 8 * unit;
                res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
                                         SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags);
+                                        start, end, count, flags, cpuid);
                if (res) {
                        start = rman_get_start(res) + 2;
                        end = start + ATA_ALTIOSIZE - 1;
@@ -796,7 +796,8 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
                                             SYS_RES_IOPORT, myrid, res);
                        res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
                                                 SYS_RES_IOPORT, &myrid,
-                                                start, end, count, flags);
+                                                start, end, count, flags,
+                                                cpuid);
                }
            }
            break;
@@ -810,7 +811,7 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
                count = ATA_BMIOSIZE;
                res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
                                         SYS_RES_IOPORT, &myrid,
-                                        start, end, count, flags);
+                                        start, end, count, flags, cpuid);
            }
        }
        return res;
@@ -820,15 +821,19 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
        if (ATA_MASTERDEV(dev)) {
            int irq = (unit == 0 ? 14 : 15);
 
+           cpuid = machintr_intr_cpuid(irq);
            return BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                                     SYS_RES_IRQ, rid, irq, irq, 1, flags);
+                                     SYS_RES_IRQ, rid, irq, irq, 1, flags,
+                                     cpuid);
        }
        else {
            /* primary and secondary channels share interrupt, keep track */
-           if (!controller->irq)
+           if (!controller->irq) {
                controller->irq = BUS_ALLOC_RESOURCE(device_get_parent(dev), 
                                                     dev, SYS_RES_IRQ,
-                                                    rid, 0, ~0, 1, flags);
+                                                    rid, 0, ~0, 1, flags,
+                                                    cpuid);
+           }
            controller->irqcnt++;
            return controller->irq;
        }
index 08a115e..d22e36b 100644 (file)
@@ -36,6 +36,7 @@
 #include <sys/nata.h>
 #include <sys/rman.h>
 #include <sys/systm.h>
+#include <sys/machintr.h>
 
 #include <bus/pci/pcireg.h>
 #include <bus/pci/pcivar.h>
@@ -291,7 +292,7 @@ ata_pci_detach(device_t dev)
 
 struct resource *
 ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
-                      u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
     struct ata_pci_controller *controller = device_get_softc(dev);
     int unit = ((struct ata_channel *)device_get_softc(child))->unit;
@@ -309,7 +310,7 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
            myrid = PCIR_BAR(0) + (unit << 3);
            res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
                                     SYS_RES_IOPORT, &myrid,
-                                    start, end, count, flags);
+                                    start, end, count, flags, cpuid);
            break;
 
        case ATA_CTLADDR_RID:
@@ -321,16 +322,18 @@ ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
            myrid = PCIR_BAR(1) + (unit << 3);
            res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev,
                                     SYS_RES_IOPORT, &myrid,
-                                    start, end, count, flags);
+                                    start, end, count, flags, cpuid);
            break;
        }
     }
     if (type == SYS_RES_IRQ && *rid == ATA_IRQ_RID) {
        if (controller->legacy) {
            int irq = (unit == 0 ? 14 : 15);
-           
+
+           cpuid = machintr_intr_cpuid(irq);
            res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
-                                    SYS_RES_IRQ, rid, irq, irq, 1, flags);
+                                    SYS_RES_IRQ, rid, irq, irq, 1, flags,
+                                    cpuid);
        }
        else
            res = controller->r_irq;
index 04fff71..02cd5fd 100644 (file)
@@ -458,7 +458,7 @@ struct ata_connect_task {
 int ata_pci_probe(device_t dev);
 int ata_pci_attach(device_t dev);
 int ata_pci_detach(device_t dev);
-struct resource * ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags);
+struct resource * ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags, int cpuid);
 int ata_pci_release_resource(device_t dev, device_t child, int type, int rid, struct resource *r);
 int ata_pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, driver_intr_t *function, void *argument, void **cookiep);
  int ata_pci_teardown_intr(device_t dev, device_t child, struct resource *irq, void *cookie);
index 7dab64c..367b662 100644 (file)
@@ -128,7 +128,7 @@ static int puc_pci_attach(device_t dev);
 static void puc_intr(void *arg);
 
 static struct resource *puc_alloc_resource(device_t, device_t, int, int *,
-    u_long, u_long, u_long, u_int);
+    u_long, u_long, u_long, u_int, int);
 static int puc_release_resource(device_t, device_t, int, int,
     struct resource *);
 static int puc_get_resource(device_t, device_t, int, int, u_long *, u_long *);
@@ -603,7 +603,7 @@ puc_print_resource_list(struct resource_list *rl)
 
 static struct resource *
 puc_alloc_resource(device_t dev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
        struct puc_device *pdev;
        struct resource *retval;
index cbe7e86..ab9eb72 100644 (file)
@@ -169,7 +169,7 @@ static int  cbb_cardbus_deactivate_resource(device_t brdev,
                    device_t child, int type, int rid, struct resource *res);
 static struct resource *cbb_cardbus_alloc_resource(device_t brdev,
                    device_t child, int type, int *rid, u_long start,
-                   u_long end, u_long count, u_int flags);
+                   u_long end, u_long count, u_int flags, int cpuid);
 static int     cbb_cardbus_release_resource(device_t brdev, device_t child,
                    int type, int rid, struct resource *res);
 static int     cbb_cardbus_power_enable_socket(device_t brdev,
@@ -1151,7 +1151,7 @@ cbb_cardbus_deactivate_resource(device_t brdev, device_t child, int type,
 
 static struct resource *
 cbb_cardbus_alloc_resource(device_t brdev, device_t child, int type,
-    int *rid, u_long start, u_long end, u_long count, u_int flags)
+    int *rid, u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct cbb_softc *sc = device_get_softc(brdev);
        int tmp;
@@ -1168,6 +1168,7 @@ cbb_cardbus_alloc_resource(device_t brdev, device_t child, int type,
                        return (NULL);
                }
                start = end = tmp;
+               cpuid = rman_get_cpuid(sc->irq_res);
                flags |= RF_SHAREABLE;
                break;
        case SYS_RES_IOPORT:
@@ -1192,7 +1193,7 @@ cbb_cardbus_alloc_resource(device_t brdev, device_t child, int type,
        }
 
        res = BUS_ALLOC_RESOURCE(device_get_parent(brdev), child, type, rid,
-           start, end, count, flags & ~RF_ACTIVE);
+           start, end, count, flags & ~RF_ACTIVE, cpuid);
        if (res == NULL) {
                kprintf("cbb alloc res fail\n");
                return (NULL);
@@ -1307,7 +1308,7 @@ cbb_pcic_deactivate_resource(device_t brdev, device_t child, int type,
 
 static struct resource *
 cbb_pcic_alloc_resource(device_t brdev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct resource *res = NULL;
        struct cbb_softc *sc = device_get_softc(brdev);
@@ -1344,10 +1345,11 @@ cbb_pcic_alloc_resource(device_t brdev, device_t child, int type, int *rid,
                }
                flags |= RF_SHAREABLE;
                start = end = rman_get_start(sc->irq_res);
+               cpuid = rman_get_cpuid(sc->irq_res);
                break;
        }
        res = BUS_ALLOC_RESOURCE(device_get_parent(brdev), child, type, rid,
-           start, end, count, flags & ~RF_ACTIVE);
+           start, end, count, flags & ~RF_ACTIVE, cpuid);
        if (res == NULL)
                return (NULL);
        cbb_insert_res(sc, res, type, *rid);
@@ -1450,16 +1452,16 @@ cbb_deactivate_resource(device_t brdev, device_t child, int type,
 
 struct resource *
 cbb_alloc_resource(device_t brdev, device_t child, int type, int *rid,
-    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct cbb_softc *sc = device_get_softc(brdev);
 
        if (sc->flags & CBB_16BIT_CARD)
                return (cbb_pcic_alloc_resource(brdev, child, type, rid,
-                   start, end, count, flags));
+                   start, end, count, flags, cpuid));
        else
                return (cbb_cardbus_alloc_resource(brdev, child, type, rid,
-                   start, end, count, flags));
+                   start, end, count, flags, cpuid));
 }
 
 int
index e925cb3..b4a5446 100644 (file)
@@ -117,7 +117,7 @@ int cbb_activate_resource(device_t brdev, device_t child,
            int type, int rid, struct resource *r);
 struct resource        *cbb_alloc_resource(device_t brdev, device_t child,
            int type, int *rid, u_long start, u_long end, u_long count,
-           u_int flags);
+           u_int flags, int cpuid);
 void   cbb_child_detached(device_t brdev, device_t child);
 int    cbb_child_present(device_t self);
 int    cbb_deactivate_resource(device_t brdev, device_t child,
index e46d630..d938401 100644 (file)
@@ -88,7 +88,7 @@ static int gusc_attach(device_t dev);
 static int gusisa_probe(device_t dev);
 static void gusc_intr(void *);
 static struct resource *gusc_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                                             u_long start, u_long end, u_long count, u_int flags);
+    u_long start, u_long end, u_long count, u_int flags, int cpuid);
 static int gusc_release_resource(device_t bus, device_t child, int type, int rid,
                                   struct resource *r);
 
@@ -344,7 +344,7 @@ gusc_intr(void *arg)
 
 static struct resource *
 gusc_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                     u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
        sc_p scp;
        int *alloced, rid_max, alloced_max;
@@ -551,7 +551,7 @@ alloc_resource(sc_p scp)
                                return (1);
                        scp->irq_rid = 0;
                        scp->irq = BUS_ALLOC_RESOURCE(dev, NULL, SYS_RES_IRQ, &scp->irq_rid,
-                                                     0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
+                                                     0, ~0, 1, RF_ACTIVE | RF_SHAREABLE, -1);
                        if (scp->irq == NULL)
                                return (1);
                        scp->irq_alloced = 0;
index f4e4ca8..365d006 100644 (file)
@@ -78,7 +78,7 @@ static int sbc_attach(device_t dev);
 static void sbc_intr(void *p);
 
 static struct resource *sbc_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                                          u_long start, u_long end, u_long count, u_int flags);
+    u_long start, u_long end, u_long count, u_int flags, int cpuid);
 static int sbc_release_resource(device_t bus, device_t child, int type, int rid,
                                struct resource *r);
 static int sbc_setup_intr(device_t dev, device_t child, struct resource *irq,
@@ -524,7 +524,7 @@ sbc_teardown_intr(device_t dev, device_t child, struct resource *irq,
 
 static struct resource *
 sbc_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                     u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
        struct sbc_softc *scp;
        int *alloced, rid_max, alloced_max;
index 5345b18..94830fe 100644 (file)
@@ -78,7 +78,7 @@ typedef struct csa_softc *sc_p;
 static int csa_probe(device_t dev);
 static int csa_attach(device_t dev);
 static struct resource *csa_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                                             u_long start, u_long end, u_long count, u_int flags);
+    u_long start, u_long end, u_long count, u_int flags, int cpuid);
 static int csa_release_resource(device_t bus, device_t child, int type, int rid,
                                   struct resource *r);
 static int csa_setup_intr(device_t bus, device_t child,
@@ -382,7 +382,7 @@ csa_resume(device_t dev)
 
 static struct resource *
 csa_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                     u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
        sc_p scp;
        csa_res *resp;
index 3c02d0a..2c1ecb9 100644 (file)
@@ -716,7 +716,7 @@ fm801_pci_probe( device_t dev )
 
 static struct resource *
 fm801_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid __unused)
 {
        struct fm801_info *fm801;
 
index 20c9708..1f92cf1 100644 (file)
@@ -39,7 +39,7 @@ CODE {
        null_alloc_resource(device_t dev, device_t child,
                            int type, int *rid,
                            u_long start, u_long end,
-                           u_long count, u_int flags)
+                           u_long count, u_int flags, int cpuid)
        {
            return 0;
        }
@@ -157,6 +157,7 @@ METHOD struct resource * alloc_resource {
        u_long          end;
        u_long          count;
        u_int           flags;
+       int             cpuid;
 } DEFAULT null_alloc_resource;
 
 METHOD int activate_resource {
index 995f255..58b507e 100644 (file)
@@ -2230,7 +2230,7 @@ resource_list_alloc(struct resource_list *rl,
        if (passthrough) {
                return(BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
                                          type, rid,
-                                         start, end, count, flags));
+                                         start, end, count, flags, cpuid));
        }
 
        rle = resource_list_find(rl, type, *rid);
@@ -2249,7 +2249,8 @@ resource_list_alloc(struct resource_list *rl,
        cpuid = rle->cpuid;
 
        rle->res = BUS_ALLOC_RESOURCE(device_get_parent(bus), child,
-                                     type, rid, start, end, count, flags);
+                                     type, rid, start, end, count,
+                                     flags, cpuid);
 
        /*
         * Record the new range.
@@ -2602,12 +2603,12 @@ bus_generic_config_intr(device_t dev, device_t child, int irq, enum intr_trigger
 
 struct resource *
 bus_generic_alloc_resource(device_t dev, device_t child, int type, int *rid,
-                          u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        /* Propagate up the bus hierarchy until someone handles it. */
        if (dev->parent)
                return(BUS_ALLOC_RESOURCE(dev->parent, child, type, rid, 
-                                          start, end, count, flags));
+                                          start, end, count, flags, cpuid));
        else
                return(NULL);
 }
@@ -2747,7 +2748,7 @@ bus_generic_rl_release_resource(device_t dev, device_t child, int type,
 
 struct resource *
 bus_generic_rl_alloc_resource(device_t dev, device_t child, int type,
-    int *rid, u_long start, u_long end, u_long count, u_int flags)
+    int *rid, u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct resource_list *rl = NULL;
 
@@ -2756,7 +2757,7 @@ bus_generic_rl_alloc_resource(device_t dev, device_t child, int type,
                return(NULL);
 
        return(resource_list_alloc(rl, dev, child, type, rid,
-           start, end, count, flags, -1));
+           start, end, count, flags, cpuid));
 }
 
 int
@@ -2813,7 +2814,7 @@ bus_alloc_resource(device_t dev, int type, int *rid, u_long start, u_long end,
        if (dev->parent == 0)
                return(0);
        return(BUS_ALLOC_RESOURCE(dev->parent, dev, type, rid, start, end,
-                                 count, flags));
+                                 count, flags, -1));
 }
 
 int
index 5847d56..2484747 100644 (file)
@@ -85,7 +85,7 @@ static        int nexus_print_child(device_t, device_t);
 static device_t nexus_add_child(device_t bus, device_t parent, int order,
                                const char *name, int unit);
 static struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
-                                             u_long, u_long, u_long, u_int);
+    u_long, u_long, u_long, u_int, int);
 static int nexus_read_ivar(device_t, device_t, int, uintptr_t *);
 static int nexus_write_ivar(device_t, device_t, int, uintptr_t);
 static int nexus_activate_resource(device_t, device_t, int, int,
@@ -340,7 +340,7 @@ nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
  */
 static struct resource *
 nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct nexus_device *ndev = DEVTONX(child);
        struct  resource *rv;
@@ -362,6 +362,7 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
                start = rle->start;
                end = rle->end;
                count = rle->count;
+               cpuid = rle->cpuid;
        }
 
        flags &= ~RF_ACTIVE;
index 15b1259..b933925 100644 (file)
@@ -81,7 +81,7 @@ static        int nexus_print_child(device_t, device_t);
 static device_t nexus_add_child(device_t bus, device_t parent, int order,
                                const char *name, int unit);
 static struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
-                                             u_long, u_long, u_long, u_int);
+    u_long, u_long, u_long, u_int, int);
 static int nexus_read_ivar(device_t, device_t, int, uintptr_t *);
 static int nexus_write_ivar(device_t, device_t, int, uintptr_t);
 static int nexus_activate_resource(device_t, device_t, int, int,
@@ -336,7 +336,7 @@ nexus_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
  */
 static struct resource *
 nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
-                    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags, int cpuid)
 {
        struct nexus_device *ndev = DEVTONX(child);
        struct  resource *rv;
@@ -358,6 +358,7 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
                start = rle->start;
                end = rle->end;
                count = rle->count;
+               cpuid = rle->cpuid;
        }
 
        flags &= ~RF_ACTIVE;
index 204cd23..fd6e786 100644 (file)
@@ -237,7 +237,7 @@ struct resource *
        bus_generic_alloc_resource(device_t bus, device_t child,
                                    int type, int *rid,
                                    u_long start, u_long end,
-                                   u_long count, u_int flags);
+                                   u_long count, u_int flags, int cpuid);
 struct resource_list *
        bus_generic_get_resource_list (device_t, device_t);
 
@@ -283,7 +283,7 @@ int bus_generic_write_ivar(device_t dev, device_t child, int which,
 
 struct resource *
        bus_generic_rl_alloc_resource (device_t, device_t, int, int *,
-                                   u_long, u_long, u_long, u_int);
+                                   u_long, u_long, u_long, u_int, int);
 void   bus_generic_rl_delete_resource (device_t, device_t, int, int);
 int    bus_generic_rl_get_resource (device_t, device_t, int, int, u_long *,
                                    u_long *);
index 43a7777..0cff3c2 100644 (file)
@@ -154,6 +154,7 @@ uint32_t rman_make_alignment_flags(uint32_t size);
 #define rman_set_rid(r,i)       ((r)->r_rid = (i))
 #define rman_get_rid(r,i)       ((r)->r_rid)
 #define rman_is_region_manager(r,rm) ((r)->r_rm == rm)
+#define rman_get_cpuid(r)      ((r)->r_rm->rm_cpuid)
 
 extern struct rman_head rman_head;
 #endif /* _KERNEL */