diff options
author | Eric Biederman <ebiederm@xmission.com> | 2004-10-30 08:05:41 +0000 |
---|---|---|
committer | Eric Biederman <ebiederm@xmission.com> | 2004-10-30 08:05:41 +0000 |
commit | f8a2dddb573faef41ad43ee111d91d4c5259ad59 (patch) | |
tree | 3606ac56f585bce51868b8a5388bf9d0bb4561b9 /src/devices | |
parent | 0afcba7a3d0e7dc22818ecdfd79230f5fb987f0d (diff) |
- To reduce confuse rename the parts of linuxbios bios that run from
ram linuxbios_ram instead of linuxbios_c and linuxbios_payload...
- Reordered the linker sections so the LinuxBIOS fallback image can take more the 64KiB on x86
- ROM_IMAGE_SIZE now will work when it is specified as larger than 64KiB.
- Tweaked the reset16.inc and reset16.lds to move the sanity check to see if everything will work.
- Start using romcc's built in preprocessor (This will simplify header compiler checks)
- Add helper functions for examining all of the resources
- Remove debug strings from chip.h
- Add llshell to src/arch/i386/llshell (Sometime later I can try it...)
- Add the ability to catch exceptions on x86
- Add gdb_stub support to x86
- Removed old cpu options
- Added an option so we can detect movnti support
- Remove some duplicate definitions from pci_ids.h
- Remove the 64bit resource code in amdk8/northbridge.c in preparation for making it generic
- Minor romcc bug fixes
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1727 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/devices')
-rw-r--r-- | src/devices/device.c | 36 | ||||
-rw-r--r-- | src/devices/device_util.c | 52 | ||||
-rw-r--r-- | src/devices/root_device.c | 6 |
3 files changed, 60 insertions, 34 deletions
diff --git a/src/devices/device.c b/src/devices/device.c index 96559c5833..033f41d2ca 100644 --- a/src/devices/device.c +++ b/src/devices/device.c @@ -169,9 +169,10 @@ struct pick_largest_state { int seen_last; }; -static void pick_largest_resource(struct pick_largest_state *state, +static void pick_largest_resource(void *gp, struct device *dev, struct resource *resource) { + struct pick_largest_state *state = gp; struct resource *last; last = state->last; /* Be certain to pick the successor to last */ @@ -197,33 +198,6 @@ static void pick_largest_resource(struct pick_largest_state *state, } } -static void find_largest_resource(struct pick_largest_state *state, - struct bus *bus, unsigned long type_mask, unsigned long type) -{ - struct device *curdev; - for(curdev = bus->children; curdev; curdev = curdev->sibling) { - int i; - /* Ignore disabled devices */ - if (!curdev->have_resources) continue; - for(i = 0; i < curdev->resources; i++) { - struct resource *resource = &curdev->resource[i]; - /* If it isn't the right kind of resource ignore it */ - if ((resource->flags & type_mask) != type) { - continue; - } - /* If it is a subtractive resource recurse */ - if (resource->flags & IORESOURCE_SUBTRACTIVE) { - struct bus *subbus; - subbus = &curdev->link[resource->index]; - find_largest_resource(state, subbus, type_mask, type); - continue; - } - /* See if this is the largest resource */ - pick_largest_resource(state, curdev, resource); - } - } -} - static struct device *largest_resource(struct bus *bus, struct resource **result_res, unsigned long type_mask, unsigned long type) { @@ -234,7 +208,7 @@ static struct device *largest_resource(struct bus *bus, struct resource **result state.result = 0; state.seen_last = 0; - find_largest_resource(&state, bus, type_mask, type); + search_bus_resources(bus, type_mask, type, pick_largest_resource, &state); *result_res = state.result; return state.result_dev; @@ -282,7 +256,7 @@ void compute_allocate_resource( min_align = 0; base = bridge->base; - printk_spew("%s compute_allocate_%s: base: %08lx size: %08lx align: %d gran: %d\n", + printk_spew("%s compute_allocate_%s: base: %08Lx size: %08Lx align: %d gran: %d\n", dev_path(bus->dev), (bridge->flags & IORESOURCE_IO)? "io": (bridge->flags & IORESOURCE_PREFETCH)? "prefmem" : "mem", @@ -383,7 +357,7 @@ void compute_allocate_resource( */ bridge->size = round(base, bridge->gran) - bridge->base; - printk_spew("%s compute_allocate_%s: base: %08lx size: %08lx align: %d gran: %d done\n", + printk_spew("%s compute_allocate_%s: base: %08Lx size: %08Lx align: %d gran: %d done\n", dev_path(bus->dev), (bridge->flags & IORESOURCE_IO)? "io": (bridge->flags & IORESOURCE_PREFETCH)? "prefmem" : "mem", diff --git a/src/devices/device_util.c b/src/devices/device_util.c index 56a96015b8..fd8fdcf9b8 100644 --- a/src/devices/device_util.c +++ b/src/devices/device_util.c @@ -2,6 +2,7 @@ #include <device/device.h> #include <device/path.h> #include <device/pci.h> +#include <device/resource.h> #include <string.h> /** @@ -388,3 +389,54 @@ void report_resource_stored(device_t dev, struct resource *resource, const char comment); } } + +void search_bus_resources(struct bus *bus, + unsigned long type_mask, unsigned long type, + resource_search_t search, void *gp) +{ + struct device *curdev; + for(curdev = bus->children; curdev; curdev = curdev->sibling) { + int i; + /* Ignore disabled devices */ + if (!curdev->have_resources) continue; + for(i = 0; i < curdev->resources; i++) { + struct resource *resource = &curdev->resource[i]; + /* If it isn't the right kind of resource ignore it */ + if ((resource->flags & type_mask) != type) { + continue; + } + /* If it is a subtractive resource recurse */ + if (resource->flags & IORESOURCE_SUBTRACTIVE) { + struct bus * subbus; + subbus = &curdev->link[IOINDEX_SUBTRACTIVE_LINK(resource->index)]; + search_bus_resources(subbus, type_mask, type, search, gp); + continue; + } + search(gp, curdev, resource); + } + } +} + +void search_global_resources( + unsigned long type_mask, unsigned long type, + resource_search_t search, void *gp) +{ + struct device *curdev; + for(curdev = all_devices; curdev; curdev = curdev->next) { + int i; + /* Ignore disabled devices */ + if (!curdev->have_resources) continue; + for(i = 0; i < curdev->resources; i++) { + struct resource *resource = &curdev->resource[i]; + /* If it isn't the right kind of resource ignore it */ + if ((resource->flags & type_mask) != type) { + continue; + } + /* If it is a subtractive resource ignore it */ + if (resource->flags & IORESOURCE_SUBTRACTIVE) { + continue; + } + search(gp, curdev, resource); + } + } +} diff --git a/src/devices/root_device.c b/src/devices/root_device.c index 95189e0241..897a5a3bbf 100644 --- a/src/devices/root_device.c +++ b/src/devices/root_device.c @@ -72,7 +72,7 @@ unsigned int scan_static_bus(device_t bus, unsigned int max) device_t child; unsigned link; - printk_debug("%s for %s\n", __func__, dev_path(bus)); + printk_spew("%s for %s\n", __func__, dev_path(bus)); for(link = 0; link < bus->links; link++) { for(child = bus->link[link].children; child; child = child->sibling) { @@ -91,12 +91,12 @@ unsigned int scan_static_bus(device_t bus, unsigned int max) for(child = bus->link[link].children; child; child = child->sibling) { if (!child->ops || !child->ops->scan_bus) continue; - printk_debug("%s scanning...\n", dev_path(child)); + printk_spew("%s scanning...\n", dev_path(child)); max = child->ops->scan_bus(child, max); } } - printk_debug("%s done\n", __func__); + printk_spew("%s done\n", __func__); return max; } |