One more patch.
-Kevin
From c0068c484162337afda1ede0322a4cfcd37ded23 Mon Sep 17 00:00:00 2001
From: Kevin O'Connor kevin@koconnor.net Date: Sat, 1 Oct 2011 15:50:55 -0400 Subject: [PATCH] Locally allocate busses[] and always make it maximum sized. To: seabios@seabios.org
Don't bother tracking busses_count - there is plenty of dynamic ram - just always allocate the maximum size it can be (256).
Since only a few functions need to access busses[] pass it by reference instead of using a global.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/pciinit.c | 42 +++++++++++++++++------------------------- 1 files changed, 17 insertions(+), 25 deletions(-)
diff --git a/src/pciinit.c b/src/pciinit.c index e2c5f3c..c618a8f 100644 --- a/src/pciinit.c +++ b/src/pciinit.c @@ -1,6 +1,6 @@ // Initialize PCI devices (on emulators) // -// Copyright (C) 2008 Kevin O'Connor kevin@koconnor.net +// Copyright (C) 2008-2011 Kevin O'Connor kevin@koconnor.net // Copyright (C) 2006 Fabrice Bellard // // This file may be distributed under the terms of the GNU LGPLv3 license. @@ -31,7 +31,7 @@ static const char *region_type_name[] = { [ PCI_REGION_TYPE_PREFMEM ] = "prefmem", };
-static struct pci_bus { +struct pci_bus { struct { /* pci region stats */ u32 count[32 - PCI_MEM_INDEX_SHIFT]; @@ -42,8 +42,7 @@ static struct pci_bus { u32 bases[32 - PCI_MEM_INDEX_SHIFT]; u32 base; } r[PCI_REGION_TYPE_COUNT]; -} *busses; -static int busses_count; +};
static int pci_size_to_index(u32 size, enum pci_region_type type) { @@ -313,7 +312,6 @@ pci_bios_init_bus(void) { u8 pci_bus = 0; pci_bios_init_bus_rec(0 /* host bus */, &pci_bus); - busses_count = pci_bus + 1; }
@@ -362,21 +360,15 @@ static void pci_bios_bus_reserve(struct pci_bus *bus, int type, u32 size) bus->r[type].max = size; }
-static void pci_bios_check_device(struct pci_device *dev) +static void pci_bios_check_device(struct pci_bus *busses, struct pci_device *dev) { struct pci_bus *bus = &busses[pci_bdf_to_bus(dev->bdf)];
if (dev->class == PCI_CLASS_BRIDGE_PCI) { - if (dev->secondary_bus >= busses_count) { - /* should never trigger */ - dprintf(1, "PCI: bus count too small (%d), skipping bus #%d\n", - busses_count, dev->secondary_bus); - return; - } dprintf(1, "PCI: check devices bus %d\n", dev->secondary_bus); struct pci_device *pci; foreachchildpci(pci, dev) { - pci_bios_check_device(pci); + pci_bios_check_device(busses, pci); }
struct pci_bus *s = &busses[dev->secondary_bus]; @@ -420,7 +412,7 @@ static void pci_bios_check_device(struct pci_device *dev) #define ROOT_BASE(top, sum, max) ALIGN_DOWN((top)-(sum),(max) ?: 1)
// Setup region bases (given the regions' size and alignment) -static int pci_bios_init_root_regions(u32 start, u32 end) +static int pci_bios_init_root_regions(struct pci_bus *busses, u32 start, u32 end) { struct pci_bus *bus = &busses[0];
@@ -482,7 +474,7 @@ static u32 pci_bios_bus_get_addr(struct pci_bus *bus, int type, u32 size) #define PCI_MEMORY_SHIFT 16 #define PCI_PREF_MEMORY_SHIFT 16
-static void pci_bios_map_device(struct pci_device *dev) +static void pci_bios_map_device(struct pci_bus *busses, struct pci_device *dev) { struct pci_bus *bus = &busses[pci_bdf_to_bus(dev->bdf)]; u16 bdf = dev->bdf; @@ -491,9 +483,6 @@ static void pci_bios_map_device(struct pci_device *dev) , pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), pci_bdf_to_fn(bdf));
if (dev->class == PCI_CLASS_BRIDGE_PCI) { - if (dev->secondary_bus >= busses_count) { - return; - } struct pci_bus *s = &busses[dev->secondary_bus]; int type; for (type = 0; type < PCI_REGION_TYPE_COUNT; type++) { @@ -523,7 +512,7 @@ static void pci_bios_map_device(struct pci_device *dev)
struct pci_device *pci; foreachchildpci(pci, dev) { - pci_bios_map_device(pci); + pci_bios_map_device(busses, pci); } return; } @@ -577,13 +566,17 @@ pci_setup(void) pci_probe_devices();
dprintf(1, "=== PCI new allocation pass #1 ===\n"); - busses = malloc_tmp(sizeof(*busses) * busses_count); - memset(busses, 0, sizeof(*busses) * busses_count); + struct pci_bus *busses = malloc_tmp(sizeof(*busses) * 256); + if (!busses) { + warn_noalloc(); + return; + } + memset(busses, 0, sizeof(*busses) * 256); struct pci_device *pci; foreachhostpci(pci) { - pci_bios_check_device(pci); + pci_bios_check_device(busses, pci); } - if (pci_bios_init_root_regions(start, end) != 0) { + if (pci_bios_init_root_regions(busses, start, end) != 0) { panic("PCI: out of address space\n"); }
@@ -591,11 +584,10 @@ pci_setup(void) dprintf(1, "PCI: init bases bus 0 (primary)\n"); pci_bios_init_bus_bases(&busses[0]); foreachhostpci(pci) { - pci_bios_map_device(pci); + pci_bios_map_device(busses, pci); }
pci_bios_init_devices();
free(busses); - busses_count = 0; }