summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2013-06-10 10:34:20 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-11-26 19:10:31 +0100
commit8adf7a2c50dcb3a7f09b66c1f3918ab195d8c5ec (patch)
tree50f9e2599a850991df65570ccf216682f9d7b406 /src/device
parentd5686fe23b1341ca2c72b2941cf80577e6198f23 (diff)
downloadcoreboot-8adf7a2c50dcb3a7f09b66c1f3918ab195d8c5ec.tar.xz
Log device path into CMOS during probe stages
One of the most common hangs during coreboot execution is during ramstage device init steps. Currently there are a set of (somewhat misleading) post codes during this phase which give some indication as to where execution stopped, but it provides no information on what device was actually being initialized at that point. This uses the new CMOS "extra" log banks to store the encoded device path of the device that is about to be touched by coreboot. This way if the system hangs when talking to the device there will be some indication where to investigate next. interrupted boot with reset button and gathered the eventlog after several test runs: 26 | 2013-06-10 10:32:48 | System boot | 120 27 | 2013-06-10 10:32:48 | Last post code in previous boot | 0x75 | Device Initialize 28 | 2013-06-10 10:32:48 | Extra info from previous boot | PCI | 00:16.0 29 | 2013-06-10 10:32:48 | Reset Button 30 | 2013-06-10 10:32:48 | System Reset Change-Id: I6045bd4c384358b8a4e464eb03ccad639283939c Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/58105 Reviewed-on: http://review.coreboot.org/4230 Tested-by: build bot (Jenkins) Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Diffstat (limited to 'src/device')
-rw-r--r--src/device/device.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/device/device.c b/src/device/device.c
index a2a64b2cae..dee797ed35 100644
--- a/src/device/device.c
+++ b/src/device/device.c
@@ -66,10 +66,12 @@ void dev_initialize_chips(void)
/* Initialize chip if we haven't yet. */
if (dev->chip_ops && dev->chip_ops->init &&
!dev->chip_ops->initialized) {
+ post_log_path(dev);
dev->chip_ops->init(dev->chip_info);
dev->chip_ops->initialized = 1;
}
}
+ post_log_clear();
}
/**
@@ -841,8 +843,10 @@ void assign_resources(struct bus *bus)
dev_path(curdev));
continue;
}
+ post_log_path(curdev);
curdev->ops->set_resources(curdev);
}
+ post_log_clear();
printk(BIOS_SPEW, "%s assign_resources, bus %d link: %d\n",
dev_path(bus->dev), bus->secondary, bus->link_num);
}
@@ -865,14 +869,17 @@ static void enable_resources(struct bus *link)
struct bus *c_link;
for (dev = link->children; dev; dev = dev->sibling) {
- if (dev->enabled && dev->ops && dev->ops->enable_resources)
+ if (dev->enabled && dev->ops && dev->ops->enable_resources) {
+ post_log_path(dev);
dev->ops->enable_resources(dev);
+ }
}
for (dev = link->children; dev; dev = dev->sibling) {
for (c_link = dev->link_list; c_link; c_link = c_link->next)
enable_resources(c_link);
}
+ post_log_clear();
}
/**
@@ -912,6 +919,8 @@ unsigned int scan_bus(struct device *busdev, unsigned int max)
return max;
}
+ post_log_path(busdev);
+
do_scan_bus = 1;
while (do_scan_bus) {
struct bus *link;
@@ -971,6 +980,7 @@ void dev_enumerate(void)
return;
}
scan_bus(root, 0);
+ post_log_clear();
printk(BIOS_INFO, "done\n");
}
@@ -1151,8 +1161,10 @@ static void init_link(struct bus *link)
struct device *dev;
struct bus *c_link;
- for (dev = link->children; dev; dev = dev->sibling)
+ for (dev = link->children; dev; dev = dev->sibling) {
+ post_log_path(dev);
init_dev(dev);
+ }
for (dev = link->children; dev; dev = dev->sibling) {
for (c_link = dev->link_list; c_link; c_link = c_link->next)
@@ -1183,6 +1195,7 @@ void dev_initialize(void)
/* Now initialize everything. */
for (link = dev_root.link_list; link; link = link->next)
init_link(link);
+ post_log_clear();
printk(BIOS_INFO, "Devices initialized\n");
show_all_devs(BIOS_SPEW, "After init.");