Use lists instead of arrays for resources in devices to reduce memory usage.
authorMyles Watson <mylesgw@gmail.com>
Fri, 21 May 2010 14:33:48 +0000 (14:33 +0000)
committerMyles Watson <mylesgw@gmail.com>
Fri, 21 May 2010 14:33:48 +0000 (14:33 +0000)
Signed-off-by: Myles Watson <mylesgw@gmail.com>
Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5576 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

25 files changed:
src/devices/device.c
src/devices/device_util.c
src/devices/oprom/yabel/device.c
src/devices/pci_device.c
src/devices/pnp_device.c
src/drivers/ati/ragexl/xlinit.c
src/include/device/device.h
src/include/device/resource.h
src/northbridge/amd/amdfam10/northbridge.c
src/northbridge/amd/amdk8/northbridge.c
src/northbridge/amd/gx2/northbridge.c
src/northbridge/amd/lx/northbridge.c
src/northbridge/intel/e7520/northbridge.c
src/northbridge/intel/e7525/northbridge.c
src/northbridge/intel/i3100/northbridge.c
src/southbridge/amd/sb600/sb600_lpc.c
src/southbridge/amd/sb700/sb700_lpc.c
src/southbridge/broadcom/bcm5785/bcm5785_lpc.c
src/southbridge/nvidia/ck804/ck804_lpc.c
src/southbridge/nvidia/mcp55/mcp55_lpc.c
src/southbridge/sis/sis966/sis966_lpc.c
src/superio/smsc/lpc47n217/superio.c
src/superio/smsc/lpc47n227/superio.c
src/superio/via/vt1211/vt1211.c
util/sconfig/main.c

index c9788211cd187f0520c026970dac89ec432c2300..f6c7af48c0dd0bec1e055191d37efad9b1b9efb5 100644 (file)
@@ -43,6 +43,8 @@
 struct device *all_devices = &dev_root;
 /** Pointer to the last device */
 extern struct device **last_dev_p;
+/** Linked list of free resources */
+struct resource *free_resources = NULL;
 
 
 /**
@@ -253,16 +255,15 @@ static void compute_resources(struct bus *bus, struct resource *bridge,
 
        /* For each child which is a bridge, compute_resource_needs. */
        for (dev = bus->children; dev; dev = dev->sibling) {
-               unsigned i;
                struct resource *child_bridge;
 
                if (!dev->links)
                        continue;
 
                /* Find the resources with matching type flags. */
-               for (i = 0; i < dev->resources; i++) {
+               for (child_bridge = dev->resource_list; child_bridge;
+                    child_bridge = child_bridge->next) {
                        unsigned link;
-                       child_bridge = &dev->resource[i];
 
                        if (!(child_bridge->flags & IORESOURCE_BRIDGE) ||
                            (child_bridge->flags & type_mask) != type)
@@ -502,16 +503,15 @@ static void allocate_resources(struct bus *bus, struct resource *bridge,
 
        /* For each child which is a bridge, allocate_resources. */
        for (dev = bus->children; dev; dev = dev->sibling) {
-               unsigned i;
                struct resource *child_bridge;
 
                if (!dev->links)
                        continue;
 
                /* Find the resources with matching type flags. */
-               for (i = 0; i < dev->resources; i++) {
+               for (child_bridge = dev->resource_list; child_bridge;
+                    child_bridge = child_bridge->next) {
                        unsigned link;
-                       child_bridge = &dev->resource[i];
 
                        if (!(child_bridge->flags & IORESOURCE_BRIDGE) ||
                            (child_bridge->flags & type_mask) != type)
@@ -556,8 +556,7 @@ static void constrain_resources(struct device *dev, struct constraints* limits)
        printk(BIOS_SPEW, "%s: %s\n", __func__, dev_path(dev));
 
        /* Constrain limits based on the fixed resources of this device. */
-       for (i = 0; i < dev->resources; i++) {
-               res = &dev->resource[i];
+       for (res = dev->resource_list; res; res = res->next) {
                if (!(res->flags & IORESOURCE_FIXED))
                        continue;
                if (!res->size) {
@@ -604,7 +603,6 @@ static void avoid_fixed_resources(struct device *dev)
 {
        struct constraints limits;
        struct resource *res;
-       int i;
 
        printk(BIOS_SPEW, "%s: %s\n", __func__, dev_path(dev));
        /* Initialize constraints to maximum size. */
@@ -617,8 +615,7 @@ static void avoid_fixed_resources(struct device *dev)
        limits.mem.limit = 0xffffffffffffffffULL;
 
        /* Constrain the limits to dev's initial resources. */
-       for (i = 0; i < dev->resources; i++) {
-               res = &dev->resource[i];
+       for (res = dev->resource_list; res; res = res->next) {
                if ((res->flags & IORESOURCE_FIXED))
                        continue;
                printk(BIOS_SPEW, "%s:@%s %02lx limit %08Lx\n", __func__,
@@ -638,9 +635,8 @@ static void avoid_fixed_resources(struct device *dev)
        constrain_resources(dev, &limits);
 
        /* Update dev's resources with new limits. */
-       for (i = 0; i < dev->resources; i++) {
+       for (res = dev->resource_list; res; res = res->next) {
                struct resource *lim;
-               res = &dev->resource[i];
 
                if ((res->flags & IORESOURCE_FIXED))
                        continue;
@@ -764,7 +760,7 @@ void assign_resources(struct bus *bus)
                    dev_path(bus->dev), bus->secondary, bus->link);
 
        for (curdev = bus->children; curdev; curdev = curdev->sibling) {
-               if (!curdev->enabled || !curdev->resources) {
+               if (!curdev->enabled || !curdev->resource_list) {
                        continue;
                }
                if (!curdev->ops || !curdev->ops->set_resources) {
@@ -927,7 +923,6 @@ void dev_configure(void)
        struct resource *res;
        struct device *root;
        struct device *child;
-       int i;
 
 #if CONFIG_VGA_BRIDGE_SETUP == 1
        set_vga_bridge_bits();
@@ -954,8 +949,7 @@ void dev_configure(void)
        for (child = root->link[0].children; child; child = child->sibling) {
                if (!(child->path.type == DEVICE_PATH_PCI_DOMAIN))
                        continue;
-               for (i = 0; i < child->resources; i++) {
-                       res = &child->resource[i];
+               for (res = child->resource_list; res; res = res->next) {
                        if (res->flags & IORESOURCE_FIXED)
                                continue;
                        if (res->flags & IORESOURCE_PREFETCH) {
@@ -987,8 +981,7 @@ void dev_configure(void)
        for (child = root->link[0].children; child; child = child->sibling) {
                if (child->path.type != DEVICE_PATH_PCI_DOMAIN)
                        continue;
-               for (i = 0; i < child->resources; i++) {
-                       res = &child->resource[i];
+               for (res = child->resource_list; res; res = res->next) {
                        if (!(res->flags & IORESOURCE_MEM) ||
                            res->flags & IORESOURCE_FIXED)
                                continue;
@@ -1001,8 +994,7 @@ void dev_configure(void)
        for (child = root->link[0].children; child; child = child->sibling) {
                if (!(child->path.type == DEVICE_PATH_PCI_DOMAIN))
                        continue;
-               for (i = 0; i < child->resources; i++) {
-                       res = &child->resource[i];
+               for (res = child->resource_list; res; res = res->next) {
                        if (res->flags & IORESOURCE_FIXED)
                                continue;
                        if (res->flags & IORESOURCE_PREFETCH) {
index 3e8cba2f9815d1fe14cca136492edaf5d127c263..9096c137dadcfc013a2a69fb5c99454b007a0788 100644 (file)
@@ -260,6 +260,40 @@ int path_eq(struct device_path *path1, struct device_path *path2)
        return equal;
 }
 
+/**
+ * Allocate 64 more resources to the free list.
+ */
+static int allocate_more_resources(void)
+{
+       int i;
+       struct resource *new_res_list;
+       new_res_list = malloc(64 * sizeof(*new_res_list));
+
+       if (new_res_list == NULL)
+               return 0;
+
+       memset(new_res_list, 0, 64 * sizeof(*new_res_list));
+
+       for (i = 0; i < 64-1; i++)
+               new_res_list[i].next = &new_res_list[i+1];
+
+       free_resources = new_res_list;
+       return 1;
+}
+
+/**
+ * Remove resource res from the device's list and add it to the free list.
+ */
+static void free_resource(device_t dev, struct resource *res, struct resource *prev)
+{
+       if (prev)
+               prev->next = res->next;
+       else
+               dev->resource_list = res->next;
+       res->next = free_resources;
+       free_resources = res;
+}
+
 /**
  * See if we have unused but allocated resource structures.
  * If so remove the allocation.
@@ -267,19 +301,14 @@ int path_eq(struct device_path *path1, struct device_path *path2)
  */
 void compact_resources(device_t dev)
 {
-       struct resource *resource;
-       int i;
+       struct resource *res, *next, *prev = NULL;
        /* Move all of the free resources to the end */
-       for(i = 0; i < dev->resources;) {
-               resource = &dev->resource[i];
-               if (!resource->flags) {
-                       memmove(resource, resource + 1, (dev->resources - i) *
-                               sizeof(*resource));
-                       dev->resources -= 1;
-                       memset(&dev->resource[dev->resources], 0, sizeof(*resource));
-               } else {
-                       i++;
-               }
+       for(res = dev->resource_list; res; res = next) {
+               next = res->next;
+               if (!res->flags)
+                       free_resource(dev, res, prev);
+               else
+                       prev = res;
        }
 }
 
@@ -292,17 +321,13 @@ void compact_resources(device_t dev)
  */
 struct resource *probe_resource(device_t dev, unsigned index)
 {
-       struct resource *resource;
-       int i;
+       struct resource *res;
        /* See if there is a resource with the appropriate index */
-       resource = 0;
-       for(i = 0; i < dev->resources; i++) {
-               if (dev->resource[i].index == index) {
-                       resource = &dev->resource[i];
+       for(res = dev->resource_list; res; res = res->next) {
+               if (res->index == index)
                        break;
-               }
        }
-       return resource;
+       return res;
 }
 
 /**
@@ -314,7 +339,7 @@ struct resource *probe_resource(device_t dev, unsigned index)
  */
 struct resource *new_resource(device_t dev, unsigned index)
 {
-       struct resource *resource;
+       struct resource *resource, *tail;
 
        /* First move all of the free resources to the end */
        compact_resources(dev);
@@ -322,12 +347,20 @@ struct resource *new_resource(device_t dev, unsigned index)
        /* See if there is a resource with the appropriate index */
        resource = probe_resource(dev, index);
        if (!resource) {
-               if (dev->resources == MAX_RESOURCES) {
-                       die("MAX_RESOURCES exceeded.");
-               }
-               resource = &dev->resource[dev->resources];
+               if (free_resources == NULL && !allocate_more_resources())
+                       die("Couldn't allocate more resources.");
+
+               resource = free_resources;
+               free_resources = free_resources->next;
                memset(resource, 0, sizeof(*resource));
-               dev->resources++;
+               resource->next = NULL;
+               tail = dev->resource_list;
+               if (tail) {
+                       while (tail->next) tail = tail->next;
+                       tail->next = resource;
+               }
+               else
+                       dev->resource_list = resource;
        }
        /* Initialize the resource values */
        if (!(resource->flags & IORESOURCE_FIXED)) {
@@ -486,23 +519,22 @@ void search_bus_resources(struct bus *bus,
 {
        struct device *curdev;
        for(curdev = bus->children; curdev; curdev = curdev->sibling) {
-               int i;
+               struct resource *res;
                /* Ignore disabled devices */
                if (!curdev->enabled) continue;
-               for(i = 0; i < curdev->resources; i++) {
-                       struct resource *resource = &curdev->resource[i];
+               for(res = curdev->resource_list; res; res = res->next) {
                        /* If it isn't the right kind of resource ignore it */
-                       if ((resource->flags & type_mask) != type) {
+                       if ((res->flags & type_mask) != type) {
                                continue;
                        }
                        /* If it is a subtractive resource recurse */
-                       if (resource->flags & IORESOURCE_SUBTRACTIVE) {
+                       if (res->flags & IORESOURCE_SUBTRACTIVE) {
                                struct bus * subbus;
-                               subbus = &curdev->link[IOINDEX_SUBTRACTIVE_LINK(resource->index)];
+                               subbus = &curdev->link[IOINDEX_SUBTRACTIVE_LINK(res->index)];
                                search_bus_resources(subbus, type_mask, type, search, gp);
                                continue;
                        }
-                       search(gp, curdev, resource);
+                       search(gp, curdev, res);
                }
        }
 }
@@ -513,20 +545,19 @@ void search_global_resources(
 {
        struct device *curdev;
        for(curdev = all_devices; curdev; curdev = curdev->next) {
-               int i;
+               struct resource *res;
                /* Ignore disabled devices */
                if (!curdev->enabled) continue;
-               for(i = 0; i < curdev->resources; i++) {
-                       struct resource *resource = &curdev->resource[i];
+               for(res = curdev->resource_list; res; res = res->next) {
                        /* If it isn't the right kind of resource ignore it */
-                       if ((resource->flags & type_mask) != type) {
+                       if ((res->flags & type_mask) != type) {
                                continue;
                        }
                        /* If it is a subtractive resource ignore it */
-                       if (resource->flags & IORESOURCE_SUBTRACTIVE) {
+                       if (res->flags & IORESOURCE_SUBTRACTIVE) {
                                continue;
                        }
-                       search(gp, curdev, resource);
+                       search(gp, curdev, res);
                }
        }
 }
@@ -561,6 +592,7 @@ static void resource_tree(struct device *root, int debug_level, int depth)
 {
        int i = 0, link = 0;
        struct device *child;
+       struct resource *res;
        char indent[30];        /* If your tree has more levels, it's wrong. */
 
        for (i = 0; i < depth + 1 && i < 29; i++)
@@ -571,13 +603,13 @@ static void resource_tree(struct device *root, int debug_level, int depth)
                  dev_path(root), root->links);
        do_printk(BIOS_DEBUG, " %s\n", root->link[0].children ?
                  dev_path(root->link[0].children) : "NULL");
-       for (i = 0; i < root->resources; i++) {
+       for (res = root->resource_list; res; res = res->next) {
                do_printk(BIOS_DEBUG,
                          "%s%s resource base %llx size %llx align %d gran %d limit %llx flags %lx index %lx\n",
-                         indent, dev_path(root), root->resource[i].base,
-                         root->resource[i].size, root->resource[i].align,
-                         root->resource[i].gran, root->resource[i].limit,
-                         root->resource[i].flags, root->resource[i].index);
+                         indent, dev_path(root), res->base,
+                         res->size, res->align,
+                         res->gran, res->limit,
+                         res->flags, res->index);
        }
 
        for (link = 0; link < root->links; link++) {
@@ -611,8 +643,8 @@ void show_devs_tree(struct device *dev, int debug_level, int depth, int linknum)
        for (i = 0; i < depth; i++)
                depth_str[i] = ' ';
        depth_str[i] = '\0';
-       do_printk(debug_level, "%s%s: enabled %d, %d resources\n",
-                 depth_str, dev_path(dev), dev->enabled, dev->resources);
+       do_printk(debug_level, "%s%s: enabled %d\n",
+                 depth_str, dev_path(dev), dev->enabled);
        for (i = 0; i < dev->links; i++) {
                for (sibling = dev->link[i].children; sibling;
                     sibling = sibling->sibling)
@@ -646,10 +678,8 @@ void show_all_devs(int debug_level, const char *msg)
        if (!do_printk(debug_level, "Show all devs...%s\n", msg))
                return;
        for (dev = all_devices; dev; dev = dev->next) {
-               do_printk(debug_level,
-                         "%s: enabled %d, %d resources\n",
-                         dev_path(dev), dev->enabled,
-                         dev->resources);
+               do_printk(debug_level, "%s: enabled %d\n",
+                         dev_path(dev), dev->enabled);
        }
 }
 
@@ -687,12 +717,10 @@ void show_all_devs_resources(int debug_level, const char* msg)
                return;
 
        for (dev = all_devices; dev; dev = dev->next) {
-               int i;
-               do_printk(debug_level,
-                         "%s: enabled %d, %d resources\n",
-                         dev_path(dev), dev->enabled,
-                         dev->resources);
-               for (i = 0; i < dev->resources; i++)
-                       show_one_resource(debug_level, dev, &dev->resource[i], "");
+               struct resource *res;
+               do_printk(debug_level, "%s: enabled %d\n",
+                         dev_path(dev), dev->enabled);
+               for (res = dev->resource_list; res; res = res->next)
+                       show_one_resource(debug_level, dev, res, "");
        }
 }
index 7e71a45e97ceb0af6d0524dc6a87b5fd8c6a724e..5e5dc2877dabea8e6a9055a58e5ee804dc5510f8 100644 (file)
@@ -53,8 +53,7 @@ biosemu_dev_get_addr_info(void)
        bios_device.devfn = devfn;
 
        DEBUG_PRINTF("bus: %x, devfn: %x\n", bus, devfn);
-       for (i = 0; i < bios_device.dev->resources; i++) {
-               r = &bios_device.dev->resource[i];
+       for (r = bios_device.dev->resource_list; r; r = r->next) {
                translate_address_array[taa_index].info = r->flags;
                translate_address_array[taa_index].bus = bus;
                translate_address_array[taa_index].devfn = devfn;
index 8863c237a4380eabd60302fc7187692c1d161806..4aed35d501fb13a2ed15c9a9fb44621104617e3f 100644 (file)
@@ -550,14 +550,12 @@ static void pci_set_resource(struct device *dev, struct resource *resource)
 
 void pci_dev_set_resources(struct device *dev)
 {
-       struct resource *resource, *last;
+       struct resource *res;
        unsigned link;
        u8 line;
 
-       last = &dev->resource[dev->resources];
-
-       for (resource = &dev->resource[0]; resource < last; resource++) {
-               pci_set_resource(dev, resource);
+       for (res = dev->resource_list; res; res = res->next) {
+               pci_set_resource(dev, res);
        }
        for (link = 0; link < dev->links; link++) {
                struct bus *bus;
index 469487d1d26f8007eaa7a2823e52c573c88bf976..ad14bbf89af633caff023362366e07796c6a2cb1 100644 (file)
@@ -132,14 +132,14 @@ static void pnp_set_resource(device_t dev, struct resource *resource)
 
 void pnp_set_resources(device_t dev)
 {
-       int i;
+       struct resource *res;
 
        /* Select the device */
        pnp_set_logical_device(dev);
 
        /* Paranoia says I should disable the device here... */
-       for(i = 0; i < dev->resources; i++) {
-               pnp_set_resource(dev, &dev->resource[i]);
+       for(res = dev->resource_list; res; res = res->next) {
+               pnp_set_resource(dev, res);
        }
 }
 
index 8b0223983396d24c63dfdaf6fa72d8de92d4d344..bcbce6c9b6e72150125212f16b328f3bb053c170 100644 (file)
@@ -520,9 +520,9 @@ static void ati_ragexl_init(device_t dev)
 #define USE_AUX_REG 1
 
 
-       res = &dev->resource[0];
+       res = dev->resource_list;
        if(res->flags & IORESOURCE_IO) {
-               res = &dev->resource[1];
+               res = res->next;
        }
 
 #if CONFIG_CONSOLE_BTEXT==1
@@ -532,7 +532,9 @@ static void ati_ragexl_init(device_t dev)
 #if USE_AUX_REG==0
         info->ati_regbase = res->base+0x7ff000+0xc00;
 #else
-        res = &dev->resource[2];
+       /* Fix this to look for the correct index. */
+       //if (dev->resource_list && dev->resource_list->next)
+        res = dev->resource_list->next->next;
         if(res->flags & IORESOURCE_MEM) {
                 info->ati_regbase = res->base+0x400; //using auxiliary register
         }
index 59dd0815e6e3f0bdb740728cb20de62118322843..6ac2d10bfcb8a96ee60d757e5af6380f2ef539fb 100644 (file)
@@ -74,11 +74,10 @@ struct device {
        u8 command;
 
        /* Base registers for this device. I/O, MEM and Expansion ROM */
-       struct resource resource[MAX_RESOURCES];
-       unsigned int resources;
+       struct resource *resource_list;
 
        /* links are (downstream) buses attached to the device, usually a leaf
-        * device with no children have 0 buses attached and a bridge has 1 bus
+        * device with no children has 0 buses attached and a bridge has 1 bus
         */
        struct bus link[MAX_LINKS];
        /* number of buses attached to the device */
@@ -96,6 +95,7 @@ struct device {
 extern struct device   dev_root;
 extern struct device   *all_devices;   /* list of all devices */
 
+extern struct resource *free_resources;
 
 /* Generic device interface functions */
 device_t alloc_dev(struct bus *parent, struct device_path *path);
index 5452d4360cdd0c8fe72adf2529e979fa01544768..49e218531c5c9966a233a4f84fe10b5570a60c22 100644 (file)
@@ -68,6 +68,7 @@ struct resource {
        resource_t base;        /* Base address of the resource */
        resource_t size;        /* Size of the resource */
        resource_t limit;       /* Largest valid value base + size -1 */
+       struct resource* next;  /* Next resource in the list */
        unsigned long flags;    /* Descriptions of the kind of resource */
        unsigned long index;    /* Bus specific per device resource id */
        unsigned char align;    /* Required alignment (log 2) of the resource */
index 3d968a9dedbfbfa249abbe994e7315bd0809909a..009b57becc25077a4b1f3d0566c8a4bbdb073d02 100644 (file)
@@ -592,7 +592,7 @@ static void amdfam10_create_vga_resource(device_t dev, unsigned nodeid)
 static void amdfam10_set_resources(device_t dev)
 {
        u32 nodeid, link;
-       int i;
+       struct resource *res;
 
        /* Find the nodeid */
        nodeid = amdfam10_nodeid(dev);
@@ -600,8 +600,8 @@ static void amdfam10_set_resources(device_t dev)
        amdfam10_create_vga_resource(dev, nodeid);
 
        /* Set each resource we have found */
-       for(i = 0; i < dev->resources; i++) {
-               amdfam10_set_resource(dev, &dev->resource[i], nodeid);
+       for(res = dev->resource_list; res; res = res->next) {
+               amdfam10_set_resource(dev, res, nodeid);
        }
 
        for(link = 0; link < dev->links; link++) {
@@ -889,7 +889,7 @@ static void pci_domain_set_resources(device_t dev)
 {
 #if CONFIG_PCI_64BIT_PREF_MEM == 1
        struct resource *io, *mem1, *mem2;
-       struct resource *resource, *last;
+       struct resource *res;
 #endif
        unsigned long mmio_basek;
        u32 pci_tolm;
@@ -943,14 +943,13 @@ static void pci_domain_set_resources(device_t dev)
                        mem2->base, mem2->limit, mem2->size, mem2->align);
        }
 
-       last = &dev->resource[dev->resources];
-       for(resource = &dev->resource[0]; resource < last; resource++)
+       for(res = &dev->resource_list; res; res = res->next)
        {
-               resource->flags |= IORESOURCE_ASSIGNED;
-               resource->flags &= ~IORESOURCE_STORED;
-               link = (resource>>2) & 3;
-               resource->flags |= IORESOURCE_STORED;
-               report_resource_stored(dev, resource, "");
+               res->flags |= IORESOURCE_ASSIGNED;
+               res->flags &= ~IORESOURCE_STORED;
+               link = (res>>2) & 3;
+               res->flags |= IORESOURCE_STORED;
+               report_resource_stored(dev, res, "");
 
        }
 #endif
index 6938ec62b39bdf3905de452113f5df01692a1769..7910f291aaa2fb1e765cdf6d815d5c87897c18bd 100644 (file)
@@ -520,14 +520,13 @@ static void amdk8_create_vga_resource(device_t dev, unsigned nodeid)
 static void amdk8_set_resources(device_t dev)
 {
        unsigned nodeid, link;
-       int i;
+       struct resource *res;
 
        /* Find the nodeid */
        nodeid = amdk8_nodeid(dev);
 
        /* Set each resource we have found */
-       for(i = 0; i < dev->resources; i++) {
-               struct resource *res = &dev->resource[i];
+       for(res = dev->resource_list; res; res = res->next) {
                struct resource *old = NULL;
                unsigned index;
 
@@ -846,7 +845,7 @@ static void amdk8_domain_set_resources(device_t dev)
 {
 #if CONFIG_PCI_64BIT_PREF_MEM == 1
        struct resource *io, *mem1, *mem2;
-       struct resource *resource, *last;
+       struct resource *res;
 #endif
        unsigned long mmio_basek;
        uint32_t pci_tolm;
@@ -905,12 +904,11 @@ static void amdk8_domain_set_resources(device_t dev)
                mem2->base, mem2->limit, mem2->size, mem2->align);
 #endif
 
-       last = &dev->resource[dev->resources];
-       for(resource = &dev->resource[0]; resource < last; resource++)
+       for(res = dev->resource_list; res; res = res->next)
        {
-               resource->flags |= IORESOURCE_ASSIGNED;
-               resource->flags |= IORESOURCE_STORED;
-               report_resource_stored(dev, resource, "");
+               res->flags |= IORESOURCE_ASSIGNED;
+               res->flags |= IORESOURCE_STORED;
+               report_resource_stored(dev, res, "");
 
        }
 #endif
index 98acbc9f9559de68f8cb5a55f680b9e259e84bb5..42fdcbb496162141c8095b9af6d014df11429f1c 100644 (file)
@@ -297,11 +297,9 @@ static void northbridge_init(device_t dev)
 static void set_resources(struct device *dev)
 {
 #if 0
-        struct resource *resource, *last;
+        struct resource *res;
 
-        last = &dev->resource[dev->resources];
-
-        for(resource = &dev->resource[0]; resource < last; resource++) {
+        for(res = &dev->resource_list; res; res = res->next) {
                 pci_set_resource(dev, resource);
         }
 #endif
index 6eba99d9df8b2044ef4b3278ca38dd5824bf289c..8fd8d9ecd2296dc78d921f986e1d545eee7a27fe 100644 (file)
@@ -318,18 +318,18 @@ static void northbridge_init(device_t dev)
 
 static void northbridge_set_resources(struct device *dev)
 {
-       struct resource *resource, *last;
        unsigned link;
        uint8_t line;
 
-       last = &dev->resource[dev->resources];
-
-       for (resource = &dev->resource[0]; resource < last; resource++) {
+#if 0
+       struct resource *res;
+       for (res = dev->resource_list; res; res = res->next) {
 
                // andrei: do not change the base address, it will make the VSA virtual registers unusable
-               //pci_set_resource(dev, resource);
+               //pci_set_resource(dev, res);
                // FIXME: static allocation may conflict with dynamic mappings!
        }
+#endif
 
        for (link = 0; link < dev->links; link++) {
                struct bus *bus;
index 93604b6cf798f6cdd19a5a5ed280727da24305e1..02f7c45495cbcf372c7c51b1316d318425dfbf4a 100644 (file)
@@ -183,9 +183,8 @@ static void mc_read_resources(device_t dev)
 
 static void mc_set_resources(device_t dev)
 {
-       struct resource *resource, *last;
+       struct resource *resource;
 
-       last = &dev->resource[dev->resources];
        resource = find_resource(dev, 0xcf);
        if (resource) {
                report_resource_stored(dev, resource, "<mmconfig>");
index 559dc15b8bf7e8cac729f91707a018f6e4fd2660..a227f229870b71b5ac55bfa99a0b8b475939407b 100644 (file)
@@ -183,9 +183,8 @@ static void mc_read_resources(device_t dev)
 
 static void mc_set_resources(device_t dev)
 {
-       struct resource *resource, *last;
+       struct resource *resource;
 
-       last = &dev->resource[dev->resources];
        resource = find_resource(dev, 0xcf);
        if (resource) {
                report_resource_stored(dev, resource, "<mmconfig>");
index 195790f8cd5c74bce847df5c5771b84049f002bc..0675aea6bcd571e594ea03c306a1dc5c2d886fe3 100644 (file)
@@ -204,9 +204,8 @@ static void mc_read_resources(device_t dev)
 
 static void mc_set_resources(device_t dev)
 {
-       struct resource *resource, *last;
+       struct resource *resource;
 
-       last = &dev->resource[dev->resources];
        resource = find_resource(dev, 0xcf);
        if (resource) {
                report_resource_stored(dev, resource, "<mmconfig>");
index 1f3253f55b9e54993fbee6e3400f1cd3df07792b..0653772385976f5b84d854e8d248f3127349db89 100644 (file)
@@ -108,7 +108,6 @@ static void sb600_lpc_enable_childrens_resources(device_t dev)
 {
        u32 link;
        u32 reg, reg_x;
-       int i;
        int var_num = 0;
        u16 reg_var[3];
 
@@ -122,10 +121,9 @@ static void sb600_lpc_enable_childrens_resources(device_t dev)
                        enable_resources(child);
                        if (child->enabled
                            && (child->path.type == DEVICE_PATH_PNP)) {
-                               for (i = 0; i < child->resources; i++) {
-                                       struct resource *res;
+                               struct resource *res;
+                               for (res = child->resource_list; res; res = res->next) {
                                        u32 base, end;  /*  don't need long long */
-                                       res = &child->resource[i];
                                        if (!(res->flags & IORESOURCE_IO))
                                                continue;
                                        base = res->base;
index 0dcf0d1095d670d0a0b665aed351c18ac5fed5f3..ab0a5ba6ccc92548191e32a427ed36ac50723429 100644 (file)
@@ -120,7 +120,6 @@ static void sb700_lpc_enable_childrens_resources(device_t dev)
 {
        u32 link;
        u32 reg, reg_x;
-       int i;
        int var_num = 0;
        u16 reg_var[3];
 
@@ -134,10 +133,9 @@ static void sb700_lpc_enable_childrens_resources(device_t dev)
                        enable_resources(child);
                        if (child->enabled
                            && (child->path.type == DEVICE_PATH_PNP)) {
-                               for (i = 0; i < child->resources; i++) {
-                                       struct resource *res;
+                               struct resource *res;
+                               for (res = child->resource_list; res; res = res->next) {
                                        u32 base, end;  /*  don't need long long */
-                                       res = &child->resource[i];
                                        if (!(res->flags & IORESOURCE_IO))
                                                continue;
                                        base = res->base;
index 29c08ab74ee5003af3e5f7599276a0c3388db6d0..a80f5d79d5e216ba1a26aea0681b7372faae1a2d 100644 (file)
@@ -69,7 +69,6 @@ static void bcm5785_lpc_enable_childrens_resources(device_t dev)
 {
         unsigned link;
        uint32_t reg;
-       int i;
 
        reg = pci_read_config8(dev, 0x44);
 
@@ -78,10 +77,9 @@ static void bcm5785_lpc_enable_childrens_resources(device_t dev)
                 for (child = dev->link[link].children; child; child = child->sibling) {
                         enable_resources(child);
                        if(child->enabled && (child->path.type == DEVICE_PATH_PNP)) {
-                               for(i=0;i<child->resources;i++) {
-                                       struct resource *res;
+                               struct resource *res;
+                               for(res = child->resource_list; res; res = res->next) {
                                        unsigned long base, end; // don't need long long
-                                       res = &child->resource[i];
                                        if(!(res->flags & IORESOURCE_IO)) continue;
                                        base = res->base;
                                        end = resource_end(res);
index 3458738f9b36ae48d163d46c2815ec4402555183..a6637cad1ce499a230c91f3f9a417c2f81a52148 100644 (file)
@@ -242,10 +242,9 @@ static void ck804_lpc_enable_childrens_resources(device_t dev)
                for (child = dev->link[link].children; child; child = child->sibling) {
                        enable_resources(child);
                        if (child->enabled && (child->path.type == DEVICE_PATH_PNP)) {
-                               for (i = 0; i < child->resources; i++) {
-                                       struct resource *res;
+                               struct resource *res;
+                               for (res = child->resource_list; res; res = res->next) {
                                        unsigned long base, end;        // don't need long long
-                                       res = &child->resource[i];
                                        if (!(res->flags & IORESOURCE_IO))
                                                continue;
                                        base = res->base;
index 1d2a066b1b74f02dca8e06be9e69f3c098ecaa2c..0f9a50ca4f2816c3dea915bfb329bed1d919dbe7 100644 (file)
@@ -217,10 +217,9 @@ static void mcp55_lpc_enable_childrens_resources(device_t dev)
                for (child = dev->link[link].children; child; child = child->sibling) {
                        enable_resources(child);
                        if(child->enabled && (child->path.type == DEVICE_PATH_PNP)) {
-                               for(i=0;i<child->resources;i++) {
-                                       struct resource *res;
+                               struct resource *res;
+                               for(res = child->resource_list; res; res = res->next) {
                                        unsigned long base, end; // don't need long long
-                                       res = &child->resource[i];
                                        if(!(res->flags & IORESOURCE_IO)) continue;
                                        base = res->base;
                                        end = resource_end(res);
index 2efc3802b2998a1405047d6657943f7f0ee013de..a3b79f078a02cc0b1202f1dd829dec22bcc382d3 100644 (file)
@@ -210,10 +210,9 @@ static void sis966_lpc_enable_childrens_resources(device_t dev)
                for (child = dev->link[link].children; child; child = child->sibling) {
                        enable_resources(child);
                        if(child->enabled && (child->path.type == DEVICE_PATH_PNP)) {
-                               for(i=0;i<child->resources;i++) {
-                                       struct resource *res;
+                               struct resource *res;
+                               for(res = child->resource_list; res; res = res->next) {
                                        unsigned long base, end; // don't need long long
-                                       res = &child->resource[i];
                                        if(!(res->flags & IORESOURCE_IO)) continue;
                                        base = res->base;
                                        end = resource_end(res);
index cd4b5397956423c3fc76070caca00d8330c93364..085331eaa7400852929f428bc0abc234d83f4d6a 100644 (file)
@@ -99,15 +99,15 @@ static void enable_dev(device_t dev)
  */
 static void lpc47n217_pnp_set_resources(device_t dev)
 {
-       int i;
+       struct resource *res;
 
        pnp_enter_conf_state(dev);
 
        /* NOTE: Cannot use pnp_set_resources() here because it assumes chip
         * support for logical devices, which the LPC47N217 doesn't have
         */
-       for(i = 0; i < dev->resources; i++)
-               lpc47n217_pnp_set_resource(dev, &dev->resource[i]);
+       for(res = dev->resource_list; res; res = res->next)
+               lpc47n217_pnp_set_resource(dev, res);
 
        /* dump_pnp_device(dev); */
 
index 1431908f8e223bb54e4b59ae92fade8bc863cb65..f921ed85f3aeb6387f3b0f5a036a204d0427f915 100644 (file)
@@ -96,14 +96,14 @@ static void enable_dev(device_t dev)
 //
 void lpc47n227_pnp_set_resources(device_t dev)
 {
-       int i;
+       struct resource *res;
 
        pnp_enter_conf_state(dev);
 
        // NOTE: Cannot use pnp_set_resources() here because it assumes chip
        // support for logical devices, which the LPC47N227 doesn't have
-       for (i = 0; i < dev->resources; i++)
-               lpc47n227_pnp_set_resource(dev, &dev->resource[i]);
+       for (res = dev->resource_list; res; res = res->next)
+               lpc47n227_pnp_set_resource(dev, res);
 
        pnp_exit_conf_state(dev);
 }
index 1b98ae666efaf1a0d9028a1327986c30dc80eebc..69b744f2837eb6465ac983497118941c38de48ed 100644 (file)
@@ -127,15 +127,13 @@ static void vt1211_pnp_enable_resources(device_t dev)
 
 static void vt1211_pnp_set_resources(struct device *dev)
 {
-       int i;
-       struct resource *resource;
+       struct resource *res;
 
 #if CONFIG_CONSOLE_SERIAL8250 == 1
        if( dev->path.pnp.device == 2 ){
-               for( i = 0 ; i < dev->resources; i++){
-                       resource = &dev->resource[i];
-                       resource->flags |= IORESOURCE_STORED;
-                       report_resource_stored(dev, resource, "");
+               for(res = dev->resource_list; res; res = res->next){
+                       res->flags |= IORESOURCE_STORED;
+                       report_resource_stored(dev, res, "");
                }
                return;
        }
@@ -145,34 +143,33 @@ static void vt1211_pnp_set_resources(struct device *dev)
        pnp_set_logical_device(dev);
 
        /* Paranoia says I should disable the device here... */
-       for(i = 0; i < dev->resources; i++) {
-               resource = &dev->resource[i];
-               if (!(resource->flags & IORESOURCE_ASSIGNED)) {
+       for(res = dev->resource_list; res; res = res->next){
+               if (!(res->flags & IORESOURCE_ASSIGNED)) {
                        printk(BIOS_ERR, "ERROR: %s %02lx %s size: 0x%010Lx not assigned\n",
-                               dev_path(dev), dev->resource->index,
-                               resource_type(resource),
-                               resource->size);
+                               dev_path(dev), res->index,
+                               resource_type(res),
+                               res->size);
                        continue;
                }
 
                /* Now store the resource */
-               if (resource->flags & IORESOURCE_IO) {
-                       vt1211_set_iobase(dev, resource->index, resource->base);
+               if (res->flags & IORESOURCE_IO) {
+                       vt1211_set_iobase(dev, res->index, res->base);
                }
-               else if (resource->flags & IORESOURCE_DRQ) {
-                       pnp_set_drq(dev, resource->index, resource->base);
+               else if (res->flags & IORESOURCE_DRQ) {
+                       pnp_set_drq(dev, res->index, res->base);
                }
-               else if (resource->flags  & IORESOURCE_IRQ) {
-                       pnp_set_irq(dev, resource->index, resource->base);
+               else if (res->flags  & IORESOURCE_IRQ) {
+                       pnp_set_irq(dev, res->index, res->base);
                }
                else {
                        printk(BIOS_ERR, "ERROR: %s %02lx unknown resource type\n",
-                               dev_path(dev), resource->index);
+                               dev_path(dev), res->index);
                        return;
                }
-               resource->flags |= IORESOURCE_STORED;
+               res->flags |= IORESOURCE_STORED;
 
-               report_resource_stored(dev, resource, "");
+               report_resource_stored(dev, res, "");
        }
 
        pnp_exit_ext_func_mode(dev);
index 9c7938617b4af4f5bcb0045d79e600ceb16495fb..a8441111db5dd69abd48ee11539bbae06f8d4e71 100755 (executable)
@@ -278,8 +278,11 @@ void add_register(struct device *dev, char *name, char *val) {
 }
 
 static void pass0(FILE *fil, struct device *ptr) {
-       if ((ptr->type == device) && (ptr->id != 0) && (!ptr->used))
+       if ((ptr->type == device) && (ptr->id != 0) && (!ptr->used)) {
                fprintf(fil, "struct device %s;\n", ptr->name);
+               if (ptr->rescnt > 0)
+                       fprintf(fil, "struct resource %s_res[];\n", ptr->name);
+       }
        if ((ptr->type == device) && (ptr->id != 0) && ptr->used)
                fprintf(fil, "struct device %s;\n", ptr->aliased_name);
 }
@@ -295,18 +298,7 @@ static void pass1(FILE *fil, struct device *ptr) {
                fprintf(fil, "\t.enabled = %d,\n", ptr->enabled);
                fprintf(fil, "\t.on_mainboard = 1,\n");
                if (ptr->rescnt > 0) {
-                       fprintf(fil, "\t.resources = %d,\n", ptr->rescnt);
-                       fprintf(fil, "\t.resource = {\n");
-                       struct resource *r = ptr->res;
-                       while (r) {
-                               fprintf(fil, "\t\t{ .flags=IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_");
-                               if (r->type == IRQ) fprintf(fil, "IRQ");
-                               if (r->type == DRQ) fprintf(fil, "DRQ");
-                               if (r->type == IO) fprintf(fil, "IO");
-                               fprintf(fil, ", .index=0x%x, .base=0x%x},\n", r->index, r->base);
-                               r = r->next;
-                       }
-                       fprintf(fil, "\t },\n");
+                       fprintf(fil, "\t.resource_list = &%s_res[0],\n", ptr->name);
                }
                int link = 0;
                fprintf(fil, "\t.link = {\n");
@@ -346,6 +338,24 @@ static void pass1(FILE *fil, struct device *ptr) {
                        fprintf(fil, "\t.next=&%s\n", ptr->nextdev->name);
                fprintf(fil, "};\n");
        }
+       if (ptr->rescnt > 0) {
+               int i=1;
+               fprintf(fil, "struct resource %s_res[] = {\n", ptr->name);
+               struct resource *r = ptr->res;
+               while (r) {
+                       fprintf(fil, "\t\t{ .flags=IORESOURCE_FIXED | IORESOURCE_ASSIGNED | IORESOURCE_");
+                       if (r->type == IRQ) fprintf(fil, "IRQ");
+                       if (r->type == DRQ) fprintf(fil, "DRQ");
+                       if (r->type == IO) fprintf(fil, "IO");
+                       fprintf(fil, ", .index=0x%x, .base=0x%x,", r->index, r->base);
+                       if (r->next)
+                               fprintf(fil, ".next=&%s_res[%d]},\n", ptr->name, i++);
+                       else
+                               fprintf(fil, ".next=NULL },\n");
+                       r = r->next;
+               }
+               fprintf(fil, "\t };\n");
+       }
        if ((ptr->type == chip) && (ptr->chiph_exists)) {
                if (ptr->reg) {
                        fprintf(fil, "struct %s_config %s_info_%d\t= {\n", ptr->name_underscore, ptr->name_underscore, ptr->id);