resource: Per-CPU hardware resources support, step 1 of many
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 3 Oct 2011 12:41:03 +0000 (20:41 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 3 Oct 2011 12:41:03 +0000 (20:41 +0800)
- Add cpuid in the resource list entry, which points to the
  resource's owner CPU
- Add cpuid parameter to resource_list_add(), which could be used to
  set the resource's owner CPU

12 files changed:
sys/bus/isa/i386/isa.c
sys/bus/isa/isa_common.c
sys/bus/isa/x86_64/isa.c
sys/bus/pccard/pccard.c
sys/bus/pci/pci.c
sys/dev/misc/puc/puc.c
sys/dev/netif/ndis/if_ndis_pccard.c
sys/dev/pccard/cardbus/cardbus_cis.c
sys/kern/subr_bus.c
sys/platform/pc32/i386/nexus.c
sys/platform/pc64/x86_64/nexus.c
sys/sys/bus.h

index a4be1bd..4d9a306 100644 (file)
@@ -123,7 +123,8 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
                        default:
                                return 0;
                        }
-                       resource_list_add(rl, type, *rid, start, end, count);
+                       resource_list_add(rl, type, *rid, start, end,
+                           count, -1);
                }
        }
 
index c6bdc05..fedf25c 100644 (file)
@@ -905,7 +905,7 @@ isa_set_resource(device_t dev, device_t child, int type, int rid,
        if (type == SYS_RES_DRQ && rid >= ISA_NDRQ)
                return EINVAL;
 
-       resource_list_add(rl, type, rid, start, start + count - 1, count);
+       resource_list_add(rl, type, rid, start, start + count - 1, count, -1);
 
        return 0;
 }
index f752efb..68def7a 100644 (file)
@@ -117,7 +117,8 @@ isa_alloc_resource(device_t bus, device_t child, int type, int *rid,
                        default:
                                return 0;
                        }
-                       resource_list_add(rl, type, *rid, start, end, count);
+                       resource_list_add(rl, type, *rid, start, end,
+                           count, -1);
                }
        }
 
index ba74401..26c3f09 100644 (file)
@@ -441,7 +441,7 @@ pccard_function_init(struct pccard_function *pf)
                                goto not_this_one;
                        resource_list_add(rl, SYS_RES_IOPORT,
                            rid, rman_get_start(r), rman_get_end(r),
-                           cfe->iospace[i].length);
+                           cfe->iospace[i].length, -1);
                        rle = resource_list_find(rl, SYS_RES_IOPORT, rid);
                        if (rle == NULL)
                                panic("Cannot add resource rid %d IOPORT", rid);
@@ -464,7 +464,7 @@ pccard_function_init(struct pccard_function *pf)
                                goto not_this_one;
                        resource_list_add(rl, SYS_RES_MEMORY,
                            rid, rman_get_start(r), rman_get_end(r),
-                           cfe->memspace[i].length);
+                           cfe->memspace[i].length, -1);
                        rle = resource_list_find(rl, SYS_RES_MEMORY, rid);
                        if (rle == NULL)
                                panic("Cannot add resource rid %d MEM", rid);
@@ -482,7 +482,7 @@ pccard_function_init(struct pccard_function *pf)
                        if (r == NULL)
                                goto not_this_one;
                        resource_list_add(rl, SYS_RES_IRQ, rid,
-                           rman_get_start(r), rman_get_end(r), 1);
+                           rman_get_start(r), rman_get_end(r), 1, -1);
                        rle = resource_list_find(rl, SYS_RES_IRQ, rid);
                        if (rle == NULL)
                                panic("Cannot add resource rid %d IRQ", rid);
@@ -902,7 +902,7 @@ pccard_set_resource(device_t dev, device_t child, int type, int rid,
        if (type == SYS_RES_DRQ && rid >= PCCARD_NDRQ)
                return (EINVAL);
 
-       resource_list_add(rl, type, rid, start, start + count - 1, count);
+       resource_list_add(rl, type, rid, start, start + count - 1, count, -1);
        if (NULL != resource_list_alloc(rl, device_get_parent(dev), dev,
            type, &rid, start, start + count - 1, count, 0))
                return 0;
@@ -1127,7 +1127,7 @@ 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);
+                 rman_get_start(r), rman_get_end(r), count, -1);
                rle = resource_list_find(&dinfo->resources, type, *rid);
                if (!rle)
                    goto bad;
index d8ed302..704eade 100644 (file)
@@ -1494,7 +1494,7 @@ pci_alloc_msix_method(device_t dev, device_t child, int *count)
                if (error)
                        break;
                resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, irq,
-                   irq, 1);
+                   irq, 1, -1);
        }
        actual = i;
 
@@ -1715,7 +1715,7 @@ pci_remap_msix_method(device_t dev, device_t child, int count,
                        continue;
                irq = msix->msix_vectors[vectors[i]].mv_irq;
                resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1, irq,
-                   irq, 1);
+                   irq, 1, -1);
        }
 
        if (bootverbose) {
@@ -2094,7 +2094,7 @@ pci_alloc_msi_method(device_t dev, device_t child, int *count)
         */
        for (i = 0; i < actual; i++)
                resource_list_add(&dinfo->resources, SYS_RES_IRQ, i + 1,
-                   irqs[i], irqs[i], 1);
+                   irqs[i], irqs[i], 1, -1);
 
        if (bootverbose) {
                if (actual == 1)
@@ -2712,7 +2712,7 @@ pci_add_map(device_t pcib, device_t bus, device_t dev,
                start = base;
                end = base + (1 << ln2size) - 1;
        }
-       resource_list_add(rl, type, reg, start, end, count);
+       resource_list_add(rl, type, reg, start, end, count, -1);
 
        /*
         * Try to allocate the resource for this BAR from our parent
@@ -2786,11 +2786,11 @@ pci_ata_maps(device_t pcib, device_t bus, device_t dev, int b,
                    prefetchmask & (1 << 1));
        } else {
                rid = PCIR_BAR(0);
-               resource_list_add(rl, type, rid, 0x1f0, 0x1f7, 8);
+               resource_list_add(rl, type, rid, 0x1f0, 0x1f7, 8, -1);
                resource_list_alloc(rl, bus, dev, type, &rid, 0x1f0, 0x1f7, 8,
                    0);
                rid = PCIR_BAR(1);
-               resource_list_add(rl, type, rid, 0x3f6, 0x3f6, 1);
+               resource_list_add(rl, type, rid, 0x3f6, 0x3f6, 1, -1);
                resource_list_alloc(rl, bus, dev, type, &rid, 0x3f6, 0x3f6, 1,
                    0);
        }
@@ -2801,11 +2801,11 @@ pci_ata_maps(device_t pcib, device_t bus, device_t dev, int b,
                    prefetchmask & (1 << 3));
        } else {
                rid = PCIR_BAR(2);
-               resource_list_add(rl, type, rid, 0x170, 0x177, 8);
+               resource_list_add(rl, type, rid, 0x170, 0x177, 8, -1);
                resource_list_alloc(rl, bus, dev, type, &rid, 0x170, 0x177, 8,
                    0);
                rid = PCIR_BAR(3);
-               resource_list_add(rl, type, rid, 0x376, 0x376, 1);
+               resource_list_add(rl, type, rid, 0x376, 0x376, 1, -1);
                resource_list_alloc(rl, bus, dev, type, &rid, 0x376, 0x376, 1,
                    0);
        }
@@ -2860,7 +2860,7 @@ pci_assign_interrupt(device_t bus, device_t dev, int force_route)
        }
 
        /* Add this IRQ as rid 0 interrupt resource. */
-       resource_list_add(&dinfo->resources, SYS_RES_IRQ, 0, irq, irq, 1);
+       resource_list_add(&dinfo->resources, SYS_RES_IRQ, 0, irq, irq, 1, -1);
 }
 
 void
@@ -3833,7 +3833,7 @@ pci_alloc_map(device_t dev, device_t child, int type, int *rid,
                    count, *rid, type, start, end);
                goto out;
        }
-       resource_list_add(rl, type, *rid, start, end, count);
+       resource_list_add(rl, type, *rid, start, end, count, -1);
        rle = resource_list_find(rl, type, *rid);
        if (rle == NULL)
                panic("pci_alloc_map: unexpectedly can't find resource.");
index 698e02d..7dab64c 100644 (file)
@@ -292,7 +292,8 @@ puc_pci_attach(device_t dev)
                /* First fake up an IRQ resource. */
                resource_list_add(&pdev->resources, SYS_RES_IRQ, 0,
                    rman_get_start(sc->irqres), rman_get_end(sc->irqres),
-                   rman_get_end(sc->irqres) - rman_get_start(sc->irqres) + 1);
+                   rman_get_end(sc->irqres) - rman_get_start(sc->irqres) + 1,
+                   -1);
                rle = resource_list_find(&pdev->resources, SYS_RES_IRQ, 0);
                rle->res = sc->irqres;
 
index 4e7725c..a49ab68 100644 (file)
@@ -202,7 +202,7 @@ ndis_attach_pccard(device_t dev)
        sc->ndis_rescnt++;
        resource_list_add(&sc->ndis_rl, SYS_RES_IOPORT, rid,
            rman_get_start(sc->ndis_res_io), rman_get_end(sc->ndis_res_io),
-           rman_get_size(sc->ndis_res_io));
+           rman_get_size(sc->ndis_res_io), -1);
 
        rid = 0;
        sc->ndis_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
@@ -215,7 +215,7 @@ ndis_attach_pccard(device_t dev)
        }
        sc->ndis_rescnt++;
        resource_list_add(&sc->ndis_rl, SYS_RES_IRQ, rid,
-           rman_get_start(sc->ndis_irq), rman_get_start(sc->ndis_irq), 1);
+           rman_get_start(sc->ndis_irq), rman_get_start(sc->ndis_irq), 1, -1);
 
        sc->ndis_iftype = PCMCIABus;
 
@@ -287,7 +287,7 @@ ndis_alloc_amem(void *arg)
        sc->ndis_rescnt++;
        resource_list_add(&sc->ndis_rl, SYS_RES_MEMORY, rid,
            rman_get_start(sc->ndis_res_am), rman_get_end(sc->ndis_res_am),
-           rman_get_size(sc->ndis_res_am));
+           rman_get_size(sc->ndis_res_am), -1);
 
        error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->ndis_dev),
            sc->ndis_dev, rid, 0, NULL);
index b97a645..976fe34 100644 (file)
@@ -374,7 +374,7 @@ decode_tuple_bar(device_t cbdev, device_t child, int id,
            " (Prefetchable)" : "", type == SYS_RES_MEMORY ?
            ((dinfo->mbelow1mb & BARBIT(bar)) ? " (Below 1Mb)" : "") : ""));
 
-       resource_list_add(&dinfo->pci.resources, type, bar, 0UL, ~0UL, len);
+       resource_list_add(&dinfo->pci.resources, type, bar, 0UL, ~0UL, len, -1);
 
        /*
         * Mark the appropriate bit in the PCI command register so that
index 45b9453..06a29b4 100644 (file)
@@ -2156,9 +2156,8 @@ resource_list_free(struct resource_list *rl)
 }
 
 void
-resource_list_add(struct resource_list *rl,
-                 int type, int rid,
-                 u_long start, u_long end, u_long count)
+resource_list_add(struct resource_list *rl, int type, int rid,
+    u_long start, u_long end, u_long count, int cpuid)
 {
        struct resource_list_entry *rle;
 
@@ -2172,6 +2171,7 @@ resource_list_add(struct resource_list *rl,
                rle->type = type;
                rle->rid = rid;
                rle->res = NULL;
+               rle->cpuid = -1;
        }
 
        if (rle->res)
@@ -2180,6 +2180,14 @@ resource_list_add(struct resource_list *rl,
        rle->start = start;
        rle->end = end;
        rle->count = count;
+
+       if (cpuid != -1) {
+               if (rle->cpuid != -1 && rle->cpuid != cpuid) {
+                       panic("resource_list_add: moving from cpu%d -> cpu%d\n",
+                           rle->cpuid, cpuid);
+               }
+               rle->cpuid = cpuid;
+       }
 }
 
 struct resource_list_entry*
@@ -2705,7 +2713,7 @@ bus_generic_rl_set_resource(device_t dev, device_t child, int type, int rid,
        if (!rl)
                return(EINVAL);
 
-       resource_list_add(rl, type, rid, start, (start + count - 1), count);
+       resource_list_add(rl, type, rid, start, (start + count - 1), count, -1);
 
        return(0);
 }
index 9ffb811..0527eb0 100644 (file)
@@ -537,7 +537,7 @@ nexus_set_resource(device_t dev, device_t child, int type, int rid, u_long start
        struct resource_list    *rl = &ndev->nx_resources;
 
        /* XXX this should return a success/failure indicator */
-       resource_list_add(rl, type, rid, start, start + count - 1, count);
+       resource_list_add(rl, type, rid, start, start + count - 1, count, -1);
        return(0);
 }
 
index 2dfc1c1..deef6ef 100644 (file)
@@ -533,7 +533,7 @@ nexus_set_resource(device_t dev, device_t child, int type, int rid, u_long start
        struct resource_list    *rl = &ndev->nx_resources;
 
        /* XXX this should return a success/failure indicator */
-       resource_list_add(rl, type, rid, start, start + count - 1, count);
+       resource_list_add(rl, type, rid, start, start + count - 1, count, -1);
        return(0);
 }
 
index 515ab93..713b077 100644 (file)
@@ -140,6 +140,7 @@ struct resource_list_entry {
     u_long             start;          /* start of resource range */
     u_long             end;            /* end of resource range */
     u_long             count;          /* count within range */
+    int                        cpuid;          /* owner cpuid */
 };
 SLIST_HEAD(resource_list, resource_list_entry);
 
@@ -173,9 +174,8 @@ void        resource_list_free(struct resource_list *rl);
  * Add a resource entry or modify an existing entry if one exists with 
  * the same type and rid.
  */
-void   resource_list_add(struct resource_list *rl,
-                         int type, int rid,
-                         u_long start, u_long end, u_long count);
+void   resource_list_add(struct resource_list *rl, int type, int rid,
+           u_long start, u_long end, u_long count, int cpuid);
 
 /*
  * Find a resource entry by type and rid.